diff --git a/aima/agents.py b/aima/agents.py index d159466cc..166c6aed3 100644 --- a/aima/agents.py +++ b/aima/agents.py @@ -191,7 +191,8 @@ def rule_match(state, rules): # ______________________________________________________________________________ -loc_A, loc_B = (0, 0), (1, 0) # The two locations for the Vacuum world +loc_A, loc_B, loc_C, loc_D = (0, 0), (1, 0), (0, 1), (1, 1) # The four locations for the Vacuum world +locations = [loc_A, loc_B, loc_C, loc_D] def RandomVacuumAgent(): @@ -203,7 +204,7 @@ def RandomVacuumAgent(): >>> environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} True """ - return Agent(RandomAgentProgram(['Right', 'Left', 'Suck', 'NoOp'])) + return Agent(RandomAgentProgram(['Right', 'Left','Up','Down', 'Suck', 'NoOp'])) def TableDrivenVacuumAgent(): @@ -261,21 +262,26 @@ def ModelBasedVacuumAgent(): >>> environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} True """ - model = {loc_A: None, loc_B: None} + model = {loc_A: None, loc_B: None, loc_C: None, loc_D: None} def program(percept): """Same as ReflexVacuumAgent, except if everything is clean, do NoOp.""" location, status = percept - model[location] = status # Update the model here - if model[loc_A] == model[loc_B] == 'Clean': + model[location] = status + + if all(model[loc] == 'Clean' for loc in locations): return 'NoOp' elif status == 'Dirty': return 'Suck' + # map: A right to C up to D left to B down elif location == loc_A: - return 'Right' + return 'Up' # A -> C + elif location == loc_C: + return 'Right' # C -> D + elif location == loc_D: + return 'Down' # D -> B elif location == loc_B: - return 'Left' - + return 'Left' # B -> A return Agent(program) @@ -806,8 +812,7 @@ class TrivialVacuumEnvironment(Environment): def __init__(self): super().__init__() - self.status = {loc_A: random.choice(['Clean', 'Dirty']), - loc_B: random.choice(['Clean', 'Dirty'])} + self.status = {loc: random.choice(['Clean', 'Dirty']) for loc in locations} def thing_classes(self): """Return the Thing/Agent classes that may populate this vacuum world.""" @@ -820,11 +825,16 @@ def percept(self, agent): def execute_action(self, agent, action): """Change agent's location and/or location's status; track performance. Score 10 for each dirt cleaned; -1 for each move.""" - if action == 'Right': - agent.location = loc_B - agent.performance -= 1 - elif action == 'Left': - agent.location = loc_A + a, b = agent.location + moves = {'Right': (a + 1, b), + 'Left': (a - 1, b), + 'Up': (a, b + 1), + 'Down': (a, b - 1) + } + if action in moves: + target = moves[action] + if target in self.status: + agent.location = target agent.performance -= 1 elif action == 'Suck': if self.status[agent.location] == 'Dirty': @@ -833,7 +843,7 @@ def execute_action(self, agent, action): def default_location(self, thing): """Agents start in either location at random.""" - return random.choice([loc_A, loc_B]) + return random.choice([loc_A, loc_B, loc_C, loc_D]) # ______________________________________________________________________________ diff --git a/aima/notebook_utils.py b/aima/notebook_utils.py index 7b881d29c..6da04b8a0 100644 --- a/aima/notebook_utils.py +++ b/aima/notebook_utils.py @@ -50,7 +50,7 @@ def psource(*functions): from pygments.lexers import PythonLexer from pygments import highlight - display(HTML(highlight(source_code, PythonLexer(), HtmlFormatter(full=True)))) + display(HTML(highlight(source_code, PythonLexer(), HtmlFormatter(noclasses=True, style='monokai')))) except ImportError: print(source_code) diff --git a/lite/content/Welcome.ipynb b/lite/content/Welcome.ipynb index 8f567519a..744398064 100644 --- a/lite/content/Welcome.ipynb +++ b/lite/content/Welcome.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# aima-python in the browser\n", @@ -23,6 +24,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/agents.ipynb b/lite/content/agents.ipynb index d533c152c..a9a122607 100644 --- a/lite/content/agents.ipynb +++ b/lite/content/agents.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2ccc4349", + "id": "0", "metadata": {}, "source": [ "# Agents and environments in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "47375431", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "588ca436", + "id": "2", "metadata": {}, "source": [ "## The two-square vacuum world\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2b51257f", + "id": "3", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/csp.ipynb b/lite/content/csp.ipynb index 505ba9e53..5249c082f 100644 --- a/lite/content/csp.ipynb +++ b/lite/content/csp.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Constraint satisfaction in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -22,6 +24,7 @@ }, { "cell_type": "markdown", + "id": "2", "metadata": {}, "source": [ "## Map colouring\n", @@ -34,6 +37,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -46,6 +50,7 @@ }, { "cell_type": "markdown", + "id": "4", "metadata": {}, "source": [ "## N-queens\n", @@ -57,6 +62,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/game_theory.ipynb b/lite/content/game_theory.ipynb index fbb21aa91..dceed746e 100644 --- a/lite/content/game_theory.ipynb +++ b/lite/content/game_theory.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2a692917", + "id": "0", "metadata": {}, "source": [ "# Game theory in the browser\n", @@ -12,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "27833b2a", + "id": "1", "metadata": {}, "source": [ "`aima.game_theory` uses SciPy for the linear program behind zero-sum games, so we load it alongside `aima`." @@ -21,7 +21,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea7846ee", + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -32,7 +32,7 @@ }, { "cell_type": "markdown", - "id": "c6470bac", + "id": "3", "metadata": {}, "source": [ "## Pure-strategy Nash equilibria\n", @@ -43,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d78b2ad1", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "148ca176", + "id": "5", "metadata": {}, "source": [ "## Zero-sum games and cooperative value\n", @@ -70,7 +70,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31cdf1f3", + "id": "6", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/games.ipynb b/lite/content/games.ipynb index c2eb461c9..0469b2929 100644 --- a/lite/content/games.ipynb +++ b/lite/content/games.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Adversarial search in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,6 +25,7 @@ { "cell_type": "code", "execution_count": null, + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -37,6 +40,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/knowledge.ipynb b/lite/content/knowledge.ipynb index 4ab4f913d..332051e62 100644 --- a/lite/content/knowledge.ipynb +++ b/lite/content/knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "6433848c", + "id": "0", "metadata": {}, "source": [ "# Knowledge in learning, in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ed8fbc35", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "6b6b3c18", + "id": "2", "metadata": {}, "source": [ "## Learning a concept from examples\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5a8d03da", + "id": "3", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/learning.ipynb b/lite/content/learning.ipynb index e50adf74d..c4cc0aab4 100644 --- a/lite/content/learning.ipynb +++ b/lite/content/learning.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "14ed9989", + "id": "0", "metadata": {}, "source": [ "# Learning from examples in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9f1978e2", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "ba4b1402", + "id": "2", "metadata": {}, "source": [ "## The \"play tennis\" dataset\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9e3ee8d7", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -55,7 +55,7 @@ }, { "cell_type": "markdown", - "id": "165a1f98", + "id": "4", "metadata": {}, "source": [ "## Decision tree vs. naive Bayes" @@ -64,7 +64,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14f3bdb8", + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/logic.ipynb b/lite/content/logic.ipynb index 9571503c3..83fc16d43 100644 --- a/lite/content/logic.ipynb +++ b/lite/content/logic.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Logic in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -22,6 +24,7 @@ }, { "cell_type": "markdown", + "id": "2", "metadata": {}, "source": [ "## Propositional logic\n", @@ -32,6 +35,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -47,6 +51,7 @@ }, { "cell_type": "markdown", + "id": "4", "metadata": {}, "source": [ "## First-order logic\n", @@ -58,6 +63,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/mdp.ipynb b/lite/content/mdp.ipynb index 358dc968c..793ad17f4 100644 --- a/lite/content/mdp.ipynb +++ b/lite/content/mdp.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "960fe9fb", + "id": "0", "metadata": {}, "source": [ "# Markov decision processes in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7fed7058", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "3128ce5a", + "id": "2", "metadata": {}, "source": [ "## The 4x3 grid world\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0582d17", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -49,7 +49,7 @@ }, { "cell_type": "markdown", - "id": "aa5af733", + "id": "4", "metadata": {}, "source": [ "Policy iteration converges to the same optimal policy by a different route." @@ -58,7 +58,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9708866c", + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/nlp.ipynb b/lite/content/nlp.ipynb index fefb5f56a..e508fd072 100644 --- a/lite/content/nlp.ipynb +++ b/lite/content/nlp.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "45bc2d37", + "id": "0", "metadata": {}, "source": [ "# Natural language parsing in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "daa724fc", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "7d400142", + "id": "2", "metadata": {}, "source": [ "## CYK parsing\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f0fa48ef", + "id": "3", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/planning.ipynb b/lite/content/planning.ipynb index 7945e46f1..6368c64bf 100644 --- a/lite/content/planning.ipynb +++ b/lite/content/planning.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Classical planning in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -22,6 +24,7 @@ }, { "cell_type": "markdown", + "id": "2", "metadata": {}, "source": [ "## Spare tire\n", @@ -33,6 +36,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -44,6 +48,7 @@ }, { "cell_type": "markdown", + "id": "4", "metadata": {}, "source": [ "## Air cargo\n", @@ -55,6 +60,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/probability.ipynb b/lite/content/probability.ipynb index a629ba252..9e7aa7352 100644 --- a/lite/content/probability.ipynb +++ b/lite/content/probability.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Probabilistic reasoning in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -22,6 +24,7 @@ }, { "cell_type": "markdown", + "id": "2", "metadata": {}, "source": [ "## The burglary network\n", @@ -34,6 +37,7 @@ { "cell_type": "code", "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -46,6 +50,7 @@ }, { "cell_type": "markdown", + "id": "4", "metadata": {}, "source": [ "## Approximate inference\n", @@ -57,6 +62,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/reinforcement_learning.ipynb b/lite/content/reinforcement_learning.ipynb index 17ea5a6ad..0fb2c2198 100644 --- a/lite/content/reinforcement_learning.ipynb +++ b/lite/content/reinforcement_learning.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "556d6850", + "id": "0", "metadata": {}, "source": [ "# Reinforcement learning in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "008e0c81", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ { "cell_type": "code", "execution_count": null, - "id": "663a6866", + "id": "2", "metadata": {}, "outputs": [], "source": [ diff --git a/lite/content/search.ipynb b/lite/content/search.ipynb index 80c5d4f21..c0d91241d 100644 --- a/lite/content/search.ipynb +++ b/lite/content/search.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Search in the browser\n", @@ -13,6 +14,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,6 +25,7 @@ { "cell_type": "code", "execution_count": null, + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -42,6 +45,7 @@ }, { "cell_type": "markdown", + "id": "3", "metadata": {}, "source": [ "A* finds the optimal route Arad → Sibiu → Rimnicu → Pitesti → Bucharest\n", diff --git a/lite/content/text.ipynb b/lite/content/text.ipynb index ba2473391..6964a8731 100644 --- a/lite/content/text.ipynb +++ b/lite/content/text.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "24d93d74", + "id": "0", "metadata": {}, "source": [ "# Language models in the browser\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a033624c", + "id": "1", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "9a4a1e3d", + "id": "2", "metadata": {}, "source": [ "## Counting n-grams\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5c4b9474", + "id": "3", "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/agents.ipynb b/notebooks/agents.ipynb index 6cff727ff..07cecb308 100644 --- a/notebooks/agents.ipynb +++ b/notebooks/agents.ipynb @@ -736,7 +736,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/notebooks/arc_consistency_heuristics.ipynb b/notebooks/arc_consistency_heuristics.ipynb index 68c22e51b..a6b5e5843 100644 --- a/notebooks/arc_consistency_heuristics.ipynb +++ b/notebooks/arc_consistency_heuristics.ipynb @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -75,74 +75,22 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mAC3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdom_j_up\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"[Figure 6.3]\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXk\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariables\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msupport_pruning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrevise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is inconsistent\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is satisfiable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource AC3" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mrevise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Return true if we remove a value.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# If Xi=x conflicts with Xj=y for every possible y, eliminate Xi=x\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if all(not csp.constraints(Xi, x, Xj, y) for y in csp.curr_domains[Xj]):\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource revise" ] @@ -162,118 +110,22 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mAC3b\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdom_j_up\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXk\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariables\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msupport_pruning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Si_p values are all known to be supported by Xj\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Sj_p values are all known to be supported by Xi\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Dj - Sj_p = Sj_u values are unknown, as yet, to be supported by Xi\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSj_u\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpartition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is inconsistent\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# or queue -= {(Xj, Xi)} or queue.remove((Xj, Xi))\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdifference_update\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdifference_update\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# the elements in D_j which are supported by Xi are given by the union of Sj_p with the set of those\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# elements of Sj_u which further processing will show to be supported by some vi_p in Si_p\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvj_p\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mSj_u\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvi_p\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvj_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvi_p\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvj_p\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is satisfiable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource AC3b" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mpartition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mSi_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSj_p\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSj_u\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvi_u\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# now, in order to establish support for a value vi_u in Di it seems better to try to find a support among\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# the values in Sj_u first, because for each vj_u in Sj_u the check (vi_u, vj_u) is a double-support check\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# and it is just as likely that any vj_u in Sj_u supports vi_u than it is that any vj_p in Sj_p does...\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvj_u\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mSj_u\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# double-support check\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvi_u\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvj_u\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvi_u\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvj_u\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# ... and only if no support can be found among the elements in Sj_u, should the elements vj_p in Sj_p be used\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# for single-support checks (vi_u, vj_p)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvj_p\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# single-support check\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvi_u\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvj_p\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvi_u\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mSi_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSj_u\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mSj_p\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource partition" ] @@ -319,44 +171,22 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mdom_j_up\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mSortedSet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mneg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\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[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource dom_j_up" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0msat_up\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_do\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mSortedSet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_do\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource sat_up" ] @@ -382,61 +212,11 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mAC4\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdom_j_up\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXk\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvariables\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mneighbors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msupport_pruning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msupport_counter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvariable_value_pairs_supported\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdefaultdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munsupported_variable_value_pairs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# construction and initialization of support sets\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msupport_counter\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvariable_value_pairs_supported\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msupport_counter\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munsupported_variable_value_pairs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is inconsistent\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# propagation of removed values\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0munsupported_variable_value_pairs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munsupported_variable_value_pairs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvariable_value_pairs_supported\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msupport_counter\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msupport_counter\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mXj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremovals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrevised\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munsupported_variable_value_pairs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrevised\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurr_domains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is inconsistent\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;31m# CSP is satisfiable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource AC4" ] @@ -459,29 +239,11 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". . 3 | . 2 . | 6 . .\n", - "9 . . | 3 . 5 | . . 1\n", - ". . 1 | 8 . 6 | 4 . .\n", - "------+-------+------\n", - ". . 8 | 1 . 2 | 9 . .\n", - "7 . . | . . . | . . 8\n", - ". . 6 | 7 . 8 | 2 . .\n", - "------+-------+------\n", - ". . 2 | 6 . 9 | 5 . .\n", - "8 . . | 2 . 3 | . . 9\n", - ". . 5 | . 1 . | 3 . .\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "sudoku.display(sudoku.infer_assignment())" @@ -489,30 +251,11 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 23.6 ms, sys: 0 ns, total: 23.6 ms\n", - "Wall time: 22.4 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 needs 11322 consistency-checks'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, checks = AC3(sudoku, arc_heuristic=no_arc_heuristic)\n", "f'AC3 needs {checks} consistency-checks'" @@ -520,30 +263,11 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 7.43 ms, sys: 3.68 ms, total: 11.1 ms\n", - "Wall time: 10.7 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b needs 8345 consistency-checks'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "%time _, checks = AC3b(sudoku, arc_heuristic=no_arc_heuristic)\n", @@ -552,30 +276,11 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 56.3 ms, sys: 0 ns, total: 56.3 ms\n", - "Wall time: 55.4 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 needs 27718 consistency-checks'" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "%time _, checks = AC4(sudoku, arc_heuristic=no_arc_heuristic)\n", @@ -584,30 +289,11 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.2 ms, sys: 0 ns, total: 17.2 ms\n", - "Wall time: 16.9 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 with DOM J UP arc heuristic needs 6925 consistency-checks'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "%time _, checks = AC3(sudoku, arc_heuristic=dom_j_up)\n", @@ -616,30 +302,11 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 40.9 ms, sys: 2.47 ms, total: 43.4 ms\n", - "Wall time: 41.7 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP arc heuristic needs 6278 consistency-checks'" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "%time _, checks = AC3b(sudoku, arc_heuristic=dom_j_up)\n", @@ -648,30 +315,11 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 38.9 ms, sys: 1.96 ms, total: 40.9 ms\n", - "Wall time: 40.7 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 with DOM J UP arc heuristic needs 9393 consistency-checks'" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(easy1)\n", "%time _, checks = AC4(sudoku, arc_heuristic=dom_j_up)\n", @@ -680,27 +328,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4 8 3 | 9 2 1 | 6 5 7\n", - "9 6 7 | 3 4 5 | 8 2 1\n", - "2 5 1 | 8 7 6 | 4 9 3\n", - "------+-------+------\n", - "5 4 8 | 1 3 2 | 9 7 6\n", - "7 2 9 | 5 6 4 | 1 3 8\n", - "1 3 6 | 7 9 8 | 2 4 5\n", - "------+-------+------\n", - "3 7 2 | 6 8 9 | 5 1 4\n", - "8 1 4 | 2 5 3 | 7 6 9\n", - "6 9 5 | 4 1 7 | 3 8 2\n" - ] - } - ], + "outputs": [], "source": [ "backtracking_search(sudoku, select_unassigned_variable=mrv, inference=forward_checking)\n", "sudoku.display(sudoku.infer_assignment())" @@ -717,29 +347,11 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4 1 7 | 3 6 9 | 8 . 5\n", - ". 3 . | . . . | . . .\n", - ". . . | 7 . . | . . .\n", - "------+-------+------\n", - ". 2 . | . . . | . 6 .\n", - ". . . | . 8 . | 4 . .\n", - ". . . | . 1 . | . . .\n", - "------+-------+------\n", - ". . . | 6 . 3 | . 7 .\n", - "5 . . | 2 . . | . . .\n", - "1 . 4 | . . . | . . .\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "sudoku.display(sudoku.infer_assignment())" @@ -747,30 +359,11 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.7 ms, sys: 481 µs, total: 18.2 ms\n", - "Wall time: 17.2 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 needs 12837 consistency-checks'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, checks = AC3(sudoku, arc_heuristic=no_arc_heuristic)\n", "f'AC3 needs {checks} consistency-checks'" @@ -778,30 +371,11 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 24.1 ms, sys: 2.6 ms, total: 26.7 ms\n", - "Wall time: 25.1 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b needs 8864 consistency-checks'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "%time _, checks = AC3b(sudoku, arc_heuristic=no_arc_heuristic)\n", @@ -810,30 +384,11 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 63.4 ms, sys: 3.48 ms, total: 66.9 ms\n", - "Wall time: 65.5 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 needs 44213 consistency-checks'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "%time _, checks = AC4(sudoku, arc_heuristic=no_arc_heuristic)\n", @@ -842,30 +397,11 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 9.96 ms, sys: 570 µs, total: 10.5 ms\n", - "Wall time: 10.3 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 with DOM J UP arc heuristic needs 7045 consistency-checks'" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "%time _, checks = AC3(sudoku, arc_heuristic=dom_j_up)\n", @@ -874,30 +410,11 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 36.1 ms, sys: 0 ns, total: 36.1 ms\n", - "Wall time: 35.5 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP arc heuristic needs 6994 consistency-checks'" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "%time _, checks = AC3b(sudoku, arc_heuristic=dom_j_up)\n", @@ -906,30 +423,11 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 40.3 ms, sys: 0 ns, total: 40.3 ms\n", - "Wall time: 39.7 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 with DOM J UP arc heuristic needs 19210 consistency-checks'" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "sudoku = Sudoku(harder1)\n", "%time _, checks = AC4(sudoku, arc_heuristic=dom_j_up)\n", @@ -938,29 +436,11 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4 1 7 | 3 6 9 | 8 2 5\n", - "6 3 2 | 1 5 8 | 9 4 7\n", - "9 5 8 | 7 2 4 | 3 1 6\n", - "------+-------+------\n", - "8 2 5 | 4 3 7 | 1 6 9\n", - "7 9 1 | 5 8 6 | 4 3 2\n", - "3 4 6 | 9 1 2 | 7 5 8\n", - "------+-------+------\n", - "2 8 9 | 6 4 3 | 5 7 1\n", - "5 7 3 | 2 9 1 | 6 8 4\n", - "1 6 4 | 8 7 5 | 2 9 3\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "backtracking_search(sudoku, select_unassigned_variable=mrv, inference=forward_checking)\n", "sudoku.display(sudoku.infer_assignment())" @@ -977,26 +457,11 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". - . - . - . - 0 0 0 0 0 0 0 0 \n", - "- . - . - . - . 0 0 0 0 0 0 0 0 \n", - ". - . - . - . - 0 0 0 0 0 0 0 0 \n", - "- . - . - . - . 0 0 0 0 0 0 0 0 \n", - ". - . - . - . - 0 0 0 0 0 0 0 0 \n", - "- . - . - . - . 0 0 0 0 0 0 0 0 \n", - ". - . - . - . - 0 0 0 0 0 0 0 0 \n", - "- . - . - . - . 0 0 0 0 0 0 0 0 \n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "chess.display(chess.infer_assignment())" @@ -1004,30 +469,11 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 689 µs, sys: 193 µs, total: 882 µs\n", - "Wall time: 892 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 needs 666 consistency-checks'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, checks = AC3(chess, arc_heuristic=no_arc_heuristic)\n", "f'AC3 needs {checks} consistency-checks'" @@ -1035,30 +481,11 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 451 µs, sys: 127 µs, total: 578 µs\n", - "Wall time: 584 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b needs 428 consistency-checks'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "%time _, checks = AC3b(chess, arc_heuristic=no_arc_heuristic)\n", @@ -1067,30 +494,11 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 8.53 ms, sys: 109 µs, total: 8.64 ms\n", - "Wall time: 8.48 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 needs 4096 consistency-checks'" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "%time _, checks = AC4(chess, arc_heuristic=no_arc_heuristic)\n", @@ -1099,30 +507,11 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.88 ms, sys: 0 ns, total: 1.88 ms\n", - "Wall time: 1.88 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3 with DOM J UP arc heuristic needs 666 consistency-checks'" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "%time _, checks = AC3(chess, arc_heuristic=dom_j_up)\n", @@ -1131,30 +520,11 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.21 ms, sys: 326 µs, total: 1.53 ms\n", - "Wall time: 1.54 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP arc heuristic needs 792 consistency-checks'" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "%time _, checks = AC3b(chess, arc_heuristic=dom_j_up)\n", @@ -1163,30 +533,11 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.71 ms, sys: 0 ns, total: 4.71 ms\n", - "Wall time: 4.65 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC4 with DOM J UP arc heuristic needs 4096 consistency-checks'" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "chess = NQueensCSP(8)\n", "%time _, checks = AC4(chess, arc_heuristic=dom_j_up)\n", @@ -1195,26 +546,11 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". - . - Q - . - 2 2 3 3 0* 1 1 2 \n", - "- Q - . - . - . 1 0* 3 3 2 2 2 2 \n", - ". - . - . Q . - 3 2 3 2 2 0* 3 2 \n", - "Q . - . - . - . 0* 3 1 2 3 3 3 3 \n", - ". - . - . - Q - 2 2 2 2 3 3 0* 2 \n", - "- . - Q - . - . 2 1 3 0* 2 3 2 2 \n", - ". - . - . - . Q 1 3 2 3 3 1 2 0* \n", - "- . Q . - . - . 2 2 0* 2 2 2 2 2 \n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "backtracking_search(chess, select_unassigned_variable=mrv, inference=forward_checking)\n", "chess.display(chess.infer_assignment())" @@ -1230,71 +566,11 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/plain": [ - " \u001b[0;32mdef\u001b[0m \u001b[0mGAC\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morig_domains\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mto_do\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msat_up\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Makes this CSP arc-consistent using Generalized Arc Consistency\u001b[0m\n", - "\u001b[0;34m orig_domains is the original domains\u001b[0m\n", - "\u001b[0;34m to_do is a set of (variable,constraint) pairs\u001b[0m\n", - "\u001b[0;34m returns the reduced domains (an arc-consistent variable:domain dictionary)\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0morig_domains\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0morig_domains\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomains\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mto_do\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mto_do\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mconst\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconstraints\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mto_do\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_do\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomains\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0morig_domains\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mto_do\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_do\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mto_do\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_do\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mother_vars\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mov\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mov\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscope\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mov\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_domain\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother_vars\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mholds\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_domain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# new_domain = {val for val in domains[var]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if const.holds({var: val})}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother_vars\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mother\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mother_vars\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mother_val\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mholds\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mother_val\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_domain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# new_domain = {val for val in domains[var]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if any(const.holds({var: val, other: other_val})\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# for other_val in domains[other])}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# general case\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mholds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0many_holds\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdomains\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother_vars\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchecks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mholds\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_domain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# new_domain = {val for val in domains[var]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if self.any_holds(domains, const, {var: val}, other_vars)}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_domain\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_domain\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mnew_domain\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0madd_to_do\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_to_do\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconst\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdifference\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_do\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mto_do\u001b[0m \u001b[0;34m|=\u001b[0m \u001b[0madd_to_do\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchecks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%psource ACSolver.GAC" ] @@ -1310,47 +586,11 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[_] [_] [_] [*] [*] \n", - "[_] [*] [_] [*] [*] \n", - "[_] [_] [_] [_] [*] \n", - "[_] [*] [_] [*] [*] \n", - "[*] [*] [_] [_] [_] \n", - "[*] [*] [_] [*] [*] \n" - ] - }, - { - "data": { - "text/plain": [ - "{'ant',\n", - " 'big',\n", - " 'book',\n", - " 'bus',\n", - " 'buys',\n", - " 'car',\n", - " 'ginger',\n", - " 'has',\n", - " 'hold',\n", - " 'lane',\n", - " 'search',\n", - " 'symbol',\n", - " 'syntax',\n", - " 'year'}" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "crossword = Crossword(crossword1, words1)\n", "crossword.display()\n", @@ -1359,30 +599,11 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1min 20s, sys: 2.02 ms, total: 1min 20s\n", - "Wall time: 1min 20s\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC needs 64617645 consistency-checks'" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(crossword).GAC(arc_heuristic=no_heuristic)\n", "f'GAC needs {checks} consistency-checks'" @@ -1390,30 +611,11 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.19 s, sys: 0 ns, total: 1.19 s\n", - "Wall time: 1.19 s\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC with SAT UP arc heuristic needs 908015 consistency-checks'" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "crossword = Crossword(crossword1, words1)\n", "%time _, _, checks = ACSolver(crossword).GAC(arc_heuristic=sat_up)\n", @@ -1422,24 +624,11 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[B] [U] [S] [*] [*] \n", - "[U] [*] [E] [*] [*] \n", - "[Y] [E] [A] [R] [*] \n", - "[S] [*] [R] [*] [*] \n", - "[*] [*] [C] [A] [R] \n", - "[*] [*] [H] [*] [*] \n" - ] - } - ], + "outputs": [], "source": [ "crossword.display(ACSolver(crossword).domain_splitting())" ] @@ -1462,22 +651,11 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t10\\\t13\\\t[*]\t\n", - "\\3\t[_]\t[_]\t13\\\t\n", - "\\12\t[_]\t[_]\t[_]\t\n", - "\\21\t[_]\t[_]\t[_]\t\n" - ] - } - ], + "outputs": [], "source": [ "kakuro = Kakuro(kakuro2)\n", "kakuro.display()" @@ -1485,30 +663,11 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.8 ms, sys: 171 µs, total: 18 ms\n", - "Wall time: 16.4 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC needs 2752 consistency-checks'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(kakuro).GAC(arc_heuristic=no_heuristic)\n", "f'GAC needs {checks} consistency-checks'" @@ -1516,30 +675,11 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 8.55 ms, sys: 0 ns, total: 8.55 ms\n", - "Wall time: 8.39 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC with SAT UP arc heuristic needs 1765 consistency-checks'" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro = Kakuro(kakuro2)\n", "%time _, _, checks = ACSolver(kakuro).GAC(arc_heuristic=sat_up)\n", @@ -1548,22 +688,11 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t10\\\t13\\\t[*]\t\n", - "\\3\t[1]\t[2]\t13\\\t\n", - "\\12\t[5]\t[3]\t[4]\t\n", - "\\21\t[4]\t[8]\t[9]\t\n" - ] - } - ], + "outputs": [], "source": [ "kakuro.display(ACSolver(kakuro).domain_splitting())" ] @@ -1579,26 +708,11 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t17\\\t28\\\t[*]\t42\\\t22\\\t\n", - "\\9\t[_]\t[_]\t31\\14\t[_]\t[_]\t\n", - "\\20\t[_]\t[_]\t[_]\t[_]\t[_]\t\n", - "[*]\t\\30\t[_]\t[_]\t[_]\t[_]\t\n", - "[*]\t22\\24\t[_]\t[_]\t[_]\t[*]\t\n", - "\\25\t[_]\t[_]\t[_]\t[_]\t11\\\t\n", - "\\20\t[_]\t[_]\t[_]\t[_]\t[_]\t\n", - "\\14\t[_]\t[_]\t\\17\t[_]\t[_]\t\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro = Kakuro(kakuro3)\n", "kakuro.display()" @@ -1606,30 +720,11 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.96 s, sys: 0 ns, total: 1.96 s\n", - "Wall time: 1.96 s\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC needs 1290179 consistency-checks'" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(kakuro).GAC(arc_heuristic=no_heuristic)\n", "f'GAC needs {checks} consistency-checks'" @@ -1637,30 +732,11 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 225 ms, sys: 0 ns, total: 225 ms\n", - "Wall time: 223 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC with SAT UP arc heuristic needs 148780 consistency-checks'" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro = Kakuro(kakuro3)\n", "%time _, _, checks = ACSolver(kakuro).GAC(arc_heuristic=sat_up)\n", @@ -1669,26 +745,11 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t17\\\t28\\\t[*]\t42\\\t22\\\t\n", - "\\9\t[8]\t[1]\t31\\14\t[5]\t[9]\t\n", - "\\20\t[9]\t[2]\t[1]\t[3]\t[5]\t\n", - "[*]\t\\30\t[6]\t[9]\t[7]\t[8]\t\n", - "[*]\t22\\24\t[7]\t[8]\t[9]\t[*]\t\n", - "\\25\t[8]\t[4]\t[7]\t[6]\t11\\\t\n", - "\\20\t[5]\t[3]\t[6]\t[4]\t[2]\t\n", - "\\14\t[9]\t[5]\t\\17\t[8]\t[9]\t\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro.display(ACSolver(kakuro).domain_splitting())" ] @@ -1704,33 +765,11 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t[*]\t[*]\t[*]\t[*]\t4\\\t24\\\t11\\\t[*]\t[*]\t[*]\t11\\\t17\\\t[*]\t[*]\t\n", - "[*]\t[*]\t[*]\t17\\\t11\\12\t[_]\t[_]\t[_]\t[*]\t[*]\t24\\10\t[_]\t[_]\t11\\\t[*]\t\n", - "[*]\t4\\\t16\\26\t[_]\t[_]\t[_]\t[_]\t[_]\t[*]\t\\20\t[_]\t[_]\t[_]\t[_]\t16\\\t\n", - "\\20\t[_]\t[_]\t[_]\t[_]\t24\\13\t[_]\t[_]\t16\\\t\\12\t[_]\t[_]\t23\\10\t[_]\t[_]\t\n", - "\\10\t[_]\t[_]\t24\\12\t[_]\t[_]\t16\\5\t[_]\t[_]\t16\\30\t[_]\t[_]\t[_]\t[_]\t[_]\t\n", - "[*]\t[*]\t3\\26\t[_]\t[_]\t[_]\t[_]\t\\12\t[_]\t[_]\t4\\\t16\\14\t[_]\t[_]\t[*]\t\n", - "[*]\t\\8\t[_]\t[_]\t\\15\t[_]\t[_]\t34\\26\t[_]\t[_]\t[_]\t[_]\t[_]\t[*]\t[*]\t\n", - "[*]\t\\11\t[_]\t[_]\t3\\\t17\\\t\\14\t[_]\t[_]\t\\8\t[_]\t[_]\t7\\\t17\\\t[*]\t\n", - "[*]\t[*]\t[*]\t23\\10\t[_]\t[_]\t3\\9\t[_]\t[_]\t4\\\t23\\\t\\13\t[_]\t[_]\t[*]\t\n", - "[*]\t[*]\t10\\26\t[_]\t[_]\t[_]\t[_]\t[_]\t\\7\t[_]\t[_]\t30\\9\t[_]\t[_]\t[*]\t\n", - "[*]\t17\\11\t[_]\t[_]\t11\\\t24\\8\t[_]\t[_]\t11\\21\t[_]\t[_]\t[_]\t[_]\t16\\\t17\\\t\n", - "\\29\t[_]\t[_]\t[_]\t[_]\t[_]\t\\7\t[_]\t[_]\t23\\14\t[_]\t[_]\t3\\17\t[_]\t[_]\t\n", - "\\10\t[_]\t[_]\t3\\10\t[_]\t[_]\t[*]\t\\8\t[_]\t[_]\t4\\25\t[_]\t[_]\t[_]\t[_]\t\n", - "[*]\t\\16\t[_]\t[_]\t[_]\t[_]\t[*]\t\\23\t[_]\t[_]\t[_]\t[_]\t[_]\t[*]\t[*]\t\n", - "[*]\t[*]\t\\6\t[_]\t[_]\t[*]\t[*]\t\\15\t[_]\t[_]\t[_]\t[*]\t[*]\t[*]\t[*]\t\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro = Kakuro(kakuro4)\n", "kakuro.display()" @@ -1738,30 +777,11 @@ }, { "cell_type": "code", - "execution_count": 53, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 76.5 ms, sys: 847 µs, total: 77.4 ms\n", - "Wall time: 77 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC needs 46633 consistency-checks'" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(kakuro).GAC()\n", "f'GAC needs {checks} consistency-checks'" @@ -1769,30 +789,11 @@ }, { "cell_type": "code", - "execution_count": 54, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 64.6 ms, sys: 0 ns, total: 64.6 ms\n", - "Wall time: 63.6 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC with SAT UP arc heuristic needs 36828 consistency-checks'" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro = Kakuro(kakuro4)\n", "%time _, _, checks = ACSolver(kakuro).GAC(arc_heuristic=sat_up)\n", @@ -1801,33 +802,11 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[*]\t[*]\t[*]\t[*]\t[*]\t4\\\t24\\\t11\\\t[*]\t[*]\t[*]\t11\\\t17\\\t[*]\t[*]\t\n", - "[*]\t[*]\t[*]\t17\\\t11\\12\t[3]\t[7]\t[2]\t[*]\t[*]\t24\\10\t[2]\t[8]\t11\\\t[*]\t\n", - "[*]\t4\\\t16\\26\t[8]\t[5]\t[1]\t[9]\t[3]\t[*]\t\\20\t[8]\t[1]\t[9]\t[2]\t16\\\t\n", - "\\20\t[3]\t[7]\t[9]\t[1]\t24\\13\t[8]\t[5]\t16\\\t\\12\t[9]\t[3]\t23\\10\t[3]\t[7]\t\n", - "\\10\t[1]\t[9]\t24\\12\t[3]\t[9]\t16\\5\t[1]\t[4]\t16\\30\t[7]\t[5]\t[8]\t[1]\t[9]\t\n", - "[*]\t[*]\t3\\26\t[8]\t[2]\t[7]\t[9]\t\\12\t[3]\t[9]\t4\\\t16\\14\t[9]\t[5]\t[*]\t\n", - "[*]\t\\8\t[1]\t[7]\t\\15\t[8]\t[7]\t34\\26\t[1]\t[7]\t[3]\t[9]\t[6]\t[*]\t[*]\t\n", - "[*]\t\\11\t[2]\t[9]\t3\\\t17\\\t\\14\t[8]\t[6]\t\\8\t[1]\t[7]\t7\\\t17\\\t[*]\t\n", - "[*]\t[*]\t[*]\t23\\10\t[1]\t[9]\t3\\9\t[7]\t[2]\t4\\\t23\\\t\\13\t[4]\t[9]\t[*]\t\n", - "[*]\t[*]\t10\\26\t[6]\t[2]\t[8]\t[1]\t[9]\t\\7\t[1]\t[6]\t30\\9\t[1]\t[8]\t[*]\t\n", - "[*]\t17\\11\t[3]\t[8]\t11\\\t24\\8\t[2]\t[6]\t11\\21\t[3]\t[9]\t[7]\t[2]\t16\\\t17\\\t\n", - "\\29\t[8]\t[2]\t[9]\t[3]\t[7]\t\\7\t[4]\t[3]\t23\\14\t[8]\t[6]\t3\\17\t[9]\t[8]\t\n", - "\\10\t[9]\t[1]\t3\\10\t[2]\t[8]\t[*]\t\\8\t[2]\t[6]\t4\\25\t[8]\t[1]\t[7]\t[9]\t\n", - "[*]\t\\16\t[4]\t[2]\t[1]\t[9]\t[*]\t\\23\t[1]\t[8]\t[3]\t[9]\t[2]\t[*]\t[*]\t\n", - "[*]\t[*]\t\\6\t[1]\t[5]\t[*]\t[*]\t\\15\t[5]\t[9]\t[1]\t[*]\t[*]\t[*]\t[*]\t\n" - ] - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "kakuro.display(ACSolver(kakuro).domain_splitting())" ] @@ -1857,7 +836,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": { "pycharm": {} }, @@ -1879,30 +858,11 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 21.7 s, sys: 0 ns, total: 21.7 s\n", - "Wall time: 21.7 s\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC needs 14080592 consistency-checks'" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(cryptarithmetic).GAC(arc_heuristic=no_heuristic)\n", "f'GAC needs {checks} consistency-checks'" @@ -1910,30 +870,11 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 939 ms, sys: 0 ns, total: 939 ms\n", - "Wall time: 938 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'GAC with SAT UP arc heuristic needs 573120 consistency-checks'" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "%time _, _, checks = ACSolver(cryptarithmetic).GAC(arc_heuristic=sat_up)\n", "f'GAC with SAT UP arc heuristic needs {checks} consistency-checks'" @@ -1941,24 +882,11 @@ }, { "cell_type": "code", - "execution_count": 59, - "metadata": { - "pycharm": {} - }, - "outputs": [ - { - "data": { - "text/latex": [ - "\\begin{array}{@{}r@{}} 9567 \\\\ + 1085 \\\\ \\hline 10652 \\end{array}" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": { + "pycharm": {} + }, + "outputs": [], "source": [ "assignment = ACSolver(cryptarithmetic).domain_splitting()\n", "\n", diff --git a/notebooks/bootstrap.ipynb b/notebooks/bootstrap.ipynb index 77d94d282..0243599e8 100644 --- a/notebooks/bootstrap.ipynb +++ b/notebooks/bootstrap.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "0", "metadata": {}, "source": [ "# Bootstrap\n", @@ -12,6 +13,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/chapter16-17/Algorithms for MDPs.ipynb b/notebooks/chapter16-17/Algorithms for MDPs.ipynb index bc4bbf807..a0399eca1 100644 --- a/notebooks/chapter16-17/Algorithms for MDPs.ipynb +++ b/notebooks/chapter16-17/Algorithms for MDPs.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -77,30 +77,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 1): 0.3984432178350046,\n", - " (1, 2): 0.649585681261095,\n", - " (3, 2): 1,\n", - " (0, 0): 0.2962883154554812,\n", - " (3, 0): 0.12987274656746337,\n", - " (3, 1): -1,\n", - " (2, 1): 0.48644001739269643,\n", - " (2, 0): 0.34475423001241573,\n", - " (2, 2): 0.7953620878466678,\n", - " (1, 0): 0.253866998464795,\n", - " (0, 2): 0.5093943765842497}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "value_iteration(sequential_decision_environment)" ] @@ -132,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -157,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -168,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -180,38 +159,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d98fa86f0b764eef840e3d433f113579", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(IntSlider(value=1, description='iteration', max=15, min=1), Output()), _dom_classes=('wi…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3aaadb0f71fd469d96f460a422bc48fa", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(ToggleButton(value=False, description='Visualize'), ToggleButtons(description='Extra Del…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import ipywidgets as widgets\n", "from IPython.display import display\n", @@ -302,30 +252,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 1): (0, 1),\n", - " (1, 2): (1, 0),\n", - " (3, 2): None,\n", - " (0, 0): (0, 1),\n", - " (3, 0): (-1, 0),\n", - " (3, 1): None,\n", - " (2, 1): (0, 1),\n", - " (2, 0): (0, 1),\n", - " (2, 2): (1, 0),\n", - " (1, 0): (1, 0),\n", - " (0, 2): (1, 0)}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "policy_iteration(sequential_decision_environment)" ] diff --git a/notebooks/chapter16-17/Introduction.ipynb b/notebooks/chapter16-17/Introduction.ipynb index f8fa8c714..f51fac316 100644 --- a/notebooks/chapter16-17/Introduction.ipynb +++ b/notebooks/chapter16-17/Introduction.ipynb @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/chapter16-17/MDPs.ipynb b/notebooks/chapter16-17/MDPs.ipynb index bf1a68651..f08b0192e 100644 --- a/notebooks/chapter16-17/MDPs.ipynb +++ b/notebooks/chapter16-17/MDPs.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -45,205 +45,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class MDP:\n",
-       "    """A Markov Decision Process, defined by an initial state, transition model,\n",
-       "    and reward function. We also keep track of a gamma value, for use by\n",
-       "    algorithms. The transition model is represented somewhat differently from\n",
-       "    the text. Instead of P(s' | s, a) being a probability number for each\n",
-       "    state/state/action triplet, we instead have T(s, a) return a\n",
-       "    list of (p, s') pairs. We also keep track of the possible states,\n",
-       "    terminal states, and actions for each state. [page 646]"""\n",
-       "\n",
-       "    def __init__(self, init, actlist, terminals, transitions=None, reward=None, states=None, gamma=0.9):\n",
-       "        if not (0 < gamma <= 1):\n",
-       "            raise ValueError("An MDP must have 0 < gamma <= 1")\n",
-       "\n",
-       "        # collect states from transitions table if not passed.\n",
-       "        self.states = states or self.get_states_from_transitions(transitions)\n",
-       "\n",
-       "        self.init = init\n",
-       "\n",
-       "        if isinstance(actlist, list):\n",
-       "            # if actlist is a list, all states have the same actions\n",
-       "            self.actlist = actlist\n",
-       "\n",
-       "        elif isinstance(actlist, dict):\n",
-       "            # if actlist is a dict, different actions for each state\n",
-       "            self.actlist = actlist\n",
-       "\n",
-       "        self.terminals = terminals\n",
-       "        self.transitions = transitions or {}\n",
-       "        if not self.transitions:\n",
-       "            print("Warning: Transition table is empty.")\n",
-       "\n",
-       "        self.gamma = gamma\n",
-       "\n",
-       "        self.reward = reward or {s: 0 for s in self.states}\n",
-       "\n",
-       "        # self.check_consistency()\n",
-       "\n",
-       "    def R(self, state):\n",
-       "        """Return a numeric reward for this state."""\n",
-       "\n",
-       "        return self.reward[state]\n",
-       "\n",
-       "    def T(self, state, action):\n",
-       "        """Transition model. From a state and an action, return a list\n",
-       "        of (probability, result-state) pairs."""\n",
-       "\n",
-       "        if not self.transitions:\n",
-       "            raise ValueError("Transition model is missing")\n",
-       "        else:\n",
-       "            return self.transitions[state][action]\n",
-       "\n",
-       "    def actions(self, state):\n",
-       "        """Return a list of actions that can be performed in this state. By default, a\n",
-       "        fixed list of actions, except for terminal states. Override this\n",
-       "        method if you need to specialize by state."""\n",
-       "\n",
-       "        if state in self.terminals:\n",
-       "            return [None]\n",
-       "        else:\n",
-       "            return self.actlist\n",
-       "\n",
-       "    def get_states_from_transitions(self, transitions):\n",
-       "        if isinstance(transitions, dict):\n",
-       "            s1 = set(transitions.keys())\n",
-       "            s2 = set(tr[1] for actions in transitions.values()\n",
-       "                     for effects in actions.values()\n",
-       "                     for tr in effects)\n",
-       "            return s1.union(s2)\n",
-       "        else:\n",
-       "            print('Could not retrieve states from transitions')\n",
-       "            return None\n",
-       "\n",
-       "    def check_consistency(self):\n",
-       "\n",
-       "        # check that all states in transitions are valid\n",
-       "        assert set(self.states) == self.get_states_from_transitions(self.transitions)\n",
-       "\n",
-       "        # check that init is a valid state\n",
-       "        assert self.init in self.states\n",
-       "\n",
-       "        # check reward for each state\n",
-       "        assert set(self.reward.keys()) == set(self.states)\n",
-       "\n",
-       "        # check that all terminals are valid states\n",
-       "        assert all(t in self.states for t in self.terminals)\n",
-       "\n",
-       "        # check that probability distributions for all actions sum to 1\n",
-       "        for s1, actions in self.transitions.items():\n",
-       "            for a in actions.keys():\n",
-       "                s = 0\n",
-       "                for o in actions[a]:\n",
-       "                    s += o[0]\n",
-       "                assert abs(s - 1) < 0.001\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(MDP)" ] @@ -278,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -308,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -337,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -362,168 +166,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class GridMDP(MDP):\n",
-       "    """A two-dimensional grid MDP, as in [Figure 16.1]. All you have to do is\n",
-       "    specify the grid as a list of lists of rewards; use None for an obstacle\n",
-       "    (unreachable state). Also, you should specify the terminal states.\n",
-       "    An action is an (x, y) unit vector; e.g. (1, 0) means move east."""\n",
-       "\n",
-       "    def __init__(self, grid, terminals, init=(0, 0), gamma=.9):\n",
-       "        grid.reverse()  # because we want row 0 on bottom, not on top\n",
-       "        reward = {}\n",
-       "        states = set()\n",
-       "        self.rows = len(grid)\n",
-       "        self.cols = len(grid[0])\n",
-       "        self.grid = grid\n",
-       "        for x in range(self.cols):\n",
-       "            for y in range(self.rows):\n",
-       "                if grid[y][x]:\n",
-       "                    states.add((x, y))\n",
-       "                    reward[(x, y)] = grid[y][x]\n",
-       "        self.states = states\n",
-       "        actlist = orientations\n",
-       "        transitions = {}\n",
-       "        for s in states:\n",
-       "            transitions[s] = {}\n",
-       "            for a in actlist:\n",
-       "                transitions[s][a] = self.calculate_T(s, a)\n",
-       "        MDP.__init__(self, init, actlist=actlist,\n",
-       "                     terminals=terminals, transitions=transitions,\n",
-       "                     reward=reward, states=states, gamma=gamma)\n",
-       "\n",
-       "    def calculate_T(self, state, action):\n",
-       "        if action:\n",
-       "            return [(0.8, self.go(state, action)),\n",
-       "                    (0.1, self.go(state, turn_right(action))),\n",
-       "                    (0.1, self.go(state, turn_left(action)))]\n",
-       "        else:\n",
-       "            return [(0.0, state)]\n",
-       "\n",
-       "    def T(self, state, action):\n",
-       "        return self.transitions[state][action] if action else [(0.0, state)]\n",
-       "\n",
-       "    def go(self, state, direction):\n",
-       "        """Return the state that results from going in this direction."""\n",
-       "\n",
-       "        state1 = tuple(vector_add(state, direction))\n",
-       "        return state1 if state1 in self.states else state\n",
-       "\n",
-       "    def to_grid(self, mapping):\n",
-       "        """Convert a mapping from (x, y) to v into a [[..., v, ...]] grid."""\n",
-       "\n",
-       "        return list(reversed([[mapping.get((x, y), None)\n",
-       "                               for x in range(self.cols)]\n",
-       "                              for y in range(self.rows)]))\n",
-       "\n",
-       "    def to_arrows(self, policy):\n",
-       "        chars = {(1, 0): '>', (0, 1): '^', (-1, 0): '<', (0, -1): 'v', None: '.'}\n",
-       "        return self.to_grid({s: chars[a] for (s, a) in policy.items()})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(GridMDP)" ] @@ -559,20 +204,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "sequential_decision_environment" ] diff --git a/notebooks/chapter16-17/Partially Observable MDP.ipynb b/notebooks/chapter16-17/Partially Observable MDP.ipynb index 4c1939793..077d73191 100644 --- a/notebooks/chapter16-17/Partially Observable MDP.ipynb +++ b/notebooks/chapter16-17/Partially Observable MDP.ipynb @@ -162,220 +162,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class POMDP(MDP):\n",
-       "    """A Partially Observable Markov Decision Process, defined by\n",
-       "    a transition model P(s'|s,a), actions A(s), a reward function R(s),\n",
-       "    and a sensor model P(e|s). We also keep track of a gamma value,\n",
-       "    for use by algorithms. The transition and the sensor models\n",
-       "    are defined as matrices. We also keep track of the possible states\n",
-       "    and actions for each state. [page 659]."""\n",
-       "\n",
-       "    def __init__(self, actions, transitions=None, evidences=None, rewards=None, states=None, gamma=0.95):\n",
-       "        """Initialize variables of the pomdp"""\n",
-       "\n",
-       "        if not (0 < gamma <= 1):\n",
-       "            raise ValueError('A POMDP must have 0 < gamma <= 1')\n",
-       "\n",
-       "        self.states = states\n",
-       "        self.actions = actions\n",
-       "\n",
-       "        # transition model cannot be undefined\n",
-       "        self.t_prob = transitions or {}\n",
-       "        if not self.t_prob:\n",
-       "            print('Warning: Transition model is undefined')\n",
-       "\n",
-       "        # sensor model cannot be undefined\n",
-       "        self.e_prob = evidences or {}\n",
-       "        if not self.e_prob:\n",
-       "            print('Warning: Sensor model is undefined')\n",
-       "\n",
-       "        self.gamma = gamma\n",
-       "        self.rewards = rewards\n",
-       "\n",
-       "    def remove_dominated_plans(self, input_values):\n",
-       "        """\n",
-       "        Remove dominated plans.\n",
-       "        This method finds all the lines contributing to the\n",
-       "        upper surface and removes those which don't.\n",
-       "        """\n",
-       "\n",
-       "        values = [val for action in input_values for val in input_values[action]]\n",
-       "        values.sort(key=lambda x: x[0], reverse=True)\n",
-       "\n",
-       "        best = [values[0]]\n",
-       "        y1_max = max(val[1] for val in values)\n",
-       "        tgt = values[0]\n",
-       "        prev_b = 0\n",
-       "        prev_ix = 0\n",
-       "        while tgt[1] != y1_max:\n",
-       "            min_b = 1\n",
-       "            min_ix = 0\n",
-       "            for i in range(prev_ix + 1, len(values)):\n",
-       "                if values[i][0] - tgt[0] + tgt[1] - values[i][1] != 0:\n",
-       "                    trans_b = (values[i][0] - tgt[0]) / (values[i][0] - tgt[0] + tgt[1] - values[i][1])\n",
-       "                    if 0 <= trans_b <= 1 and trans_b > prev_b and trans_b < min_b:\n",
-       "                        min_b = trans_b\n",
-       "                        min_ix = i\n",
-       "            prev_b = min_b\n",
-       "            prev_ix = min_ix\n",
-       "            tgt = values[min_ix]\n",
-       "            best.append(tgt)\n",
-       "\n",
-       "        return self.generate_mapping(best, input_values)\n",
-       "\n",
-       "    def remove_dominated_plans_fast(self, input_values):\n",
-       "        """\n",
-       "        Remove dominated plans using approximations.\n",
-       "        Resamples the upper boundary at intervals of 100 and\n",
-       "        finds the maximum values at these points.\n",
-       "        """\n",
-       "\n",
-       "        values = [val for action in input_values for val in input_values[action]]\n",
-       "        values.sort(key=lambda x: x[0], reverse=True)\n",
-       "\n",
-       "        best = []\n",
-       "        sr = 100\n",
-       "        for i in range(sr + 1):\n",
-       "            x = i / float(sr)\n",
-       "            maximum = (values[0][1] - values[0][0]) * x + values[0][0]\n",
-       "            tgt = values[0]\n",
-       "            for value in values:\n",
-       "                val = (value[1] - value[0]) * x + value[0]\n",
-       "                if val > maximum:\n",
-       "                    maximum = val\n",
-       "                    tgt = value\n",
-       "\n",
-       "            if all(any(tgt != v) for v in best):\n",
-       "                best.append(np.array(tgt))\n",
-       "\n",
-       "        return self.generate_mapping(best, input_values)\n",
-       "\n",
-       "    def generate_mapping(self, best, input_values):\n",
-       "        """Generate mappings after removing dominated plans"""\n",
-       "\n",
-       "        mapping = defaultdict(list)\n",
-       "        for value in best:\n",
-       "            for action in input_values:\n",
-       "                if any(all(value == v) for v in input_values[action]):\n",
-       "                    mapping[action].append(value)\n",
-       "\n",
-       "        return mapping\n",
-       "\n",
-       "    def max_difference(self, U1, U2):\n",
-       "        """Find maximum difference between two utility mappings"""\n",
-       "\n",
-       "        for k, v in U1.items():\n",
-       "            sum1 = 0\n",
-       "            for element in U1[k]:\n",
-       "                sum1 += sum(element)\n",
-       "            sum2 = 0\n",
-       "            for element in U2[k]:\n",
-       "                sum2 += sum(element)\n",
-       "        return abs(sum1 - sum2)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -421,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -441,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -537,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -565,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -574,22 +363,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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X//6VyIjI7sdl8RyWbduHQ8//PAZP7viiiu4+eabcXJywsbGBmdnZz766CPt762srLQlIxcXF+66667eDntA09jYSFRUFK2trVhbW3PjjTfyt7/9DYDbbruN7OxsJkyYgBACHx8fNm7ceMbrO7pm7NixWFlZMW7cOG6++Wbuu+++i96rp2RnwzPPwPvvq3++5RZ45BEIC/vfz7qDYqyna0VRQoE48b89gSohhPtpf18phPC40D0mTZokztdjuLiumM3pm4lPi2dL+hZqW2qxs7JjTugclkYsJTY8ljAP06+99UW2VagTtAWenmaORCLpPgN5HGdkwL//DR99BDod3HYbPPwwhIT87xpFURKFEJO6c39TikAKMEcIUagoSgDwkxBi+IXu0ZEInE5Lewu7c3cTlxpHXGocaRXqks4on1HEhseyNGIp04OnY60z5SSn7zDn0CEAfho/3syRSCTdZyCO45QUNfl/8gnY2MDtt8Pf/w5BQede2xMRMGWm3AT8EXj21H+/McZNba1smRc2j3lh83gp5iVSy1OJT40nPi2el399med/eR53e3cuHXYpS8OXcumwS/Fy9DLGW0skEonJOX4cnn4aPvsM7OzgvvvgwQfBVIWHxioRXQfMAbwVRckDnkRN/p8rivInIAe42hjvdTYRXhFEREdwf/T91DTXkJCRQFxaHN+lfcdnRz9Dp+iIHhStzRJG+45GURRThCKRSCTd5rff4Kmn4IsvwNFRTfwPPAC+vqZ9X6MtBxmDziwHdRa90HOg4IC2uXywUK3YCHEL0QRhbuhcHGwcjPJ+lspAnEZL+h/9eRwfPgwrV8LXX4OLC9xzD9x/P3h7d/4elroc1GUuZuzUFXSKjilBU5gSNIUVc1dQUFvAd2nfEZcax4dHPuTtA2/jYO3A/CHzWRq+lNiIWAa5DjLa+0skEsmFOHBATf6bNoGbGzzxhLr009t73xY1E1AURQDodDr8/f2JiYnh0UcfZejQoUZ9n6a2JnZk71A3l9PiyK7KBmCc3zhtljAlaApWOiujvq85SGloAGC4o6OZI5FIuk9/Gse//gorVsDmzeDhoT7133MPuLtf/LUdYRHVQcbAIAId4erqSlRUFA888ADLli0zytq+EIITZSe0ZaOfc3+mXbTj7ejN4mGLWRqxlEVDF+Fu34P/QxKJZMCze7ea/BMSwMtL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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "plot_pomdp_utility(utility)" diff --git a/notebooks/chapter16-17/Sequential Decision Problems.ipynb b/notebooks/chapter16-17/Sequential Decision Problems.ipynb index f3ccb3d93..4403052d9 100644 --- a/notebooks/chapter16-17/Sequential Decision Problems.ipynb +++ b/notebooks/chapter16-17/Sequential Decision Problems.ipynb @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -46,112 +46,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def T(self, state, action):\n",
-       "        return self.transitions[state][action] if action else [(0.0, state)]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.T)" ] @@ -187,113 +84,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def to_arrows(self, policy):\n",
-       "        chars = {(1, 0): '>', (0, 1): '^', (-1, 0): '<', (0, -1): 'v', None: '.'}\n",
-       "        return self.to_grid({s: chars[a] for (s, a) in policy.items()})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.to_arrows)" ] @@ -308,116 +101,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def to_grid(self, mapping):\n",
-       "        """Convert a mapping from (x, y) to v into a [[..., v, ...]] grid."""\n",
-       "\n",
-       "        return list(reversed([[mapping.get((x, y), None)\n",
-       "                               for x in range(self.cols)]\n",
-       "                              for y in range(self.rows)]))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.to_grid)" ] @@ -440,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -463,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -479,19 +165,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None ^ .\n", - "^ > ^ <\n" - ] - } - ], + "outputs": [], "source": [ "from aima.utils import print_table\n", "print_table(sequential_decision_environment.to_arrows(pi))" @@ -521,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -533,19 +209,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None ^ .\n", - "^ > ^ <\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", @@ -574,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -586,19 +252,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None > .\n", - "> > > ^\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", @@ -626,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -638,19 +294,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > < .\n", - "> None < .\n", - "> > > v\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", diff --git a/notebooks/chapter18/Datasets.ipynb b/notebooks/chapter18/Datasets.ipynb index 303873122..7e41da4e9 100644 --- a/notebooks/chapter18/Datasets.ipynb +++ b/notebooks/chapter18/Datasets.ipynb @@ -87,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -113,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -129,18 +129,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5.1, 3.5, 1.4, 0.2, 'setosa']\n", - "[0, 1, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.examples[0])\n", "print(iris.inputs)" @@ -157,17 +148,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\",exclude=[1])\n", "print(iris2.inputs)" @@ -196,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -216,20 +199,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "restaurant = RestaurantDataSet()\n", "restaurant.inputs" @@ -258,22 +230,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[5.1, 3.5, 1.4, 0.2, 'setosa'],\n", - " [4.9, 3.0, 1.4, 0.2, 'setosa'],\n", - " [4.7, 3.2, 1.3, 0.2, 'setosa']]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris.examples[:3]" ] @@ -293,20 +252,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "attrs: [0, 1, 2, 3, 4]\n", - "attrnames (by default same as attrs): ['sepal-len', 'sepal-width', 'petal-len', 'petal-width', 'class']\n", - "target: 4\n", - "inputs: [0, 1, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"attrs:\", iris.attrs)\n", "print(\"attr_names (by default same as attrs):\", iris.attr_names)\n", @@ -330,17 +278,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4.7, 5.5, 5.0, 4.9, 5.1, 4.6, 5.4, 4.4, 4.8, 4.3, 5.8, 7.0, 7.1, 4.5, 5.9, 5.6, 6.9, 6.5, 6.4, 6.6, 6.0, 6.1, 7.6, 7.4, 7.9, 5.7, 5.3, 5.2, 6.3, 6.7, 6.2, 6.8, 7.3, 7.2, 7.7]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.values[0])" ] @@ -354,17 +294,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: iris\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"name:\", iris.name)" ] @@ -408,18 +340,9 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sanitized: [5.1, 3.5, 1.4, 0.2, None]\n", - "Original: [5.1, 3.5, 1.4, 0.2, 'setosa']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Sanitized:\",iris.sanitize(iris.examples[0]))\n", "print(\"Original:\",iris.examples[0])" @@ -441,18 +364,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Class of first example: setosa\n", - "Class of first example: 0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Class of first example:\",iris2.examples[0][iris2.target])\n", "iris2.classes_to_numbers()\n", @@ -475,17 +389,9 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'versicolor']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\")\n", "\n", @@ -509,17 +415,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 3\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "means, deviations = iris.find_means_and_deviations()\n", "print(len(means), len(deviations))" @@ -527,20 +425,9 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Setosa feature means: [5.006, 3.418, 1.464, 0.244]\n", - "Versicolor mean for first feature: 5.936\n", - "Setosa feature deviations: [0.3524896872134513, 0.38102439795469095, 0.17351115943644546, 0.10720950308167838]\n", - "Virginica deviation for second feature: 0.32249663817263746\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Setosa feature means:\", means[\"setosa\"])\n", "print(\"Versicolor mean for first feature:\", means[\"versicolor\"][0])\n", @@ -579,40 +466,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", diff --git a/notebooks/chapter18/Decision Tree.ipynb b/notebooks/chapter18/Decision Tree.ipynb index 7e808df3c..180271feb 100644 --- a/notebooks/chapter18/Decision Tree.ipynb +++ b/notebooks/chapter18/Decision Tree.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -147,17 +147,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(DTL([5.1, 3.0, 1.1, 0.1]))" ] @@ -185,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -203,17 +195,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DecisionFork(4, 'Patrons', {'Full': DecisionFork(9, 'WaitEstimate', {'10-30': DecisionFork(8, 'Type', {'Italian': 'No', 'French': 'No', 'Burger': 'Yes', 'Thai': 'Yes'}), '>60': 'No', '0-10': 'No', '30-60': DecisionFork(8, 'Type', {'Italian': 'No', 'French': 'Yes', 'Burger': 'Yes', 'Thai': 'No'})}), 'None': 'No', 'Some': 'Yes'})\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(RT)" ] @@ -227,17 +211,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Alternate', 'Bar', 'Fri/Sat', 'Hungry', 'Patrons', 'Price', 'Raining', 'Reservation', 'Type', 'WaitEstimate', 'Wait']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(restaurant.attr_names)" ] @@ -251,17 +227,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Yes\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "example = ['Yes', 'No', 'Yes', 'Yes', 'Full', '$', 'No', 'No', 'Thai', '10-30', 'Yes']\n", "print(RT(example))" @@ -276,17 +244,9 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "example = ['Yes', 'No', 'Yes', 'Yes', 'Full', '$', 'No', 'No', 'French', '10-30', 'Yes']\n", "print(RT(example))" @@ -359,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -375,17 +335,9 @@ }, { "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "60000\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -402,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -419,20 +371,9 @@ }, { "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAK4AAACuCAYAAACvDDbuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAFGklEQVR4nO3dvyt9cRzH8c+Vya/k94SFQTIYWKQrKaPJoO5qkPwoK5mky2Qw2JSMBoPFoEQoE4v8KBmQMokkut8/4PM+Ou659369judjfHfuuZ/h6VPnHI5EJpPJOEBM0f9eAJANwoUkwoUkwoUkwoUkwoUkwoUkwoUkwoWk4rAHJhKJfK4DcM45F/ZBLjsuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJBEuJIV+sfNfU19fb8739/e9WUlJiXlsMpn0Zjc3N5HWFWR6etqcz8/Pe7P19XXz2ImJiVwuKa/YcSGJcCGJcCGJcCGJizPnXFGR//ObSqXMY1taWrzZ9fW1eezX11e0hQXo6uryZrOzs+ax5eXl3mxhYSHnayo0dlxIIlxIIlxIIlxIIlxI4q6Cc25sbMybpdPp0J+fnJw057e3t9kuyTnnXEdHhznf2dnxZpWVleaxx8fH3uzl5SXSun4DdlxIIlxIIlxIIlxI+lMXZ01NTeZ8fHw89Dk+Pz+92cfHR9Zr+k7QuqqqqkKfw7o4e319zXpNvwU7LiQRLiQRLiQRLiQRLiQlMplMJtSBiUS+15JTxcX+DZONjQ3z2OHh4dDn3dvb82b9/f3hFxagt7fXm21tbZnH/uSuQnNzsze7u7sL/flCC5kjOy40ES4kES4kES4kxfaRb21trTf7yUVY0GPcxcXFrNfknHOlpaXmfGVlxZv95CJse3vbnD8/P4c+hxJ2XEgiXEgiXEgiXEgiXEiK7V2Furq6SJ+/uroy57u7u6HPYd1BGBkZMY8N+ovesGZmZsx5HH5p3MKOC0mEC0mEC0mEC0mxvTgbHR2N9PnGxkZzHvQ7spaamhpv1tPTk/WavtPe3m7Ord+9zddfJRcSOy4kES4kES4kES4kES4kxfauwv39faTPW/9myTnnhoaGIp03X4Ludqj9lW9Y7LiQRLiQRLiQRLiQFNtXMFVXV3uz8/Nz89iGhoZ8L+e/Ubs44xVMiDXChSTChSTChSTChaTYPvK13pmVTCbNY9va2ryZ9f99nbMfBXd3d/9scSGdnJyYc+t/8a6urprHPj095XRNvwU7LiQRLiQRLiQRLiTF9pFvvnR2dnqz09PTyOc9PDz0ZoODg+axcX2tknM88kXMES4kES4kES4kES4kxfaRb1QVFRXmfG5uLi/ft7y87M3ifPcgKnZcSCJcSCJcSCJcSOKRb4CgFyWfnZ1FOu/R0ZE5HxgY8GZvb2+RvksRj3wRa4QLSYQLSYQLSYQLSTzydfbj3XQ6nZfvWlpaMud/8Q5CFOy4kES4kES4kES4kMQjX+dca2urN7u4uIh8XusVSn19feax7+/vkb8vDnjki1gjXEgiXEgiXEgiXEjika9zbmpqKi/ntd4Hxt2D3GDHhSTChSTChSTChSQuzpxzZWVlkT7/+PhoztfW1iKdF8HYcSGJcCGJcCGJcCGJcCGJuwo5sLm5ac4vLy8LvJK/gx0XkggXkggXkggXkrg4c84dHBx4s1QqZR778PDgzXi0W3jsuJBEuJBEuJBEuJBEuJDEu8Pwq/DuMMQa4UIS4UIS4UIS4UIS4UIS4UIS4UIS4UIS4UJS6F8kD/soDigEdlxIIlxIIlxIIlxIIlxIIlxIIlxIIlxIIlxI+gegNfU4U/K/dQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plt.figure(figsize=(2,2))\n", "plt.imshow(test_img[-3].reshape((28, 28)))\n", @@ -449,18 +390,9 @@ }, { "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4, 4, 4, 1, 9]\n", - "4\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(MNIST_RF(test_img[-3]))" ] diff --git a/notebooks/chapter18/Ensemble Learning.ipynb b/notebooks/chapter18/Ensemble Learning.ipynb index 0c4ef96d8..c16ae112d 100644 --- a/notebooks/chapter18/Ensemble Learning.ipynb +++ b/notebooks/chapter18/Ensemble Learning.ipynb @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -94,134 +94,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def AdaBoost(L, K):\n",
-       "    """[Figure 18.34]"""\n",
-       "\n",
-       "    def train(dataset):\n",
-       "        examples, target = dataset.examples, dataset.target\n",
-       "        N = len(examples)\n",
-       "        epsilon = 1/(2*N)\n",
-       "        w = [1/N]*N\n",
-       "        h, z = [], []\n",
-       "        for k in range(K):\n",
-       "            h_k = L(dataset, w)\n",
-       "            h.append(h_k)\n",
-       "            error = sum(weight for example, weight in zip(examples, w)\n",
-       "                        if example[target] != h_k(example))\n",
-       "\n",
-       "            # Avoid divide-by-0 from either 0% or 100% error rates:\n",
-       "            error = clip(error, epsilon, 1 - epsilon)\n",
-       "            for j, example in enumerate(examples):\n",
-       "                if example[target] == h_k(example):\n",
-       "                    w[j] *= error/(1 - error)\n",
-       "            w = normalize(w)\n",
-       "            z.append(math.log((1 - error)/error))\n",
-       "        return WeightedMajority(h, z)\n",
-       "    return train\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(ada_boost)" ] @@ -263,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -272,20 +147,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'virginica'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\")\n", "iris2.classes_to_numbers()\n", @@ -297,17 +161,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for adaboost: 0.0\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Error ratio for adaboost: \", err_ratio(adaboost, iris2))" ] @@ -339,19 +195,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " iris orings zoo restaur restaur majorit parity xor\n", - "NearestNeighbor 0.00 0.27 0.00 0.00 0.00 0.00 0.00 0.00\n", - "DecisionTree 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00\n" - ] - } - ], + "outputs": [], "source": [ "compare([DecisionTreeLearner, NearestNeighborLearner],\n", " [DataSet(name='iris'), DataSet(name='orings')])" diff --git a/notebooks/chapter18/Linear and Nonparametric Models.ipynb b/notebooks/chapter18/Linear and Nonparametric Models.ipynb index a0bc2cedc..4fad0847d 100644 --- a/notebooks/chapter18/Linear and Nonparametric Models.ipynb +++ b/notebooks/chapter18/Linear and Nonparametric Models.ipynb @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -67,17 +67,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0863712261312969\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "iris.classes_to_numbers()\n", @@ -109,17 +101,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.16279158793332174\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "logistic_learner = LogisticLinearLeaner(iris)\n", "print(logistic_learner([5, 3, 1, 0.1]))" @@ -209,17 +193,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", @@ -229,20 +205,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.06000000000000005" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "err_ratio(knn_model, iris)" ] @@ -260,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -281,22 +246,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "model = NearestNeighborLearner(reduced_iris, k=1)\n", "plot_model_boundary(reduced_iris,0,1, model=model)" @@ -313,22 +265,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "model = NearestNeighborLearner(reduced_iris, k=3)\n", "plot_model_boundary(reduced_iris,0,1, model=model)" @@ -345,22 +284,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "model = NearestNeighborLearner(reduced_iris, k=5)\n", "plot_model_boundary(reduced_iris,0,1, model=model)" @@ -375,22 +301,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "model = NearestNeighborLearner(reduced_iris, k=14)\n", "plot_model_boundary(reduced_iris,0,1, model=model)" diff --git a/notebooks/chapter19/Learners.ipynb b/notebooks/chapter19/Learners.ipynb index 01e012774..7d18f3183 100644 --- a/notebooks/chapter19/Learners.ipynb +++ b/notebooks/chapter19/Learners.ipynb @@ -21,35 +21,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:59:58.324794Z", - "iopub.status.busy": "2026-06-27T00:59:58.324523Z", - "iopub.status.idle": "2026-06-27T01:00:03.130370Z", - "shell.execute_reply": "2026-06-27T01:00:03.129078Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", - "I0000 00:00:1782521998.836520 1650251 cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", - "I0000 00:00:1782521998.935525 1650251 cpu_feature_guard.cc:227] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", - "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", - "I0000 00:00:1782522001.478528 1650251 cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -93,15 +67,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:03.133548Z", - "iopub.status.busy": "2026-06-27T01:00:03.132937Z", - "iopub.status.idle": "2026-06-27T01:00:03.137628Z", - "shell.execute_reply": "2026-06-27T01:00:03.136609Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# input_size and output_size are derived from the dataset\n", @@ -128,15 +95,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:03.141039Z", - "iopub.status.busy": "2026-06-27T01:00:03.140793Z", - "iopub.status.idle": "2026-06-27T01:00:03.147671Z", - "shell.execute_reply": "2026-06-27T01:00:03.146437Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -150,625 +110,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:03.150050Z", - "iopub.status.busy": "2026-06-27T01:00:03.149689Z", - "iopub.status.idle": "2026-06-27T01:00:06.822817Z", - "shell.execute_reply": "2026-06-27T01:00:06.821999Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:1, total_loss:59.31476216472319\n", - "epoch:2, total_loss:33.461028303165996\n", - "epoch:3, total_loss:29.07359698509647\n", - "epoch:4, total_loss:26.09747495394851\n", - "epoch:5, total_loss:23.105593480138605\n", - "epoch:6, total_loss:21.445983801235528\n", - "epoch:7, total_loss:20.449595850278975\n", - "epoch:8, total_loss:19.373627669877457\n", - "epoch:9, total_loss:18.727359766065582\n", - "epoch:10, total_loss:18.740420615546125\n", - "epoch:11, total_loss:18.154319844273658\n", - "epoch:12, total_loss:17.71277720323123\n", - "epoch:13, total_loss:17.683700544303374\n", - "epoch:14, total_loss:17.415592373854228\n", - "epoch:15, total_loss:16.793151405001282\n", - "epoch:16, total_loss:16.330676889009748\n", - "epoch:17, total_loss:16.49432189367278\n", - "epoch:18, total_loss:16.348972672607356\n", - "epoch:19, total_loss:16.39012532443877\n", - "epoch:20, total_loss:15.926673386115379\n", - "epoch:21, total_loss:16.321431079837943\n", - "epoch:22, total_loss:15.488413775412445\n", - "epoch:23, total_loss:15.755159235596516\n", - "epoch:24, total_loss:15.840125504914784\n", - "epoch:25, total_loss:15.529250244634857\n", - "epoch:26, total_loss:15.633864082657587\n", - "epoch:27, total_loss:15.08692652613317\n", - "epoch:28, total_loss:15.280564389867369\n", - "epoch:29, total_loss:14.910021735822003\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:30, total_loss:15.326149776828503\n", - "epoch:31, total_loss:15.06272489216177\n", - "epoch:32, total_loss:14.94213693442384\n", - "epoch:33, total_loss:15.030613484467018\n", - "epoch:34, total_loss:14.934027341519089\n", - "epoch:35, total_loss:14.963658137233594\n", - "epoch:36, total_loss:14.786870372904607\n", - "epoch:37, total_loss:14.691905985967471\n", - "epoch:38, total_loss:14.92251082845551\n", - "epoch:39, total_loss:14.505893059986327\n", - "epoch:40, total_loss:14.385189252110546\n", - "epoch:41, total_loss:14.235979796518652\n", - "epoch:42, total_loss:14.327186490005815\n", - "epoch:43, total_loss:14.17949729832847\n", - "epoch:44, total_loss:14.381041948120252\n", - "epoch:45, total_loss:14.066475479509641\n", - "epoch:46, total_loss:14.421088420803787\n", - "epoch:47, total_loss:14.076476200037776\n", - "epoch:48, total_loss:13.49505447054567\n", - "epoch:49, total_loss:13.962366607835115\n", - "epoch:50, total_loss:14.132859856533951\n", - "epoch:51, total_loss:14.211254138227915\n", - "epoch:52, total_loss:13.783430685286982\n", - "epoch:53, total_loss:13.822881691925584\n", - "epoch:54, total_loss:13.874411694740841\n", - "epoch:55, total_loss:13.689458840764601\n", - "epoch:56, total_loss:13.549748796839697\n", - "epoch:57, total_loss:13.794046328692554\n", - "epoch:58, total_loss:13.627430047802486\n", - "epoch:59, total_loss:13.566341070391756\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:60, total_loss:13.607640703294347\n", - "epoch:61, total_loss:13.765936907137627\n", - "epoch:62, total_loss:13.427898654697174\n", - "epoch:63, total_loss:13.16438282240882\n", - "epoch:64, total_loss:13.699717505863067\n", - "epoch:65, total_loss:13.517151451699508\n", - "epoch:66, total_loss:13.176597420714746\n", - "epoch:67, total_loss:13.24646814613201\n", - "epoch:68, total_loss:13.244917374131173\n", - "epoch:69, total_loss:13.215854259795039\n", - "epoch:70, total_loss:13.361632303713026\n", - "epoch:71, total_loss:13.036742330577628\n", - "epoch:72, total_loss:13.304198910127244\n", - "epoch:73, total_loss:13.081586979276803\n", - "epoch:74, total_loss:12.909194473776125\n", - "epoch:75, total_loss:13.16158078431335\n", - "epoch:76, total_loss:13.091040510323086\n", - "epoch:77, total_loss:13.102056665885813\n", - "epoch:78, total_loss:13.056174157091682\n", - "epoch:79, total_loss:12.878650349945584\n", - "epoch:80, total_loss:12.915746609328925\n", - "epoch:81, total_loss:12.837916075878645\n", - "epoch:82, total_loss:12.955636403256928\n", - "epoch:83, total_loss:12.957573670383816\n", - "epoch:84, total_loss:12.847427321058367\n", - "epoch:85, total_loss:12.964006319616256\n", - "epoch:86, total_loss:12.84767541513131\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:87, total_loss:12.718307453929764\n", - "epoch:88, total_loss:12.778235374570496\n", - "epoch:89, total_loss:12.814078968217807\n", - "epoch:90, total_loss:13.031645834417173\n", - "epoch:91, total_loss:12.727466523814076\n", - "epoch:92, total_loss:12.638851384556933\n", - "epoch:93, total_loss:12.733171742007476\n", - "epoch:94, total_loss:12.279789633590688\n", - "epoch:95, total_loss:12.637884240833793\n", - "epoch:96, total_loss:12.209017659269005\n", - "epoch:97, total_loss:12.497042351941795\n", - "epoch:98, total_loss:12.716724411988926\n", - "epoch:99, total_loss:12.73128953153456\n", - "epoch:100, total_loss:12.372433012352953\n", - "epoch:101, total_loss:12.694675488168658\n", - "epoch:102, total_loss:12.511400414457075\n", - "epoch:103, total_loss:12.335057397559682\n", - "epoch:104, total_loss:12.47197415139572\n", - "epoch:105, total_loss:12.410238905268818\n", - "epoch:106, total_loss:12.50400526153365\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:107, total_loss:12.260620810613265\n", - "epoch:108, total_loss:12.384989645992645\n", - "epoch:109, total_loss:12.169719464561028\n", - "epoch:110, total_loss:12.282819567375439\n", - "epoch:111, total_loss:12.44722168123286\n", - "epoch:112, total_loss:12.296862962858754\n", - "epoch:113, total_loss:12.595632436628286\n", - "epoch:114, total_loss:12.318763730670716\n", - "epoch:115, total_loss:12.388617752169296\n", - "epoch:116, total_loss:12.130779151806331\n", - "epoch:117, total_loss:12.151072037432037\n", - "epoch:118, total_loss:12.206420660523472\n", - "epoch:119, total_loss:12.284020291663786\n", - "epoch:120, total_loss:12.299575823334571\n", - "epoch:121, total_loss:12.064111371837056\n", - "epoch:122, total_loss:12.466999100769304\n", - "epoch:123, total_loss:12.219042299862862\n", - "epoch:124, total_loss:12.112483619291446\n", - "epoch:125, total_loss:12.216083217610361\n", - "epoch:126, total_loss:12.113049691471737\n", - "epoch:127, total_loss:12.038687327822823\n", - "epoch:128, total_loss:11.89015755142935\n", - "epoch:129, total_loss:12.082701522201729\n", - "epoch:130, total_loss:12.071966267261239\n", - "epoch:131, total_loss:12.051358877606608\n", - "epoch:132, total_loss:12.08898139774195\n", - "epoch:133, total_loss:11.934586460084915\n", - "epoch:134, total_loss:11.885709946710701\n", - "epoch:135, total_loss:11.785474905954723\n", - "epoch:136, total_loss:12.032143808040379\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:137, total_loss:11.795580769502434\n", - "epoch:138, total_loss:11.996297963040147\n", - "epoch:139, total_loss:12.074923042611077\n", - "epoch:140, total_loss:11.9567557564889\n", - "epoch:141, total_loss:11.951781322622685\n", - "epoch:142, total_loss:12.280298174146248\n", - "epoch:143, total_loss:11.797433083661497\n", - "epoch:144, total_loss:11.986423110368772\n", - "epoch:145, total_loss:12.00307375198648\n", - "epoch:146, total_loss:11.906785155746888\n", - "epoch:147, total_loss:11.907037764738789\n", - "epoch:148, total_loss:11.705841962734006\n", - "epoch:149, total_loss:12.035653424548613\n", - "epoch:150, total_loss:11.605169112666514\n", - "epoch:151, total_loss:11.806263149635944\n", - "epoch:152, total_loss:11.849579320163057\n", - "epoch:153, total_loss:11.787135277614043\n", - "epoch:154, total_loss:11.757319453581685\n", - "epoch:155, total_loss:11.827193922538715\n", - "epoch:156, total_loss:11.79314044525262\n", - "epoch:157, total_loss:11.667900558325982\n", - "epoch:158, total_loss:11.697665187408786\n", - "epoch:159, total_loss:11.867174108617622\n", - "epoch:160, total_loss:11.859606031782409\n", - "epoch:161, total_loss:11.542011500917392\n", - "epoch:162, total_loss:11.78412706240579\n", - "epoch:163, total_loss:11.67732009454037\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:164, total_loss:11.863381214916538\n", - "epoch:165, total_loss:11.647855897524444\n", - "epoch:166, total_loss:11.727139024545231\n", - "epoch:167, total_loss:11.510185761614483\n", - "epoch:168, total_loss:11.559588295523524\n", - "epoch:169, total_loss:11.847765500464757\n", - "epoch:170, total_loss:11.813258614572618\n", - "epoch:171, total_loss:11.88579048659853\n", - "epoch:172, total_loss:11.546217607901818\n", - "epoch:173, total_loss:12.081776763488348\n", - "epoch:174, total_loss:11.684912022940589\n", - "epoch:175, total_loss:11.64133030918811\n", - "epoch:176, total_loss:11.94564429832782\n", - "epoch:177, total_loss:11.394889502157216\n", - "epoch:178, total_loss:11.39319325212946\n", - "epoch:179, total_loss:11.517631773301865\n", - "epoch:180, total_loss:11.689110205956284\n", - "epoch:181, total_loss:11.522651649036852\n", - "epoch:182, total_loss:11.573823030727956\n", - "epoch:183, total_loss:11.531603974201625\n", - "epoch:184, total_loss:11.574193712070949\n", - "epoch:185, total_loss:11.628423068438831\n", - "epoch:186, total_loss:11.541855185156964\n", - "epoch:187, total_loss:11.315308847778619\n", - "epoch:188, total_loss:11.582892737794857\n", - "epoch:189, total_loss:11.466293796924703\n", - "epoch:190, total_loss:11.490824135761025\n", - "epoch:191, total_loss:11.502023559395\n", - "epoch:192, total_loss:11.719433164577346\n", - "epoch:193, total_loss:11.51070260484475\n", - "epoch:194, total_loss:11.383943788976348\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:195, total_loss:11.524551182546933\n", - "epoch:196, total_loss:11.642204143224934\n", - "epoch:197, total_loss:11.409284403875658\n", - "epoch:198, total_loss:11.706139185389647\n", - "epoch:199, total_loss:11.504022320086387\n", - "epoch:200, total_loss:11.560474765720476\n", - "epoch:201, total_loss:11.360181554950765\n", - "epoch:202, total_loss:11.487462935335515\n", - "epoch:203, total_loss:11.576651766373796\n", - "epoch:204, total_loss:11.27824836056429\n", - "epoch:205, total_loss:11.302452707972014\n", - "epoch:206, total_loss:11.622801422094083\n", - "epoch:207, total_loss:11.417505218977006\n", - "epoch:208, total_loss:11.293848073422906\n", - "epoch:209, total_loss:11.78249743759448\n", - "epoch:210, total_loss:11.481425902977152\n", - "epoch:211, total_loss:11.307112782165412\n", - "epoch:212, total_loss:11.355353736327775\n", - "epoch:213, total_loss:11.565010066946343\n", - "epoch:214, total_loss:11.513935488842517\n", - "epoch:215, total_loss:11.54360589809292\n", - "epoch:216, total_loss:11.457524366453812\n", - "epoch:217, total_loss:11.293108892063186\n", - "epoch:218, total_loss:11.54969331052015\n", - "epoch:219, total_loss:11.326586703349342\n", - "epoch:220, total_loss:11.533131356614327\n", - "epoch:221, total_loss:11.580343129942644\n", - "epoch:222, total_loss:11.481365790896467\n", - "epoch:223, total_loss:11.221858335813195\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:224, total_loss:11.281770455761087\n", - "epoch:225, total_loss:11.303411528748592\n", - "epoch:226, total_loss:11.2676201914405\n", - "epoch:227, total_loss:11.31898342534404\n", - "epoch:228, total_loss:11.380369211367775\n", - "epoch:229, total_loss:11.1546412115287\n", - "epoch:230, total_loss:11.36847476573549\n", - "epoch:231, total_loss:11.286208889192357\n", - "epoch:232, total_loss:11.344102204364019\n", - "epoch:233, total_loss:11.65988374985428\n", - "epoch:234, total_loss:11.180990735039373\n", - "epoch:235, total_loss:11.129537255906111\n", - "epoch:236, total_loss:11.093160206428102\n", - "epoch:237, total_loss:11.106413209661298\n", - "epoch:238, total_loss:10.996692076820825\n", - "epoch:239, total_loss:11.347482189042562\n", - "epoch:240, total_loss:11.09532463981298\n", - "epoch:241, total_loss:11.47818807193955\n", - "epoch:242, total_loss:11.12880423187597\n", - "epoch:243, total_loss:11.224552619402548\n", - "epoch:244, total_loss:11.299794414161184\n", - "epoch:245, total_loss:11.336155458588804\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:246, total_loss:11.354954999814138\n", - "epoch:247, total_loss:11.456953191261539\n", - "epoch:248, total_loss:11.364118278556017\n", - "epoch:249, total_loss:11.279778626821273\n", - "epoch:250, total_loss:11.346586478563408\n", - "epoch:251, total_loss:11.063300792807688\n", - "epoch:252, total_loss:11.201740193439761\n", - "epoch:253, total_loss:11.476829310505105\n", - "epoch:254, total_loss:11.403246832947032\n", - "epoch:255, total_loss:11.172686961882235\n", - "epoch:256, total_loss:11.062242933043267\n", - "epoch:257, total_loss:11.022420068253043\n", - "epoch:258, total_loss:11.10249234977285\n", - "epoch:259, total_loss:11.439362977191958\n", - "epoch:260, total_loss:11.124393760427047\n", - "epoch:261, total_loss:11.37105989603374\n", - "epoch:262, total_loss:11.2406397203475\n", - "epoch:263, total_loss:11.140800561107014\n", - "epoch:264, total_loss:11.18743171626298\n", - "epoch:265, total_loss:11.32249721549863\n", - "epoch:266, total_loss:11.0676485725417\n", - "epoch:267, total_loss:11.180333037241088\n", - "epoch:268, total_loss:11.232196095259935\n", - "epoch:269, total_loss:11.095116301564493\n", - "epoch:270, total_loss:11.192408078327949\n", - "epoch:271, total_loss:11.003941362144944\n", - "epoch:272, total_loss:11.112141942237\n", - "epoch:273, total_loss:11.029736301850322\n", - "epoch:274, total_loss:11.035907415946966\n", - "epoch:275, total_loss:11.254639119889644\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:276, total_loss:11.46740945209864\n", - "epoch:277, total_loss:10.833389266449094\n", - "epoch:278, total_loss:11.350113592780405\n", - "epoch:279, total_loss:11.01886068000809\n", - "epoch:280, total_loss:11.192982815677562\n", - "epoch:281, total_loss:11.165208439862777\n", - "epoch:282, total_loss:10.917720563866286\n", - "epoch:283, total_loss:11.130295869013851\n", - "epoch:284, total_loss:11.080966579810218\n", - "epoch:285, total_loss:11.057585849396453\n", - "epoch:286, total_loss:10.92447792249546\n", - "epoch:287, total_loss:11.044421613069836\n", - "epoch:288, total_loss:11.171595363632646\n", - "epoch:289, total_loss:11.09647470193617\n", - "epoch:290, total_loss:11.320909355885094\n", - "epoch:291, total_loss:11.1054462613746\n", - "epoch:292, total_loss:10.973193065033461\n", - "epoch:293, total_loss:10.897445297526941\n", - "epoch:294, total_loss:11.238417607896032\n", - "epoch:295, total_loss:10.824814312353759\n", - "epoch:296, total_loss:10.768831781511192\n", - "epoch:297, total_loss:10.999032418713188\n", - "epoch:298, total_loss:11.110465377462571\n", - "epoch:299, total_loss:11.12439451948392\n", - "epoch:300, total_loss:10.930532889824507\n", - "epoch:301, total_loss:11.016776874252606\n", - "epoch:302, total_loss:11.019214393266923\n", - "epoch:303, total_loss:10.915475058914934\n", - "epoch:304, total_loss:11.343665096239242\n", - "epoch:305, total_loss:11.130973661232154\n", - "epoch:306, total_loss:10.905500238059203\n", - "epoch:307, total_loss:11.065665105983\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:308, total_loss:11.031335211775001\n", - "epoch:309, total_loss:11.077036492040401\n", - "epoch:310, total_loss:10.919804376802261\n", - "epoch:311, total_loss:10.76634088045004\n", - "epoch:312, total_loss:10.8348889619673\n", - "epoch:313, total_loss:10.933223871991022\n", - "epoch:314, total_loss:11.151303538897166\n", - "epoch:315, total_loss:11.201897532177862\n", - "epoch:316, total_loss:11.011673892608803\n", - "epoch:317, total_loss:10.698641451021468\n", - "epoch:318, total_loss:10.988519352949979\n", - "epoch:319, total_loss:11.301556518822666\n", - "epoch:320, total_loss:11.084015651697072\n", - "epoch:321, total_loss:10.867371496783472\n", - "epoch:322, total_loss:10.858838115829101\n", - "epoch:323, total_loss:10.950696538623607\n", - "epoch:324, total_loss:10.997155901391247\n", - "epoch:325, total_loss:10.900610228484165\n", - "epoch:326, total_loss:11.188364285602843\n", - "epoch:327, total_loss:10.882019635750474\n", - "epoch:328, total_loss:10.908442014318686\n", - "epoch:329, total_loss:10.835518950449968\n", - "epoch:330, total_loss:10.91576593679381\n", - "epoch:331, total_loss:10.93761039758479\n", - "epoch:332, total_loss:10.830106678748368\n", - "epoch:333, total_loss:10.785336099089456\n", - "epoch:334, total_loss:10.75093892442817\n", - "epoch:335, total_loss:11.032461189788457\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:336, total_loss:10.86943278814915\n", - "epoch:337, total_loss:10.965342127850716\n", - "epoch:338, total_loss:11.039704781539015\n", - "epoch:339, total_loss:11.125682928361973\n", - "epoch:340, total_loss:10.758390986264905\n", - "epoch:341, total_loss:10.878341155998331\n", - "epoch:342, total_loss:10.985317355889885\n", - "epoch:343, total_loss:10.85598207037099\n", - "epoch:344, total_loss:10.910206833871698\n", - "epoch:345, total_loss:10.78836617842957\n", - "epoch:346, total_loss:10.964373645538434\n", - "epoch:347, total_loss:10.940719935168014\n", - "epoch:348, total_loss:10.90990894755275\n", - "epoch:349, total_loss:10.904814117851853\n", - "epoch:350, total_loss:10.88105686070788\n", - "epoch:351, total_loss:10.857800034632843\n", - "epoch:352, total_loss:10.919814811629564\n", - "epoch:353, total_loss:10.776056511633088\n", - "epoch:354, total_loss:10.960987004137044\n", - "epoch:355, total_loss:10.747432630077974\n", - "epoch:356, total_loss:10.713817367504737\n", - "epoch:357, total_loss:10.700945411649801\n", - "epoch:358, total_loss:10.937710615519688\n", - "epoch:359, total_loss:10.95164560715185\n", - "epoch:360, total_loss:10.960831084321525\n", - "epoch:361, total_loss:10.856448219545621\n", - "epoch:362, total_loss:10.912902000784864\n", - "epoch:363, total_loss:10.869689353067901\n", - "epoch:364, total_loss:10.853617490471263\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:365, total_loss:10.878445914312435\n", - "epoch:366, total_loss:11.040722715447732\n", - "epoch:367, total_loss:10.810414396512455\n", - "epoch:368, total_loss:10.890142136457598\n", - "epoch:369, total_loss:10.990201031531997\n", - "epoch:370, total_loss:10.864666783567436\n", - "epoch:371, total_loss:11.075167523199474\n", - "epoch:372, total_loss:10.786739046832038\n", - "epoch:373, total_loss:11.015469986040483\n", - "epoch:374, total_loss:10.852746400245353\n", - "epoch:375, total_loss:10.879740350592819\n", - "epoch:376, total_loss:10.910220760560222\n", - "epoch:377, total_loss:10.959983351661958\n", - "epoch:378, total_loss:10.803247613628743\n", - "epoch:379, total_loss:10.931548933739277\n", - "epoch:380, total_loss:10.929219738044553\n", - "epoch:381, total_loss:10.890783471739597\n", - "epoch:382, total_loss:10.858173872968596\n", - "epoch:383, total_loss:11.053393577895225\n", - "epoch:384, total_loss:10.735623320286434\n", - "epoch:385, total_loss:10.726258510920053\n", - "epoch:386, total_loss:10.8838288872744\n", - "epoch:387, total_loss:10.979763554283393\n", - "epoch:388, total_loss:10.721301986260325\n", - "epoch:389, total_loss:10.79876115558831\n", - "epoch:390, total_loss:10.846049959048143\n", - "epoch:391, total_loss:10.786829376891331\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:392, total_loss:10.771352249171576\n", - "epoch:393, total_loss:10.709860777934558\n", - "epoch:394, total_loss:10.988322755766282\n", - "epoch:395, total_loss:10.656531000549002\n", - "epoch:396, total_loss:10.850510032950105\n", - "epoch:397, total_loss:10.582153043820533\n", - "epoch:398, total_loss:10.78349215769655\n", - "epoch:399, total_loss:10.770876438679727\n", - "epoch:400, total_loss:10.730870421924148\n", - "epoch:401, total_loss:10.703968802508832\n", - "epoch:402, total_loss:10.879751579328474\n", - "epoch:403, total_loss:10.644552082878697\n", - "epoch:404, total_loss:10.670986112049825\n", - "epoch:405, total_loss:10.91947772514622\n", - "epoch:406, total_loss:10.805348392200983\n", - "epoch:407, total_loss:10.795900912514343\n", - "epoch:408, total_loss:10.602210478623993\n", - "epoch:409, total_loss:10.815956721895347\n", - "epoch:410, total_loss:10.957507947954578\n", - "epoch:411, total_loss:10.6533734644956\n", - "epoch:412, total_loss:10.878293827624173\n", - "epoch:413, total_loss:10.751859574819848\n", - "epoch:414, total_loss:10.78021582980708\n", - "epoch:415, total_loss:11.339907239284344\n", - "epoch:416, total_loss:10.766439642267878\n", - "epoch:417, total_loss:10.691408724076881\n", - "epoch:418, total_loss:10.652920377241356\n", - "epoch:419, total_loss:10.487145161707089\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:420, total_loss:11.027019236286609\n", - "epoch:421, total_loss:10.927645620440293\n", - "epoch:422, total_loss:10.679213200522405\n", - "epoch:423, total_loss:10.671764797943158\n", - "epoch:424, total_loss:10.750383104266978\n", - "epoch:425, total_loss:10.875817154853705\n", - "epoch:426, total_loss:10.944030101690748\n", - "epoch:427, total_loss:10.928036382429092\n", - "epoch:428, total_loss:10.947655353208413\n", - "epoch:429, total_loss:10.944172934797923\n", - "epoch:430, total_loss:10.578319084900338\n", - "epoch:431, total_loss:10.942926483988833\n", - "epoch:432, total_loss:10.807559054638537\n", - "epoch:433, total_loss:11.002922518311912\n", - "epoch:434, total_loss:10.572906521251266\n", - "epoch:435, total_loss:10.829493353579078\n", - "epoch:436, total_loss:10.873412826520925\n", - "epoch:437, total_loss:10.696661324989169\n", - "epoch:438, total_loss:10.848434602131727\n", - "epoch:439, total_loss:10.65723267295385\n", - "epoch:440, total_loss:10.729141649791057\n", - "epoch:441, total_loss:10.656043621219418\n", - "epoch:442, total_loss:10.608765215007072\n", - "epoch:443, total_loss:10.787346056459132\n", - "epoch:444, total_loss:10.761017284947256\n", - "epoch:445, total_loss:10.639615319726955\n", - "epoch:446, total_loss:10.933273477669523\n", - "epoch:447, total_loss:10.832242057404045\n", - "epoch:448, total_loss:10.745324574329555\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:449, total_loss:10.702190166961817\n", - "epoch:450, total_loss:10.665893940873417\n", - "epoch:451, total_loss:10.86400034835733\n", - "epoch:452, total_loss:10.806813525935313\n", - "epoch:453, total_loss:10.549991913389794\n", - "epoch:454, total_loss:10.701336272589131\n", - "epoch:455, total_loss:10.600325133411253\n", - "epoch:456, total_loss:10.880046803245936\n", - "epoch:457, total_loss:10.752522193188385\n", - "epoch:458, total_loss:10.78560497471056\n", - "epoch:459, total_loss:10.858960271909979\n", - "epoch:460, total_loss:10.490636789321773\n", - "epoch:461, total_loss:10.862508226960598\n", - "epoch:462, total_loss:10.543107312573792\n", - "epoch:463, total_loss:10.96903897710602\n", - "epoch:464, total_loss:10.563424782030056\n", - "epoch:465, total_loss:10.903264868619248\n", - "epoch:466, total_loss:10.613614667912822\n", - "epoch:467, total_loss:10.670085565824722\n", - "epoch:468, total_loss:10.572973580645177\n", - "epoch:469, total_loss:10.71196778750004\n", - "epoch:470, total_loss:10.765127592682404\n", - "epoch:471, total_loss:10.63995668507757\n", - "epoch:472, total_loss:10.808078282914975\n", - "epoch:473, total_loss:10.577580374002107\n", - "epoch:474, total_loss:10.762890756782571\n", - "epoch:475, total_loss:10.621447225565642\n", - "epoch:476, total_loss:10.78466964847079\n", - "epoch:477, total_loss:10.642169148047282\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:478, total_loss:10.686759833856536\n", - "epoch:479, total_loss:10.640348268575325\n", - "epoch:480, total_loss:10.52722100241036\n", - "epoch:481, total_loss:10.69556899593067\n", - "epoch:482, total_loss:10.731314064217294\n", - "epoch:483, total_loss:10.72755843090813\n", - "epoch:484, total_loss:10.822232402102639\n", - "epoch:485, total_loss:10.629897681805321\n", - "epoch:486, total_loss:10.601721287135755\n", - "epoch:487, total_loss:10.654589400939356\n", - "epoch:488, total_loss:10.619103688256695\n", - "epoch:489, total_loss:10.624210849595018\n", - "epoch:490, total_loss:10.790483664903162\n", - "epoch:491, total_loss:10.74746751802616\n", - "epoch:492, total_loss:10.461786404373873\n", - "epoch:493, total_loss:10.839570241136071\n", - "epoch:494, total_loss:10.642483451747152\n", - "epoch:495, total_loss:10.551401919289328\n", - "epoch:496, total_loss:10.577710949900766\n", - "epoch:497, total_loss:10.672594252141312\n", - "epoch:498, total_loss:10.579594645969713\n", - "epoch:499, total_loss:10.753440751518946\n", - "epoch:500, total_loss:10.653607190000272\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl = PerceptronLearner(iris, l_rate=0.01, epochs=500, verbose=50).fit(X_iris, y_iris)" ] @@ -782,24 +126,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:06.826148Z", - "iopub.status.busy": "2026-06-27T01:00:06.825740Z", - "iopub.status.idle": "2026-06-27T01:00:06.844611Z", - "shell.execute_reply": "2026-06-27T01:00:06.841655Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.046666666666666634\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(err_ratio(pl, iris))" ] @@ -813,24 +142,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:06.847928Z", - "iopub.status.busy": "2026-06-27T01:00:06.847699Z", - "iopub.status.idle": "2026-06-27T01:00:06.853938Z", - "shell.execute_reply": "2026-06-27T01:00:06.852755Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "tests = [([5.0, 3.1, 0.9, 0.1], 0),\n", " ([5.1, 3.5, 1.0, 0.0], 0),\n", @@ -855,25 +169,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:06.856675Z", - "iopub.status.busy": "2026-06-27T01:00:06.856403Z", - "iopub.status.idle": "2026-06-27T01:00:07.661136Z", - "shell.execute_reply": "2026-06-27T01:00:07.659564Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "length of training dataset: 60000\n", - "length of test dataset: 10000\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "train_img, train_lbl, test_img, test_lbl = load_MNIST(path=\"../../aima-data/MNIST/Digits\")\n", "import numpy as np\n", @@ -893,87 +191,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:00:07.663853Z", - "iopub.status.busy": "2026-06-27T01:00:07.663561Z", - "iopub.status.idle": "2026-06-27T01:01:11.238146Z", - "shell.execute_reply": "2026-06-27T01:01:11.237210Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:1, total_loss:284.997237059612\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:2, total_loss:188.79815976164036\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:3, total_loss:183.90105502608466\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:4, total_loss:182.7\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:5, total_loss:182.70000000000002\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:6, total_loss:182.70000000000002\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:7, total_loss:182.7000000000001\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:8, total_loss:182.69999999999993\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:9, total_loss:182.6999999999999\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:10, total_loss:182.70000000000007\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "mnist = DataSet(examples=train_examples[:1000])\n", "X_mnist = np.array([x[:mnist.target] for x in mnist.examples])\n", @@ -983,24 +203,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:11.240438Z", - "iopub.status.busy": "2026-06-27T01:01:11.240205Z", - "iopub.status.idle": "2026-06-27T01:01:15.781007Z", - "shell.execute_reply": "2026-06-27T01:01:15.779675Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.9\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(err_ratio(pl, mnist))" ] @@ -1014,24 +219,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:15.786800Z", - "iopub.status.busy": "2026-06-27T01:01:15.786408Z", - "iopub.status.idle": "2026-06-27T01:01:16.280406Z", - "shell.execute_reply": "2026-06-27T01:01:16.279294Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.92\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "test_mnist = DataSet(examples=test_examples[:100])\n", "print(err_ratio(pl, test_mnist))" @@ -1061,15 +251,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:16.283290Z", - "iopub.status.busy": "2026-06-27T01:01:16.282920Z", - "iopub.status.idle": "2026-06-27T01:01:16.288734Z", - "shell.execute_reply": "2026-06-27T01:01:16.287603Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# input_size and output_size are derived from the dataset and\n", @@ -1098,207 +281,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:16.290969Z", - "iopub.status.busy": "2026-06-27T01:01:16.290672Z", - "iopub.status.idle": "2026-06-27T01:01:17.889654Z", - "shell.execute_reply": "2026-06-27T01:01:17.888667Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:1, total_loss:32.912795298488625\n", - "epoch:2, total_loss:27.516426370563963\n", - "epoch:3, total_loss:22.888486273511155\n", - "epoch:4, total_loss:20.34304116675352\n", - "epoch:5, total_loss:18.995505492622872\n", - "epoch:6, total_loss:18.037974436127158\n", - "epoch:7, total_loss:17.432439555704953\n", - "epoch:8, total_loss:16.705715872125694\n", - "epoch:9, total_loss:16.33334026639665\n", - "epoch:10, total_loss:16.527876198404634\n", - "epoch:11, total_loss:15.30644525236212\n", - "epoch:12, total_loss:16.016784884200007\n", - "epoch:13, total_loss:15.942120933521043\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:14, total_loss:15.37374822603961\n", - "epoch:15, total_loss:15.137675519389836\n", - "epoch:16, total_loss:14.49887197267364\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:17, total_loss:14.16305801363231\n", - "epoch:18, total_loss:15.48701807473735\n", - "epoch:19, total_loss:14.660274353053168\n", - "epoch:20, total_loss:12.78907703027487\n", - "epoch:21, total_loss:13.436848379822264\n", - "epoch:22, total_loss:13.552838418240952\n", - "epoch:23, total_loss:9.790057285211436\n", - "epoch:24, total_loss:11.958259472644617\n", - "epoch:25, total_loss:8.523598412025178\n", - "epoch:26, total_loss:7.494516285379954\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:27, total_loss:17.3181739806647\n", - "epoch:28, total_loss:11.307454180226836\n", - "epoch:29, total_loss:8.17711187267412\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:30, total_loss:12.556339269456796\n", - "epoch:31, total_loss:7.212416746125583\n", - "epoch:32, total_loss:7.1898027254553885\n", - "epoch:33, total_loss:9.87739964645205\n", - "epoch:34, total_loss:6.041383985576961\n", - "epoch:35, total_loss:8.354390190811536\n", - "epoch:36, total_loss:5.864359327218853\n", - "epoch:37, total_loss:6.346876600785102\n", - "epoch:38, total_loss:7.678281535334033\n", - "epoch:39, total_loss:6.787107736893334\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:40, total_loss:6.7717688791189925\n", - "epoch:41, total_loss:5.3145745831067375\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:42, total_loss:8.435624037861784\n", - "epoch:43, total_loss:6.802409339189361\n", - "epoch:44, total_loss:6.161610149058332\n", - "epoch:45, total_loss:6.649262144175456\n", - "epoch:46, total_loss:4.82588099591665\n", - "epoch:47, total_loss:4.765359547839223\n", - "epoch:48, total_loss:5.88233472352701\n", - "epoch:49, total_loss:7.833472139567658\n", - "epoch:50, total_loss:4.044576153637201\n", - "epoch:51, total_loss:5.065926151227105\n", - "epoch:52, total_loss:4.875004864981223\n", - "epoch:53, total_loss:5.182787483656709\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:54, total_loss:8.137643713343785\n", - "epoch:55, total_loss:9.441096315408045\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:56, total_loss:5.322962109475348\n", - "epoch:57, total_loss:6.314929949935136\n", - "epoch:58, total_loss:3.4806002194195345\n", - "epoch:59, total_loss:3.661207020253595\n", - "epoch:60, total_loss:4.295308603569921\n", - "epoch:61, total_loss:5.059960240900545\n", - "epoch:62, total_loss:5.21355355106433\n", - "epoch:63, total_loss:4.38691079942881\n", - "epoch:64, total_loss:6.0250148812710504\n", - "epoch:65, total_loss:4.006162753999467\n", - "epoch:66, total_loss:5.720074610151459\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:67, total_loss:4.712761400808384\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:68, total_loss:5.168520872318532\n", - "epoch:69, total_loss:3.648191296042262\n", - "epoch:70, total_loss:6.325452372098929\n", - "epoch:71, total_loss:4.758284120607314\n", - "epoch:72, total_loss:5.306882309216254\n", - "epoch:73, total_loss:4.4938666672692005\n", - "epoch:74, total_loss:4.625061385703857\n", - "epoch:75, total_loss:5.051469055003512\n", - "epoch:76, total_loss:3.6898974460022584\n", - "epoch:77, total_loss:5.7374056092134635\n", - "epoch:78, total_loss:3.7144674846812897\n", - "epoch:79, total_loss:4.946209187164789\n", - "epoch:80, total_loss:4.847912548421224\n", - "epoch:81, total_loss:5.647376863066678\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:82, total_loss:4.569249377587947\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:83, total_loss:5.419922272125784\n", - "epoch:84, total_loss:4.261300987031312\n", - "epoch:85, total_loss:3.5630389278467107\n", - "epoch:86, total_loss:3.774046889581062\n", - "epoch:87, total_loss:4.382902546649984\n", - "epoch:88, total_loss:4.961165782207284\n", - "epoch:89, total_loss:3.888827902043524\n", - "epoch:90, total_loss:4.12949520432408\n", - "epoch:91, total_loss:4.366357513205353\n", - "epoch:92, total_loss:3.874538264402984\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:93, total_loss:3.636996826374803\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:94, total_loss:7.673077214679743\n", - "epoch:95, total_loss:3.7280600425229014\n", - "epoch:96, total_loss:2.1422780252097837\n", - "epoch:97, total_loss:3.278394539370065\n", - "epoch:98, total_loss:3.5470320758547094\n", - "epoch:99, total_loss:4.5049273286466365\n", - "epoch:100, total_loss:5.804618584310183\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "nn = NeuralNetworkLearner(iris, [4], l_rate=0.15, epochs=100, optimizer=stochastic_gradient_descent, verbose=10).fit(X_iris, y_iris)" ] @@ -1312,48 +297,18 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:17.893527Z", - "iopub.status.busy": "2026-06-27T01:01:17.893242Z", - "iopub.status.idle": "2026-06-27T01:01:17.919862Z", - "shell.execute_reply": "2026-06-27T01:01:17.918489Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "error ration on training set: 0.040000000000000036\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"error ration on training set:\",err_ratio(nn, iris))" ] }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:17.923882Z", - "iopub.status.busy": "2026-06-27T01:01:17.923588Z", - "iopub.status.idle": "2026-06-27T01:01:17.931023Z", - "shell.execute_reply": "2026-06-27T01:01:17.929962Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "accuracy on test set: 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "tests = [([5.0, 3.1, 0.9, 0.1], 0),\n", " ([5.1, 3.5, 1.0, 0.0], 0),\n", @@ -1376,741 +331,18 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:01:17.933389Z", - "iopub.status.busy": "2026-06-27T01:01:17.933090Z", - "iopub.status.idle": "2026-06-27T01:12:56.770082Z", - "shell.execute_reply": "2026-06-27T01:12:56.768454Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:1, total_loss:148.21290821886535\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:2, total_loss:91.92809023468917\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:3, total_loss:89.95472297531978\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:4, total_loss:89.01306311955564\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:5, total_loss:88.05471405726098\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:6, total_loss:87.72804575175529\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:7, total_loss:86.93619125795307\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:8, total_loss:85.79501208136118\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:9, total_loss:84.46697804765577\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:10, total_loss:83.85651467508092\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:11, total_loss:82.47548333944026\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:12, total_loss:81.50464955455206\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:13, total_loss:80.28551533481775\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:14, total_loss:79.56566441280448\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:15, total_loss:79.14206994302415\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:16, total_loss:78.0226233284735\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:17, total_loss:78.48454959293564\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:18, total_loss:77.91337107695324\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:19, total_loss:78.01688160983814\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:20, total_loss:78.35875028102286\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:21, total_loss:78.13756583399673\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:22, total_loss:77.96990409511119\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:23, total_loss:77.72333707508524\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:24, total_loss:78.62328635085098\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:25, total_loss:76.03958224710722\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:26, total_loss:75.439568997961\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:27, total_loss:74.80600093509969\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:28, total_loss:74.33014493281406\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:29, total_loss:73.94069005124106\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:30, total_loss:73.50839483827598\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:31, total_loss:73.20268087722567\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:32, total_loss:73.17248451715453\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:33, total_loss:72.52351520907712\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:34, total_loss:72.03636143501343\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:35, total_loss:71.84364042784816\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:36, total_loss:71.7311755900969\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:37, total_loss:72.6794639438994\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:38, total_loss:71.23310672741088\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:39, total_loss:72.46079863331452\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:40, total_loss:72.5948415129244\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:41, total_loss:71.27253303685123\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:42, total_loss:71.71953618085173\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:43, total_loss:70.52417447936269\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:44, total_loss:70.04233582990267\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:45, total_loss:69.46778932137015\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:46, total_loss:70.51921597411045\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:47, total_loss:70.38918343891932\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:48, total_loss:70.17580937065325\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:49, total_loss:69.95630575841054\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:50, total_loss:68.31685036843999\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:51, total_loss:67.95322320864001\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:52, total_loss:68.63812315512547\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:53, total_loss:68.17642274460644\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:54, total_loss:67.79825218819803\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:55, total_loss:67.44328354647436\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:56, total_loss:68.29031221365366\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:57, total_loss:67.44218848763964\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:58, total_loss:68.0210946752627\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:59, total_loss:68.50769384976209\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:60, total_loss:67.39327202490935\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:61, total_loss:66.37803712456447\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:62, total_loss:66.09921909346444\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:63, total_loss:66.14559504770372\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:64, total_loss:65.89682009932491\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:65, total_loss:65.78850533037902\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:66, total_loss:65.55503142694319\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:67, total_loss:65.54569799301048\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:68, total_loss:65.40188440972726\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:69, total_loss:65.2586554981169\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:70, total_loss:65.33544330314929\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:71, total_loss:66.77675821085754\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:72, total_loss:68.82115427304635\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:73, total_loss:68.43423906261155\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:74, total_loss:68.61844525818006\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:75, total_loss:72.08001372338893\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:76, total_loss:68.72255117172097\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:77, total_loss:65.19385152324037\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:78, total_loss:65.1369807653386\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:79, total_loss:64.69856251099463\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:80, total_loss:64.55543828498355\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:81, total_loss:64.43800743044909\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:82, total_loss:64.34235293125388\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:83, total_loss:64.2370080057394\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:84, total_loss:67.40044224735277\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:85, total_loss:75.72516719133378\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:86, total_loss:74.5356819943464\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:87, total_loss:73.90731174885096\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:88, total_loss:73.21067955866441\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:89, total_loss:73.09614224050888\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:90, total_loss:72.92346573797603\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:91, total_loss:72.8129758560969\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:92, total_loss:72.72914016712502\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:93, total_loss:72.43638857830153\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:94, total_loss:72.198933158585\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:95, total_loss:72.05339051462525\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:96, total_loss:71.98473114802397\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:97, total_loss:71.91683278452426\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:98, total_loss:71.86745778657574\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:99, total_loss:71.79430556250283\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch:100, total_loss:71.7582000717878\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "nn = NeuralNetworkLearner(mnist, [10], l_rate=0.01, epochs=100, optimizer=stochastic_gradient_descent, verbose=10).fit(X_mnist, y_mnist)" ] }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T01:12:56.772812Z", - "iopub.status.busy": "2026-06-27T01:12:56.772558Z", - "iopub.status.idle": "2026-06-27T01:13:02.530469Z", - "shell.execute_reply": "2026-06-27T01:13:02.529341Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.629\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(err_ratio(nn, mnist))" ] diff --git a/notebooks/chapter19/Loss Functions and Layers.ipynb b/notebooks/chapter19/Loss Functions and Layers.ipynb index 17e4d9e61..7a7835e40 100644 --- a/notebooks/chapter19/Loss Functions and Layers.ipynb +++ b/notebooks/chapter19/Loss Functions and Layers.ipynb @@ -102,17 +102,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -171,17 +163,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.03205860328008499, 0.08714431874203257, 0.23688281808991013, 0.6439142598879722]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "layer = OutputLayer(size=4)\n", "example = [1,2,3,4]\n", @@ -208,17 +192,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "layer = InputLayer(size=3)\n", "example = [1,2,3]\n", @@ -244,18 +220,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sigmoid at 0: 0.5\n", - "Deriavation of sigmoid at 0: 0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "s = Sigmoid()\n", "print(\"Sigmoid at 0:\", s.function(0))\n", @@ -277,17 +244,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.21990266877137224, 0.2038864498984756, 0.5543443697256466]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "layer = DenseLayer(in_size=4, out_size=3, activation=Sigmoid)\n", "example = [1,2,3,4]\n", @@ -314,17 +273,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[array([3.9894228, 3.9894228, 3.9894228]), array([3.9894228, 3.9894228, 3.9894228]), array([3.9894228, 3.9894228, 3.9894228])]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "layer = ConvLayer1D(size=3, kernel_size=3)\n", "example = [[1]*3 for _ in range(3)]\n", @@ -349,17 +300,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[3, 4], [4, 4], [4, 4]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "layer = MaxPoolingLayer1D(size=3, kernel_size=3)\n", "example = [[1,2,3,4], [2,3,4,1],[3,4,1,2]]\n", diff --git a/notebooks/chapter19/Optimizer and Backpropagation.ipynb b/notebooks/chapter19/Optimizer and Backpropagation.ipynb index 3081e0e09..b230213a7 100644 --- a/notebooks/chapter19/Optimizer and Backpropagation.ipynb +++ b/notebooks/chapter19/Optimizer and Backpropagation.ipynb @@ -33,17 +33,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -53,140 +45,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def gradient_descent(dataset, net, loss, epochs=1000, l_rate=0.01,  batch_size=1):\n",
-       "    """\n",
-       "    gradient descent algorithm to update the learnable parameters of a network.\n",
-       "    :return: the updated network.\n",
-       "    """\n",
-       "    # init data\n",
-       "    examples = dataset.examples\n",
-       "\n",
-       "    for e in range(epochs):\n",
-       "        total_loss = 0\n",
-       "        random.shuffle(examples)\n",
-       "        weights = [[node.weights for node in layer.nodes] for layer in net]\n",
-       "\n",
-       "        for batch in get_batch(examples, batch_size):\n",
-       "\n",
-       "            inputs, targets = init_examples(batch, dataset.inputs, dataset.target, len(net[-1].nodes))\n",
-       "            # compute gradients of weights\n",
-       "            gs, batch_loss = BackPropagation(inputs, targets, weights, net, loss)\n",
-       "            # update weights with gradient descent\n",
-       "            weights = vector_add(weights, scalar_vector_product(-l_rate, gs))\n",
-       "            total_loss += batch_loss\n",
-       "            # update the weights of network each batch\n",
-       "            for i in range(len(net)):\n",
-       "                if weights[i]:\n",
-       "                    for j in range(len(weights[i])):\n",
-       "                        net[i].nodes[j].weights = weights[i][j]\n",
-       "\n",
-       "        if (e+1) % 10 == 0:\n",
-       "            print("epoch:{}, total_loss:{}".format(e+1,total_loss))\n",
-       "    return net\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(stochastic_gradient_descent)" ] diff --git a/notebooks/chapter19/RNN.ipynb b/notebooks/chapter19/RNN.ipynb index 93a9bafad..63dfb92d2 100644 --- a/notebooks/chapter19/RNN.ipynb +++ b/notebooks/chapter19/RNN.ipynb @@ -46,17 +46,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n", @@ -68,139 +60,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def SimpleRNNLearner(train_data, val_data, epochs=2):\n",
-       "    """\n",
-       "    RNN example for text sentimental analysis.\n",
-       "    :param train_data: a tuple of (training data, targets)\n",
-       "            Training data: ndarray taking training examples, while each example is coded by embedding\n",
-       "            Targets: ndarray taking targets of each example. Each target is mapped to an integer.\n",
-       "    :param val_data: a tuple of (validation data, targets)\n",
-       "    :param epochs: number of epochs\n",
-       "    :return: a keras model\n",
-       "    """\n",
-       "\n",
-       "    total_inputs = 5000\n",
-       "    input_length = 500\n",
-       "\n",
-       "    # init data\n",
-       "    X_train, y_train = train_data\n",
-       "    X_val, y_val = val_data\n",
-       "\n",
-       "    # init a the sequential network (embedding layer, rnn layer, dense layer)\n",
-       "    model = Sequential()\n",
-       "    model.add(Embedding(total_inputs, 32, input_length=input_length))\n",
-       "    model.add(SimpleRNN(units=128))\n",
-       "    model.add(Dense(1, activation='sigmoid'))\n",
-       "    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
-       "\n",
-       "    # train the model\n",
-       "    model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=epochs, batch_size=128, verbose=2)\n",
-       "\n",
-       "    return model\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(SimpleRNNLearner)" ] @@ -223,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -241,49 +103,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: Logging before flag parsing goes to stderr.\n", - "W1018 22:51:23.614058 140557804885824 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use tf.where in 2.0, which has the same broadcast rule as np.where\n", - "W1018 22:51:24.267649 140557804885824 deprecation_wrapper.py:119] From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train on 24990 samples, validate on 25000 samples\n", - "Epoch 1/10\n", - " - 59s - loss: 0.6540 - accuracy: 0.5959 - val_loss: 0.6234 - val_accuracy: 0.6488\n", - "Epoch 2/10\n", - " - 61s - loss: 0.5977 - accuracy: 0.6766 - val_loss: 0.6202 - val_accuracy: 0.6326\n", - "Epoch 3/10\n", - " - 61s - loss: 0.5269 - accuracy: 0.7356 - val_loss: 0.4803 - val_accuracy: 0.7789\n", - "Epoch 4/10\n", - " - 61s - loss: 0.4159 - accuracy: 0.8130 - val_loss: 0.5640 - val_accuracy: 0.7046\n", - "Epoch 5/10\n", - " - 61s - loss: 0.3931 - accuracy: 0.8294 - val_loss: 0.4707 - val_accuracy: 0.8090\n", - "Epoch 6/10\n", - " - 61s - loss: 0.3357 - accuracy: 0.8637 - val_loss: 0.4177 - val_accuracy: 0.8122\n", - "Epoch 7/10\n", - " - 61s - loss: 0.3552 - accuracy: 0.8594 - val_loss: 0.4652 - val_accuracy: 0.7889\n", - "Epoch 8/10\n", - " - 61s - loss: 0.3286 - accuracy: 0.8686 - val_loss: 0.4708 - val_accuracy: 0.7785\n", - "Epoch 9/10\n", - " - 61s - loss: 0.3428 - accuracy: 0.8635 - val_loss: 0.4332 - val_accuracy: 0.8137\n", - "Epoch 10/10\n", - " - 61s - loss: 0.3650 - accuracy: 0.8471 - val_loss: 0.4673 - val_accuracy: 0.7914\n" - ] - } - ], + "outputs": [], "source": [ "model = SimpleRNNLearner(train, val, epochs=10)" ] @@ -321,136 +143,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def AutoencoderLearner(inputs, encoding_size, epochs=200):\n",
-       "    """\n",
-       "    Simple example of linear auto encoder learning producing the input itself.\n",
-       "    :param inputs: a batch of input data in np.ndarray type\n",
-       "    :param encoding_size: int, the size of encoding layer\n",
-       "    :param epochs: number of epochs\n",
-       "    :return: a keras model\n",
-       "    """\n",
-       "\n",
-       "    # init data\n",
-       "    input_size = len(inputs[0])\n",
-       "\n",
-       "    # init model\n",
-       "    model = Sequential()\n",
-       "    model.add(Dense(encoding_size, input_dim=input_size, activation='relu', kernel_initializer='random_uniform',\n",
-       "                    bias_initializer='ones'))\n",
-       "    model.add(Dense(input_size, activation='relu', kernel_initializer='random_uniform', bias_initializer='ones'))\n",
-       "\n",
-       "    # update model with sgd\n",
-       "    sgd = optimizers.SGD(lr=0.01)\n",
-       "    model.compile(loss='mean_squared_error', optimizer=sgd, metrics=['accuracy'])\n",
-       "\n",
-       "    # train the model\n",
-       "    model.fit(inputs, inputs, epochs=epochs, batch_size=10, verbose=2)\n",
-       "\n",
-       "    return model\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(AutoencoderLearner)" ] diff --git a/notebooks/chapter21/Active Reinforcement Learning.ipynb b/notebooks/chapter21/Active Reinforcement Learning.ipynb index 912d27b25..719629734 100644 --- a/notebooks/chapter21/Active Reinforcement Learning.ipynb +++ b/notebooks/chapter21/Active Reinforcement Learning.ipynb @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -114,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -134,31 +134,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "defaultdict(()>,\n", - " {(0, 0): -0.0036556430391564178,\n", - " (1, 0): -0.04862675963288682,\n", - " (2, 0): 0.03384490363100474,\n", - " (3, 0): -0.16618771401113092,\n", - " (3, 1): -0.6015323978614368,\n", - " (0, 1): 0.09161077177913537,\n", - " (0, 2): 0.1834607974581678,\n", - " (1, 2): 0.26393277962204903,\n", - " (2, 2): 0.32369726495311274,\n", - " (3, 2): 0.38898341569576245,\n", - " (2, 1): -0.044858154562400485})" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "U" ] @@ -172,17 +150,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{(0, 1): 0.3984432178350045, (1, 2): 0.649585681261095, (3, 2): 1.0, (0, 0): 0.2962883154554812, (3, 0): 0.12987274656746342, (3, 1): -1.0, (2, 1): 0.48644001739269643, (2, 0): 0.3447542300124158, (2, 2): 0.7953620878466678, (1, 0): 0.25386699846479516, (0, 2): 0.5093943765842497}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(value_iteration(sequential_decision_environment))" ] diff --git a/notebooks/chapter21/Passive Reinforcement Learning.ipynb b/notebooks/chapter21/Passive Reinforcement Learning.ipynb index 90f0db103..c34af27be 100644 --- a/notebooks/chapter21/Passive Reinforcement Learning.ipynb +++ b/notebooks/chapter21/Passive Reinforcement Learning.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -173,25 +173,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 1):0.7956939931414414\n", - "(1, 2):0.9162054322837863\n", - "(3, 2):1.0\n", - "(0, 0):0.734717308253083\n", - "(2, 2):0.9595117143816332\n", - "(0, 2):0.8481387156375687\n", - "(1, 0):0.4355860415209706\n", - "(2, 1):-0.550079982553143\n", - "(3, 1):-1.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('\\n'.join([str(k)+':'+str(v) for k, v in DUEagent.U.items()]))" ] @@ -233,17 +217,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Warning: Transition table is empty.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ADPagent = PassiveADPAgent(policy, sequential_decision_environment)\n", "for i in range(200):\n", @@ -259,27 +235,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0):0.3014408531958584\n", - "(0, 1):0.40583863351329275\n", - "(1, 2):0.6581480346627065\n", - "(3, 2):1.0\n", - "(3, 0):0.0\n", - "(3, 1):-1.0\n", - "(2, 1):0.5341859348580892\n", - "(2, 0):0.0\n", - "(2, 2):0.810403779650285\n", - "(1, 0):0.23129676787627254\n", - "(0, 2):0.5214746706094832\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('\\n'.join([str(k)+':'+str(v) for k, v in ADPagent.U.items()]))" ] @@ -327,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -343,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -360,27 +318,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 1):0.36652562797696076\n", - "(1, 2):0.6584162739552614\n", - "(3, 2):1\n", - "(0, 0):0.27775491505339645\n", - "(3, 0):0.0\n", - "(3, 1):-1\n", - "(2, 1):0.6097040420148784\n", - "(2, 0):0.0\n", - "(2, 2):0.7936759402770092\n", - "(1, 0):0.19085842384266813\n", - "(0, 2):0.5258782999305713\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('\\n'.join([str(k)+':'+str(v) for k, v in TDagent.U.items()]))" ] diff --git a/notebooks/chapter22/Grammar.ipynb b/notebooks/chapter22/Grammar.ipynb index d0f25a55f..291c2529a 100644 --- a/notebooks/chapter22/Grammar.ipynb +++ b/notebooks/chapter22/Grammar.ipynb @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -167,19 +167,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lexicon {'Verb': ['is', 'say', 'are'], 'Noun': ['robot', 'sheep', 'fence'], 'Adjective': ['good', 'new', 'sad'], 'Adverb': ['here', 'lightly', 'now'], 'Pronoun': ['me', 'you', 'he'], 'RelPro': ['that', 'who', 'which'], 'Name': ['john', 'mary', 'peter'], 'Article': ['the', 'a', 'an'], 'Preposition': ['to', 'in', 'at'], 'Conjunction': ['and', 'or', 'but'], 'Digit': ['1', '2', '0']}\n", - "\n", - "Rules: {'S': [['NP', 'VP'], ['S', 'Conjunction', 'S']], 'NP': [['Pronoun'], ['Name'], ['Noun'], ['Article', 'Noun'], ['Article', 'Adjs', 'Noun'], ['Digit'], ['NP', 'PP'], ['NP', 'RelClause']], 'VP': [['Verb'], ['VP', 'NP'], ['VP', 'Adjective'], ['VP', 'PP'], ['VP', 'Adverb']], 'Adjs': [['Adjective'], ['Adjective', 'Adjs']], 'PP': [['Preposition', 'NP']], 'RelClause': [['RelPro', 'VP']]}\n" - ] - } - ], + "outputs": [], "source": [ "lexicon = Lexicon(\n", " Verb = \"is | say | are\",\n", @@ -221,19 +211,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "How can we rewrite 'VP'? [['Verb'], ['VP', 'NP'], ['VP', 'Adjective'], ['VP', 'PP'], ['VP', 'Adverb']]\n", - "Is 'the' an article? True\n", - "Is 'here' a noun? False\n" - ] - } - ], + "outputs": [], "source": [ "grammar = Grammar(\"A Simple Grammar\", rules, lexicon)\n", "\n", @@ -252,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -272,17 +252,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('S', 'NP', 'VP'), ('NP', 'Article', 'Noun'), ('NP', 'Adjective', 'Noun'), ('VP', 'Verb', 'NP'), ('VP', 'Verb', 'Adjective')]\n" - ] - } - ], + "outputs": [], "source": [ "print(E_Chomsky.cnf_rules())" ] @@ -296,20 +268,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'a fence is 2 at 0 at he at john the fence at a good new sheep in the new sad robot which is who is a good robot which are good sad new now lightly sad at 2 and me are'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "grammar.generate_random('S')" ] @@ -343,19 +304,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lexicon {'Verb': [('is', 0.5), ('say', 0.3), ('are', 0.2)], 'Noun': [('robot', 0.4), ('sheep', 0.4), ('fence', 0.2)], 'Adjective': [('good', 0.5), ('new', 0.2), ('sad', 0.3)], 'Adverb': [('here', 0.6), ('lightly', 0.1), ('now', 0.3)], 'Pronoun': [('me', 0.3), ('you', 0.4), ('he', 0.3)], 'RelPro': [('that', 0.5), ('who', 0.3), ('which', 0.2)], 'Name': [('john', 0.4), ('mary', 0.4), ('peter', 0.2)], 'Article': [('the', 0.5), ('a', 0.25), ('an', 0.25)], 'Preposition': [('to', 0.4), ('in', 0.3), ('at', 0.3)], 'Conjunction': [('and', 0.5), ('or', 0.2), ('but', 0.3)], 'Digit': [('0', 0.35), ('1', 0.35), ('2', 0.3)]}\n", - "\n", - "Rules: {'S': [(['NP', 'VP'], 0.6), (['S', 'Conjunction', 'S'], 0.4)], 'NP': [(['Pronoun'], 0.2), (['Name'], 0.05), (['Noun'], 0.2), (['Article', 'Noun'], 0.15), (['Article', 'Adjs', 'Noun'], 0.1), (['Digit'], 0.05), (['NP', 'PP'], 0.15), (['NP', 'RelClause'], 0.1)], 'VP': [(['Verb'], 0.3), (['VP', 'NP'], 0.2), (['VP', 'Adjective'], 0.25), (['VP', 'PP'], 0.15), (['VP', 'Adverb'], 0.1)], 'Adjs': [(['Adjective'], 0.5), (['Adjective', 'Adjs'], 0.5)], 'PP': [(['Preposition', 'NP'], 1.0)], 'RelClause': [(['RelPro', 'VP'], 1.0)]}\n" - ] - } - ], + "outputs": [], "source": [ "lexicon = ProbLexicon(\n", " Verb = \"is [0.5] | say [0.3] | are [0.2]\",\n", @@ -395,19 +346,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "How can we rewrite 'VP'? [(['Verb'], 0.3), (['VP', 'NP'], 0.2), (['VP', 'Adjective'], 0.25), (['VP', 'PP'], 0.15), (['VP', 'Adverb'], 0.1)]\n", - "Is 'the' an article? True\n", - "Is 'here' a noun? False\n" - ] - } - ], + "outputs": [], "source": [ "grammar = ProbGrammar(\"A Simple Probabilistic Grammar\", rules, lexicon)\n", "\n", @@ -425,7 +366,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -445,17 +386,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('S', 'NP', 'VP', 1.0), ('NP', 'Article', 'Noun', 0.6), ('NP', 'Adjective', 'Noun', 0.4), ('VP', 'Verb', 'NP', 0.5), ('VP', 'Verb', 'Adjective', 0.5)]\n" - ] - } - ], + "outputs": [], "source": [ "print(E_Prob_Chomsky.cnf_rules())" ] @@ -469,18 +402,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a good good new good sheep that say a good good robot the sad robot to 1 to me you to sheep are\n", - "5.511240000000004e-26\n" - ] - } - ], + "outputs": [], "source": [ "sentence, prob = grammar.generate_random('S')\n", "print(sentence)\n", diff --git a/notebooks/chapter22/Introduction.ipynb b/notebooks/chapter22/Introduction.ipynb index d7a8c3d72..d114970d4 100644 --- a/notebooks/chapter22/Introduction.ipynb +++ b/notebooks/chapter22/Introduction.ipynb @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/notebooks/chapter22/Parsing.ipynb b/notebooks/chapter22/Parsing.ipynb index 5790825ea..c4267fa33 100644 --- a/notebooks/chapter22/Parsing.ipynb +++ b/notebooks/chapter22/Parsing.ipynb @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -111,17 +111,9 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0, 6, 'S', [[0, 2, 'NP', [('Article', 'the'), ('Noun', 'stench')], []], [2, 6, 'VP', [[2, 3, 'VP', [('Verb', 'is')], []], [3, 6, 'PP', [('Preposition', 'in'), [4, 6, 'NP', [('Digit', '2'), ('Digit', '2')], []]], []]], []]], []]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(chart.parses('the stench is in 2 2'))" ] @@ -152,17 +144,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(chart.parses('the stench 2 2'))" ] @@ -202,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -235,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -262,17 +246,9 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "defaultdict(, {('Article', 0, 0): , ('Noun', 1, 1): , ('Verb', 2, 2): , ('Adjective', 3, 3): , ('VP', 2, 3): })\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "words = ['the', 'robot', 'is', 'good']\n", "grammar = E_Prob_Chomsky\n", @@ -290,17 +266,9 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{('Article', 0, 0): ['the'], ('Noun', 1, 1): ['robot'], ('Verb', 2, 2): ['is'], ('Adjective', 3, 3): ['good'], ('VP', 2, 3): [, ]}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "parses = {k: p for k, p in P.items() if p}\n", "\n", @@ -316,18 +284,9 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['is']\n", - "['good']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# CYK_parse returns a probability table P[(symbol, start, length)] -> probability;\n", "# show where the grammar can parse a VP (verb phrase) and with what probability\n", @@ -376,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -386,20 +345,9 @@ }, { "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'S'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "astar_search_parsing(words, grammar)" ] @@ -413,20 +361,9 @@ }, { "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "words_swaped = [\"the\", \"is\", \"wupus\", \"dead\"]\n", "astar_search_parsing(words_swaped, grammar)" @@ -474,40 +411,18 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'S'" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "beam_search_parsing(words, grammar)" ] }, { "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "beam_search_parsing(words_swaped, grammar)" ] diff --git a/notebooks/chapter22/nlp_apps.ipynb b/notebooks/chapter22/nlp_apps.ipynb index 58d0b9bef..dd13b7074 100644 --- a/notebooks/chapter22/nlp_apps.ipynb +++ b/notebooks/chapter22/nlp_apps.ipynb @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -127,108 +127,36 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'i'), ('i', 'c'), ('c', 'h'), (' ', 'b'), ('b', 'i'), ('i', 'n'), ('i', 'n'), (' ', 'e'), ('e', 'i'), (' ', 'p'), ('p', 'l'), ('l', 'a'), ('a', 't'), ('t', 'z')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Ich bin ein platz\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 't'), ('t', 'u'), ('u', 'r'), ('r', 't'), ('t', 'l'), ('l', 'e'), ('e', 's'), (' ', 'f'), ('f', 'l'), ('l', 'y'), (' ', 'h'), ('h', 'i'), ('i', 'g'), ('g', 'h')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Turtles fly high\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'd'), ('d', 'e'), ('e', 'r'), ('e', 'r'), (' ', 'p'), ('p', 'e'), ('e', 'l'), ('l', 'i'), ('i', 'k'), ('k', 'a'), ('a', 'n'), (' ', 'i'), ('i', 's'), ('s', 't'), (' ', 'h'), ('h', 'i'), ('i', 'e')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Der pelikan ist hier\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'a'), ('a', 'n'), ('n', 'd'), (' ', 't'), (' ', 't'), ('t', 'h'), ('t', 'h'), ('h', 'u'), ('u', 's'), ('h', 'e'), (' ', 'w'), ('w', 'i'), ('i', 'z'), ('z', 'a'), ('a', 'r'), ('r', 'd'), (' ', 's'), ('s', 'p'), ('p', 'o'), ('o', 'k'), ('k', 'e')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"And thus the wizard spoke\", nBS, 2)" ] @@ -259,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -288,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -308,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -328,20 +256,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Abbott'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"the square is mad\", nBS)" ] @@ -357,20 +274,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Austen'" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"a most peculiar acquaintance\", nBS)" ] @@ -401,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -420,20 +326,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The Project Gutenberg EBook of The Federalist Papers, by \\nAlexander Hamilton and John Jay and James Madison\\n\\nThis eBook is for the use of anyone anywhere at no cost and with\\nalmost no restrictions whatsoever. You may copy it, give it away or\\nre-use it under the terms of the Project Gutenberg License included\\nwith this eBook or online at www.gutenberg.net\\n\\n\\nTitle: The Federalist Papers\\n\\nAuthor: Alexander Hamilton\\n John Jay\\n James Madison\\n\\nPosting Date: December 12, 2011 [EBook #18]'" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "federalist[:500]" ] @@ -447,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -464,20 +359,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'federalist no 1 general introduction for the independent journal hamilton to the people of the state of new york after an unequivocal experience of the inefficacy of the subsisting federal government you are called upon to deliberate on a new constitution for the united states of america the subject speaks its own importance comprehending in its consequences nothing less than the existence of the union the safety and welfare of the parts of which it is composed the fate of an empire in many respects the most interesting in the world it has been frequently remarked that it seems to'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "' '.join(wordseq[:100])" ] @@ -495,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -515,20 +399,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(4, 16, 52)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import re\n", "\n", @@ -561,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -594,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -676,7 +549,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -694,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -711,50 +584,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Straightforward Naive Bayes Learner\n", - "\n", - "Paper No. 49: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 50: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 51: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 52: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 53: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 54: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 55: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 56: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 57: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 58: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 18: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 19: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 20: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 64: Hamilton: 1.0000 Madison: 0.0000 Jay: 0.0000\n", - "\n", - "Logarithmic Naive Bayes Learner\n", - "\n", - "Paper No. 49: Hamilton: -0.330591 Madison: -0.327717 Jay: -0.341692\n", - "Paper No. 50: Hamilton: -0.333119 Madison: -0.328454 Jay: -0.338427\n", - "Paper No. 51: Hamilton: -0.330246 Madison: -0.325758 Jay: -0.343996\n", - "Paper No. 52: Hamilton: -0.331094 Madison: -0.327491 Jay: -0.341415\n", - "Paper No. 53: Hamilton: -0.330942 Madison: -0.328364 Jay: -0.340693\n", - "Paper No. 54: Hamilton: -0.329566 Madison: -0.327157 Jay: -0.343277\n", - "Paper No. 55: Hamilton: -0.330821 Madison: -0.328143 Jay: -0.341036\n", - "Paper No. 56: Hamilton: -0.330333 Madison: -0.327496 Jay: -0.342171\n", - "Paper No. 57: Hamilton: -0.330625 Madison: -0.328602 Jay: -0.340772\n", - "Paper No. 58: Hamilton: -0.330271 Madison: -0.327215 Jay: -0.342515\n", - "Paper No. 18: Hamilton: -0.337781 Madison: -0.330932 Jay: -0.331287\n", - "Paper No. 19: Hamilton: -0.335635 Madison: -0.331774 Jay: -0.332590\n", - "Paper No. 20: Hamilton: -0.334911 Madison: -0.331866 Jay: -0.333223\n", - "Paper No. 64: Hamilton: -0.331004 Madison: -0.332968 Jay: -0.336028\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('\\nStraightforward Naive Bayes Learner\\n')\n", "for d in disputed:\n", @@ -783,9 +615,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## Text Classification" ] @@ -834,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -878,7 +708,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -898,18 +728,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of words in `company` class: 49\n", - "Number of words in `fruit` class: 49\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "words_0 = []\n", "words_1 = []\n", @@ -946,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -963,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -985,7 +806,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -996,18 +817,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Apple Inc. supplier Foxconn demos its own iPhone-compatible smartwatch\t-company\n", - "I now know how to make a delicious apple pie thanks to the best teachers ever\t-fruit\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# predicting the class of sentences in the test set\n", "for i in test_data:\n", diff --git a/notebooks/chapter24/Image Edge Detection.ipynb b/notebooks/chapter24/Image Edge Detection.ipynb index db3c47eef..f707ed8b4 100644 --- a/notebooks/chapter24/Image Edge Detection.ipynb +++ b/notebooks/chapter24/Image Edge Detection.ipynb @@ -13,17 +13,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -112,18 +104,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "image height: 590\n", - "image width: 787\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -143,18 +126,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "image height: 590\n", - "image width: 787\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "edges = gradient_edge_detector(im)\n", "print(\"image height:\", len(edges))\n", @@ -170,22 +144,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "show_edges(edges)" ] @@ -276,22 +237,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAATAAAADnCAYAAACZtwrQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOyd224kyXW1d1YVz2w2+zTTI2E0smDA8Av5cf0EvjYsyxYkSJbm0D3dzVMVWaf/gviCXy4GqwXr4oeBDoAgWZUZGbEPa6+9IzJz2G639aV9aV/al/Z/sU3+fw/gS/vSvrQv7X/bvgDYl/alfWn/Z9sXAPvSvrQv7f9s+wJgX9qX9qX9n21fAOxL+9K+tP+zbbbry3/5l3/Znp+f1x/+8IeazWY1mUxqvV7XwcFB3d7e1na7rf39/dput7W3t1er1ao2m00dHR3Ver2uxWJRz549q5ubmxqGofb392uz2dR0Oq3pdFq3t7ftvOl0WlVV6/W6ZrNZrVarms3uh7darerg4KBWq1Wt1+va29ur7Xbbfvb29mqz2dQwDLXdbmsymdR0Oq3lctmOr6rabDbt+lXV5jMMQ/uhz6qqYRhqvV63459aseXa7nM6nY6utdlsuudut9vRuKuqptNprVar9t1qtaphGEbj4Of9+/f18uXLOj4+rtVqVZPJpHutyWTS+qmq+v777+s///M/69tvv629vb1aLBb19u3bevPmTd3d3dVms2nzvb29rYODg9putyN5eQ6eB3PYbDY1m80efY+OU57IezabtTlwLvNCNsMw1GQyeTTfHIc/22w2NZlMRv3xHfPx9axzzudv902fq9WqfT6bzWoYhloulzWbzdqcfG3mg26Q193dXbNh5MGc7u7u2v/YBn3TD2OfTCZ1d3fX/MVyZly2d+yU8U0mkzZXbNry6vnKdrsd2T76tkw3m03t7e3Ver0e2SU4MAxDnZ6e1r/+67/WTz/9VJPJpBaLxYPQbde9D2lXV1c1nU7r5uamlstlU+B8Pq+9vb0mgNlsVvP5vGazWe3v79f19XUbJMaPwiaTSS2Xy1osFlVVtVwua39/v00S0MJhENBqtarDw8P2/f7+flMSfVVVE8Bisajlctmcfrlc1mQyGRnDer0eGeJqtWrAYaUxNpSHwuiHa6JElIShrNfrESBst9sR6HkcNgSOBfA5FmPgfMbtuSAbAyhjRCc2HPqh8TdGxhzsHJaJgYGAgR64Nk4KCBkQkBX9MI9hGJrO+Y28DULIw985qEyn09rb22ug5+/44X/rwr8dQKx7BxQHR65pG9psNo/kbFvAbwBM7BVZMQcasvT/XAdZ83cGfdvG/v5+A1PGzv/0a9khYwc05utAgQ+hO/sz+pvNZiP95Dh2bfXaCWAnJye1Wq3q6OioKYWB7+/v12w2a863t7dXd3d3I0CaTqe1v79fwzC0vtzPwcHByBAQ1mq1qtvb2xHjw7FRhvtKJYHk7t9Rz8p0VLDS7PyOMjgI56AkK5Y+DD42Ovp3v3ZGMwzLq8cW+J7fNojNZjMCR+Z4eHhYd3d3dXBwUFUPwYBm0PC48zODQNUD68KBsIuqGsko+0CvZl6O8Hy2XC5HoGkGZdklKKAjZGHHQi7L5XI0TjuagxRsKuXO/DmGPtGJMwGuaxn6GtYt87fsbDcEfQdmwMB67AVe5IHebHOQE+SCbMyMexmGfY3rWRduDvb8bT+17p9qOwHs/fv3zQEZGIK6urqqYRhaCsh3AA4CWK1WtVgsarFYtNQQ9Ofvu7u7qnpgEkZrGzVMy8rC8Jk8qe16vW4gZzrbJi5QMDByPOfaCFGoGRXysdPwPf1zjo3HinGEXS6Xj9gcqTPOmnOz4mkJzk4xbDhmRT4v2ZnTx6p6NJ5M9ZyW+4exYi/oOFmT2S7NOjQAmhHMZrNmX5naG5js2A5WZnAwFc/XqaLBk76Qq9kY1yM1dFBNlpdyxnbIgAzs1gVpv+0CEE3AS4ZLqmn7xw5hj5a3/Yg5YgfWc0/uyMLM0nI0c/wc+6r6DICdn583FoRRL5fLBlAIdLFYjIwSByF/J+ozQRuBc2sml7UCjJz0ZL1e1+3tbRMQgvbEDw8PmzFm3cQOhmO7TmDnT1aWaUkaAr99PjJIA3Af9Etqzmd2MObo83xspmeOpuiPYx140INTOddfPP6qB1Zix7A8aTZQ5MS1nLaSZmbdC/316mFmo4wHlmWmhQ5sU5xvQMAG6A+bN9CiM7NrzkV+ZltZckjAMoOzn1nnZDro2UyJwD8MQ8t0Us/JXu23LlVkWm8ZYwvOJDITMHPNtNw+A4kxCFsHZo+ex1NtJ4DN5/NWpKcGRQGfKDefz0fp4f7+fkPzw8PD9hlO4RyZiOHUBwETsThmsVi0wj+RMalqGjLnGpBc0zHYIMy7u7umeOgzfSTwudaA4TqKca4VnWmgDZ/zzJjcp5kTzcECowZskC3M1nUJIqwNnjGahSDjTLW5ZoJLb65Z06uq5uD7+/vN+WwXmVagY6cs9G8GjpM5WBpos4Rg4EROaVtmXHl8D6Bt1wYFjjGbMwt2EDXLB1AzLXamYtDlfGcIlFMYF5kFtpCpHw37TaboudhWnM3YNjiP62cKb3u+u7sbEY5dLGwngAEiCKqXAx8dHTUw48JpEEZkGyr/54qUDXFvb+/RggGG6XEBsK7ZcH5GWrPATDOPj49HrM5Ak+yC87gO13RzkTeZg50sz03jMEuw3HpplqMov5mPr+Fg4RUmjnFkzboE7ABjtCxwCOTeK347HUuwTBZr2/DfDlB2fKfo/DaDZC7YYrL+dFJAwONCf54/bHt/f78ODw+bnu2omV4D3g5iMBX0jn5sSwTXXprMGJA1Qdm6t207hU9QYRxeUaThWw7CjBkdGNgcbLh2LhTYNpPR99pnAQwDOTk5qeVy2WpUTj9ub2+bMiaTSSsKY+QwtuVyWbe3t6OIOZvNarFYNAAAANfrdVsMsCHhPDYgxpqrfQYJxmNjT0YI+jvaUbdglcaG7ojr6zBet6wdZDrhdMRzNFD6x5Gc/qw31xVsmMzb47cT7mIIfG9AzbTHDIa+uV7qgbkzP4IJx6cMkk2ZFWZKaHkzfo4zGJAeuTnImLXBcviclXJSchgwtp61smTe/GSth7Fjh84oDHxmfslUPCf6J1iYHeOL9OOSiQMNJMHBGAywnrA3bBq5IWenmNb5MAwjJmiWv6vt3AdGSgfaIzSofxac7XwYNwO8vb0dpTZWlJkJq5gInOPSwblmRgbn1DacpPo2fo/DKSnRr9d/pjemyTaaBLKn6LDTNANbOjpzTibjKGdDpW87r+WRKSTf2eGSQZppmb1gM+7D3yFfM89kXcjILKOX2ni8lpXHjh566Zfn5mv0or5B0TpMZkjtq1fMTvtxMEwWbeaN/rIho96Kpo9P+3RAs+3TTEyyP1/LqaIZNscnk3Ogc7B04E2byPn12k4GxsohBfi9vb1GTZ3D2imcbvAd7Mroa8bkwr+pLQpwfcffcR6ACd11f1UP4GnFpcBt0E55cYB0ZloaoNmLQRS5eI9P0v8EFYMpyrcTGbTS2a34HAfAbBlwHXTAdwCSGabH6jmYOfBdpnecbz07WPTAqsdmLZcMPACEZcGcXMYweFlGBgenqS5Z2OYNAq5JeqUWO6uqxupprrEmM8/A6yzDzNnzSPn6ewcRrsl3Ls94vBlEHQBovfIK55Faey7WuwET2wd7evofzenJb6pGkfLo6KhthyA62kA8qbu7u2YALP86QlOIR+AUnrOm5Z25CAKlYiDug+twHkKB0hsk6SPrPTir04Ze/p/Nykx2xFjp29HYaSDjSDZmMPB4DVR2Ngw7nRq9IV/YWjqTC8DIiWuaFSewwsoMLICJdYhMkgV7/D1wMijZDpJNJWOy7DwfBxaag1nWIJPt5uKHUx8Dnut8wzC0Egx/u17ma9APY/WKtsGKcfc2AufYE3ATHA1sjMnbUlwPY/yWretptivGVvVQV3N5wW0ymdTh4WGXIWbbCWAvX75sdSscGWMkzRuGYcRwNpvNaMf80dHRSAjr9bpOTk5aP6yQmIJTkAd4QGXAkXNdxHZNwAyMMbLCQ57tqIzQXHRMoWGQGSWTSfg2j56SHOU5BwNM9sDxTgHzPDcb9q6Uy/TeUa5Xr3JJAAbpeojrclU10qXH7/SW5hQKmRjg3C9BygsGjNGA66BhmXqfHraYzoEzWgZmbpny9JgbY8JWPAbOTTZ4e3vb5ulgb3tkDhlgLAtnNS7yW94AsxedHCDJEHxdAgv9ekMxWzmQjQMu9XKu5+ysZxNmg57nrrYTwD5+/FgnJyftliAiDxM1InszK7+Xy+Wjovh8Ph8VMCeTSbsNaT6f13K5rL29vbq6uqqqcZqQ6WEWsXHIxWIxoqcsFU8mk9HKSVWNdmCn0TE/rzbZOVCcKbkZlh2Q62DMNtjsy7VFO0QaG/NmPLnPK6Nuj7liQOjLjoZMnOojU3bxcz1YBccxLp/rORkkDMxZEzHz8H40g4FTNTNpA2SuBNop7aiwSLMXdOC9XcPwsF8ui/DILsGf8ZCC2lbQP9ciozBztkywKcvRzNIAnWzZZZFk1AZN+wKlIPaAunzhQJJZkLfvpIwchPkuS0nuv9d2AtizZ8/q6uqqttttY0QocbVatXpY1UPEQZBJZ5nY8fHxqH5mug5bY/US4RtkiDxZXHcqS4SdTqej9BTj3N/fb/Nw/QwFomz681hcS/P8iGjMic+h3t7RbZBgXD7XNbBMkZyyeRc9c8iUvmrs7L4fENBh7mYwjN8rTTg97MvRFsM3++Ma9Js1FQMMc3df6DuvlyCFzLJOxzV69RkvOjFPM3hkn8CTfTE3gN5gacfzjnhk4OszB+ZpEEGOTr2YY+5R7DWzXjIZrosfGGQoMxg4uQbZGOfYD13isU0hb/sqLf2AHQzGiF1tJ4Dd3Ny0AWJIZjleJkbYRPGq8b1hHrjzaf73KkXevoNQnPaZCfJ/KotzAEgMzcDH+PnMqRsA19uMSP/+2wqxY7o5WveiEi1Tjh7r9F4fX9OO1gsUgJ9TIssNoLejePw4eM7TAczXzBTK10+ZZUqXjNX9OqjY5pAxn2eNxd/5xnOPIdmv58VxXom3nWJHZnYO9paXZUq/qTeDv5mlATvtyPPwthZvm+A4fA1Z+treymT59gDXtogN2qd61/VxPs+481Q5pOozAHZ8fDwSooGAWlXVw2M7UDTRgtt9vL8HRmSQQsjU0kwjzQoccfmevr03zcyolzIx5p6DpKPzOzfg2fmsIMbuFR0DQc8Ze0ZU9VCjMrsxC3SKwbE5NgMe/QDsBiEfS2riFJPzM5iY6XCOU9DVajV6kkmmBJ4X87DOneI5YFpmGH2mre4rm0E/WZB1ZTlhB07/bWtcv3edXqM/Mhb68FMZvEjjsfknZZqpY4/FOnBlQM55uObpzw1c3mmQQcgLRWZVBndfP1cs/9cp5Hw+b7vbGbipuj87ODgYDY4o54n0Il5GUJQKE4PyOg1JI3HBMBlR7jJm7CgVA0zB2jAc9WwUHJsRyuDisTDOHghxjNmTUww7stmiQZm5UeezA3Mdr2J5Xh47f2PMrkHxGSvJHAvAGFSdyjMHAAZgyBIAnydLR5fM18BO/+jRunTtKFtPp4yJIrLZpPXglMvf4Yypk7xGBljOQY5O4xw0HZCtP+vJDJMfkwH7GkV7jsn6H3rknkzGwW+uf3t7O5qrdYKNMN9kzLnhlz7/bgA7ODhoE8IpMEoKes6NF4tFu1fSAEKB2BM/PDxskZ5CP8+oonFbjydpCktfBiAziaT1vv8LQTqycA4G5J3Hdsxe2mRQQwGZxhFd/F3WVczcemluT9Gu5xiYq8YbEx2Jmb+B2mwDfXG85VE1LmjP5/MRezQop3G6tojzuPjLsSwg9Awa/ZmJeY7YgR3JTsw4uH724wK4g4htgU28vqYZO2MA0MySXcvlOC8g8Zn1y+8ERsvEK4TJmlxbxC5sh4wfvfoWIsDUwIlteA6QE/pg/PSB/J1iuznwcOcL43qq7QQw5/cMHMF564QLwTAMJuJVDhRhJuInVtrYN5tN20+GEMxGnG44sqQBcwyfOdoZfCxA03j6yRw/f9NnRjiPN5kZ83JqgKGl8yVgJyA8peg0Eo8JWdhJbIjM34ZvtohOuYXMY6T1NjB6HvRjoHDNtFf/yDk50PR+qsY1GYOQ5WKGyJiSjVSNGWemcAa7ZJjM0U9bQMbWhefpwNmTFde2fvIzp9EpY9tMruZyvOtmPj51Zr9MpuqyAr6cpCZLMdbdU+2zDAyGZENar9eNQTF4Iip7uJggT2N1rQTh4iywtun04a55JuUagI2J761QG7wVkTTaoMSYLExfwwzASnGUpQ+ajc4Rvqq6Rp/G6d8JigYvB4MExtQXfTm19PgdQPy4YcveK1YGPJqB23KzUyGD3vEGx95xlpNl42BlOZjt2fESiJ7SKc3f+TOz5dShQSNTTo/TZZgcp8flQIe+eiw0yw62W8smgyv2b7tKfViHll9mDMMwjGTDZ+m/XL/qgeyYiTKeXauRn2Vgm83DY3GM7CBpsrPJZDJ6QCHpJGDlpXHS0uvr6/a3H0joCef1rHSPwcZjZ7OQU5BQfQSGgzu9wYBMx6v6t1kkyDq9yaKwlWsnzLTJRuQ5VY1XlgAaU/RMr/hsl8PmvGDajDFZie3DINtLsWm5k91zy3m50b9ZS9aVnE4/Fcn9vR2Ghh7cB5/b0R0wbCMOQgn01r0L7AYy25CZIWNwn8zFnydrtmw9XsDY4Jf67QVS26jBK7/rgabT9aqHnfq5+t1j7247b+Z2Cgfi8zuL5k41XEcBja+ururZs2cj1OZ7lph5/phT0owyKJx+MbLZ7OH5YbAJanSTyWT0FAwbq4VkxmeFAIim2F4QsGHaKOnbdSEDcjIQA61B2IZkMOfc5XLZnhZSNX5Olft2FHb65BTXCzRERdcMPV6nBwYNG3sv4ia4pmzNajNYGNx9voNoBgb0ju1m0d+AZBn12KU3aOZCDHq3jAzoBhfrw1sGMig4WFi+2JUBxM8T8zFe8IEouH7FOWZbfp+E5+MV6iQK+AWpc6aYrmNbBtY3W1N6jLTXdjKw09PTkSFst9v26BuiBhf043BobEydTCb17Nmzlnoa6GBsTq3YNNuL9jyuJLdQIFBviEMAXPfg4KBFG54xZnruiGmgRcn+DDDnOyvCxxronDKgyKT7VY+jXzIixs54kb036HIs4yFNpi8vJiST9QKHHdkOttlsGtM2qCT79I5yp03IxP04YK3X67bXMBdUiNzWG2NC7r4jBHZCkduOSp/exkBfBiBkgA3lijZ9OX1KxuH+sGHLi7G7pOH+nSojL4/TKSJ/uyadWQf9JWNmfMwz2TPH+j5nxsRGZ9u4wct2aR9PZlj18DjtXe2zT6NAYavV/cs9eL7X8fFxE/T+/n59+vSpTdpgBpAwGK9YQRkxBvp0zQ2hg9qkoUQurmOluRaAgNfrdXuaBQ6Uhd2qx9sYrDAzJy/3c60sxDpqojgzBs8ro00aVNYUemzEwOAXdRik7SyOsE4RDQLIlWMMaN4Z3mMrnJMszHO0cyN77/Zm7gYkxsB1WOLHWWAGzhCcqt3e3tZ8Pm8voWFV3UwV2Tv1ytU1ZGO24NqibYInUDhg5aqe60EJMJY7/RiMnS7yO4Ojx2oWZf15O5TPR1/oAv1jS6ljMzGDEnaGHpgvzfdwGvSfajtTyOPj4/Z6MrY42NG8E9k3XvPbObejS1J5HI5I7OVtKz2jnp3b9JyIu8t5bBj87wjm61iAKD7TZUd/xsDfXqHx5x6XHdLjszHxf9J/j4PmiEd/7t+1PAMF35lpMT6DJ306wic78G/PO1fx0CsOzfV8fs7FvzMAJROkP/dpXTvdJ0D2mvs2o+6xlKxReRwp0x74JKu0bCwf24fHYLDytQDSlBfNd9K4+Zg8xxkGNpoppAmFAyHkxtkWx9ufnmp/061ETof427R/s9mMbu7lczsXEyL1QgDe6+PCfjK0qvF9XF7lwVkxPCvb4zZrqRrXfuxgBhPfuFr1+OkTdkrmkEaT4JHKdgqHQh19bQhZdyOiue+qx3UNg76Pca0xAdfXsEx8fA/UaHyWaZvtgf/v7u5aKQEwy9QG0E2wsAN5tc7OSF85H659e3tbt7e37R2oBG76z7cC5eJAysggh2Oa9fIdP5a5mZlZjnWcgdUsKetqyKIX7L1PkH4MrAn8HoOzHV/L4IVf0K/7cyZFWYdzfI0Mzm47AcxMyPtnEASAksjvG1tRHK9Pg2kBTp44fWZxkOZl7xSkv8/akql8AkOCh43B5/dYUwrWffv7NBLkyd8JFkQwp78GjwQNpzT528aSsvOc/T+LKJaxj3Uhm/PsVHbiHvBnaoAevHnSunXEtu6sdzuPZekxcbyd3amft9g4VXKKmXp2CaFnE7bh1LOL6y5p8J39zT+ue6VdmBlyzQwqtqGnUr9k9bmVwd/nmBiP02n7JHqy/xG4bDOWx1NtJ4AxINiVEXQ6nY523Bt4zHiS7mdx2ALNKOPr8T+CSlCxcgFRb7vopXw9YTqae3wumrulQbh+wfFOfVGGC5iWDwzVDmuwM3MYhqGx1pRzKj2dyOM26FFHyvcJZv/0lX2wQm255aZJsy+DCKzn7u6uPTzz5uamrq+vGwPy+N2n++F/O3Ev8AA+2B02Q6MgfXNzM1pQoJbam3um2rYj7DMZTjJFmu0wdZsA5jQ2QSTLG2kXBuLUjQHRPseY/ex/PyAgQZkGm82sh+9o9tveuNv4n/ymqhmyX0oLm2Flz06N89n4fTyO7HTOtZxkFEzcj/RAmMkk7Ez8dvTyUyucZmStwNHc5+d+oarH+1ro30BqcE5K7z64hmsFmWoBWAbZvIMh6zcJUDZOjNvRGACyXpPhIUszlGQkCc5PFXLT4bEHg4sZmY+1syeTwHkdCBIQEtjMeq0bGFjKNcfhwPIUO/GxfEfdzY9rpw9sIJl96jrnkpmLx1L1+Pl0zMOgMQxDW1DLQr2ZauqMsTMGj8UlKc+J822jri8+1XYC2O3tbXu6qot/+Swts68sHrMA4KgAcvMo3aqHVzSZViZb4AWoZiUGtAQvFwxRkGmthW4jtyJwoFwtZE7JrJL5GIwYrw0ABboG4LnDrjJVMdBmFPU4ONcOx/mkit7EaKBxBHa09EoRgG3AMIO0A2ZKkkwa8ExnZAV7sVjU7e1tXV9f183NTYvmTj8s9wSXrJHaln1eApfrU67H5vYOs8DUr4M2srUM7Dt+/A3n+H2leb4bx7hkYobo8dg26Td9wYBsG0pbcW3LQOssAqzwmDabzQgzfHO5a6FPtZ0A5khp5aKkXMbt1ahgZKA4A+JG8adSGjsejmBnTppsttADiaSijmIowyzLCwN2KubGuwFs0PSbMnRa0ktdzfDSIA1odqKntmykAXuOBiP0wfcGQa6RkdmO3XNMfjjHAQld8dt6ppkh+XOXEKbT6aMnI2Q66vFm/4zZ9+LaQbwY5eK9WUGvlOCA6dSV5mt43nZyZIW9eX5sR7IN2E7TXyw7Wm8RweUTxmN7NKCkjmxT/G/f9bUyi/B4XW/NBanUYbadAIaiqSnRqUHLF2bvUQKHBZSrI5vNZvTYHBSAQCwEO4cnxTh9nhEcYTlFyKLiZDJprKpnDKbrpMqM30JOA7IyDKLIxQrLVVaO8++k8mZhZmhJzc1qDfB+6oTn7OfPI0OzXubo1eiM1DmWBFunqskisw7D3wZkHuGyWCxqPp/XfD4f1dGoD/JQPvZ9ZU2R5k3Zh4eHdXx83MASZmm7ZKxOpf1OAOZpUPULMhycnXnYxvEJUrnMTlIu6RsOzJznOiVj8TkOZMgtMwMIRdqu7d12kKup+BDpc/pMLwD12k4Aq3rY5pCT86uh+O3H1SDIFGCme1yDSTsSuAaAsjP1wPncp4HQgGGDcVTl+1z54/OMILkiY7DIVCnHz/EJaBTPiUhOfdKJvbWklyIYAPjcoNUzrAwqnmeCuVlDPsguU1vPwf9jvHZWM2Cn3J6L5WHG70UWs7W9vb26vr6u29vb9oiWHmPnehyzXq/bRkvm53sNPS6XEQw0jNfjtpzp13LNYEjzYoj1mNmIwZI+vOHYNWAznCQlvXQ/s55svTkyp9zqlAyS67GDIUsAT7WdG1mpUSUi+34lWARRbjp9ePZPsikoO5teeVIFBoMh+J4pKymdgAlCr71QYOWQxqbDoNC8A97Xgd310p2MXHaKXmTzd+6PvhyBzcQyLfUbXtJozN6Yd9V41zvzctoCECGDvJE6jYkn61p/HmvWQtlG4+tnMPn2229rf3+/bm5u6ubmZsTmqh7uzzOIGeicMWCTf/rTn+ri4qLOz89bf7zbwfLAFpbLZT179mwEqsjz8PBwBLBHR0ftntuqB/Db29trt9GZvX78+LGur6/buEnP8KWsVRqkDJLWuedgXdAgG2aRtg3s/ykGh48yHo4hkOYz1czUM3txOSUXm5hXZhz5d7adAPbhw4f69ttvR9Ge90NikAglHxVNgRijNvoDgvyPYXv/mA2VSTg1BACdezsVQhimvgYV7zHJ1NS/mSPGxTyTRRmsMEqc1ODMXPI6NDOZZJoGZQzg7u6uzs7O2nVxzKoapeXJ7Dx3rsvfPN6b6/QeF4wxWn8OMhg61/TN43nfrI15sVhU1f1dIFdXV6NVUZ47lozWDspnfpY7AWo+n7d5oEevMGLXnz59ansWOX82m9XNzc2I6QNe5+fn7ZFQ9L1YLBrzOz09bYD3zTff1I8//ljD8LDC59u+DFjI6qnAbAbNOLOUgv56YMcxmU5WjVM9lxeyJaPCNpxZmCTYfowT9t9kuL2STJvzk9/U/c3Yl5eXzQB5UsQw3N9wfX19PRK8H2BISuTGwLwszFMiZrP7F4VQc7BgzPYAJfqmyOqVG7MZBMGenixSZ8rLeS40oiinZlmvoLmeAYglqHoFyPUQs5GnQAGjROnoJNMWp5UYX6ZnXpzIVV07iFNWp2+cy9xw6KyPIO8em92VavEYJ4ya+xczzQK82JuEUzDOw8PDEVtk1QZIOCsAACAASURBVJJx2Xb4jHsCM5Bhc9PptO1T495g2wD9PHv2rE5PT2uxWNQf//jHev78ef3www+1v79f//zP/9zmdX193V456PtemZMzCezCAcmgjq171z12gC3yeT7i3XZA3/v7+yMCQfNeRmzBPuSgaHaVcrJNZmbRS1XddgIYBulIihEsFouRUfOZ0zXTzaS5Rtqk6gYFRwanfPTt2lHm/tm350Dzo259XdN1MwQbDQKnmalxLIr28b5GppL8cFymlY6ymSrk+PncBpH1McvbIJtMwHO0EZtFcnzOyUvoNAexnD868hK6V8WclmXKk0HHgcINObh+ljVB92tb8Dai6XTamKGd0Cn1xcVFffz4sU5PT+vs7KwFDhgbm2QZR6/1nD9rZ/YBvmM++XYh+0nvGgarTOXRj/WF7DOg9/q2rJ6yGY7LxYFsOwHMVI4VHRogNAxDi0CkSmY1rLrwghAEYIBJp+PapCdEdKd/CS4GK85Pp8yaVwrYAG2W5GsZJK0AK8VzSQVZuRg5feNkOQeDvSMrzMlpsMdmJmLZ0Y+jL+w5AaCqRk5tQOEzgwNzNJNwqskxmb7SB/LH4YZhaIExgYLVa1gK+k1WlyybJ86SPvHcu2EY6vLysumMjdoEB2pdDsIA7Wq1Gr3o5Lvvvmv6mE6n9fXXX9fZ2Vn99NNPdX19XbPZ/YucKcUcHh6OHgHFtX7++eeWVkMkshziQGDGw1hdGkhfcGBzP7Yp94eP2Ab9Xa85aGem4RTSY3fp4O8CMJSEQOnc6SFFeYNMOuzBwcGovuVCK8boR+WQOg7Dw6Nh8lVu7q/qfuMtWyHs6Bxj1oKR8j1CxnFcEO0p1umEI0cyQC/ZJ+NwxOVavmOAeWR0d/QyODEGzjezoHlxJRmH2Z73F/UKrpyT16RfA7MjqYu1ZnNZ3/E1Dw8P26qgU3hWMuljsViMnIXarIGdrAIdWzdO/WFGMHdsh3kwB+xqOp3W0dFRu9YPP/xQV1dXdXx8XK9fv67Dw8P69OlTHR0d1T/+4z+2wE6pABkxrvl83lLQ58+f19XVVWNqdmjXsghEDurWF3+bfCTo8Bn6h/EDntafGaDPRS70vYs99hgYzfXcp9pOAOMCRnPyZiI4wONCIBNZLBZ1fHw8AhMizmw2a899qnpMSzEoPyyR5+ZnPu5H+vhzM7XN5uH5SVYQ4GdnI6ryeVJoxsuYHSX43M5tkE0qDSMwi3GqlBHIqUbS/F6Nw8ZhluexbLfbVrT3rUoOYG4GU+ZoALTxOg11pPVxdkrm5OgLSABIGf1hZjwogEyAv81syRhydQ17gS2aSXIeNk8fyBn7AxiZB8X7v/zlL3V8fFxHR0d1dHTUxoaM7u7u6uLioqrunwAzDEN98803o1LN8+fP68WLF411vn///lHQ8RzzrUkGCKeYWULxgkmWZXo2YJBBZjBvs2HrluOMLW6MD59+itlV/Q2PlMaAbm9v6/z8fFT7MhWn9uVCIw8/5HgKlhSeWXZ2VHNkREAYiCdsgzfTQnneuWy094KBGSDNtD9TQoOG+zXoZsPoM331fB0JzWCZfxacncoa+D0eF4LNMCwHj5fnvXkuZjLIxiUCF4bRL79xbIOB93khBz8D3foz0JJ6Yhs4f26fwUa8wIOu0ZcDGrLAaQFby8IBjSe6unZGult1zwAZA2wMVr3ZbOr9+/e12Wzqq6++aosLOOkvf/nLury8rJOTk+a0q9Wq3r17V8+ePRsF8+l0Wm/fvq1hGOrDhw/NT+3oDiLI1Wze99Bid7lSbrt3YHZQghU7LSS7guz4abdm49ZJBkmz9dyS4/ZZBuZn1OM0GJJ3ozNY0k2ilPNZHnnMAKvG+4Wy6OooyDI1q0NO/7Ke5gctonjXdegTI0OgMJuMWB4rArcSnRIhIy8c4KgYTa+gjJzW6/Wo/sNmSq6HQ/A3BuV6AmPKCGrGasaGvgzeyA8nSCbDylTOw4aeWwD47bqc65H5Gdf3HjU7BLUkv5/UwM6+LYMScvIWDqedfI/deAwG5M1m09gSDKaq2s5/p1JV9+API7u8vKxhGOrdu3e1XC7r1atXzbb39/fr4OCgjo+Pa7lc1tHRUZ2entaPP/5Ynz59qoODg7q4uGhpKds4ZrNZSzP9OOosmwBsXiBBDta37Z80FzvLYGDZmYVZvujPmUr6AZ/hLw6oT7XPbqO4uLioo6OjZtQM4vDwsBUtnSeT12+32/aIaNNqp3eueVU95NuODtyhDzCaVXE90h4iWjoEwjFT8RNkze44Pumuo9l2u22pjMHBzuclbLMrMyMzMCvaWyiyoG5ANigwbvYymT3glIyBMRlMXMNkTPTJeLJew3iqHr+ooapGoE0/rkWalSJDflu/NIIM84eNoScHIDsNxXjXw5yiw5KTkbgvGJeBAXvE/vARbBuwMPDm+ewvY7vS6elpnZyctD1rk8mkAdfbt29rtVrV2dlZK82wOXZ/f79OTk7q+Pi4gdzV1VVdX1+PanWwWfpmjGZeZkS+A2C73T5izLZ9znXtmPNMRhywDXo+z0FuV9sJYFdXV/UP//APLdIdHx+3aOQagCO5gYbVE0coJnFyclLX19cjtAYE/axs00/vITIjcGRxsdVFRxpGRj8GLCvQ9aSsl9mxnFbSn/N7FO6UDZBwAZr+vCXEaSbzc2rrAiggCZuyQTEPpz++KwGdmLWiV9f47JCurxn4MkLDZrxJmbH61jMbu42eBoAfHR21uTFGakoHBwcNOBgLTjubzdp+MN+g7eCCrj1Ws28vslhvyJAAhd2TUuamWp+DbCeTSdv8enFx0VYlT09Pm+xdGvnhhx/aOyo2m039+OOP9erVqwZoe3t79Ytf/KI+fvxY8/m8Pn782IKJ972ZgQIc+GSv9uvA6e/Tvw08BqZeuok8sRXOcbB/qu0EsLOzs7q5uXn05mX+dormHJ3Cb7IaK5HobIpLnxgaRmNWYzqcubWdgdeMZb7PHFC8HcWFYzsw83D/jj5mDK73MDb6Npuwo6fCPQY7t2WdBVI7Ps2prdnnarWq+XzeAgf1GBu1U1YDCfP1TvVkbQkgzJ/xeYUUufF4JesEmRnMr6+v27gODw9bUONFy1dXV3V0dDR6DA6rmNhCProYMM97TGlZq7E8HLCcxnuzrIPiZrMZZRV2/JOTk3bOer2uT58+1dXVVZ2entbx8fHodqw3b960LSSHh4f1m9/8pj0hhfTr48eP7ZYsxrG3t1eLxeLR28Hc7JNOBV1X47fLKlwjg7t91pkEzf26+YECT7WdAEY9BsUzANgXEWm1WrXVlaTM1NAANaM7BmomAUglwMHwkolZmE7rKC7a6Lhm0liamUQvtWGMBrMERv62A8NSkI2VbFaEAfTqWTYCF0ETQNlTlICIoRmADZ5ebTRbY96ZUuXiR9YzDGLJGJ2K5XfJ/FyDw25gOF7c4djT09PGuhaLRZ2eno507LphgqzZE5/5YZ4OHPTheiJ2z5jNYqjrVD2sFGKDvkWKhZq7u7tWM+M5aK4rAmAGm++//7751DAMo9qmg7RrdC6RbLfbR3rFLjjOoGf7NntifmZqtnXvLOBz+xCZixftnmo7AQzFoYScgGnt7e1tGxQC4jjf9+i6FxTRiwSkkKbdAKXpKRGXyNa7WTujJd8jeM738ZxvAbtWRX+9p3FkDYw+AVQAyY5gWVY93KfX23Fv6u0aG30mS3VaZOBz7cf1DRd4TfUNJq5XmP5nAPKYXOfwuOnbgMb5jviWE3rM53hhr3zOlgsclgBsNoLtOT2GiWJn2KGL+Ni4a3ouOzjtyRLGer1uK/n2E8bv+4uxadJL2vX1dWPNV1dXNQxDe9DjwcFBq61hs17UMljZ5mkAtu3KunKzbbhea7k6A+L6vrc2a8UGMca1C8Q+eyuRC6M0O6DrII6g6/X9ex57Gwl7Cvb+JTt/1jQwMpRg9OYzRyGzRMbBdXA0mBfnJ1U2MPGZ01aub3lwHM5oJ2bezI8GQPZSTR+DHBPc0gAMoBxjZ5tMJm2D8unp6ei+SoAgQcwvZOnNx6Bm5zAL5n+a5eSW/7sUsd1u28ZVv4EdUGBM2+223a94dnbW9OsaFsd5QQVg5x5H33NrVuLyhDMDBwfbjOugvPWLHfmulwGk9ImNzmazOj8/r9VqVVdXV00mrv9VVSMBNJ6c4ccFMWbGYx155dElDNsl+ve8TDKG4eEOD9uAgd51PeyN/nspe7bPbqNw6lL1YJiHh4etSMnAKbxhAN4X42Vr+sMQLRi+M3MhCqWQMjLjBCwm+DqMn1uTZrNZMxbXyugH40nWCEAnqBr8AFUvLgCYzCNTWAMwyua301Yr2ADFMWaKPpaxoYvJZFK/+tWv6uXLl218BwcHdXV11V5xZr15E2o25siKmufcW+ww8PMdc/ViBee6+O95uaxgQ7escBQWjTabTT1//nwEMPSfhehkpGy7AUyoOTF2s0/qc16hd8pf9XB3is+Ddd3c3FTVPdPjurYH21+PqZrlbDabBpLYNduReDFPvi/SaaYDie+ocfBGL7Y5rm9987fl4NVfB0LfyP5U++ytRDaOpKGuvfC3ayeudbULxsqgWYSdjyiG0vjMqZUF4H1qNhYzPIzUQES/FDdd65tMHpbbMRpapnXMzWwU5VY9fvVX0mPP0SkW5zo6wpQ8PrMhswmcx3ufvArnms9isWjghXPDhh0IvIpGS+Zr/VgWXuVzTdFOmYsn6BXgIM0irTs7O2tPZ3VKY0eGnQ3DUB8/fqyjo6NRMDFbzBU41wSdBjkYcH3qV2xncTptndsuHDxJB52WU3P2vaD04aBicLctcB2eXLu3t9d2EphY2L5dOsIv1ut1XV5eVlXV8+fP27alTBfN2O3b9hczuyxZMG4v4DzVPptCYgB3d3ejGtJ2u211AO8cdiRysdI1BxzQxfIERFa5fEtEbki1AaJIfnuFygrKFJXfXvFywdgKtsNaqJkGMwYUaKUmi/DxbmaVCQQJ4GZejBP5OwV0X0RSpzzMhVW7TAGQfRoqf/s2MR+PfRCAevpzemHDxwaxFRu4WZMdiOZb3qx39ideXV21epFBM9Nxsy7mZfYDkDFOAAK5ARbICPB33RKA5BjbDVtEzIZIMx1IzIwAOAOnt3CQfuKj+PJyuRzdjpWB9ujoqOHB2dlZXV1djVaUuab9lPPtP7lKb+bmsscu8Kr6DICdnJy0aDeZPNyL5tUkFOwVRQaCIfaOrarR8rYZDiyjqlp9A+MHnBA0Bs9k7XR2cm/uzDTWmzmTPQAGGHCmPhiuFzF6YOSUESW5FkFzam3GyXiyuI8jEBC43QXnxjidrjKvTGNxRBu6n4NlVpgG53l+7m+uVfV4g67naSd1NAbwXf9E78yNvjl+Nps1HRkoq6ptBKUe2GPHvTGbTWBDw/CwyZtAzbnYEPbthQjbG77GNUjnAMHlclnHx8f16dOn5nMwTM5BVhlo+Q57YaHDfkudjLa/v99ux7q+vm7bnKhBMj8/tJK+bM8GdTNIl4ws65R/r+0EsO+//77evHnTnPv09LSqHvY0sbKGsiys7Xb7iK6u1+vRSxJgb0wkC48WtFka1Jec3lE5ncasA+PxKpady6mRQcQ3idvgYDkGJafPXNPG6VQyI7znQP8ev+cDqPHoYgyMVMNGVPXgdI7YZmzJ5ojcTlHNcAx6lr9Xlawbmtkn51sGWQ9Dlqkr25prdrAZF+cZr5+wipyXy2ULktyLaF2aKWRpwgtSBl6yExwYwGGMaau9bAKbdzoMC6Pwb5BKX8gyDjLF7j9+/NjqYIeHh83+DDjL5bLevXtXt7e3dXJyUsMw1KtXr2o2m7W7A/JuGuzb2Q8Bw3sBrVPbFw286NmQ204Ae/PmTauRnJ6eNmpp2r9arUYbT512sYLDsnGmAoARrMJMAeMiGniyXuYFRABFpyN2AuoIRA4Q3quVAAyRBCaSt+44V7dynFrY8M18cAzYDTLJ9LPXsn6wWq1arcXsFyNxVHN90SySMTJOy4yW6bb79Vj5HsfKupGvb6flXObo9NCyM7DgeDTX5rhe1pw8B4ISjsuGUFgOqSaOhkw9T2yEMTv44MSTyaSOj4/bvY5mzHb+lIMZv4OxbQRGw4/3V2G7DphXV1c1n8/r4OCgnj171uyG+azX67q6umpBkA3B3GAOO3P24OcAVj2khvZ1Bznm2JsLcjEL3QVeVX/DrUS/+c1varVajZ4hXlU1n8/b0izH5uOEnUPbgZKJZCERhmR2ZgBhoplmYIiO0hiI06JkR3YS0kX647amnmNjKIwP4/OmPsDBgIZBulbkWkFGUoM6RkG9ItN2Agjz5d63dEQDBnLxahZj4Xg/+SGDBNc28Di1ckGY79OouY7H52BAKpzjRX4Jyg4wLlG4hpuBKsdPcAAwE8joxw6HA/o63gOIw2KzXnEkEGLz7t92QmmBMVDvBfS4HrYzm93f6D2ZTOr169fNJnkNHT43nU7rxYsXI/tjTs+ePWtyxZ8yuFSNbw+rGr//wAtiBGDbke+19dgzNXX77FuJQGQuArCQurgQicBhT46WueLEpMyETHFdTIWdkQK4DjeZjG9Q9ebYXj4N2/GtJhnhHDkcxcxkcA7XOBiPU72sD5nBslDh9M51LWRkA+FpA7y3EIA1czMrsKE7LbWBIGPvSaNP5gaDzXQpa3j0zXnehmFGgVxh1NiCU0/rDRnaVvJ9hU5BAT7qpb6vFpChDmXnZ45szubm7PV6XS9evBiBrhkZjBpQNeukT1gYsuF80jNqgOyddMD03A3wZrXMnUxmGO4ft3N0dNQeqEhN7ezsrLFM+yV9mBSgN1Lh1WrVbjF0EPZDCGwPZsS5rSTl7ubyzFPt6W+q2ltYLCAUYGQ03Z9MJm0ZGNBBMM6VneIZvYnaGCHCRBiO5ozJhUyDAH35M8bumoZZFA5FfzghhoxhAJT0x2cGTTc/VdardgAAn6Uxut4C60I+Lu4boK0T5OjVK+RFsOBaflhg9olBZz3Oesi0z9tnDOTog7EAXtSNSFW4jtmbzyWAUBPFSQABxt6L7tS8HFi4np8+nDW+ZIlmY/7fdUSA3gyyVwvE7ghOs9ms1ZDRkeWXDNDBydd++fJlO//Vq1cNtOjH10/bQy+M2aDNM/Vgq7Yx692lGT++241+0JcXBRPY3D77OB2UxSQ98clk/MAyp0YI1I/c8VLwMAztyQJ2gru7u5ZX85YiG62fBmBHw4AcyTkvU1evrDn/p7FsTXTGQG3spIlmDzi0jQyj9THZH9c0AHgVdbVaNSbsTbqAr2+poiVzcYBhk7GPz9uwnM44fadl9DfbdmBzwdy3ySB3p0w0O5a35tiJzPy9agbTmUzu97VdXV2NUsWqavbl24YMNMgeIOMmazbCbjabOjk5afMw+yXYAHyuBSJTb5PwPEkHXScDHDJbgCQ4UzH7QZ4soE0mkzo9Pa2jo6O6urpq5RnGYIDMmqV92DXEy8vL9vSLZKYG/txGQ7/pe1laQK4Jdm6f3Ynv1INO7TR+LRqD8U3R7Dfix4KA1fihiQDien3/wEFABLA0KLi2RCNyp0OQTrh4iFGZwnq+rjVkbcrOZGCyAszSckxZ3ESheXP33d1dffr0qT1WxWluj8VmKst1zcxcU0i25TF6C0cvapqdug+nyujHmx3Nfp89e9YWIy4uLkZMLvcdegneKQkrVjc3N6MUnRqTswDXvnKnt+unaVfeX7bdbtt2gqyfMT+zI2zEvw3+yZ6ZK1kMQWC73bY7HSwbN5dlbB/DMDT2z90LWV6w/fL/s2fPWjmINgxDe8BoVTXmnI8pAlgBW+zZxOIpGaMPlyF6bSeAffr0qV3EgjDLQeBmNdB5106YOFEkGQ97zKrGaRbXzpdt0I/fWef9ZVnv8SZLol/V+DYS03+ie0ZTfp4SKv35cT1mjsir1wyObIu4u7trb4pGhgm0djrXTsx2YUYcC8N0ncnpkJ0bxsYGUK5F0GHeTgezJXNaLBbtnr7pdNpefmGb+umnn5peN5v7bQRkBVXVtvXwyGVSSQCKgGlgQLa91gtifM4Y+I4nfrCd4ejoaGSzZg+2+wQX24TtDV34/8lkUmdnZ6Ogjw5Ikb2Axrj9FnUH4awzbjabOj4+blnKdnt/3/GvfvWrVg8007dfZNDkeweIZFMORHxP8KPOe3d314Cy13YCGFHfkQxFsnPX6ZkNFOFUPdScvFGRBiuyAFz3MEtCKEzIr2mremBfXN/Cqxo/Vsbf29j8lnDO8fkujjvquk7jdMlposGEc2im21XVdjj3CrkoH2B0TYjoZzZXNWZAMGiPDTn6NiWnLRg1x1l2Pp9rpNHaHugfpkGK5JrLbDart2/fVlXVxcVFu81puVy2RyjzzDfmYsZMgOFzs2TAx8HUTmimy7wc9OiX7OL29vbRhl/bi3WYrMlyMpv3MSlP7Mf2jrNn+lb1sErrVWvAkuwJ9juZTFpKCGvzwxCsZ48bGXtrkO3LrJR5gxnYpJm+meeuthPA6DjrEQgnaSAKszNxHIKlNuF8lwhB6omzZX2FCWM4LsxyXRAcQ8w+cqk7o6Gf9e40tbfiZgUY3FyrMBAY0BxtnDJ9+vSprq+vW/DYbDajyJdGQb+WddY1MBhvaWBsLAr0UnJ041Q4mV8PhB3EcNh8AYdTKvROkZdnzRsAeDop9rNcLuvDhw+tD4M9fWJ37BhHNpa9deNFImRDc42TOWHHBGE/GywfGOjgkjUn+s/g6M8Zb5Yc/HQJZw22PY5nX+Zkcn9j+ocPH0Y1RmRxcnLSbGmz2bS3hrO6yebftCPmjlwT8FyD7dVJuaZr2Jz/VNsJYMfHx/Xx48cR2oL2fv4WF+U4BrTZPDwOx6kAxoxzABrUvnxLDsbOVgqAyuzMTuoHIRqkTFMdlR0BMHRTecAui/AoJCOjvzcTMgA4zTBr+emnn0abEZlrGgSNiOc0OlkRzfKnIWsDOWNkHsjSzuEU1XP2/AyyVY/rTVW1k+3SvxmyX3BiYKiqthoJeLgMQb8UrtmQ3dsr5zkmg8WmPE6AC/tnbDzx1rLCLpwmZxrl+fp6GaiwSYLVdrttwMO+MH54o9h8Pq+ff/65rq+vq+p+kY7Ntdg6jNJ2ykIA13dmhQzwJZcwHLB9143rv16sMo64frir7dxG8f79+5YTOzIjMP4m2lFwB9SIaAzE6ZtfUupm2o7SuDb9u/5W9ZAeUaB0+oBzEU0QmlMEjHpvb68plHOsKIzJzMlGBgC7ltQEPRlvSnRhcxiG+vTpU00mk3r27Nlob06OyUAGs3EkdNQyUPo5Wa5tGdCqHnaAI/cEL+SC7JKVmr1a7rlSyPeLxaJubm7q6uqq2ZD7dd3RbNm6oE8zu0+fPjW74DhAbRiGtsuc8oiDHk8yJfhyrhk+4zPrBjBYTLi9vR1tL3gquNjRXSvMAMwckYOZFzLzEyZYZXXhntrSN998M7qB++rqqo0fMNlut+1uGNcDzR7zMTx8n7Uu5O5tULY3xmnmjR1m2cltJwP7+uuvW0emmC44ujietSuci4FTgL29vW2Fdr9k1EohQnpVxStvXMPpYjK8qvEGShtHvoSUYwG3qvHO9oyk/j5rXfmZa2t8xxL9fD4fsQGYqKk18k7Hyccd04dv4aHZGFx8R79+Nprn52LwU5+jt6rHgJZFYvQL89ls7gvh19fXTfbs+vaN/DSDsJuDCc+h415cxn58fFzDMLSVT2TgzarOIkipncoSsAmOZqDoz4X0YRhaScAszPNxiuUCvtkec7O8sw7FPaHc/rNYLNqr2tDZ2dlZe3mI33zk0o3rebPZ/ctQuF3Q76A0sHl/on3V9sln9O10PIEappf2lG0ngLGR1U7L4OxMTiWJdigfw/I9f9QMiH5EO4yCibu+xaTMWvidk+Z419xc3CUFNsg5/cT4mJtBLOVho8PIs+blVA2DIVImmJox0J/l0hSnPTnclGsgTrBwHcW/XYesekg/PE8zMKcb1oNlVlWP2AGf2Y4IirPZrL37cDabtYcq4vTffPPNCBgSvFwewKYoOWBnwzDUzc3NyFaQWwYzxp3bB5AX8uEz7/BH/k7teZoDsj45OXnkvIyb8SJz5Gq/Ys7oA7n827/9W/3TP/1TA4nDw8O2SuqXtuAT+HKyZmzQhXXS06oalWmwS78NCxtJv80FCj5HhsjX51i+vbYTwPb39+v6+nqUe/u2DDMdWMLd3V2dnJyMHNSDdjHcKxVMNiOua09M0A+LM1IbaJzmcG2YDhEXg3B+jgGnoaDgTF0BboONU7eqxy/JgD2RrthJmL9l588xWG8ehgUzV9dr3JI9M1+Dpu/9pD/6RK7YgAEr62C9yNk7PlcmOR8g4/P9/f168eLFiJE6rWSM9FX18EZvR3wa7A+Gwooecs3n1bsOmgEhU3HYtlNu+t5sNnV0dDTa2gCbym0wXNd2Y//IVMt74th862Bj1n15edmCB3NwiouuATlAnnsq0f98Pm/jN2C5D9ufa2XMwXOyHHfVdGk7Aezy8rLevn1bJycnLSIwcLMoBLler1u0qarR27Sz1gKK44xMzKkXE7YzskseRyZPz7qOC7agOUbCd7AuCwgDclQ3gGdERvCu7xBBHV1JB9nV7F3gnJ+ggczNopiDr5spIaDOeJJJ2aHSWTw3GtcC2M1S8lgfjyzNQNOg0el0Oq2XL1+OygUXFxc1nU7r5uam7u7u6uLiom5vb+vFixdVVfXVV181XTvo0LiWX9eGDLmXl20YyPTs7Gxk48iXoGO5Y1/efO0MxYHVQHtxcVFVD2/xJsA5C7FN+IZofATHtt+cn5/Xdnu/J+38/Lx+/vnnka8ul8vG/vAZmBM2BCDO5/NRWcbsj89dj0s2if7xkUyPe/bplHMXaLl9dhWSPSI83DBzcddDyMO93EokYsIAXNYJXB8iYtC3wx/sPgAAIABJREFUi34ImKjhp2SgSK7ZA0AXaxEk486UizFgPPyfTMxprBXn+lLVfUrOErSBg3nxO+sgXMPXxii8H80sxikp83a0Zi6kW2a9Xvm1o2RKaBnwvfdK8XeuVrvG6LqIAebg4KABGq/su7m5qb29vXYPHmzgF7/4RavJkDo6PbYNcZ1kjDjjYrFoL4E9OztrNusaG0GPVU/XAHtObb35uuwfI/Dn00WcVtoG6Nulgqqq169f11dffVXT6bQBkPWHHQ/D0Jj26elps12yAvu2bSjLRrbdDHI0ZJ7g5Tk5czG79lyfajsBzHm6FYGwUT5AYhrKAJ2ukL75LSTOlxGw9x25CMj17FCepA2U8QKkBjLAyNTVTIfWAyunFBauWYdZJDm8nx4L+JjBuf/PpV92xty3hQFknz7OYOtalp0ha25PNcbhVNclgl1zs2xtpKRartdVPTCWDCY8wwtATqDP4rkBnObVXRYRtttte1orYOBg6vqoAcoO7Xnxues8h4eHdXJyUpeXl49KMsjVaZmb7Ri9OzU0yDF+MgBeblv1cHuPSwUGSViqSw3ol/SScXhuzMUBy7Zi/zGzNBb0mLXbZ98LCTA5MsCsXOvxs7syb4d1QbfNNnyzKT8AGgpyWgEIGJQcCbN+RXMqYHAxy7DwGJ/pNkpwSyCzsWAwPESOcdgJ3I/BxzKyLPNvgxO3B2XfTwERQYDrOkgAYMkEc8y0jNbu/6lImgyO47wvzKUC30Y0mUzaC18vLy9rtbp/EzXX29/fr9evX7cyRQYa/nZt0gGNtI5jPE5W5ViUqnr8VFj6o09AwnUibBi9LRaLdouVA7xtvxc0XRohJeRzg7gZKSklm4JhZLe3t3V8fNzsireD84SMtJlk67aLp4J7b+WWz13M90rrU+2zbyVyhPELark4QuJx0CgFQfE9kdMbYK0YszCzFfp0aufI4l3HRnwr0TeL079TX9e5nJr53XgYOWDJ9anlJViy/2c2m7UaYtX4wYhmIwa97Aulul5ApMvietWYxRLFbDwOQGl0rhFm3c9BizE7VeZY5EFfrj851QQgsg7naGzWY+Dn2icnJ+3FHAAaJYs///nPNZlMmuOdnZ2NQBI7SdafjC1ZNY69Xq8bqHKnAOBwfX09qgnlPYowNZ5qQTD3M8o2m01jSVlWsM0aABhn1mAJbNj0zz//XJPJ/b5D7jfcbO5fdPLhw4c6Pz9vvvDmzZsR68xm+8RffIcHY/bnztSsc2clPRab7bPbKH75y1+2wbFTHeNksEQ95+wYCUDBwDDWrBu5FkIzMHkflNPDXNkgssF4XLdBkQcHB60gm07qAjfzw5gYk8dMgdiG7mf2M1c7f6bXNObRAwm+x9DNCjIt8x6mBGbAA8PJGhhj7rEmxuVxZ23Jhul9fJmiGBSsc4OHdZNpdxbGCXY8JZj0j5dWzOfzev/+fS2Xy/r222/ba9XMmHoprceG3M1UYVbe/DoMQz1//rzJAaaDvAGYk5OT2t/fr6urq3KDNVY9vCnbLAsde6UwmVkGxLTB1er+Ju+PHz+O7gAhKJyfn9fl5WUjALngg/xZVPPnpPJOJTnXsvYeTa/ouwa2C7yq/oYnshq0GLDvqWIiCBwm5giRq5Wca0PBIZi4GZb3xyCIdAbadvuwwY4xAAoIhzECxFXjfUuOAgkOBgDXZ5DPxcVF7e/vjyKVjd4tr80409ByHNB9A5sBg3E6lc/CucfgucI2DaLImAjaq73YWayn1I9XQb2wwNh6tRD68/9mF4yd6yN7xsuGTa797t27qqpWf4KZ0SxX686LFAZegpa3spydnbX/WQyDDXsLhQEbOVo/7JZn/6LlRGbiDMAB0AHdtuC5X15e1mQyqefPn7fzDg4OGjDzFFoHT2dWtjOvpFpH/HZ5x/qzfg20ucu/13YC2MePH+vXv/5129zI6o53lbuOhTH70bq+fw2hVj0sCcMAAA2noAAmDkoxlVTUk2M8Zh5WqPNuDNCrp+7PtZCqGjEWPybHwufxN0TiXG17quW4mAcGj8NkmurG58nczL5gkl4QMcvJAIMsk21ZJh4f4O/UzPMxS+b8bNSUcsOq9Wxwo2/GznUtdz+zCwC5vLxsY/n48WO9e/eujo6O6vT0tM7Pz0cZBeyuZ0OWg8F7tVrV5eVlC5S+R3EY7l+s6zKK2Sg+BCAMw1Cnp6eNxeUKneXIeM1QnbJantgTK+KwUZc43BcN5k86atDNe5g9Lgc1jnEQ4H/Ih/1vVx1sJ4Cdn5/Xcrmsm5ub9vRUF48RNsYFHbdiXNDMepELmQjHf7OaUlUj5LfSkwlZYVZC1fgFHDZSjkNYKTDA1g7uOfZqOVzfaQnXMeNIUPU1uU5vVbIHNslYMpp7ngZv5u3ree9Rz4FzVdNzzHTF9TuO8/luZq4GBeZkhtFL67N+BUvxSqEBjfsduQZ2x+1u1kmuiGXg4frMgYB/eXnZ9kSakZDGuaEzQNFZAUSBVC9tcpejex6wG4LuMAxtqwrAyr26uQveYLter1s2lj5sJu2x9eyN4/BPszWPu9d2ApiXTjOiGjxQHpM324IRoQADEDeWshfm9PS0sSsmeXBw0GoEZmCmrozNqRjnIxDqF67Z9Bwgd1XzWGvGDVObTCbNABK0nQI7LfJYMSSu7xSW1gM4H+valltGTbME953HMm5qZU4t/UwojA0H9LYYF9rt7AZZxs21ub7vW6QBNLY7O4XZcNZ9sA+YBeNxwd4lhsViUT/88ENVPTywkTRqb2+vXr58OUpVASGDuwOEa5X0ZwLARtlcQAAcLOfJZNI2cBPUWd3uyTL9FZmTQTE3jj89Pa2bm5t207cDBqDpYOIaMfNDtmlXCazWTQY3ZJm18qfaTgCjBoBge3uyuECvHoSwTHMBIADNO+X95EUmyWde2YLyOu/HaBCmazDU0hgzqY9ZUkYz+nBUsIP4WWRuWb+xPJ6KJsko8nNa1rMYp+fi6/mY/Nws1udlfYP5eLUzZUxD1pnuJigbuHusM2WQRsxnCWgGBx+T9pEO47SI883+ARoveLgm5/E5fTKwmUUhKzNL+1naKmNHH1ljMgO276Xd2Y69VaXq4UWy+CZBKc/ls2RQDuI0B4dkYAlcybaRRfaZbSeAed+W2YMNhlSF2lfVAxMjyqB057k+FgGC6BgPxkXx0imoDdjCsmKz/uKVN88h01rn4ln3GIah3SBrg8400ds7HAW5JqzOlDkN0EHD6RNj6tV8kElvuwIyM/vimjZ4O5xBJpleL13POgefZYrnvw2Wnof7thG7RuqAmKlr2qod26tiDkS5YsotTJvNpt6/f992/282m/rVr35VVdVeNWZ/sD2YnfHbqSOMazK5f9Agj6c2owVcvKiFH3HPsu8RZiGJ8znv97//fZ2dndWbN29GQYzH6vgJE1X3LzRxHZF3WF5fX7cVVtsGAOzSUbKx9AeaiRG29bn22X1gRncP1rUKT9ibBmFQftV91fjhcAiXqOctC0Q9hOItDdQBXMsxqJlJeNUOI8u6FoZusE3mtdls2qY+A0xGCSvHjpkgZjabdNtMMGXcc+pevcCg5Ov7N3J2H4AzASdB3P/nQoWZUrICy9vXT5bluWfK6AjNb4NOr0TQk4evBQha3tgWKRsZwsuXL5veb25u2tu8/Y5EMxeDN+PrpZz8tr4B2kzL3X9mNMx7Pp/XarWqk5OTBtCsZPJYIet0Nps1P7WcsVM/624YHl4Q8v3337d7U92X9W39ucRjxmWfs1/tSh+r/gYAA0RQ5Hr9cGe6nR+jhzERLUj3sugLa4MlICiE41Ujb/QjuqBcogBC8yooxVhv8LPwcFwrxkvlNCLU3d1di0Y29HSIFLojkp3ThmjlZ8qTcuuBQB5DH960amfBOHxrDgbn+p3ZAeP3NgjPA3309rN57MlW+W0mZRlShsgUuDd398nf1qnl4udk+Q4Rro/tsxGZW4xIt9hH5frW6elpvXjxor0ABfm7vpeg5lRrs3l48iysixSWG9AZf2YGjB+d3t7e1ocPH2oymdTLly/bFp9nz561BQHGgI8DYs5AzBi96jwMD4+gyjTcgd+pr8sdxoVe6aXnS9k+WwPDcSnumTZmHgzI8T2KQsEAH+cBHGZYXDONyQZgGu60wEbhIr+/cxTwWDjW6SbXZjzeO2bnzpTNYG0DfSqXz9rbUy1TeOspV22YpwHCaSHG6e0jmT64/pGUP9P0bAbAHJ/7MSNm/rmQ4sIw55htZ582en/n4OWHaGaKY11ttw8buJPdAfaZhs7n83Y7jj+3nzgQmKVYRgRh5AeQu2zBHLyCz3n7+/tt68Yw3G+upS82cnuPnwOZ2bHtncfnQBJOTk5GK6Zpm87grLve35aVwf7veh6YU4qkwtBXFy1hQb7Z26mSVxdwnmEY2goLINAThGsTZneTyeRRBLAh2lB87Gz28ILXVCCK/fDhQ3ttF9/ZgFE0CjUt9tzzvOxrV3Mq0asx0QykT606WnecT+DxfqbccNprvZqYa3ZmtlkH87hzO0I6syN3sjDr2kHKdShHcss7UzGaZezr0tdms2llBHSMU2+39yt0f/rTn5o9XV1d1fn5eZ2entbJyUm3TgaT9XiRG2PihSc4tbMhXlqLPOfzectahmEYPaHDCxFOQZEFAAfIshHWfg4j5m4CgC33cfqcZOTeoG798/9Tdue284j5fF5v3rxpdSTfdc5vhODc1dsvMufP6ObfRmR/nswDo00khx1lfSFzbM5lkYJjHP1QLGkDLWtdNBu9j4FN9Obwt7ZcZXRzrcWFzwwABlzLgEbh3vr0d09dl0bfmY5mem1HyfpfXs91TI+blsDlebuGk6l3Ljx4DDlejsMpDX7IjIDhm/6rqm1xOD09rdls1p7D7/1crvNxrhmo7ZjvqmoESIyLp0ZUPawSMyavKDP+nizxE66bT/ewfyDjHKMJQK9k0/P3TDcJDH93CslNnt664DqHPwOVMzLl/XW+SXo6nTb0ZlXFBm6Ki6LI8bPew0qLx8hvLw5k/75ZfDqd1uXlZYuyZlPIxOllAoVXY/IGXhSVY8DJHJVoyMy3org5lWXe/tyAkUCRqVNGS2+bcb3wqQZz4zj+Rz/o0g7K3JgDdpaAYuDIsWeKaJswG8OZM5Wm0V/eLlM1XpEnZXQKulqt2mokdTMam0avrq5ajYtd9W/fvm1FcIAAeWetyH7FHNjbOAwPj8rhlp7pdNpeRedVa2TAKissi4wLP8hSUcrKpMD2mFlBMn5k6LkZ1LAHfOKp0kvVZwCMZwb16hy5+sdFXcB1+ja66OzhXkIUTp+eQEZegCSXoN1vsjAf4/TEKD8MQzNansvUYwqM0dH8qeaicI9tmZ36s5SX0/SsISVj7bHDZBw+Dh14pYvruH/+f2ol0tfrXYeWaRjzzbTWYJXzs9MQPA0kHreZeY8lZEaQLMtsxZu0rQfXWmGfrtkwBq/ETyb3T4HAD66vr0d7zjLVcu3XY0uQ9TwYG31n6uwHgTpAebHJAc39e3zekpR69vz9nTHCtoBseoHoqbYTwNhoaidgMAwcoSJI351udAbRcWyvDNqwvHsZNCeqIOAe7Xd0xdgAQ54EYAXDZlDi+/fva7O5X2lK0OzRbo6h8O36UYIbwMr1rLSeszhlzN805mlnsVxcc0pH9QZis1RH9QwqfmyzndVAZqbIXOjn5uZmtLzeG6fH4jE5WPYagcmARXN2kOla2h4y8qqn007maLBGV2Z61rHtiPsOOQ825lfArdfrtlVnf3+/vvrqq9ELMwygMBSDucdj3dA/1/VDSS3vDBicn8HE6aPHxnkcbz3aJ61768Zjxtd3gdhnbyXKWws8oYwABiachsG72ZkzemCQbmY8RnRfz7Ulpxw4k2809dhcjyD6ub+cn8e42WxGNNvn+Tgc38ZPfwl2VnquLNIHn/fYGt9l3cnGmKs6dmbvg7NezGZ3Mc+sR5lBJCNlDk5Pc5Eij88g4vEzh16dNaO8dWKgn81mo5JH3nHgmk4CiZlqpr1mjqRusGuApapa+uniPc2+5OzFdTrbRA98XHLw+K0Dl4UykFvGk8mk3TOKTJ9iW+mfDphuXN+3p+1qn30iKwMlEgMamaey/A1bwvEdHWBhvHzWqZ4nw6Tdp3NrM77tdlvz+byNkeVxb+5zbYjGU2J//PHHOj8/b/l/KtxsqOc82Qw8WY/iexSVss7UiutkZDPoO3pmkLG8cBBWsygge878nfvccr7IgXEBBDikAZP6Rq4ocb2cqxt69v2ZuXJlsHVtje8Zi69jR3O0dzZh5lb1+KZ2sw4HLjuca4gOIGY6fvsRY+DJE+v1uv7617/Wer1ujwR6+/ZtTSaTevXq1ajPtKdM77PkYxsxQegFVOa0WCzqw4cPtVrdv4/g9PS0ZSyZrWQ67+zH+ncq7PH6Mde72k4Aw1CWy2UdHR2NDNa3p6AsHCgjuJXrgiKg4aX36XTa9t0wYcCO55Pl7TV+6YJTzaoaASXC2t/fr++//76GYRjtIkYBGBO1AtNzBOxIZoO0M9IXQMEKrZWSTDH7d72gx+LQh89zUMD4clWK4NB7a5TB1rUjg6NTIWTngIPtZAT1PNwvLQE4A4HTVf+2ffVKDHZggxNytj3Z2ZyOOcgafJOxoy9SaAOdGZz/94ZOv+ZtsVjUfD5vcv348WN7zPPJyUlbJUSHZqDYHvJm3A7I3uJkooKd3dzc1Lt37xprZDP3wcFB217k+aVMssSQ+k89JpBlRpPts/vAvPoB8DBxorgHb7bjQSUroA7jnfMsA7smgsD39vbam1YAEzNC1zdSiI4us9ms/vjHP9arV68e1T/cXOOhoVxTeQzUVN4OQz9emMgo12Nl/t6pldMdjJ29NxwDkCSDwKFcy7KD9WTIWKhfpcOiQ4yN6zwFtp5bD4gBGLOgZJ2WAbrIiJ+69MLRMAyj+3Wd3iFjBwP+T2ekv8wY0HcCFMf5mk5nU7akUqzOw8xev35dd3d37b2Z+/v79fLly3r9+vVIZ4AbPsY4GL+vhS5YIb28vKy7u7t69+5dTaf3z+0/Oztrcnjx4kU9f/68rq+vH9X6HJwMkDTruJdFID8D3FNtJ4AZvalXoUweg4MjGLjSmZ2OOJdmoM7JOccFSkf7jFh8l0VGj9XHXV1d1ddffz1Kbbzp0w7g/pICJwh5I22yMfr13wazpP9ZgO/VhQAswMVsp7cI4A2Z9MdtVpne2hFzzMzdOvXnPQBJWfX+99ws654+HOB8vu2G5npLMqCsXXls6MVycF8ca/Cz3hKcbfNmSiYDfIdj+zYw9Owf31qErUMyeL7XZDJpG2CPj49HvmkZXFxc1Gw2a7cbTafTtjkW/7esuFXJIOhm37XO/J1LDi70u7/ckJ3ts0+jYEWRfSI0pzcoARrrDX2kfpvNpqWGfmmEd8I7TfMLQ3F0JgtL860vGJwNtOregU9OTuoPf/hDe+EnfaPskUBm4yeK0lcKEfDuveTADpBRm/ZUbSnvmdzVPEf67KV/Zhd2pASIZBfu0wzEdSYbdY7ZtbTpdNrSVacpHk+vdueGXhL06StXeN1g+GZMABrH2n48/l4mYdaJIzrltM1guw5EsOZhGEaB2fVOB3wY3dHR0aNtPlX3m87/8pe/tPoRe8940cj5+XlNJvcv1b2+vq7/+Z//abXo/f39Bm5kVQBX790SjI+FiAwCZpkGK2SRaTrnuC/rNB/66LYTwE5PT+v6+rqBEMDkpdjtdttWImA1VpQLsNwIDXLbSOy43veCIOjb0Y9+HQVt/NPptI6Pj+vPf/5zPX/+vD0V08Knue6UqY9rBHZ+oqTPN6tyrclOmkqj5SqSr++tCVlv4Vz+7hU+XXswK07ATKBOgLUMHP1Tn06fqx6ncT2Q8sqbdY3MnmJKBmAzU7Nqbjr2Nc2okukZnJ9i1O4n02fLnDkzJ8DIpQazPfdrMHb5hv6QJfdekgkBXrDs+XxeP/zwQ9si8+rVq0ZIWI1nBdYyyWDDXFwSMWjbLnpBuFcD9BzN6Ho11GyffSb+d9991x7yD5rzxInt9uHJjKw4eXUShuRnZxPRQP4cPEyOOwBsMH4qpAvSdiqnuOv1un766ae2RcJ7bUz5ASIDi0EnW47XOT9j9aJG7xjO99g5z6m7QYnvd6Wm2SyXqvHSuo/pscycsx8XzPhzDrRkxhksGIMXV3wdZGXQdIDpAYXTO8bXA3h/7xoufWYaaGaVTIIxJtiZuTpdpF+CpOtAyRCr6lGd2XPl9iXfXsR4sHcyHL73ajSMK+eYhXxIi1Ndy8BAxLVYsOIzM07Xv6xP7NCZyOdAbCeAPX/+vD1o0DdboyTYB6le3hLCLTpQXgZpup1F0Kr7TY+uvfnFHq6JYTQuglZVHR0d1bt371otACNwOuMovV4/3n7h4mMWIi2DZCEc68jqiGbjxpjdzG7o0+e62Jn1sTRCX8cvT8GoPN9mELPxzdi9hr4N+BhnLn48VSOxXDz+Xj3MaXCmIBi7ncJycx9mdWZZfObgi/15FZJ+bWtZmLc8zVqyTmkwol9vbSFgu1SDndqhvZEaUIMh5YMRqW1VVUsf6bd3TbNlg61Bq8dgTS7Mqpm3bd26MaPspeK99jdvoyAfzqKic2MjMMBkpZhCs0PehsR5AIijEEDmdNHKWa1W9eLFi/rpp5/qr3/9a3399dftODs647cz+6mzR0dHDTBN8e1IZlPJXvL5WnZGf5YMz6mwjSeVnsVlO5JrWJlSWkdOd/m+qh7tC+N4SgW+8b0HkvTTAz8DJ//3AoOPd+rMmL1S6qDhmpTZEfLynM0kfPuZ2YCZGzqm5WZfZJIOnYDn1Ar/cH3MzMM2YL1CFFxT84tJrD+eKGF50hf3TXqOXqE2+CTjtg34lW3Wj4HZtUvkZJt2JsV4LNddbecuMRyXwSeLAOAYUKKsFZkU3EaEAHpMBaUYkf2Z09XLy8taLpf16tWrUaTlepnqZAQm3XXkpI8810DQS4/4u5c2Mh7PNaOMU6hkWj3QQIYunDvtyjHYAT2OHE8v/XHL1Ugz4t547Qwpm6oasYHePNImq8YFdcZqFpZz8HiyxmOHSabhaztzsL37/3R4y5/xGLQtY8/d35vx5UqzQdqssKc7Ew/82LLygobnYDkaoDmPUpHHbBtN+aM/A55LPbvYV9VnAMwO6FzZq4NmRgwMSktkcwpAv5vNpr0k1UCXTIw6GUqlcO807fz8vC4uLmq9vn/NkyOZBe15OTVIw8tm5Zq5GPyear0UDUfMdIl5Ox2CbRkUPH7OxeCdbrtv1xkYu69pZpzfp6O4qE7dhfNTXi72ehx23Nyy0QM2Pk/2lfLLFNLB02NwbTLZQaY9zMlAxhw5lzoR9tFbqEnGCyAaGC23HLP/TmD2fs3ZbNbqXdS58FvuseQHnRuIPBeDbQKZg4Zlb9nl+T6P1gv0+Ege+8gmnvymHnJU6kcIjC0EoDhpk9M+p115v6CXohG4B42QWE3x9b0xk9fD/+53vxvdAO5aQNXDZlPoLnQZY7TwrKRe3u50xEaVTshY8vus//k8s7lUusFrOn14W5KBnj78OZ+t1+u2sZF+POdeas24kVmuEtpgnV7bqb1x0oyafpwm8pnnn4bt2if9GtQyGBogzCoAXAcMxsw8sBfryLafgAiQ+AEIZqZ85mCTgQYboV+PN4Osx8z1ez+9NN2BLFlj1cMjqy0f+7aDSaaVPfaUNTWfn8Et+9iVRn72kYekZ45qfjor2yKM2Ln5zAVMGwvGCguz01nQNgQEe3h4WJeXl/Xu3bv2tEueOoHRmYa75uQFiarHK0aZ8jBnR4NMueyE2ZyiMTevNjqiG+hms4fHCZu5caxB1tsiDN5mqnYMN3/v6M64PWeul2kt/dqxvZDRA+M0TKdFPcaYKQ2fp6M4yidbcTNT5H9sGMAfhoe3w9sOM31kfLaT1BH90pfLKsmI/ahv1+kMSj2ZMJdkl5ZVjt8poetx9uWebxhwptNpw4FM5bGdBEMzWNdTMwjuap+tgQEaNk4EOJvNaj6fj+4c9ws2sjhXVW1VcrO5f5QIaWHVw+qW6yCus3Hcy5cvq6rq06dP9c0339Th4WG7zQgl9sDJOX9vKwLnm2VhyK45JStItoPsdgkfwzajsOFkxEtHTeUyBvrKFK03ltRLApKbV8Kc1u5qKZOqMfC7DpOpOb+TiWZqYjkYTJBnpq/JYKrGixdmabnqbXtErk6nPL9MqwAHvrPNOYD3ZOcUMRmPA6/lRfDLDbeZFibQeJw0+ktG7bKQMzSzRbN72wBytc/62Ax8T7WdDIxB8l5Gp4MMlPu0cBqAq+rhTnsbCIZhwWOUpt5MlJ3bd3d37d6r3/72t3VyclIvXrwY1cRgLUmLjez0m58hMDslYGuQcT3F/dC8NL2rGZzS+HuUP5ujoaOunyaaNN6slPvjzEzZg+fnRBGQ3Bfz84qZmUEvDcb4LS/r2d/zWW7LMRD5d7KoHtCb4ThAZCnAKWQGEWwT2TrIcYwDJ2Ox7Nw/tuLN3pnO2SZwegDAdwrkxmyIAQ86SBactpR/G5jzPli+s/48xiwFAaaM1QzSMvQCBRvOd6WPVZ9hYFdXV21TadXD7Q8eFH8zEde+GAwT9K0KVdUKiEZybvKG+cDiXr9+Xd9//3396U9/qjdv3jx6Vv16vW77XrwUjCFktKIxXsbIC0FRvGtB/E7Q6aUntLzVyPWUHgu0QxmAzVDMfly3yXpS1fiJA4yR4/jtz9m5bT1aV66DGSjdchsFizrogmslkFkO7iNrkXYe+jKL8NzNvg2ynMc1qf/ZSZOt9dJa13WG4aH47dIH57kMALi4f47v1ZjIeAwCnosXYNCfHxFlG3AAZg53d3et1uysyAyQ/9NnMgA4jeTzxWLR5opPWKYZzLiW59BrOxnYixcv6ubmZmS7DVtOAAAgAElEQVQYd3d3dXx8PHphLdGI2ph3DrMbl0H7diSE5pUskBfn2mw2dXZ2Vn/84x9rsVjUd9991wAuqXFuosTIXMNgvK5ncFwP6GzkGELSYgsdxaAA79vhWMaRhfik2Vk7cXT0LVjJfGgG8mS2zQDEwMwMOJenXWTdArZnXXMdmB1jdyTNmk2Oxey1x4CQgRmQA4p1iYPmewZS3wYW5megyj7NSuyAGVSwF993a8DBLtktb12ZDHgsBgrLCYZlQuB0M1NM5Mc8epkLfee1sbteZgMQ2waSUDhops0yX/Ai6+nZdjKwd+/e1enp6cjx/QTT7XbbdupXjXfmm+Wcnp5WVbWbMieTSXsIodNMFx4RxtnZWf3ud7+r1WpVX3/9dXuwG07vPLpXAHbURsg9dsj3sEyDiqO3QSBXELM2xjF2QsbZc2D/z7EeK/OC0TzlmLlS5+v6f59DvQT5s8KbEZs2DEPTPbL2yhW6ZCXPzmQGadZBuujmAOU5VNUoPXIzGOSmT+br/pFXriwms+DHq5f0lwza9uIgZVmyEn5wcDDaguKyCsf7fDNm6zgZnRvs2bJmHp6fFysc+Gx7XhDq1cBMSiwT6ylZs/3TY/+7UsiTk5O2slD1YDDURnKVyQjN4Pb29urq6mqUbqzX61Fti0ECZpvNpo6Pj+vm5qb+8Ic/1OvXr9ubjn1tRwDXGzIH9zPyJ5OHp2EMwzB6fDAKXa/XjTnaAOyEGIENN483M0iDBBQts6ypOEo5qmJkudmxV1dD3mYY6cBEzCzE8v1ThuQ0287O+NyH64u+jovjyDFZr23KgOP3ilrGvbdW9yK5GTwA3gt8yTCQq+3OYOXVxQySDoY5Tv72Oxn5zfEOwE7Tttv7nff5whsHYffpWt5TbNNzx/5dNmLOZqL87S1L1MjzxclZ10Re9r9d7KvqMwC2Wq3aTaEusGb6BvpT7DdLsYCrHtCYnBjnqbo3vNvb2zo6Oqrlclnv3r1rT0z1Xi4bWtJ2HACGgvECwj7Oz4a34QJ6diYAM9MyQM+1J4wGOZm6o6w0Lq8YGcTox7UnO5eZYoIojLnqIT3z3Q8GkDQm+vZbqbNG4zkxVrMry8qs3GmU5+V+kIebt+oMw8OjXmjYEU7mWoud3nbCGD0PsyanYAQ5O6zfyoOuzXjRnf0FX0Im2B71nqOjo5HdcH2XWsxo0Pnh4eFIvwS5XokC3fcWZ+wLyCIXpzKgwSYdTGCrtkeXQYwjZmLJAnexsM++FxKgIWe30yB8P1IGuu6aEc2rUAlqPLb68PCw/uu//qtOT0/b/YywvMlk0p4ygXMCHnY++jQzJCdHaBzDb6O9Adi1sGQEXCNTMhsXBkBztHNNB2NNMDLDrRo/oNC1tTy+x2IYF8aVxXY3zvPLjB2RPUenzvnOT2QEuBFMckOvr5nytz4ZS9Xjl5NgU9ifbc+ypi8DGce7dmfZpT1jd1kcN9vKtDcZsnXN92ZzTltd83OGwXm2VevLdUXL2Trjf5iT/Zdzfb8w5MDX8fjN9O3rKSMA1umj+2FO/+saGFEio7QN07mwU0oGmIqpqkfspqrq7Oys7u7u6j/+4z/qm2++qefPn7drWaH0gRPgGEbyBMiqao//MdOgbwsuU0M/PC4djWtaIe47ATPPRcb+n7l5Dr1jzPDcchXSaZyfIFH19Bu3rRfkwndmkz4ugdXnJGB7zE6nOd8FaZ5TZXsxc7OenbbbkfnOc3Q6V/WgL4/dAGdWynwzDbMj91Jb25cB2UwqGQfysw/Y96wTA13K32Bo5m8ikmzROnImZR832JiJ2rbQpV9gYv0hawNpyvCp9tkUEhBj4nYAK7hX3M48FtCB6pvR/fa3v631el2//vWvm1IzfXI+jWHzuQVBlCAacIwpbqZ9jMeOSFR29Koapzt2jKxxJEg1oSsV8ZYSlJiMEhmmnLPo7JS2Z0TUHX3NqmqPWcnaleeRTM5zye+8749aiHeok1rkudYl13QNLx3fQFP1kLL1ADg/d1qJXfGb/gheyVacQpo106/BA3k4uAGSjMF3umTQyjTXwdIsLbcj2fm9xcI+6w3O9jP7ja/rcWBvLlEY3M26yLC8SOf0NQlFL0A+1T57BPuCmIQHkaiOoDK1QLDenIZRHx8f11/+8pf23C4bGoJ2LYXHU7OLP+mnz7MwaYCqb5GgsfJWNX5aBlSXYw0MXuECJHsposfGd6437GJkVY9vvvZxCVYc41oVDKzqYR8OKRMFfAAcY/cqZ6bRPSbpOqNTSD9jirlQerB8Mgj5d9XjRxCl/visV1Jww3Fcg+rdJ8qKN2N3Xcb9ulaU13QtyjUkznGAotbkQEtQMrt7qiSBDA046B27d4DcbDYjm3CgzOCYTIvPmA8LEmaZLjcwpiy32PYNfA7C/+sU8ubmpm0mRZDcuM1g6TydwANMtjMMQ3v8ze9///v66quv6sWLF23wvX1EWWzkc0ciFOgo5adZMBYM0QK1MunH/fn/LC47ZTYN30WBHXUMtsyPvtxf1fhZVMmIOderk5mG0wfX9QZTf0/QsSP5Gh6vX0hBfx47hs7YnIrAHjIN8XWe0pdBw2PyyvJTMmelizmSDZgFJfAYPAA8O3KyLwf+6XQ62tTcC14c488ydYXp8MTiDCyepzMnMzPmj84zW+G6PQbn62VAsizM5qxD1xC9AJLptetpBuxsOwHs5cuXDbxgPr077e343s+CI2C0UOWzs7P66aef6vb2tr7++utmSDc3N23TJGmmC9i+lqMMzC7ZyK6UwsLFQDLC2+lpdtJsrgG6kOmWrMHA68hlA/O1k43k+TCLHlOCXZlpuK7ptMHskxqGQZnfzDdTdOvOAE9/Tl2QtW+pyfl6DozTQY2+Waq3jA16/ozz1+uH+3O94OAMo6pGgWE+n492xafz2fFgNFwvF7rMbgxW2LhBDJkeHByMrpF26zQc2XJtBw+XFjx+fI1xZzAzeDkj8Fgzq8BuGTO4YHtyEPhb0sjPMjA69kZTdmfbULwL38LDMDj++Pi4fvvb39bt7W29fPmyGQvCcz3GzAfHtID439GBsfh/11WSodkJqK9xrgHThWP3nZ/TnhK+Uwhfy3vbaO6Xv0nrcCY/RsisgnPsgMzJRmKG63kZfDjed164pVytNzulAZ7+mTs2xhgcXBgnc8p02tfpLUwwB9uO2SuPV55Op+2pw2amOK/TLLIRA7CZQ6Z6uTjg8XCOa30Oqswr39Dl420rTivpg+t5QyupM4GN4zjH7N1j5Bqea6b/XjByqQemawKEjpxCem672k4A460mZiLr9cNTSx11vdEwFc6tEtvttv77v/+73rx5017Oaafi78zrmZCNPtPSqnoEfBbAZrMZUfhkUgk2Xl3NNIjz/dvyqeo/Q4zjHOX4nbv6uTbnw3Zy64DlNplMGlN2HcNplcfoaxisGI8jq1NTy9vR3fUz5mFmh7ycThG0+Nty8RhTFlzfcu4FDDMH99EDqFwBTV0ydrNkB4lk1iwCkFF4Xukr6Mgy53hs3mQgFwI4hv89zrQ1+xIBb7VajepYZoVOG82UmIf1i805zXRAOjg4GLFNgznBbTKZtLsT/i4Au7i4aDdgc/uQc1sE4Ojh+gkAcnJyUh8/fqybm5v65ptvRkzBu6k9IYTgyTkvNv23sdrQqvqrhAjV9Syzxen0YROlnbNqXLOycyN4A9RI0JPxdgFHyJyHHYVrZkRPZ8UoCCQGWMsrjZF+Pe4MJHkXgseUdRA7km2F6zq9xz7M5p3iZh2F5tqa5cH/1in72MwQGI9ZrMsWfG5g5beDpFMx5mu26wUjPyE15WVGjEx6DA2deh+d7cLszemqQcjzH4ahbX5lVd9gnWPz52aTLtukzrFH10bpx+eayWF3n7sPsuozAIbyYWFOC1ECv22kDPTg4KCOjo7qz3/+cx0cHIzeHWljfUqRjpJG8YzC2fzIazuV6Srn9upZGf1Ji9NAaU4HewyMMfZSQqcLBsCqxw+C5Lwe+NowSBMMLpa703bPBYPKdCudghJCFv298x1ZMHaAyoVt64RxOIgl2FnmfOZ587dTUZhPpijIEjZoAId95a1a2bfZTaY7mcJxHlkHYHZ0dNR0TbDJYIU8bWcZYG0TDkgGVuuWseWN1ZyT90karK2jtGdapsu2ZdtwytIA6jT/qbYTwFC4GdBkMhndq4Vhc1GM/fj4uC4uLurf//3f69tvv20TMGtJ50XAVrxzZwuGY/hNPxiKUzo7cm9+NBtsT9BZYHY/WYuwM+UeHVoaP06LzDNqZb9WctYBTfEpUpsBeauBUwsf43naiRwImHPPuB1lLRsHg8lkvKePzzwG+jfIW8cG+QT8vJ4ZNoHODMFzsfNk6m5ZMC5k7e0nyK2nn9vb2xZozX6SKdkefL7tEV2RxnuFlYyHY5J4pK75m2saVFIu7jNBt3ctf+6HO/A7x/B3pZA83M7CclQ2K0KBt7e39ezZs5rP5/X+/fv67rvvaj6fj6KgjYTJ0TCCjLhp4E6xUtiMs5eKZZ9ch/4diYnCdsAeezCA0LJAnDJDDgYg16Ac8cy03L/rB5ma+jaXYXh4rBEG6Foh1/DtIq7bGdxwdhe0uTa2Yp0afNySOTmgJVhgN+jBiwHYBKyTYrQBIXWCQ/dYo8/5f+2dS28kx7FGk90zQ3IsSzIM////5YW98MKAF5auLGhIDh93oXuap05HNQV7cw0wAYLd9chHZMQXX0RmVVsGMKUWOziPvY7RfW1q4HA4nN6558UUX8u8NYqgnQl8DLDoi7d/lHnTd+qFjVoHDWZ2SMaBpljsnGmD8ZgR166cCtkrF5+F9K/62oPRIGh/dfXrw9kfP35c33333frLX/6yvvvuu/WnP/3pFDbYe7hzsCwbbQGp8bbrcCg2TWgZk72HGZcNdyoObwxGvq9GagAwy3Q/3Uf33Z8LNrSF/MweWpdzJVY6lNO0viBoam+Zk98xq3ZfHOZ44cM5nSq5c2cNXajf/SqI2bHYWDwXZgEOiV1qZFzrdIZlbWMzU3e9lSP2UB0qW2lOiHMUO83Ok9mwj0+LF2Vivp6+2VaYo69fv24eNXQbnlfLwfpWG6V+Lw7Vplre3InvjYdsUjUtRrhXV1frm2++WT/88MO6vb09S7RPVLX5FXukKtCE8A5PEFZj87W2+aYKywLq9z3hGZiYCIeJbsfA9vz8fGJGsArv8DfT8XinsNVMy4ZTQOc4dcFwzDKRHZTeitMnFuzRJwa8t8Gz8+M5dh02Vo+7gFewtuz9SmzrSxmDWYCLN/p64crg2wfFKXY2ZjNmzHz3j+OYRRroHfVMYWV1vrpPP8oS/bkgx7E6E39H580svf+w7SNT9NvbQJCHo7IJN6ZyEcD4lWoeRYBtGbm/fv26bm5u1t3d3frzn/98mnQbqHdqW1ksOCYTY0G5mv/xCpA91hQ6UTBMK8xa6wzhq3yuE6AsG7m/v9/kGKiX+jz2tX4NKdnrxsqUJxDAKgA6z+LrXTfzsQd4djweC8DqJy0skwIJymemM4V1V1dXmxfbtZ/WJa9eeTO0i6+Z8laVuRkP88h/zvWpBcvn4eHh7PnYRgFrbUMonEOB3xuzDfxOMXz9+vXUnlfn22ZX8ih19naCJiK+tiGrnQtt7AFJgdsryT7ulEV/Y8LO187UC3yXykUA+8c//nEyNjqM0a7166R8/Phx/fTTT+vLly/rj3/840kZ7eH80PZeSGOgApwQkB86xqCdd7Ki2qMjIJLEJLM9Ad0IataAoRlkPJGAkGW01mvins/UzzgBQ7fNmC03K4PHhVI1TMILIl8UB4M0EJu5WsYoejc/mgVYXgZrpwIAGPpZ1tUHiWkbp0cfWmB6z8+vPzbjvJhZkkHFLMSbOf3cp0GsOnw4HDavCuIadGxvocjOhrlHNs/Pz6cXhiIjFlua9GecBRgDEv8bGiJvz3mjoJ7DFnyv27NDtR5h440QAGE/tmSmyb2Mw4sHl0DsIoB9++23J2/FD10g3Lu7u/Xtt9+ul5eX9dNPP60//OEPGwEYYR0KOnHuvAvCcnLbjGytreexEdMOYOGkN39d0auXLrtCyfml74afVo561UkGnSB7Jd8HKDiUxGhRpg8fPpweJSkbwzic34IFA2YGW+cqzH4NPpwz0E45L8bl/I3ns16ctpxIJwStvJGN60OPnBP0mMwkvbXEBsf8deEHQOF6swfvG+N+7x2bmIXZjeVD/82mfA19RLbI36kbg0jrMGiWXDQUtR40ldLIaa11Gr9tD71w6Nm8rOef/9UPh8+XwsiLSXwYC5PmV9r+8Y9/XH/961/X4XBY33///SbXYw9YGs+D2hWY98H4uIVoI2/IZQOz4jtmd66E35FkjF6kuLp6fXeWV9aoz8yhk+K+2vPUs9j4r66uTr/+NOWWYFOM7dOnTycW3HbXOn+cg3s9H82JmL67YMw2ZCutQ07mz2003Pfc1gEA3NRj4Kcvrsf64r5SGhIZ4Gz4ZisO/8zKDWqc2wuvLKfJWUACIAc4oQJN5d0UjEFrDxBhlnaIEAm3zw+0VD9sT9xHKUOu7dTGrV+MpRvZGY/7cKlcvOLTp0+nPV+m2Dc3N+uvf/3r+uabb9Y333xzlhNoOOHOkYdqvskMwIbguqzIa73uzanX8TUomNnY09Ovm2w/fvx4CkNsZL5n8hoO3zr2lhqu2YND4OaQDM4TReezx8p1AC9joY6GyJx3ewDKFKo4LHdux/J3/Yxx8qDul8fVUGWt+bU5bs9sp+crP+TkUN7XA1AtTgtQx2RoXa10P+2Auxo49bFEwKzajsE2VibGdU3VNJrgnoK7AcfOpv21QzTTq3ymhZXJxvbmvOUigPGrM09PT+tf//rX+vz583p4eFh///vf17fffnsWVjgO57+Ny5PC/064QwgKe5QcLnLcbdi4PCmOp3kioIqN0Cx0JsH5No73mb96I+euDORmhOQD19qucKEoZSCuzzuwyzoKSg4zPWfuD69DogBENggzSq/OWQ78L7shlPW1VVyHwp0T55DoT4HGdQK2DpktF4c5Tl9M/TE7p57qO063n9eaf4qv/W44ZWdsuVe3XQo67p9ZbwHQTqv315HQR9qz87A8/Syx+2d5tbi9zsVeuQhgDw8P68uXL+vz58/r+++/X3/729/W169fTz+T1klH6R1SQEv9x7U2WgTZX8eBSUwbal0/15QhOObnGkJhC9dgaoV3LO5zfryI7z7vuh0WOk/Hjmn6YkaK/BiLldcLEU5GN29BHYyF/2U5h8PhlLuxwdrjd75ZffVSOteYVTnt4NykQyKvbpfZFixoz3PSOh2CmbGY1Tp0M2PAqVgHygiIIqy7HCvw0Ac/+tN+m/HCnie2RqhXtsNxrrG+23nWGR0Oh9PjggU56xfycbrHoArDwxYdLvrtKXZCDnvt5CxT17VXLubADofDur29XT///PP6xz/+cXp3VxWbCXLsa+/OQLx07pASASKwtbZgRB1G/HoZBHh3d7dhQ1NYAViRB3CeZ0oIO7RzQtJ5m4YxZlLOQ5WRuu/8d1/7Hvvj8XhaDeM89XmBhL7YoPZydlamJlwBF/JzBUnaBSTIpZQJNbShbsvBzsey874sh2722AZEz6HD9mmcFPTNKYvqDTI08GK0AI+BkPEcDq8rmICVbYQxeYXOMpmYEfbmX+uybCfmBDh5bH6/nvvH34cPH07v2ysDo+/0Fz13xGNmZ330HE862cWmvXIRwD58+LB+/PHH9fj4uL777rtNoxYIAqBBTxDK4ESgO9yQwArZ857YxtcTA5rQ2wZTmlvmw7HmnNZaG+PqBPhejLQg0jbMemz03e1uwHJbVgobh412yrN0XD6HJ3x6en2+j+MN9Sh2YjA05t+JXYfPnRvaNbvZA5S9fl8a11TK3Pfqdjjr9AcGXOdtgKpOV9ena/fGa7B2qX51jmsXdtpmTFwL8E56NDknz59ttDpf+7U8PJYea7kYQv7444/reDyengNzGGOjpDHK9GMedLoewANqZ/GcZi1OUCMUwhkL5q3XCpvdNVwx4+J7aX8ZYz0mfWm46j01ZiDOlxAaNxRp/+sRnXeZktc4ACsa9+Apva/LckL2ZrcOzyjMcQG+OSyU3HPmduvxJ51xqsL/fZ3rmLx9wYP5Zqz8IS/3m+LFmDpN11m22ZwfIZ03RXsbRENsMyV0lDHzv/k7y8jhq2XpebFOUI/H0NXr5rysH0Q+U92eL4e9/xGAGSzcKA07P2FFIJ/iAZh52cBtvBUewrKQYAMcJ2S8vb3dxPZVbo4XFGyoZoEFZwNVQ1uXCn9SaO53uOaVTY5ZfpORNy83rRBNsjWVL2ibSVR+/l4PSzGrcIjk41ZU19W+2inVMXjck1Na63XHvT1/rzeLsEyaZ6VfdcAG6b0QDtn6mBmcjz08PKzr6+tNisW6uRdW7bFry88yK0P3anHZ2pSGsTyoz/ZkrGiUZjBuntnXu6298uY2Cq/cuEEaajjRifIgzDZ8PwOavMUkfHbWH4/H9f33359+yZh7DofXpOZaW6ZjoPCD0BVWP08Mi/asLChClXMK+cwI8MaTcthT8rlh6WTcBR2zKDuGyYnUY3fcgG6va/rAhtLQznktK7Hfx9+0AnIrmPg4ZW+VtHnOfneyf62to7Axk4dy/XbYnnsbpgGp8u0LDw3Cnp+WttGogTptU9WZgq51og57AhbLcMrBTazROUTnxn9rDuwigH358mWzyuaVLgvUeaA9L2Qq7fMeFAZmwRbQDofXl9Q9P//6uuq7u7sNcL68bF/J4nzL8Xg8bb5sItXeuJPrUsUoA8GjcW6SWxPsZhxO+ttJwGIdykyMqDKnHxil5eG63Meyk8lwzKb2PCXy8L19ENpzYxmVxXZ7iGWIbhWYzFoculO8Sj0ZqQ2+DNlhuPXYc17Zls04r0TkQO7QDr6pg4az1YcyMsuz/UD3GnVQzwTmHUdD/AkUC3CdMzNz5NA6Wt4MIe39PUiMFGNzktaggOCsaKWKXmK+RPcR1MT8XE+Fa6ZlwdBn2tzztHvKgPG5b80fWGmq5O4rSt/rKd2qYCVGwVBEzwfj8Zwyf76f9ixXOxO3zf0dH8eb4DeITPV5Pp6fnzevYi5TLIjwfwpnbXjug4GQ/9UZ2nt+3v6Wgs+1DTsG7jVTRF/sqK1/3j40PQZl/ZpAxzbFVhuP2zk3b+e4uro6vU7dkRBs2KwY+XY7CNcbdMoaDcRTLpXPnsvJMbtcBLAqppW1MSwTWa/B5LUTRt8pgYhQbIgWQnNG7i9gwGfvFq8xN4yjHnvj5lZ6jfNaFMbiSTDQTJPi8ND3mqU45K6D4Lyva8hvj884zD4tR89tPSr1dQ44ZmfAfQU7jmMwzJsfnrdM+e4+rPX6sHbHMcnBMio7tJx9//Q2VtpvrmnarFuWhGxpk747irERoxcN+8pu7HC6lYG2KNOYHKLTRn8xioKtey4Ae8bUaIxrHCHZNjqvv6W8mQNrKAWi29O40y8vL6e3T1gwXplk4FxnJSrlR3goYA3DA29Yy2ezijKZadWL7wYI57p8rgZZwPZ9LgZGxmggKjjZcXg+PCazsYZL9o7ID8NoCGSw53jzS4+PjxvgMKOcHNb0iI1lwbhgMdN1nbuGlHZclj36Wjbk6xymc34K/dtvZLxnfJWn+0qbzfc4XWA9a/rFc2vG5/HVoVHaZlf2qz914NZP+uDtLiYvXs21Hhvk7Fzdj0vh41q/IQeG4OxBERgNwnBMiz1oMxR7I0+uQcFJdgupBu4cxSTktbb5JNdRAVVQza/0HntL+uP7NkI+nO/XoU3X7wktGywDKlAYvA2ME9uz56RvZioTC2yo7Nft2NDKmmirBuo59V83SdPHSXaWkZ2dZehtK44M9sJqy695nRbAcZo3MyeKV4k5NzEy67b1zNfX2XIvbSN3Mzzf493+raORhP+XxVqGXrmdoiXbVNkZfZiii0sg9mYOrBOJ4ImZ3Ygnn9DQnp3PFij3mErSjgXhYiWwoGzkZlxmD845VAmsRM3j2JszgZaLwyDadVjtPIRZjRW/IYblNlFy8hMA/UTzGVsZm8dig6EvHfe0RQOG4mP0c1oi9zzacTgcKZC7717qd5887wWNGmTDKue/7HzcTnOTrq/Odm+jse3CfZkchGXq/jPWPVbo42WxE+B4PhoON53A/OEUCjTth3WX+j2v1U3rh22z89dycSe+B1eAmVaAGJATlVPYZ4Uzi/KA7Tmpr0Kirg7QYMS1ZUjT4y7+7MmdlqS530pfRoXyT32n365nz4NyzPU2zKjX7FaAyqH5P8vU4+48I1+H7VOYYgcw3W/5+76Hh4czVtMUwVTnNEY7yrJQ2vAWChu9HXL1sMddT/tgOVJwOk9PT2ePAFHQGzOaMq0WRwa9pt+tq5ciGDsS6rE8DNjTOCbbeXp63cvp+TFWOFKaohfKRQZGpV4dMYtyxz2BMC+EM4UL9iau0/VyvxXFhlxPu7dC1clrIr3G5kmawiEbrRWNsbsOvwWVMZh5YjQGbi9QHI/HzSqYQa3hQdnIWmvz8K8ZcpXNMjKT86Zh582sF9RnJ9FQ18zMrMYOEabqlSyz1BoJ7RI2Wq5cb7aAXM1+JydZGRcUDHgTmLROL4Ywx330jTnu86G2na6GToyO4+7HBCzI3mSjzLKAaDaG3MviK7+JwfEKK/pRG7ccL4WPa70BYAzCm+tKLe1NrUj2kFVeT75DGbOXqVhoFvolJZpocUMCU1cb+Vrbd471Ouo3IDhEpY49EGr73Ybiayt31+VxVX5N8Pc+Aynj8XzbKfQ3DL1pd8+TO3GNAtsouc86YEAsQ7RTRD8NUp6bPfbLdV7ocR6wrNKsiz4i248fP2767DJtfeG45Y1s19r+SEv77felce8l3S8rX+scIBhXF2nsWDtuz7NxgPr2cOLq6mrzm2CwfwgAACAASURBVA1llJZRdWWvXAQwlLV7O6qANzc3G0rKtf5so2ag/iEP2rMioKRmSJNSesBWPJ9DUA69LBzGZa/q82V3zZFV0EyGf+CE4wWJtbZPOhjcLXvLyfmfOgfaMbvtSiP9hqEZ6Ch9HpN6+96wMtg6Lzs3xuo59pyZ7ft4AYD+W4Zl1HaoAJ11BBC2Xq51/mMvlDry4/F1JzkydD11Gvywh/ve8pZDtkzsLE0ELANK9225Pf57vuoEK4+JIbLZvZGKQYn9aWbW1k/30RiyV94EMJ5Gd2f76lnv/6Iz9pYoLIPkWUm2UZSN2EC8QsS1puBmEA1P6F83zTWc8zgMmPawBgCHNg1vy5b6Opy1tmGiJ9chJcvOBnmDJMyG/tDG9fX1Cfhgq/TXzohxfv369ex1NfTFbyYo6CIvzy3X+e0dXOdnZ53gb6jZbRBNLaBnBc6J1ZlBui7/qC19Nfg8Pv76y1b9RSkzFoMifed+vyLKYDSxiY7XDquFOek8mcU5vN+bKztg98k26jYnZl1nUCD1PBkU/dOMnaduE/kt5SKA+VUaFD9cSseZqKKnabLZlCccz2BP6boBKwvRIcda2zcv1IOZHXV7hxmj8xZepfNPtNOW++G6zPB6z8T4KNxLfYzXeSZkipx83vLiLboAnPtrZfYL+DxPfrcX8kBZ+3P1fc2N81h2dtRtZ2RZ0A/PBfXYk0/bCKawjT7x1tjWxXcnoFlVt5ECdBgq9sC+RHTeuS6Pyey6rIZiVjaFoRz386tNj1gmdSjWLW9zsDPxPNFej9fx21H5PuTW0ldoW2cLkpzfY6mbNi+dbGLTwrAHMJOgU/w3qJWt2TOsdU5Vnadg8M/P5y9va9tVJnvZvXyS+8NnlHPvvj3QbDjtHI1ZJH3HkxsEC5S+3214lQewYazUO/UZGZbheENtnZT1wvPr9j0mh+oOAytHK/S0g5xrplXsgqHlbUO1HtiRNQltQ7Ie+D6f93fPR59l3CsTqHmMfN7bCMz4C35NpZTFTzo6tQ/wTfZmkOlrcezYO+dlbVw3yWkCdJc3VyHpjMMVH/eklZG4837PlDvafArXWBhWqks0s6xure3PaTXXwT1up4qAMjo8dPwPYDJWe+a11ikEbXvUZeMqIFDMfJqDdCnD8PUONQE6wMJjsPctyF1fX2/m1zrh+XBYaM/vflunpvGY2RTQyqgN7jYk+ri3HWTP6fT9V5U7dZYJ2fEQJk/XeN73AMz9mhZSPOaClR0xIW0Bxvc75HS7vt6g48Jxp5U8567LfWVurBt7dV8qb+bAyAd0lYLJdl6gDMGfPUAfa36q7MMoXW/WUBIh2IvzuTkr6rNnMPhUmJOicKyMwsZZFrqXeyi49j4bz941LlaMCWRgenUgZVoGoz5cjUypv84BuXSryMvLax6qelKlrbFbpgUH6mAcDZMcRvt65FsdJzqYDHHqq68xg7MsvD2Gdi+V5k+nPFPlwPnmxihmm/6b2sPG7Oin4jpcig+WkRl62ZjHe5HB7p5Zvxo/Pz9WxSwL8+DKIq6uXld7+I5HtyL0/UpdWeOzw4m9nJTL3d3dRmAUG0EBpb/gXVC1kpSK872Jatrkf/uLnCqvidX6uxWyoNHwHEP1vDmBT8LdjIF6qLu/Y+Ck7NRGHYd/h2BSzuZfqtiWuVmW5QKTYkyHw+vzuM7fOL826UW3oXi+uHdPdl595tqJVTrMNwO0zKs/7u9UDPKTTUws0GBveyg7m+RkIuKFCMbch7f3HJCJxyUHfRrHpZM01LyIcwtuwINnUrmf1S4LyUlFjjuHQz1uo/mYtbZeo4nNtdbpl1c6md506k15DsUYj8MKlHZSIiuOH/GxIgN+lsHV1dUpVDSt93i6D8iyJNyzLLln2luEfBqu853//IAu/QOc6ly4BnbVpHm96sSeuQbwNrvzfPYZWesQMvb8sjLrpP7EFgDCSTYOs7mGH6qZdAqdaW4JMG10Qurj6up1XyWsl754fmobE0gVAP3Zea1pjsokret8t+PmHX1rvaZNPD9uH92cFtXAGr/V+VIoeRHAbm9vTwZA5YBMJ7cxsr2xJ9SejEFMq1Ze/rdgUQqv3vjBVPqGorHMTX8dXlL/xHT63jDH6f6jnw6T8LLIxbvhnT+xMU1bEuh/vVwZyfF43LBk5+rs9f2TdZQafdkkbMvhvsHHc9OQkLbsfS1fh3o4RetP86VmZjagMrkyvpeXl837rmA5ZtNuwwzKuoGjo46yd37hvWzTzJjcYyMJM9g+gO5ramvUwWeztzrsyoT+0I5JR4HS+juFe9UD9xubtB0B3A7HwRYvWFgfp3IRwPg5JQMQHakHdsc6IM7jUcwyzOYQpBXDObG1XnMxZgr1gAYee2P3Za1XhaMe5zwMtGw5sOewsjBpnggnuD0e52W8x84ASB3c65Wy5+fnTSL3cDhsDNpeDmVDXgDSFOI0IW/52UjKiNwmCvfp06eNfBiPGQNAzjyg8P6l9OZpOO6Q1w7CoRCO7unpaX3+/Hnd3Nxs3uTLvbRNMWABJGWHlgPhEfPQcKwbSJ+fn096Z2NFr61jDk2ttwYQyxbHYH33WD0+gz91EDW4Ho8DZzQ5F87brtEzyIb7gHwpJgjItLsSpvJmmt+VoPAOK22kptd0iuNlYw7LMD6MZPrhViaD6znnbQ8os4VVZmGva+ZGX703iL9uozA4TOyhQOV+cN6gyPX02wrpMTLmtc73V9GHbhVYaxtydZOwjdOGYmZoQJ8ofWVsWdnT2/A9Zr8/zszMYTwhm0HQ7WE46Cgs53g8rh9//HH985//XLe3t6dxlE1Tr1lsnQlzYVCzgwHEpmJGZaDyvNaoucft8t3tVr8859YFxs35RgPoAPKnXhyB2ZbtmmLbdv6yDNEyrtPEPtufvXIRwEy96fhESTtgT6xpqY3A9zfR7PDQgnNoaO9hgXh3vwse2cKZkqSTcRZ8uM/9mibKoGxmh5GZIaHYNVozSHtjezOz4+PxeHoRZZP1DqU5byC1ogIkzH/Dj8qXOjtWgIfzXOMwweyvim8n6DZxVg5xaJNcF/2G7TRPiDzr7CzfghjzXYZydXV1prcGxbISM0izN3SjUYeLHU1DSved/tqJNjrxOTsGg6PrsRO3zprceHyNfCbGjy5aZ92vRnMuv2kbRVdO1vo1MQ49RtGKpDU2rjH9ZpIdFnKtwc6DN5szS7IHoJiqe/IclrmP7r/zFo79qcftMCY/fuL43srh1bGCqJWdcUPPCQH7JgfL1izAAGk257wd84FRGtxfXs4fhUJRG7JMyjflNOijQ2b6j6yRAy/K5K8M0IZs1gj42tEwBjtP98HynIDGeUzrCGC51utTKt535XbszMr0mltCRtVBlwK7++eoxjri68qe3E+DZu2J/wZgZO8IyDbEPSYdDc2ZA4esHXPLxfeBsf2goZsT4RQPBiM0k3BohKD8GluM2gZv0LTAPPkevENEg1YN1WOheHJtCABCvRDnDAo2BhuS8yAGT9iNjRTDoyALOwk7AcsDmZiWmxljKPQBGWBsfvYR+fkXuWF4HgPAZ2CxV23Y6D7x2QzR5xxueLx2apZFAbIhfB2fZd18jnWMNg3Ma50/MmMdmxhU7aCs0/PonKb1rcXjsQ5QvFnZulAZUL/TQ3YUsHXnX0tqug2q+mlWankbJ9Y63+t4qbz5QkOzDoPJWtu9JPWmZUP27s6fuSBMK33ZX0EMwdCv5nmaRC1QcX+9V0OIGiHny4Q6FhtW8xbI1OzB8kOZDofDSXFsTPbOTgY7lMWLM4YC95SToJ6mA8yAu31gYpsuNVo+ex4NJpzzPPgheMuWfnoLA8cmD24H52NlJHXKHDcjbI4GR2FwhMFZdz0XLHq4Heu7++Sow23uFeusv6N7yKrpFSIE63v11UBzOBzW/f39ZtXa7Oru7u4U8pvIID+Hw43kLpWLZz98+LBubm7Wly9fNsaFAfVXu6d3IxEj+w0RNlYrbWP/siCK43XXh3DZ90X7fb7On80cqNssA4Vx2NjcFMWTYZBxQrmsoGyCOjiHTL3sj9yYcO8PQwG658lhpdnTSRECRgXmhrs17LZjkGELBrIDPKZnWs06uqG2/WqO1dczN8iXvKCdosf9WzaPMmcY/f39/UYXbIANj5ojcptOb7i0H+jyW6zEBQdOv7xa6GLArK73GjsG5urp6WljdwY4Ox87yebHqo+186lcBLDj8bgeHh42+7esUH2+yiEgwvBDyl2CtbAQbr1yWUOpq/uEInSljTapH0E6X7PW9hd8LHDawUCnnECZKIZm5sR5A0iBwkn2MjJkaplYVnYSTbg6/0BxmGLwNEg3j+E+INcyaUDSgGPdYPuImWKNxQzK/aFN65BXrf3iSL/+xzpRBt/8U0Mo7uHapiMKuDicygzgRu/ok1eJkVGd6ltMhOsoyNL5tbXmHfy1A9vWlNZwPbRjuZM3tY0hn7JB5+rc7t5q7lnfL51sjqRxqT2KhexEr72jPc7UaUon38o9xeb1DBYS/eBJAOq3QgI6HksVaZrIKRdnsDAld+wPQ1rr/Pk6j6vH3CcSxRiT81fur/Nz9MsyNCigYAAk40FO1NtC35pbY8yVoefPQIaSc41/is/Xo0MFRK6pPK2bBi8DTn/YlfvKAroFAt3hz47OfQH4Oo7j8fwxGwPO8XjcsHDniaw/jI3/ZpReRKk8+O46LSfmhxVWxtEUisNa2L/n39c7PWA9tA5Q/iMGttb5b0OatpvyuxMYl5eazUo4Nikb1zKpZgW0wdK/DdN9mMKAThh98YrVtDpJcfxvA61ReYKt4A4rME7LzAppgLVym7XWsMp+aZt+YFBcx/iow8zS/TETNJjVIxt8zJocUrm+T58+na6nbb++m6SxAYI2+0iT5eMcTdmQHS7gZefscAjZOSrAcVim1GWb8AKP5eY8oOVvmzJrLytFv9x2HQr1tM2ySesJc8p3629lzxi9d6+65OKneAzgjTAY68vLy7q/v9+w0slpnsaye+b/BnV3d7cxtjIeGzRMoMbkibThXV9fnz3aw+fb29u11mtYZGBw7sRhYduZjMyCdd6EiXY9tAFbMt113c11ICsfLyNoGGmHgKLa+Ax+ZpmeeI/dLIExmQUbKBlXc5pVSMsXj0wfDYz8Nfz3OO/u7jb5M8CEuT0cDqccEwVdYww3Nzcbh2iQdyF35HlkHvjzKl8XX3wOkGEOOe/cX0Gkq5IGLZc6RIf1nLdsqXuKClxH9cHXOP3iJzq6E74gwhMTHoN1BvZMXqxpAsa6xyD3QLzlzUeJLCB7IJTMgLbW9j1Ips2m13SU/Npa56/xcNK5oGW2Yg/enFXjfRuMAaAeqWyQB5oZH/1jTGYxjBHQclK+rMSTaBBCbmZtFFPwssHTpAaoud8JYO6vo6k39OcqmwGr7U8Mzn1rMtmysbHRBzMl6uTRIOvVFLajw87Beq4Yu+eIPgGYjBX2Y6dH8Zi76GIdQ6ctFzOdhpBmxm6rYbOLdd06yb2OKCiOZqpnk1Nw2NgIB/ZqEK9TYFy0B3aY9V5iX2u9AWCfP3/exPwvLy8nZIYpOG9idG3IMHUEBbMHc7GBMrFOhOIp3G7zdVYGA9Nar4zKntgTYgEzsXhxvlcpmxdrzoD2620twz3wMGC3X5Y3/2tgXcaeZFIgMvugPx07MvTKo8MQAwLMt+2ZHTgMtGJ7U/Wka5ORUTBOA1bDKHTC4OzFDy8WTBtLXYeBvU6eaww8lqW3qFh3Pd/UWQfWPFYZD/d4Li0f2rQTsEN2vSY37SfHTGA6Bjs6zjm8tpPdKxcB7OHhYd3e3m5yGg4XrGCT0FBGo7iRldUKT15XN6pcKLEfEO1kkyMDAEuDnbuoB+mKTb1cmZHDLrNOew8zFMbonBT1OhR3W2YZrtN5BYOiv7s0Ie9+c75eEofhuaH/niOcB/NPv82k0B+DteVvZfVY8eTe5W0jpM/MffWnc8bnKZ9Y3cZQWQR6fp5/TYs+Wx8re4NaWatLF7dqwA77qvveHG5nYHD3Pe6P9RFd8Dx7LLRf4lGnVRCanj/mOrO+5tr3ypv7wL58+XL6jgelkwYjhGGFpZOeWJ+fdlqjHCjiL7/8chamUF/bQhBNEjopbgXrfTCOeh8L0+xtrbVhBM5XTYoHSHllacqFFMg8rq5s2UDdB8+Zw2vXzTEzRzOPhrqWm0MCwLRhrUHMYIOcO0aDgoGmRlJQnEIh5q91u88O2bh+j1VNoRx9c/jaHNkUPptJ2oC5vuzMbZbldqwGJ+dZm/fiOvSlzJvx2c6pz3npCVwMOg5bp9XU9pvjDfH3ykUA+/r16+YNABaWcwAYiemtBVwUrofjOLkJKwbJQrOdhkkUMwQKCxEI1gpWz4TgTfmd8DXD8TgwSIOm7zdAoHywT8ba8Md5INNt/3Vl1MzHygfgkMSnXoMd57oIYVkY0Kmf663ULp5n+ugFE2Ti8Rv40A0/aO6xWd6txw6WYl1GhgZEJ9y5zoBinfVjNTZYjN1bKRyKOTeMrD1uO1zrLH2mn58+fToBGvdVh1z/pI+T7pUdVufN1DjGGC1n6kIWyMvJezNgM7v7+/v18PCwCdun8uY+ML9Pu3GqQ0uooVfxJm9mUHOd1MGgJ1rPRHmZ2spY8DC6l8F11zbFK23uM/fZW3OdvShK20l2WOjPjKUvPbSc+fMKEePxRtnn5+fNw9dQfJSmISeMzYDunAR9gRGbeTBWr2p6DrluUmpkwL2kA1BigwufnW+tPLxQUsDwf+dvPUbGwmfk31yfdcC6YGbn+W2ivX2knzgT+jAlyG3k1gnrqqMjz93EzCkFn+Zyy3B9vfchIjvaM+ADrtRjZuWw0fp1c3OzPn36dLZxvOUigHUPGOXh4eHM0JvbMNIaaBp2Gmx4uZw9EApnquuJswE1H4By16M5Du9zkwZgezVPCqUAOHkirpvA2Nc6H9h2AG4MuS/w88Zgv0qHAqj4wWyucR7D/XeI5hDSDqMG7L1VZl0FNebAK81VUnJe7pPDVO6zc7m6ujr9WC2g5M/tVwHW4apBws6SvqFX1jXPhcdqtmjgY14Zm+fezLvX9jvsGjkaSCbbmRwr7fp3A3yea5xWsLN07tf39Zjnrjhwc3NzCjXdh6ZiXC4+zG2jM7U2sjtnwufmuFxPB+cwwMli7reAS9PdT4cCnRSUl6fp2W/kxx+4zuN0TsxxO2OhLdPyghf1TJ9rtPbOAIEn3PkPG5vH6vpr4L4fIOuPl6BMgCwKjcwbcrs9jLDHfa/ZjUM+OyD6PrG5AhZjNvt3mOz6uM+sv/qHLOsMDeqMg+011If+2tl5FbNzzXnLrVs2anv0hbEaVFwMnhOL8Wp+iYRLWbMjKDND5qo44JC795e5equU5X2pXGRgKI0ZQPMMZQ0OG00vqacsDMNyGFZKabbX0Mz1wLSa85jqKwBQphDEuRjXyxgdqlpuNgKO7YU/tM1TDPawbtthSBOw9dIei5kUfeJXoRzKmn1aKQ1ATgE01GH8E+Ps3JiBGZgMEmWCDekYL2G4AalOrvpiXUS3qcvMYmK6XOMopdHDXgrF8ui82WYKOmaqZeqeD64F4LzlY3pG08U6ZRm4T46CKCUOZfHWdVISBjfnVanP5GevXAQw6LdDQ3sTe4IirZGY3IsH4AH63oldeWe6laIAxzErko0Yg/QO7z0B2QgvleYjyqI8Dht6wYY+G+CYQIdw/HeyGBmgCBz3UxE2VMvDzMwMhOfZzFy6i98LA83/+B6zMivzWuuU3DUomqFXoa3U/o987cn9rCPzUUPqsaYuDKzU8fLycnr+kvvQUWzGTLdMnfqp13Uz9w3b+d4FKutYgaOLPGZ7Zre2Hz9j6tw3xUyR7567tV5TMRwjrPfbanhZpR2S533q21Te3EbhpKFfDWzF6hsXrGgYgUHLSo6C45HYXW3l4npyIrRj4ymIOBdQj+a+18tRyhKneNwMteMpuPp9UFPo6H67LgqyazK0St361toai+W61mvYx1zZ4MwybfRVWMu5SXIDt5nslAeiXTN1xj5tpWBMDTsArj4ZYYMqw+Z7V5OptxEGsrI+2A56Pdf1aQjydE1RUA/X2Plwnn4b+N1vszz6UACyfhhIaM+AWkLQvpqIoO9d2Tbb5lrrpHXT9+6ViwB2d3e3of5O2hVkakgWlnNEVui1Xn81mEGZwjt8MiBSCHNQAAvVG/oQvHfptx/0efqMVzLbahhoZXOh3W4B8WKBx+OwyquGZrIFKAzRytu8S0MzyxIAgXlZRtzrl+61WHkrO/piR1I5o6gOjwvmXrhwyG3m1Tn1WLxianZL/ydHZ+ftbSYNP9d6dTZmxma3Lnz3LyJ5PxmAbWB3HmwK31wvfZ/kSJ3WM/e784Y8GCvjNFsvuNop2ZFbJxvGuz2z7UnfNmO/dPLz588bT2YjomGU1+GdJ89MoejrlSCUzzkFztP+4+Pjenh42EzklBOwUgNy1AMjnN5x7omeXnHi3IfvaRh4Eu5h+2iTx+8QoYzHit9QlnG4Hj8EDWCa8Xk3Pe1abg5tPT8Oh71S2RzOBPwNAwqmVlzrQEM1PrfP1r0yfifTJ3CfwrbJMRQ0qd8A6nzqxMpYjKAfZlrMj3WLes0KK0/Ph8Nz7rXMab+huHNkHjPF1zsU7mJCwcegbn028LWt6kSd9l6UtNZvYGB+75RXBZunacM+ZkUz+JlyMmBi47VeQ0a8w+Hw668s1xsgGCbFynA4bJ9fLG11KYVnLPTf46WNMi5/t2GgLJafJxuP6WRmcxB2ENRhT0Vd3ovGd2+hqLJ7u4IZtUPWysqsx3pBOwYbrllrnSnpWtul+4b3BiGHsa7b6QmHqwYk7kUufKbYIXtsyI++ePWPdjo/U8hMG762Ty8gAwNs62Dcnn+PsZ9h1Q7PTEbqkD2/FOtGWZ774nunaAT7czTg+iewtsOYyps5MH7N2Rvt7B1p2KBg5mAPUfA6dUIMjAHY6zZnYGVtLI7xeuWE/tpw7cE8jk6Sx+d2bUQWPu05BOZ/PbQfpyFp7tCh9Zb5NkHOnFFM5afwn/oxarPAblB1OoB7fL8dA7L/+vXrhv3Wk3osOBo7DDsOy7HADmunHsuO/jjE47wf57JeeqXVBm9HTJ1mG37pn/Wp80gBlKcQzIWtLh6bx2oW19VGZOaFMNuoichUOm/9IR7PjW284T5bTuygGwXUUb4VPq71BoA5BIGNWXj1EighhultDR4YddcjudNWuoYODS9coKv9xZi1tquqrdvjbf7Inq2exjIwkNSrUE8T/ihQV84ccnLcCWHXD1ABFBOIwYxsAO6fV40bunEdhgIoINPKn3o+fvx4yvMAPPS97Pvl5eX0kjyzBwOAZWEQ9f+9BYuJ+bltO9A6jeaRkF+dOP/dzocPH05vezXL5j/gZBCwnVgO1j8DrOfMqRqu92pkS8HS+tuQ1+cdiVAaFVmG1nXPf+fR4LcHqpv+Xjx5eE0wAgoYhEM2OgnSN5a3EjkJaq9KZ/uzTGttPZnDUIqNCRZmD2Sw9QqVDZRzjMlssHktg+20SlLPYS9dwG6dKAXjJN8Fs7TReZWt3oyCQnvu2g4yNmNDPg4vWwyyzKVlX6Cply5rQv715DUi999MtMwLuVZursMyrnEWtD23nLfz4DrbAMBMXZZnGT8A1y0OXGOHxnwa+HBQHqMZlO2WNprMt6wa1k/zX8AuY5vsyW+LcbTiOTRgT+yV8uZGVocGDLCg5UloHGumZcS2J17rlV15MyLC9iAueSjTca/YWcBmOhaMPcTk+U8CO5yvjPJ5mugqq8dmcDR7sJw476V/s6auqNFHxuI8IvWZFft6O4kqXsfesAPw8jWPj4+nt5kwJ14McHvIxh7ax6uHNhzAlrm1jKmzaQT6TN/o9wSU7o/zigY+rvOqs/vteXMqhjY4z2onxYtJzS2amRk0kY/1x8VM3KkCF2xsz3kV1D9+/HjSNeuFox6cDfswyxT9ea1Xnb/ExC4CmL1Mjc2hjge6R6VrZAjBnTMdNr00g6I0D9WJssJ44jleYGsoNLEoC5PvDX33hG3vWCB3m80D1BvaaXQ1FplNjxhNTx0gDxfnDj0PBQ/YkoEFcLTx4pCcMG744/bqMGAbBibLwWNof8xQLM86WeQzsSzkW9bvUNzGx3evhvKZuuir57D64XYKuh6TQXgKKSlu1/dNEYQZW2Xl+5hXnAebe2s71eGu4ttWPf9OB+yVN3fiUwEob4G4YRp04r3epx0zrcfDGIyo217InqYI7lyLldrGX6W2R3OxkL2NxJMw0dtpRceTY1ZRBmPA5j9tVdHsQQ0MDntoE2brxQvanpbRkaGvqTcug+a7XzHjYs/qOpCvdaOAY8O2zrSu6VxlbpnYEdiwzb691cXjBcSdHOde2jTIuI7WZblMDrB6Qvuuv0DYiKD6bR2ZjlU/kGttt86t4G+2b7xgAcBza303Ifi3AYyJhSIaXRtKIdB6hA6gRmADcOhjA7+9vT1de319fQJTG+MEqIyBvqGQNnRKFWcKL1sv/Z48les0QJ8EL0V03qlKVDCzzDlnhuNQbFJs5FiQs3zsJflshZzGwr3ex9e+eN7RFXtgs0UfL2ujzQnUm5cBYMqeXbfnwec4b+fthLhBgu/ThmoDq2VjJu552AO0guvkdL3laALDaasF3wvyLy8vp0WYMiXrhMHJxMXzaUBEnmX4nQfGvBfGrvUGgP3ud79b9/f34yoIAqhXKrX3OXdoz6NaOWjny5cvJ6X3A8ZlUS71ANxjwy8rsPIBCH6cYfJabW9iVfUqa72+PscLD1xr6tzJ5HhDUOTakNxjXWttmNges6J/yKwAOYW4Xixwn8xQuJ76zLyYX89B9cRzaUApmBbkpygAOZfpWod9bUOv6jWy6kZNA+0U8lonCpq0a/nZKdKW27NTn3S1DGsvIkhsWgAAGKRJREFU9UG7Zu2U6ovr8LYK53HtKBwtMDfe8G1deYuBXXydzsPDw/r9739/VgHe04M20yl6Fl2N3vWsFgoo7p/DmrxOVz782V7Syuqx+Np6v0ve0McmhdhjCZyv4dmImFzLyvKhPc6bLSM/hz9W/GmrxlrbFSQUkHN9tY/nDXBzbpR58OqWgal7qLgewCs7rwFP17hdrumik+fSoRZj8TXMT1Mak+zMoB1NuFQX7FjsHLzi6HsMeG53Cvc8/2a37UPnoCkFAxTFc97jlmHnraH4lBqwA2K8U57uNM7dM2udnn/zRBpluxWAxvGipomTd3MIxCALgkZmA4o9vz2zz7n0gVgLjf7vhTpTnQYcvndRwpNW5afebtHAs045jbZvZaCPZUdWUBTZsnC4zkoS11O4pkZQ42POGSO601SD++B69hZsrDN1Tvb4PdZxOFTmfx2g22BurTOAjg3NjtltGYiYL8977/Gc0I639hjwrENTmGUwn5xoc6G9j7rd/6ltsyTGbIdwOLw+CeM59BxZZhTqRY/2ypuPEpnymcabuje08CTXA1ix8I4NQRlckdz9mDaiToKg8EiUBTddN1F6X4vCeTvAWtvd/g4Zuc+yqud3/WYYlC6euH9uFyqO8ninPoZtI5oWDPyDohSU2Abt7ygqIaDl6LH213walpUtOkVhgOF/xzexiQIx8rIRNfy2c0Rn7MSbU0OG1OuIwjkzitka381IcIYlAZPuTKGsy8ReAEbfNwE+xYzL/ZjsqCuH1qnJtqb0heW0l7I5XXPppGmsN1KSvzEj8wS4UYTv5DmT7Guc+zJY1cDXOk+qlyWZCdlg6H/3gK31yg4IYfaKvSD30YfSZHuPvdC19L+TjKIZPAxI1GHDpJ6yM+q0ArvNhoCcm2i8x+U2DKYoYENbA1eBoMzCsrGxOn9S5mlGBADUWVqWBoOuLvupEsvZ7fEDzTZ05/cIvw20Dq3dXnW5Ye8UlvaY62mp02jO0fW6z2VcjMFzYdZVNjWxMzv8yUExl5fKm9so7C35IxFccKoH8ncbwQReKEZDTX9mQPaQZif01b/4jacFdL31oobiejk+0X8rB3WaXtcYprIXErr+PYbg/lghefaQjZQOk2CgHZeNAiOctrFcX19vnJBDHT/szH185/lAhyyACWNyiGbH0+Q/pbrnzZ/NGZrp0187NB59Q+bIb61X1o5umm3Tb5yB+1L98Hx7Pm1bhNTeumTmyfzsAVML7WGrlh3nbZNluXWGlqfBnOL57yuyPFetj2LnR32/ZawXr+gv0ZhVOIxgAv1nRXE8vWlcwEFdDjVtaBUQ9Tks3EPtsojuJUMZvaeK66tULfbua23zGPWeBYz2sbmYtc4TvV097SpaVza5hlU/h1VmjO6fw3gn1b1r2z8L11yRAez6+nojZ4NfQ6CmBszs7RCdmuB/tzkU5Bs+W//o2wR8vs7MznU6UnB4yBh4vIq+lEH7cR76AIOzTD3vAKfHM+nV/f392eNgZf+uty85wLbdNy+s2YaRWR2rSYhtvGTHerDWq51fYmEXAaw/2UVhYkypXerdO8kON82GUI7SSNNTe76pXQvGx3ocYdfIrVj0008g7HmFerm9cKhsjsK19vK+jn57JcoKWOdgBuh6ylDMJrx4gOJyn3N+VmSDlWVAu31/m8Mq60DZzcRUaL8pCNqysXN8Wi1riI9hUY/l4Otoo2M1S/dbP5oj9pw5vPb1zWlNoST3d8uGWTbFOVHLq8WAZfbDvONcDcxrne9zaxvd02fb8Bxzv53C9AzsWb8vnTTqlz3AWLhuSt75R3E517jZwuqydMNIBOwEuZWfe2zkExuCWZohOtyi/zYWAyf3+Pv0BgiX5qscilGs5BOQWc6nCTwcNkrniXffDehWJOrgPudrOMe1ZsMOx71HzAyIvju8qyE1Z+Kxmg26vwVQ6iozsIFYV60vdlrTc4P9rVLkbx3rXFV+Hq9ZE3oJgzeY2d6sM+hddYexmUFNNrvngPdA3uyTMVAc5vdRsTpjs3rq8zW0aec0LUCc9fvNK/6vmD0xkaWNDIrr7LV7nwHCCuk2LEhAwStCbsv1lGpzvnR3rW1S3AKdAKMMw+Oenj+s3KjX/ajyc02T9h5vix+YtVcm/LNhtK9eLJm2Nrh/VS7nLQy0Dg/tZLxS5/9m4mX69HHP8OoErV/U4e8AroG0jNbfy5i9IDGxQDvGyZH14WY+ozMlAvRnYio18LbV8ewl/Kd7/RNne6kTh5Z9w0QJwgS4TZm8xbamchHA3AmHgs35MEhf6wny+cbyZiacN+20wKiH77CG3u97bJATjbdH9XEb+STYaUHCxYnpjpH77V0nb9q223/Ax4lmA5KTy82VUY+VzswMpuDEdJWyffUcuP/Vl47JTMpys6Pp/DE++tzw5pL8kD/9ar1lLb63xsx3nos0i5v0hjH5rSjuE6W5KPpbkC/DK9iXWNhBu/i7galy4Ttybv7ZusS1U8ht8gNDNpO7lPDf9PvSSb+ccK1Xo7u5uVmPj4+nF9A5obnW9hUd9nwNCWEGBbauRFKPJ9OMzhPTjZRdeaNwL/1jtaxsjH5OsrGAHSYVGG309J0691aWCpBmA76GMVxiqF4pNcV3XQ61+64o5N+lfxS1ITznrYT9xR7L1szTcwIrdOqBcwZts/Sycs+3S/XWffAf+ur7ahMYHg6je7xo3yAI4NVRTgBgXaI0PCzL6nGzqYa4ZZO0i7wtH+cu/bN91iuHuLZ1+tYICDCsrAu+U7kIYL/88ssGjBwKXF1dnR7cpQFe3EZC3B21oSHIJoGncMkD5XtXRDxAv9wOJsVkd48TQraA7Sk8Nq5ryIiyYPQFDwNvWSdgUeVxHsgycB2WB3U631SPSt8ZE9cbbMiBNXnKPFnWXalFXu5bx2S2wpw0DWHjYyx9ooNjDscsAy9IWLaWTcM7G07B0jmqp6ens1dYc0/lUObC/DjE9hz5x15tvBx3sV7xvfJGTtNx20/1bIqS6JN/9pDjXQACEJ34r6MwybCzwWadgrpULj4LeXt7e1IeK91a24R7wxIUxGGHlcwC5HwBwiyIgR2Px43BG/ych/HkMhlXV1ebuL7hbcfU+lyXJ5vPDs+sFJZPc4U2dJ8ziNeTG7B8re/1UvXeWLw8bllPMvR8UR+Kh8ycWjDIdWw2bq41i7Is6YNZg+Xg+y1vh6zMWftpJ2FAdz6q47cxcg1MqsV5ub1inenceazkMqektuf0t5TqpsteaFrn4+tsG9YLzwnzYVvsdQVtMKdAfzb+S4P1GxnsBelU3+OEcApORtW9AYHGDTP5/Pz8vO7u7kbhGegKEs6NWEGdNKV/TIQVGkNpKa11uNUwhHotE3/3eAqqLvaMrX+SyVrbH1Fo/507goXVSVnh3b7Zk/NNHbOB2mE+QODj1R+Px2PwiqLbxklRN17cjs6657YdGnmslqMB2iyuaYpPnz6dvSnCKQ+nDcr8Wzdy5lo/G9n53mNkHZeP28583KU2zVwVdAw2nhuniNqnOgnq4HcE/iMA86NCftWzBdbvRt69eNYbX43Cvt6I7mvdRhGb+xpWFiQmcPQvv1TgZTMeW0Ndt+F2mzcpo7AMqbchTmk4bTU34j5VOSuTht/+bCYz9XGt131AhDo4Njsns0WU1nmihjCeSxvZFEb5uMGKsQM4jRw8x3agntemKsyO7IDs/PjeEN9ypj/YFtfZOTSHync/GlVZ7DGxPdZlcJ2283QuWiw3rrWs/dl2xznG3PvWes1Jv7UX7E0GhmFTIcKssKwIDmem0GKtrbetQTOg5sios6EWiG1wtND9IwlmLkZ6rutqyRQeeByeWOdBbLR9ntF97zhap43TcuO+GqhLDc3/ndifru8bK+w4vHrH6pHZmUufevCYzB6q4FwHiyqTaXhJ8aq0E8OMxX1tysJg7/u7UsmWgYaaBnzas0zt5JEHOcc6IkpzstPLNd2H6XtTI77G43ffKAac/nfYbRDcY3l2SHVK2K7TPHt6vRnnxZOHw/ry5cuJoeBdndBEQDTocGyteZtEqebk5TlXGt5BmUk1z2T26OL2zBb4bUZKWVRpMlTfCjx5i/5cGHXRR495otluswnTevAWszaDf0MAt40MHDYZzDz3DZ3RDcbHDxET1hVA11pnCyDuT1MCyMP5L+thDdXG5Pqb+6vOcA06Z0Zqhzhtfm1I3bDUDMUrkdNPAVKwK9tW2XDHwTUFa/o96faeLVKnQWqKMuyIGumY+eKI3c+vX7+ebTJ/q1wEMHeWRySsGAiQhh1Sco0Fa5ZVr8ZxKxkeHmbkNs34Hh8fN8l959y6vcB5O/+fjJ98BnV2cqmTvIbHXE/XCZkmqHKyolvueO6J3gMSBqtSeReuZW7NQnqfd6VbF+qV3X8eJfLcIDMU2ivHZVoUy7566JVy/69jrUxxBh4jc1W2VMeCDOxMPLYyGwMj1/qz27vEOsriywzbT+yiD2B7dR5ZrDVv38H2eKDf/bDsyc9Z3h6b7cWAZnLTBZ+3gOwigJUiUvAcKOz0gxFG2z3DmGiugQAhwIwaXriN5kvKpAAgPCnCN7X1xHGfQ8Iqltus9/ytHsSloSSfJ4Ay/XbfJioPc5iMykZe5V/rlYVZEZtnc998f70338sayloZn+vpeJ30bthXZtF2AU+3a5lUFwy+lpPtw8XOuXV2LJO8Gw66D23H93ZPmcPm3s95g8ha52kMO6s+92gAdD8LTpVVQ0zLxMza8torbzIwwKodZRB0ti88YzAWFMBiT049/m5PQTH9br0+V8rquj0Ge4KWCtBeuddZVv5fFnASeIyXUo9HqUdsXQaKhk1TPfRpCtes7JeW23uuYXAV1Xmh3mfQsbHUqRiUDRAOZeyk2kbZnNmfw1nLz2+JcF1T2A3DwCmSG3Sk4DEwZlhcd95T/OwvsmecEzh7DNbJ2u6Ub1trC0xuv29kcXTl7+5HU0YlILbR4ovTA5fIwEUA++GHH9aHDx9OYVRjeIdnhG1eimeyPXh+O84My0yrg3XnvSXgcHj9JWcLpfF2BeZj/rk2C87t2wDKUK6uXn+gtue7TaMhwyUvzFin45a7++eXNNYYUIYqF2zUYUA9ZYGO9glNPH8UlNHJ/8qlhuliZXZu08zL+tax9S0NZhPPz+e/yk70YAdoffRcdaweF/pAH5w789gBri6QMCZvs4D1VL5eDTX4U5qO4VjZZR2znVvnkfOMhXYnp9Q2pucezboMaJ73CXw3Y9o9s9b6wx/+sO7u7s7Y1WRQ9jpmH8/Pz5uf2sJ7MBAEDUU1wjvUrPezAOoNCg7OF6GYxPRlMBVyWQ3FQNrVJtqcqH2ZhsvEmAquPmdD76twCqjs5au8HQbYCGyoE8hQHIqarU6GYVlVKS2rKvTUD0Dbcza163Fz3O/mYm5w0sjOjrfz0D6vtU4rk1MY2lDPq5jWIcbBbneuvST/PZbt6MastXpMP+yEuR7ZTk78+vr6bO+c89S1y+aI20/3z3Y3OfrNHOyeWWv9/PPP6+bmZgMgRkQ6XO9TIPFAuN5MZ48Gd5C06Xo9KQUgT5AF7Wf9proRKMdMY12Hc34oob0thuofNTibgLDJyTlQ9hhb2V3fgYXMDUoAQL038mIMnnvPhRdtkG1B03NvGfohc8boENY5KrNAriGnV7mYSVHssCgTeDJWr7q6b056T3ra7Tbug/eFNXw06JpdUti+NIV87ovnqfkjy9q5WtsRdmhH5jGYbLy8vGz0nzE2ZHY/qj+eB1JQDrvfAi7KmxtZvWq31jkNnoDIArDwoL4Ngaz8/PkeA5SF7PwXguCYAcvCsMIQRtFe6+Jae8H2ZQobO1EGQY/b+8489peXl3Vzc3MKYVxXFcvgBHg5h+dS45tWfCdF7JjsPBjbxJB9rsrfXJadT9vzkr/nlOI9azYa2kbOzScatKZ5tEPyuKyzLlOuCzk6hHJfYc6Xnvubnus027UulzV5PE2POAfV0NKyctRUnfQc0S870DJop3Ka4kGfjBtvgdibG1ldeRmPz1lxEIAVtF5hCs0mcPB1BiiEV4X2da6ztJQJ8gOna80JT09YWU/ZX+XgYz5OW8ioY8Xg2hfnI5yvch0oc3NDjGWvTJtOp/L09LTx5A4f19rO9cRWOic2sLLQKX+3145DGF/rcKilgDP1d1qEuGRYBsbqSfNibtP/3/psoDGgTvo3/bk07bMX0Tils8f+zeToZx0Yx80Q7Syru/92Dmx6ZUmRncaZlMnACnp4THul5jxQZlPg5oWa85iW0C14My0rggGvINlJMvBNxwtYa52/idRj6KRyzvt3qMP3EnZOSXbLZpKly2SwHr/nc8rrGID3wHECwxqw2VzHYVZtOdmRte0yhIndOZGOjpVFwigqH3bQU7pah7zcN8/5FFY1GuGe5lDdjx6vrKfQzWUKrZugn2yi93J/AcrOwXP58vKy7u/vN7rlfWQGtH87B7bW1viOx+NpZ7W9jDu8x1ScQ0DpoaNsRC3a21uYflqAHuRbFHWt7YPATJANY6LdDdmopxSXCSuTpB6+17O5Dq+00g/LmT5Mhu3xeSwYqVcqYSUFYu7xSmaNwHM7AY7bt+PzIzNOMTQ0cuF82/GxCWDNJHs/xmIZTvOBjkxPcuy9ywsjLGs3mFlv3XfkYpk3OvA90xYd1308HjeLC5Vpx4Q8zFid4K/8KXaUzXvZ3usQWNw7Ho/r/v5+rbVOuxQOh8Pp8cBL5SKAsYTrRx1YuUIQVZAq5+Pj40kBSpfLhhCa9yNNjMaMzpNdj+TvZhRmaggZhfZqme87CSzMzUzi+fn5lHR13VbaspUarBcGXM8U2tI3g5BBoeG86y3boBjk9sIuj22trdw7p/QFoz8ej6f3xnWcBUv0qADgfEsNyQzGjKhbDMgVMufOH5mJlFW1zy7oTcHWsp4MEsZNLgynxZx7UcMyKYBjr2a0zb3Z6VlXuLepi4mImKwY3JpTdfTD5z4hA6YgZ88zj+BdKm+GkEyijZoGjbgGHfIjeKPmcroQwP3el1XvwrGnp9dnGx0S2nNO+TBPCH33mFzfFGrZMOxN3H9/9/1TfdMzdPTZxauhBQb+/AgJTMv3X11dnRS0e+cYN8VjqKG2Xo6hkM7v2Mg4x/zxuhkzUrNy6nOOz/2rIVNYyfIzrfSZfhhILUPrsce9F6JXJhhnV0jXWqf+2PEiX/rs/k59Ri4GU7Ntxo1MsBHPWZ0cYNGcVl9XZMBDz52W8H3OvXGcFBP98d7Jkpb29z96G8X9/f1GIc2ySnMdIpnh2Jv4fjrrhYLD4XD2W3AOObr9wWBR8JrCPoczje2dzDezIBfl+j3xXNs3WTR87UR0pWYqBV7GZYWz7Av8ToY2HzO1gXHvGa0Bwxs2HU5Pr8nxKpsByQ7By/zNhU0hTJmvQx7GwJ9zXU0NWBe4nzKFap4rh0PuX7cqTKEyYA/r6Vs0LHPX0UiC/hDSAqSTHXj+HSY3jEYm08PlE9u2HU12x7VgA2+AMSP15mKz4Ia/LRcB7Lvvvlv39/cbAa61/WFZdwTBmTWs9SsQOjSYkvFMJOBmim/6XA9WwTbPZIOx0nN/QaIgQB2d5Bprww/61K0DJ8En/HGxXKYcBCy34SAKhFGxIXLP+M0efdyyxbt3tdRj8T4nb3loKIKSGoSnv8rIwOnx0UaBxvMHcE3PCboO53UtA0AdZmSHcSmUpJ2G+QYQGCf923vtkhmZ9dX24XbrhP3n/KmT9XbU6Lt/E6P6zxhqoz3X3JtTRx4r43SYWUAcZX3p5P/8z/9sNgFSoR+CXuv1J5is2Cgj1NYC9oT4OHU35JyEUy9vukup12r41TDOXovPZhdNvk4Mir4xtuvr67PEfBmXcwIeE+1PYaUVoOc7Xoq/V85TQthysbzor4tDRerjz4C81jaHyXcDJox9b/VtLy9ZNtQH961/zSk6rVGmbMdgeU/6M+kFdlFj5LhTIsfjcd3d3Z2NDZn5j/Yq1z3W5pCMKIpHBR0alv24jmlczEmZZCMerkNGPsdiA9HKpVX9jQx3z6y1Pn/+fGJbBgwQHq8yLZPTOZDdRg0LQ2jQYbxRH58oPTWjqqfxO4nsTeizBdhJKItDeA3LfG0/Mz766ZCY482zIAMnpxlPx9hiJ1AmUjbj/35Wj3psgO4L/bc3bmIbhmUAN5iVZeEUyixpr2zIfXE/zTZshIyR7/b67lvnnHrM5jxfZlKVAeyT4w4RzVA9rq5kPz4+ruvr682Yp5AefXEUYec6bWhGHz1XhJ5mXfTTqQ+zv0Yi/DexMStrusNzbXa4t+J5qVxdQrf38l7ey3v5/1ze3Af2Xt7Le3kv/1/LO4C9l/fyXv5ryzuAvZf38l7+a8s7gL2X9/Je/mvLO4C9l/fyXv5ryzuAvZf38l7+a8v/As0toE27V8j6AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "e = gaussian_derivative_edge_detector(im)\n", "show_edges(e)" @@ -356,22 +304,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "e = laplacian_edge_detector(im)\n", "show_edges(e)" diff --git a/notebooks/chapter24/Image Segmentation.ipynb b/notebooks/chapter24/Image Segmentation.ipynb index 681a3f48f..c5f546b1a 100644 --- a/notebooks/chapter24/Image Segmentation.ipynb +++ b/notebooks/chapter24/Image Segmentation.ipynb @@ -48,17 +48,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -76,22 +68,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAC7UlEQVR4nO3YMYrEMBAAwdViPVsvd6DLD68vOdYdVIWaZDA0Ax577xfQ8356AeCaOCFKnBAlTogSJ0Qdd8Mxhl+5N9ZaT6+Q5xv9bc45rt5dTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBB13A3XWt/aA/jF5YQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixt774/A8z89D4F/MOcfVu8sJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosbe++kdgAsuJ0SJE6LECVHihChxQpQ4IeoHudIUPgvLLmwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.imshow(gray_scale_image, cmap='gray', vmin=0, vmax=255)\n", "plt.axis('off')\n", @@ -107,22 +86,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADB0lEQVR4nO3YMYrEMBAAQesw+Ff6/5c20uWL11xweNtQFWqSSZoBjbXWBvT8fHsB4Jw4IUqcECVOiBInRO1XwzHGo75y55zfXuHPnrTrtj1r3yftum3bdhzHOHt3OSFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6I2q+Gc8679gDeuJwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiNqvhnPOu/YA3ricECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0TtV8M55117AG9cTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEjbXWx+Hr9fo8BP7FcRzj7N3lhChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFqrLW+vQNwwuWEKHFClDghSpwQJU6IEidE/QKgERT5nIvuXQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "gray_img = gen_gray_scale_picture(100, 5)\n", "plt.imshow(gray_img, cmap='gray', vmin=0, vmax=255)\n", @@ -139,22 +105,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "discs = gen_discs(100, 1)\n", "fig=plt.figure(figsize=(10, 10))\n", @@ -175,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -185,22 +138,9 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAADOElEQVR4nO3dwUrDUBRF0V7x/3/5ORaKKL2SHV1rqBDewN1TJG3mnPMAet6uPgDwnDghSpwQJU6IEidEvX/1y5nxr1z4ZeecefZzywlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihKgvb98reuXD4TNP75L6VXc676sfvL/Tea/4W/gpywlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlRa9/4/uq3hQOfWU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVFrN76XzczVR4Afs5wQtbac1gl2WU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlRaw8yOudsXQp4WE7IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVFrN76zZ2auPgIBlhOi1pbTqz3sspwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidErT0r5ZyzdSngYTkhS5wQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0St3fjO/zQzVx/hz7KcECVOiFp7W+vtDeyynBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0StPSvlnLN1KeBhOSFLnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRK3d+A53MDNXH+HbLCdErS3nnV6R4A4sJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTouacc/UZgCcsJ0SJE6LECVHihChxQpQ4IeoDHL0j76PZjhkAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "show_edges(contours)" ] @@ -234,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -250,22 +190,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAC7UlEQVR4nO3YMYrEMBAAwdViPVsvd6DLD68vOdYdVIWaZDA0Ax577xfQ8356AeCaOCFKnBAlTogSJ0Qdd8Mxhl+5N9ZaT6+Q5xv9bc45rt5dTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBB13A3XWt/aA/jF5YQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixt774/A8z89D4F/MOcfVu8sJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosbe++kdgAsuJ0SJE6LECVHihChxQpQ4IeoHudIUPgvLLmwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "show_edges(contours)" ] @@ -279,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -291,32 +218,9 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "contours = group_contour_detection(stapler_img, 5)\n", "plt.axis('off')\n", @@ -332,32 +236,9 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "contours = group_contour_detection(stapler_img, 15)\n", "plt.axis('off')\n", @@ -390,22 +271,9 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAC3ElEQVR4nO3YMQrDMBAAwSjY//+vGqUPwpAmXsNMqWuuWQ401lovoOd99wLAnjghSpwQJU6IEidEHVfDMYav3IeZc969Aj86z3Ps3l1OiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlRx9VwzvmvPYAvLidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihKix1rp7B2DD5YQocUKUOCFKnBAlTogSJ0R9AF+CDrluZqs6AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "image = gen_gray_scale_picture(size=10, level=2)\n", "show_edges(image)" @@ -413,29 +281,9 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[((0, 4), (0, 5)),\n", - " ((1, 4), (1, 5)),\n", - " ((2, 4), (2, 5)),\n", - " ((3, 4), (3, 5)),\n", - " ((4, 0), (5, 0)),\n", - " ((4, 1), (5, 1)),\n", - " ((4, 2), (5, 2)),\n", - " ((4, 3), (5, 3)),\n", - " ((4, 4), (5, 4)),\n", - " ((4, 4), (4, 5))]" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "graph = Graph(image)\n", "graph.min_cut((0,0), (9,9))" diff --git a/notebooks/chapter24/Objects in Images.ipynb b/notebooks/chapter24/Objects in Images.ipynb index 01ae3af9d..7b7edb6e1 100644 --- a/notebooks/chapter24/Objects in Images.ipynb +++ b/notebooks/chapter24/Objects in Images.ipynb @@ -49,17 +49,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Using TensorFlow backend.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import os, sys\n", "sys.path = [os.path.abspath(\"../../\")] + sys.path\n", @@ -111,61 +103,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: Logging before flag parsing goes to stderr.\n", - "W0820 17:50:16.660604 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n", - "\n", - "W0820 17:50:16.847119 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:517: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n", - "\n", - "W0820 17:50:16.932054 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4138: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n", - "\n", - "W0820 17:50:17.006165 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:3976: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n", - "\n", - "W0820 17:50:17.120162 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/optimizers.py:790: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n", - "\n", - "W0820 17:50:17.130156 4604204480 deprecation_wrapper.py:119] From /Users/tianqiyang/anaconda3/envs/3point6/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:3295: The name tf.log is deprecated. Please use tf.math.log instead.\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "conv2d_1 (Conv2D) (None, 1, 28, 32) 3616 \n", - "_________________________________________________________________\n", - "max_pooling2d_1 (MaxPooling2 (None, 1, 14, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_2 (Conv2D) (None, 1, 14, 32) 4128 \n", - "_________________________________________________________________\n", - "max_pooling2d_2 (MaxPooling2 (None, 1, 7, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_3 (Conv2D) (None, 1, 7, 32) 4128 \n", - "_________________________________________________________________\n", - "max_pooling2d_3 (MaxPooling2 (None, 1, 4, 32) 0 \n", - "_________________________________________________________________\n", - "flatten_1 (Flatten) (None, 128) 0 \n", - "_________________________________________________________________\n", - "dense_1 (Dense) (None, 10) 1290 \n", - "_________________________________________________________________\n", - "activation_1 (Activation) (None, 10) 0 \n", - "=================================================================\n", - "Total params: 13,162\n", - "Trainable params: 13,162\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n", - "None\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "cnn_model = simple_convnet(size=3, num_classes=10)" ] @@ -181,39 +121,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train on 1000 samples, validate on 100 samples\n", - "Epoch 1/5\n", - " - 0s - loss: 1.9887 - acc: 0.3560 - val_loss: 1.9666 - val_acc: 0.3900\n", - "Epoch 2/5\n", - " - 0s - loss: 1.9144 - acc: 0.3670 - val_loss: 1.8953 - val_acc: 0.4200\n", - "Epoch 3/5\n", - " - 0s - loss: 1.8376 - acc: 0.3920 - val_loss: 1.8257 - val_acc: 0.4200\n", - "Epoch 4/5\n", - " - 0s - loss: 1.7612 - acc: 0.4000 - val_loss: 1.7614 - val_acc: 0.4400\n", - "Epoch 5/5\n", - " - 0s - loss: 1.6921 - acc: 0.4220 - val_loss: 1.7038 - val_acc: 0.4600\n", - "100/100 [==============================] - 0s 36us/step\n", - "[8.314567489624023, 0.47]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "train_model(cnn_model)" ] @@ -349,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -369,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -385,25 +295,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[array([[1., 1., 1., 1., 1., 1., 1.],\n", - " [1., 1., 1., 1., 1., 1., 1.],\n", - " [1., 1., 1., 1., 1., 1., 1.]], dtype=float32),\n", - " array([[ 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 50.]], dtype=float32)]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pool_rois(feature_map, roiss, 3, 7)" ] diff --git a/notebooks/classical_planning_approaches.ipynb b/notebooks/classical_planning_approaches.ipynb index f24008207..0c645ae62 100644 --- a/notebooks/classical_planning_approaches.ipynb +++ b/notebooks/classical_planning_approaches.ipynb @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -58,195 +58,18 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mGraph\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Contains levels of state and actions\u001b[0m\n", - "\u001b[0;34m Used in graph planning algorithm to extract a solution\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFolKB\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mLevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjects\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexpand_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Expands the graph by a level\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlast_level\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mlast_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjects\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlast_level\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mperform_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mnon_mutex_goals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Checks whether the goals are mutually exclusive\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoal_perm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombinations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgoal_perm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource Graph" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mLevel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Contains the state of the planning problem\u001b[0m\n", - "\u001b[0;34m and exhaustive list of actions which use the\u001b[0m\n", - "\u001b[0;34m states as pre-condition.\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Initializes variables to hold state and action details of a level\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkb\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# current state\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# current action to state link\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# current state to action link\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# current action to next state link\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# next state to current action link\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# mutually exclusive actions\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobjects\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobjects\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind_mutex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mseparate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Separates an iterable of elements into positive and negative parts\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mpositive\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnegative\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'Not'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnegative\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mpositive\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpositive\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnegative\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfind_mutex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Finds mutually exclusive actions\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Inconsistent effects\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mpos_nsl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mneg_nsl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnegeff\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mneg_nsl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_negeff\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnegeff\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mnegeff\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mposeff\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpos_nsl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_negeff\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mposeff\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mposeff\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mb\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnegeff\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Interference will be calculated with the last step\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mpos_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mneg_csl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Competing needs\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpos_precond\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpos_csl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mneg_precond\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mneg_csl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_neg_precond\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mneg_precond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mneg_precond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_neg_precond\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mpos_precond\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpos_precond\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mb\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mneg_precond\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Inconsistent support\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate_mutex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpair\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnext_state_0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpair\u001b[0m\u001b[0;34m)\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpair\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnext_state_1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpair\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnext_state_1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpair\u001b[0m\u001b[0;34m)\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext_state_0\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext_state_1\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate_mutex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mnext_state_0\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnext_state_1\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstate_mutex\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mbuild\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobjects\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Populates the lists and dictionaries containing the state action dependencies\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mp_expr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'P'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mp_expr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mp_expr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mp_expr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mp_expr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnum_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mpossible_args\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpermutations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobjects\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mpossible_args\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_precond\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbol\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mislower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0marg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0marg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_action\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_action\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\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecond\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_clause\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_clause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_action\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_clause\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubstitute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_clause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_clause\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mnew_action\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mperform_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Performs the necessary actions and returns a new Level\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_kb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFolKB\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mLevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_kb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource Level" ] @@ -262,113 +85,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mGraphPlan\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Class for formulation GraphPlan algorithm\u001b[0m\n", - "\u001b[0;34m Constructs a graph of state and action space\u001b[0m\n", - "\u001b[0;34m Returns solution for the planning problem\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGraph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_goods\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcheck_leveloff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Checks if the graph has levelled off\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcheck\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\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[0mcurrent_state\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_state\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcheck\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mextract_solution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Extracts the solution\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnon_mutex_goals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_goods\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Create all combinations of actions that satisfy the goal\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgoal\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext_state_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mall_actions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Filter out non-mutex actions\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnon_mutex_actions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction_tuple\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mall_actions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0maction_pairs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcombinations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_tuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnon_mutex_actions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_tuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpair\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction_pairs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpair\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmutex\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnon_mutex_actions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Recursion\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction_list\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnon_mutex_actions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maction_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maction_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_goals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mact\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mact\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnew_goals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_goals\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrent_action_links\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mact\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_goals\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_goods\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextract_solution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_goals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Level-Order multiple solutions\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mitem\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mitem\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\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\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\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\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\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[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\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[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitem\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\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitem\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mitem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreverse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitem\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgoal_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mask\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mFalse\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Executes the GraphPlan algorithm for the given problem\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoal_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\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[0mkb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnon_mutex_goals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\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[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextract_solution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgraph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_leveloff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource GraphPlan" ] @@ -395,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -418,52 +137,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mForwardPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msearch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mProblem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Section 10.2.1]\u001b[0m\n", - "\u001b[0;34m Forward state-space search\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpanded_actions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpanded_actions\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpre\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mpre\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecond\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgoal_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoal\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgoal\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\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[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Computes ignore delete lists heuristic by creating a relaxed version of the original problem (we can do that\u001b[0m\n", - "\u001b[0;34m by removing the delete lists from all actions, i.e. removing all negative literals from effects) that will be\u001b[0m\n", - "\u001b[0;34m easier to solve through GraphPlan and where the length of the solution will serve as a good heuristic.\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrelaxed_planning_problem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelaxed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlinearize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mGraphPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrelaxed_planning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mexcept\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\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[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource ForwardPlan" ] @@ -484,69 +160,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mBackwardPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msearch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mProblem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Section 10.2.2]\u001b[0m\n", - "\u001b[0;34m Backward relevant-states search\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpanded_actions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Returns True if the action is relevant to the subgoal, i.e.:\u001b[0m\n", - "\u001b[0;34m - the action achieves an element of the effects\u001b[0m\n", - "\u001b[0;34m - the action doesn't delete something that needs to be achieved\u001b[0m\n", - "\u001b[0;34m - the preconditions are consistent with other subgoals that need to be achieved\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mnegate_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msubgoal\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpanded_actions\u001b[0m \u001b[0;32mif\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnegate_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msubgoal\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnegate_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msubgoal\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mnegate_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecond\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# g' = (g - effects(a)) + preconds(a)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdifference\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecond\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgoal_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoal\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mgoal\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\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[0msubgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Computes ignore delete lists heuristic by creating a relaxed version of the original problem (we can do that\u001b[0m\n", - "\u001b[0;34m by removing the delete lists from all actions, i.e. removing all negative literals from effects) that will be\u001b[0m\n", - "\u001b[0;34m easier to solve through GraphPlan and where the length of the solution will serve as a good heuristic.\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrelaxed_planning_problem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubgoal\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelaxed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlinearize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mGraphPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrelaxed_planning_problem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mexcept\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\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[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource BackwardPlan" ] @@ -597,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -606,90 +222,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mCSPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msolution_length\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCSP_solver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mac_search_solver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msat_up\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Section 10.4.3]\u001b[0m\n", - "\u001b[0;34m Planning as Constraint Satisfaction Problem\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Returns a string for the var-stage pair that can be used as a variable\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"_\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mif_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"If the second argument is v2, the first argument must be v1\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mif_fun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mv1\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx2\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mv2\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mif_fun\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"if the second argument is \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\" then the first argument is \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\" \"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mif_fun\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0meq_if_not_in_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactset\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"First and third arguments are equal if action is not in actset\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0meq_if_not_in\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mx2\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactset\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meq_if_not_in\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"first and third arguments are equal if action is not in \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactset\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\" \"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0meq_if_not_in\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexpanded_actions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfluent_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_fluents\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhorizon\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msolution_length\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mact_vars\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'action'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomains\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mav\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexpanded_actions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mav\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mact_vars\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomains\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m}\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfluent_values\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# initial state constraints\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\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[0;34m,\u001b[0m \u001b[0mis_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfluent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\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[0;34m,\u001b[0m \u001b[0mis_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfluent_values\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# goal state constraints\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfluent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgoals\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# precondition constraints\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'action'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mif_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# st(var, stage) == val if st('action', stage) == act\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrps\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpanded_actions\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfluent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstrps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecond\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# effect constraints\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'action'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mif_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# st(var, stage + 1) == val if st('action', stage) == act\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrps\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpanded_actions\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfluent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\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[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfluent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'Not'\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfluent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstrps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# frame constraints\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconstraints\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mConstraint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'action'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meq_if_not_in_\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mact\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mact\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpanded_actions\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Not'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mvar\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mvar\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meffect\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mvar\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfluent_values\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstage\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhorizon\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcsp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mNaryCSP\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdomains\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconstraints\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCSP_solver\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcsp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marc_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0marc_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msol\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0msol\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mact_vars\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource CSPlan" ] @@ -717,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -726,143 +261,18 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mSATPlan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msolution_length\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSAT_solver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcdcl_satisfiable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Section 10.4.1]\u001b[0m\n", - "\u001b[0;34m Planning as Boolean satisfiability\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexpand_transitions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_precond\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mact\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'Not'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_strips\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexpand_transitions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtransition\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdefaultdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexpand_transitions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mSAT_plan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplanning_problem\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[0msolution_length\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSAT_solver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mSAT_solver\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource SATPlan" ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mSAT_plan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSAT_solver\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcdcl_satisfiable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Converts a planning problem to Satisfaction problem by translating it to a cnf sentence.\u001b[0m\n", - "\u001b[0;34m [Figure 7.22]\u001b[0m\n", - "\u001b[0;34m >>> transition = {'A': {'Left': 'A', 'Right': 'B'}, 'B': {'Left': 'A', 'Right': 'C'}, 'C': {'Left': 'B', 'Right': 'C'}}\u001b[0m\n", - "\u001b[0;34m >>> SAT_plan('A', transition, 'C', 1) is None\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Functions used by SAT_plan\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtranslate_to_SAT\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstates\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mstate\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Symbol claiming state s at time t\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate_counter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstates\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"S{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_counter\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Add initial state axiom\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0minit\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\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Add goal state axiom\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfirst\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mclause\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate_sym\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\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[0;34m.\u001b[0m\u001b[0missuperset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \\\n", - " \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# All possible transitions\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtransition_counter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstates\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0ms_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Action 'action' taken from state 's' at time 't' to reach 's_'\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExpr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"T{}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtransition_counter\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Change the state from s to s_\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;34m'==>'\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;34m'==>'\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Allow only one state at any time\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# must be a state at any time\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstates\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstates\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstates\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\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[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# for each pair of states s, s_ only one is possible at time t\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\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[0mstate_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Restrict to one transition per timestep\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# list of possible transitions at time t\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtransitions_t\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mtr\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction_sym\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# make sure at least one of the transitions happens\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransitions_t\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransitions_t\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtr_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtransitions_t\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtransitions_t\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtr\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[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# there cannot be two transitions tr and tr_ at time t\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;34m~\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtr_\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Combine the clauses to form the cnf\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'&'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mextract_solution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtrue_transitions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0maction_sym\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maction_sym\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Sort transitions based on time, which is the 3rd element of the tuple\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtrue_transitions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maction\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtrue_transitions\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# Body of SAT_plan algorithm\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt_max\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# dictionaries to help extract the solution from model\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstate_sym\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0maction_sym\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mcnf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtranslate_to_SAT\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransition\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSAT_solver\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcnf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mextract_solution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource SAT_plan" ] @@ -885,50 +295,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mthree_block_tower\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Figure 10.3] THREE-BLOCK-TOWER\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m A blocks-world problem of stacking three blocks in a certain configuration,\u001b[0m\n", - "\u001b[0;34m also known as the Sussman Anomaly.\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m Example:\u001b[0m\n", - "\u001b[0;34m >>> from aima.planning import *\u001b[0m\n", - "\u001b[0;34m >>> tbt = three_block_tower()\u001b[0m\n", - "\u001b[0;34m >>> tbt.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> tbt.act(expr('MoveToTable(C, A)'))\u001b[0m\n", - "\u001b[0;34m >>> tbt.act(expr('Move(B, Table, C)'))\u001b[0m\n", - "\u001b[0;34m >>> tbt.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> tbt.act(expr('Move(A, Table, B)'))\u001b[0m\n", - "\u001b[0;34m >>> tbt.goal_test()\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m >>>\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(A, Table) & On(B, Table) & On(C, A) & Clear(B) & Clear(C)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(A, B) & On(B, C)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Move(b, x, y)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(b, x) & Clear(b) & Clear(y)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(b, y) & Clear(x) & ~On(b, x) & ~Clear(y)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Block(b) & Block(y)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'MoveToTable(b, x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(b, x) & Clear(b)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'On(b, Table) & Clear(x) & ~On(b, x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Block(b) & Block(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Block(A) & Block(B) & Block(C)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource three_block_tower" ] @@ -942,28 +311,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.46 ms, sys: 124 µs, total: 4.59 ms\n", - "Wall time: 4.48 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = GraphPlan(three_block_tower()).execute()\n", "linearize(blocks_world_solution)" @@ -978,29 +328,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "14 paths have been expanded and 28 paths remain in the frontier\n", - "CPU times: user 91 ms, sys: 0 ns, total: 91 ms\n", - "Wall time: 89.8 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = uniform_cost_search(ForwardPlan(three_block_tower()), display=True).solution()\n", "blocks_world_solution = list(map(lambda action: Expr(action.name, *action.args), blocks_world_solution))\n", @@ -1016,29 +346,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 paths have been expanded and 9 paths remain in the frontier\n", - "CPU times: user 81.3 ms, sys: 3.11 ms, total: 84.5 ms\n", - "Wall time: 83 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = astar_search(ForwardPlan(three_block_tower()), display=True).solution()\n", "blocks_world_solution = list(map(lambda action: Expr(action.name, *action.args), blocks_world_solution))\n", @@ -1054,29 +364,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "116 paths have been expanded and 289 paths remain in the frontier\n", - "CPU times: user 266 ms, sys: 718 µs, total: 267 ms\n", - "Wall time: 265 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = uniform_cost_search(BackwardPlan(three_block_tower()), display=True).solution()\n", "blocks_world_solution = list(map(lambda action: Expr(action.name, *action.args), blocks_world_solution))\n", @@ -1092,29 +382,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4 paths have been expanded and 20 paths remain in the frontier\n", - "CPU times: user 477 ms, sys: 450 µs, total: 477 ms\n", - "Wall time: 476 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = astar_search(BackwardPlan(three_block_tower()), display=True).solution()\n", "blocks_world_solution = list(map(lambda action: Expr(action.name, *action.args), blocks_world_solution))\n", @@ -1130,28 +400,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 172 ms, sys: 4.52 ms, total: 176 ms\n", - "Wall time: 175 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = CSPlan(three_block_tower(), 3, arc_heuristic=no_heuristic)\n", "blocks_world_solution" @@ -1166,28 +417,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 267 ms, sys: 0 ns, total: 267 ms\n", - "Wall time: 266 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = CSPlan(three_block_tower(), 3, arc_heuristic=sat_up)\n", "blocks_world_solution" @@ -1202,28 +434,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 34.9 s, sys: 15.9 ms, total: 34.9 s\n", - "Wall time: 34.9 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = SATPlan(three_block_tower(), 4, SAT_solver=dpll_satisfiable)\n", "blocks_world_solution" @@ -1238,28 +451,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.15 s, sys: 4.01 ms, total: 1.15 s\n", - "Wall time: 1.15 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time blocks_world_solution = SATPlan(three_block_tower(), 4, SAT_solver=cdcl_satisfiable)\n", "blocks_world_solution" @@ -1274,55 +468,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mspare_tire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Figure 10.2] SPARE-TIRE-PROBLEM\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m A problem involving changing the flat tire of a car\u001b[0m\n", - "\u001b[0;34m with a spare tire from the trunk.\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m Example:\u001b[0m\n", - "\u001b[0;34m >>> from aima.planning import *\u001b[0m\n", - "\u001b[0;34m >>> st = spare_tire()\u001b[0m\n", - "\u001b[0;34m >>> st.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> st.act(expr('Remove(Spare, Trunk)'))\u001b[0m\n", - "\u001b[0;34m >>> st.act(expr('Remove(Flat, Axle)'))\u001b[0m\n", - "\u001b[0;34m >>> st.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> st.act(expr('PutOn(Spare, Axle)'))\u001b[0m\n", - "\u001b[0;34m >>> st.goal_test()\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m >>>\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(Flat, Axle) & At(Spare, Trunk)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(Spare, Axle) & At(Flat, Ground)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Remove(obj, loc)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(obj, loc)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(obj, Ground) & ~At(obj, loc)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Tire(obj)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'PutOn(t, Axle)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(t, Ground) & ~At(Flat, Axle)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(t, Axle) & ~At(t, Ground)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Tire(t)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'LeaveOvernight'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'~At(Spare, Ground) & ~At(Spare, Axle) & ~At(Spare, Trunk) & \\\u001b[0m\n", - "\u001b[0;34m ~At(Flat, Ground) & ~At(Flat, Axle) & ~At(Flat, Trunk)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Tire(Flat) & Tire(Spare)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource spare_tire" ] @@ -1336,28 +484,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.24 ms, sys: 1 µs, total: 4.24 ms\n", - "Wall time: 4.16 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Flat, Axle), Remove(Spare, Trunk), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = GraphPlan(spare_tire()).execute()\n", "linearize(spare_tire_solution)" @@ -1372,29 +501,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "11 paths have been expanded and 9 paths remain in the frontier\n", - "CPU times: user 10.3 ms, sys: 0 ns, total: 10.3 ms\n", - "Wall time: 9.89 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Flat, Axle), Remove(Spare, Trunk), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = uniform_cost_search(ForwardPlan(spare_tire()), display=True).solution()\n", "spare_tire_solution = list(map(lambda action: Expr(action.name, *action.args), spare_tire_solution))\n", @@ -1410,29 +519,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5 paths have been expanded and 8 paths remain in the frontier\n", - "CPU times: user 20.4 ms, sys: 1 µs, total: 20.4 ms\n", - "Wall time: 19.4 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Flat, Axle), Remove(Spare, Trunk), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = astar_search(ForwardPlan(spare_tire()), display=True).solution()\n", "spare_tire_solution = list(map(lambda action: Expr(action.name, *action.args), spare_tire_solution))\n", @@ -1448,29 +537,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "29 paths have been expanded and 22 paths remain in the frontier\n", - "CPU times: user 22.2 ms, sys: 7 µs, total: 22.2 ms\n", - "Wall time: 21.3 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Flat, Axle), Remove(Spare, Trunk), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = uniform_cost_search(BackwardPlan(spare_tire()), display=True).solution()\n", "spare_tire_solution = list(map(lambda action: Expr(action.name, *action.args), spare_tire_solution))\n", @@ -1486,29 +555,9 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 paths have been expanded and 11 paths remain in the frontier\n", - "CPU times: user 13 ms, sys: 0 ns, total: 13 ms\n", - "Wall time: 12.5 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = astar_search(BackwardPlan(spare_tire()), display=True).solution()\n", "spare_tire_solution = list(map(lambda action: Expr(action.name, *action.args), spare_tire_solution))\n", @@ -1524,28 +573,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 94.7 ms, sys: 0 ns, total: 94.7 ms\n", - "Wall time: 93.2 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = CSPlan(spare_tire(), 3, arc_heuristic=no_heuristic)\n", "spare_tire_solution" @@ -1560,28 +590,9 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 119 ms, sys: 0 ns, total: 119 ms\n", - "Wall time: 118 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = CSPlan(spare_tire(), 3, arc_heuristic=sat_up)\n", "spare_tire_solution" @@ -1596,28 +607,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 9.01 s, sys: 3.98 ms, total: 9.01 s\n", - "Wall time: 9.01 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Flat, Axle), Remove(Spare, Trunk), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = SATPlan(spare_tire(), 4, SAT_solver=dpll_satisfiable)\n", "spare_tire_solution" @@ -1632,28 +624,9 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 630 ms, sys: 6 µs, total: 630 ms\n", - "Wall time: 628 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time spare_tire_solution = SATPlan(spare_tire(), 4, SAT_solver=cdcl_satisfiable)\n", "spare_tire_solution" @@ -1668,53 +641,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mshopping_problem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m SHOPPING-PROBLEM\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m A problem of acquiring some items given their availability at certain stores.\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m Example:\u001b[0m\n", - "\u001b[0;34m >>> from aima.planning import *\u001b[0m\n", - "\u001b[0;34m >>> sp = shopping_problem()\u001b[0m\n", - "\u001b[0;34m >>> sp.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> sp.act(expr('Go(Home, HW)'))\u001b[0m\n", - "\u001b[0;34m >>> sp.act(expr('Buy(Drill, HW)'))\u001b[0m\n", - "\u001b[0;34m >>> sp.act(expr('Go(HW, SM)'))\u001b[0m\n", - "\u001b[0;34m >>> sp.act(expr('Buy(Banana, SM)'))\u001b[0m\n", - "\u001b[0;34m >>> sp.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> sp.act(expr('Buy(Milk, SM)'))\u001b[0m\n", - "\u001b[0;34m >>> sp.goal_test()\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m >>>\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(Home) & Sells(SM, Milk) & Sells(SM, Banana) & Sells(HW, Drill)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Have(Milk) & Have(Banana) & Have(Drill)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Buy(x, store)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(store) & Sells(store, x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Have(x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Store(store) & Item(x)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Go(x, y)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(y) & ~At(x)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Place(x) & Place(y)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Place(Home) & Place(SM) & Place(HW) & Store(SM) & Store(HW) & '\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m'Item(Milk) & Item(Banana) & Item(Drill)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource shopping_problem" ] @@ -1728,28 +657,9 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5.08 ms, sys: 3 µs, total: 5.08 ms\n", - "Wall time: 5.03 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, HW), Go(Home, SM), Buy(Milk, SM), Buy(Drill, HW), Buy(Banana, SM)]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = GraphPlan(shopping_problem()).execute()\n", "linearize(shopping_problem_solution)" @@ -1764,29 +674,9 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "167 paths have been expanded and 257 paths remain in the frontier\n", - "CPU times: user 187 ms, sys: 4.01 ms, total: 191 ms\n", - "Wall time: 190 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, SM), Buy(Banana, SM), Buy(Milk, SM), Go(SM, HW), Buy(Drill, HW)]" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = uniform_cost_search(ForwardPlan(shopping_problem()), display=True).solution()\n", "shopping_problem_solution = list(map(lambda action: Expr(action.name, *action.args), shopping_problem_solution))\n", @@ -1802,29 +692,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9 paths have been expanded and 22 paths remain in the frontier\n", - "CPU times: user 101 ms, sys: 3 µs, total: 101 ms\n", - "Wall time: 100 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, SM), Buy(Banana, SM), Buy(Milk, SM), Go(SM, HW), Buy(Drill, HW)]" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = astar_search(ForwardPlan(shopping_problem()), display=True).solution()\n", "shopping_problem_solution = list(map(lambda action: Expr(action.name, *action.args), shopping_problem_solution))\n", @@ -1840,29 +710,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "176 paths have been expanded and 7 paths remain in the frontier\n", - "CPU times: user 109 ms, sys: 2 µs, total: 109 ms\n", - "Wall time: 107 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, HW), Buy(Drill, HW), Go(HW, SM), Buy(Milk, SM), Buy(Banana, SM)]" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = uniform_cost_search(BackwardPlan(shopping_problem()), display=True).solution()\n", "shopping_problem_solution = list(map(lambda action: Expr(action.name, *action.args), shopping_problem_solution))\n", @@ -1878,29 +728,9 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18 paths have been expanded and 28 paths remain in the frontier\n", - "CPU times: user 235 ms, sys: 9 µs, total: 235 ms\n", - "Wall time: 234 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, SM), Buy(Banana, SM), Buy(Milk, SM), Go(SM, HW), Buy(Drill, HW)]" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = astar_search(BackwardPlan(shopping_problem()), display=True).solution()\n", "shopping_problem_solution = list(map(lambda action: Expr(action.name, *action.args), shopping_problem_solution))\n", @@ -1916,28 +746,9 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 194 ms, sys: 6 µs, total: 194 ms\n", - "Wall time: 192 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, HW), Buy(Drill, HW), Go(HW, SM), Buy(Banana, SM), Buy(Milk, SM)]" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = CSPlan(shopping_problem(), 5, arc_heuristic=no_heuristic)\n", "shopping_problem_solution" @@ -1952,28 +763,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 235 ms, sys: 7 µs, total: 235 ms\n", - "Wall time: 233 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, HW), Buy(Drill, HW), Go(HW, SM), Buy(Banana, SM), Buy(Milk, SM)]" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = CSPlan(shopping_problem(), 5, arc_heuristic=sat_up)\n", "shopping_problem_solution" @@ -1988,28 +780,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1min 29s, sys: 36 ms, total: 1min 29s\n", - "Wall time: 1min 29s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Go(Home, HW), Buy(Drill, HW), Go(HW, SM), Buy(Banana, SM), Buy(Milk, SM)]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time shopping_problem_solution = SATPlan(shopping_problem(), 5, SAT_solver=cdcl_satisfiable)\n", "shopping_problem_solution" @@ -2024,58 +797,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mair_cargo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Figure 10.1] AIR-CARGO-PROBLEM\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m An air-cargo shipment problem for delivering cargo to different locations,\u001b[0m\n", - "\u001b[0;34m given the starting location and airplanes.\u001b[0m\n", - "\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m Example:\u001b[0m\n", - "\u001b[0;34m >>> from aima.planning import *\u001b[0m\n", - "\u001b[0;34m >>> ac = air_cargo()\u001b[0m\n", - "\u001b[0;34m >>> ac.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Load(C2, P2, JFK)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Load(C1, P1, SFO)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Fly(P1, SFO, JFK)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Fly(P2, JFK, SFO)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Unload(C2, P2, SFO)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.goal_test()\u001b[0m\n", - "\u001b[0;34m False\u001b[0m\n", - "\u001b[0;34m >>> ac.act(expr('Unload(C1, P1, JFK)'))\u001b[0m\n", - "\u001b[0;34m >>> ac.goal_test()\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m >>>\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mPlanningProblem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minitial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(C1, SFO) & At(C2, JFK) & At(P1, SFO) & At(P2, JFK)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(C1, JFK) & At(C2, SFO)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Load(c, p, a)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(c, a) & At(p, a)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'In(c, p) & ~At(c, a)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cargo(c) & Plane(p) & Airport(a)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unload(c, p, a)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'In(c, p) & At(p, a)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(c, a) & ~In(c, p)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cargo(c) & Plane(p) & Airport(a)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Fly(p, f, to)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprecond\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(p, f)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0meffect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'At(p, to) & ~At(p, f)'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Plane(p) & Airport(f) & Airport(to)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Cargo(C1) & Cargo(C2) & Plane(P1) & Plane(P2) & Airport(SFO) & Airport(JFK)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource air_cargo" ] @@ -2089,33 +813,9 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 9.06 ms, sys: 3 µs, total: 9.06 ms\n", - "Wall time: 8.94 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Unload(C1, P1, JFK),\n", - " Unload(C2, P2, SFO)]" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = GraphPlan(air_cargo()).execute()\n", "linearize(air_cargo_solution)" @@ -2130,34 +830,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "838 paths have been expanded and 1288 paths remain in the frontier\n", - "CPU times: user 3.56 s, sys: 4 ms, total: 3.57 s\n", - "Wall time: 3.56 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Unload(C2, P2, SFO),\n", - " Load(C1, P2, SFO),\n", - " Fly(P2, SFO, JFK),\n", - " Unload(C1, P2, JFK)]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = uniform_cost_search(ForwardPlan(air_cargo()), display=True).solution()\n", "air_cargo_solution = list(map(lambda action: Expr(action.name, *action.args), air_cargo_solution))\n", @@ -2173,34 +848,9 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "17 paths have been expanded and 54 paths remain in the frontier\n", - "CPU times: user 716 ms, sys: 0 ns, total: 716 ms\n", - "Wall time: 717 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Unload(C2, P2, SFO),\n", - " Load(C1, P2, SFO),\n", - " Fly(P2, SFO, JFK),\n", - " Unload(C1, P2, JFK)]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = astar_search(ForwardPlan(air_cargo()), display=True).solution()\n", "air_cargo_solution = list(map(lambda action: Expr(action.name, *action.args), air_cargo_solution))\n", @@ -2216,34 +866,9 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "506 paths have been expanded and 65 paths remain in the frontier\n", - "CPU times: user 970 ms, sys: 0 ns, total: 970 ms\n", - "Wall time: 971 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Load(C2, P1, JFK),\n", - " Unload(C1, P1, JFK),\n", - " Fly(P1, JFK, SFO),\n", - " Unload(C2, P1, SFO)]" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = uniform_cost_search(BackwardPlan(air_cargo()), display=True).solution()\n", "air_cargo_solution = list(map(lambda action: Expr(action.name, *action.args), air_cargo_solution))\n", @@ -2259,34 +884,9 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "23 paths have been expanded and 50 paths remain in the frontier\n", - "CPU times: user 1.19 s, sys: 2 µs, total: 1.19 s\n", - "Wall time: 1.2 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Unload(C2, P2, SFO),\n", - " Load(C1, P2, SFO),\n", - " Fly(P2, SFO, JFK),\n", - " Unload(C1, P2, JFK)]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = astar_search(BackwardPlan(air_cargo()), display=True).solution()\n", "air_cargo_solution = list(map(lambda action: Expr(action.name, *action.args), air_cargo_solution))\n", @@ -2302,33 +902,9 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 6.5 s, sys: 0 ns, total: 6.5 s\n", - "Wall time: 6.51 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Load(C2, P1, JFK),\n", - " Unload(C1, P1, JFK),\n", - " Fly(P1, JFK, SFO),\n", - " Unload(C2, P1, SFO)]" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = CSPlan(air_cargo(), 6, arc_heuristic=no_heuristic)\n", "air_cargo_solution" @@ -2343,33 +919,9 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13.6 s, sys: 7.98 ms, total: 13.7 s\n", - "Wall time: 13.7 s\n" - ] - }, - { - "data": { - "text/plain": [ - "[Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Load(C2, P1, JFK),\n", - " Unload(C1, P1, JFK),\n", - " Fly(P1, JFK, SFO),\n", - " Unload(C2, P1, SFO)]" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time air_cargo_solution = CSPlan(air_cargo(), 6, arc_heuristic=sat_up)\n", "air_cargo_solution" diff --git a/notebooks/csp.ipynb b/notebooks/csp.ipynb index 488462706..8af171ee5 100644 --- a/notebooks/csp.ipynb +++ b/notebooks/csp.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -60,252 +60,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class CSP(search.Problem):\n",
-       "    """This class describes finite-domain Constraint Satisfaction Problems.\n",
-       "    A CSP is specified by the following inputs:\n",
-       "        variables   A list of variables; each is atomic (e.g. int or string).\n",
-       "        domains     A dict of {var:[possible_value, ...]} entries.\n",
-       "        neighbors   A dict of {var:[var,...]} that for each variable lists\n",
-       "                    the other variables that participate in constraints.\n",
-       "        constraints A function f(A, a, B, b) that returns true if neighbors\n",
-       "                    A, B satisfy the constraint when they have values A=a, B=b\n",
-       "\n",
-       "    In the textbook and in most mathematical definitions, the\n",
-       "    constraints are specified as explicit pairs of allowable values,\n",
-       "    but the formulation here is easier to express and more compact for\n",
-       "    most cases. (For example, the n-Queens problem can be represented\n",
-       "    in O(n) space using this notation, instead of O(N^4) for the\n",
-       "    explicit representation.) In terms of describing the CSP as a\n",
-       "    problem, that's all there is.\n",
-       "\n",
-       "    However, the class also supports data structures and methods that help you\n",
-       "    solve CSPs by calling a search function on the CSP. Methods and slots are\n",
-       "    as follows, where the argument 'a' represents an assignment, which is a\n",
-       "    dict of {var:val} entries:\n",
-       "        assign(var, val, a)     Assign a[var] = val; do other bookkeeping\n",
-       "        unassign(var, a)        Do del a[var], plus other bookkeeping\n",
-       "        nconflicts(var, val, a) Return the number of other variables that\n",
-       "                                conflict with var=val\n",
-       "        curr_domains[var]       Slot: remaining consistent values for var\n",
-       "                                Used by constraint propagation routines.\n",
-       "    The following methods are used only by graph_search and tree_search:\n",
-       "        actions(state)          Return a list of actions\n",
-       "        result(state, action)   Return a successor of state\n",
-       "        goal_test(state)        Return true if all constraints satisfied\n",
-       "    The following are just for debugging purposes:\n",
-       "        nassigns                Slot: tracks the number of assignments made\n",
-       "        display(a)              Print a human-readable representation\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, variables, domains, neighbors, constraints):\n",
-       "        """Construct a CSP problem. If variables is empty, it becomes domains.keys()."""\n",
-       "        variables = variables or list(domains.keys())\n",
-       "        self.variables = variables\n",
-       "        self.domains = domains\n",
-       "        self.neighbors = neighbors\n",
-       "        self.constraints = constraints\n",
-       "        self.initial = ()\n",
-       "        self.curr_domains = None\n",
-       "        self.nassigns = 0\n",
-       "\n",
-       "    def assign(self, var, val, assignment):\n",
-       "        """Add {var: val} to assignment; Discard the old value if any."""\n",
-       "        assignment[var] = val\n",
-       "        self.nassigns += 1\n",
-       "\n",
-       "    def unassign(self, var, assignment):\n",
-       "        """Remove {var: val} from assignment.\n",
-       "        DO NOT call this if you are changing a variable to a new value;\n",
-       "        just call assign for that."""\n",
-       "        if var in assignment:\n",
-       "            del assignment[var]\n",
-       "\n",
-       "    def nconflicts(self, var, val, assignment):\n",
-       "        """Return the number of conflicts var=val has with other variables."""\n",
-       "\n",
-       "        # Subclasses may implement this more efficiently\n",
-       "        def conflict(var2):\n",
-       "            return (var2 in assignment and\n",
-       "                    not self.constraints(var, val, var2, assignment[var2]))\n",
-       "\n",
-       "        return count(conflict(v) for v in self.neighbors[var])\n",
-       "\n",
-       "    def display(self, assignment):\n",
-       "        """Show a human-readable representation of the CSP."""\n",
-       "        # Subclasses can print in a prettier way, or display with a GUI\n",
-       "        print('CSP:', self, 'with assignment:', assignment)\n",
-       "\n",
-       "    # These methods are for the tree and graph-search interface:\n",
-       "\n",
-       "    def actions(self, state):\n",
-       "        """Return a list of applicable actions: nonconflicting\n",
-       "        assignments to an unassigned variable."""\n",
-       "        if len(state) == len(self.variables):\n",
-       "            return []\n",
-       "        else:\n",
-       "            assignment = dict(state)\n",
-       "            var = first([v for v in self.variables if v not in assignment])\n",
-       "            return [(var, val) for val in self.domains[var]\n",
-       "                    if self.nconflicts(var, val, assignment) == 0]\n",
-       "\n",
-       "    def result(self, state, action):\n",
-       "        """Perform an action and return the new state."""\n",
-       "        (var, val) = action\n",
-       "        return state + ((var, val),)\n",
-       "\n",
-       "    def goal_test(self, state):\n",
-       "        """The goal is to assign all variables, with all constraints satisfied."""\n",
-       "        assignment = dict(state)\n",
-       "        return (len(assignment) == len(self.variables)\n",
-       "                and all(self.nconflicts(variables, assignment[variables], assignment) == 0\n",
-       "                        for variables in self.variables))\n",
-       "\n",
-       "    # These are for constraint propagation\n",
-       "\n",
-       "    def support_pruning(self):\n",
-       "        """Make sure we can prune values from domains. (We want to pay\n",
-       "        for this only if we use it.)"""\n",
-       "        if self.curr_domains is None:\n",
-       "            self.curr_domains = {v: list(self.domains[v]) for v in self.variables}\n",
-       "\n",
-       "    def suppose(self, var, value):\n",
-       "        """Start accumulating inferences from assuming var=value."""\n",
-       "        self.support_pruning()\n",
-       "        removals = [(var, a) for a in self.curr_domains[var] if a != value]\n",
-       "        self.curr_domains[var] = [value]\n",
-       "        return removals\n",
-       "\n",
-       "    def prune(self, var, value, removals):\n",
-       "        """Rule out var=value."""\n",
-       "        self.curr_domains[var].remove(value)\n",
-       "        if removals is not None:\n",
-       "            removals.append((var, value))\n",
-       "\n",
-       "    def choices(self, var):\n",
-       "        """Return all values for var that aren't currently ruled out."""\n",
-       "        return (self.curr_domains or self.domains)[var]\n",
-       "\n",
-       "    def infer_assignment(self):\n",
-       "        """Return the partial assignment implied by the current inferences."""\n",
-       "        self.support_pruning()\n",
-       "        return {v: self.curr_domains[v][0]\n",
-       "                for v in self.variables if 1 == len(self.curr_domains[v])}\n",
-       "\n",
-       "    def restore(self, removals):\n",
-       "        """Undo a supposition and all inferences from it."""\n",
-       "        for B, b in removals:\n",
-       "            self.curr_domains[B].append(b)\n",
-       "\n",
-       "    # This is for min_conflicts search\n",
-       "\n",
-       "    def conflicted_vars(self, current):\n",
-       "        """Return a list of variables in current assignment that are in conflict"""\n",
-       "        return [var for var in self.variables\n",
-       "                if self.nconflicts(var, current[var], current) > 0]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(CSP)" ] @@ -328,20 +85,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['R', 'G', 'B']" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "s = UniversalDict(['R','G','B'])\n", "s[5]" @@ -356,113 +102,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def different_values_constraint(A, a, B, b):\n",
-       "    """A constraint saying two neighboring variables must differ in value."""\n",
-       "    return a != b\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(different_values_constraint)" ] @@ -476,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -492,141 +134,18 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def MapColoringCSP(colors, neighbors):\n",
-       "    """Make a CSP for the problem of coloring a map with different colors\n",
-       "    for any two adjacent regions. Arguments are a list of colors, and a\n",
-       "    dict of {region: [neighbor,...]} entries. This dict may also be\n",
-       "    specified as a string of the form defined by parse_neighbors."""\n",
-       "    if isinstance(neighbors, str):\n",
-       "        neighbors = parse_neighbors(neighbors)\n",
-       "    return CSP(list(neighbors.keys()), UniversalDict(colors), neighbors,\n",
-       "               different_values_constraint)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(MapColoringCSP)" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(,\n", - " ,\n", - " )" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "australia_csp, usa_csp, france_csp" ] @@ -642,114 +161,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def queen_constraint(A, a, B, b):\n",
-       "    """Constraint is satisfied (true) if A, B are really the same variable,\n",
-       "    or if they are not in the same row, down diagonal, or up diagonal."""\n",
-       "    return A == B or (a != b and A + a != B + b and A - a != B - b)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(queen_constraint)" ] @@ -763,191 +177,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class NQueensCSP(CSP):\n",
-       "    """Make a CSP for the nQueens problem for search with min_conflicts.\n",
-       "    Suitable for large n, it uses only data structures of size O(n).\n",
-       "    Think of placing queens one per column, from left to right.\n",
-       "    That means position (x, y) represents (var, val) in the CSP.\n",
-       "    The main structures are three arrays to count queens that could conflict:\n",
-       "        rows[i]      Number of queens in the ith row (i.e val == i)\n",
-       "        downs[i]     Number of queens in the \\ diagonal\n",
-       "                     such that their (x, y) coordinates sum to i\n",
-       "        ups[i]       Number of queens in the / diagonal\n",
-       "                     such that their (x, y) coordinates have x-y+n-1 = i\n",
-       "    We increment/decrement these counts each time a queen is placed/moved from\n",
-       "    a row/diagonal. So moving is O(1), as is nconflicts.  But choosing\n",
-       "    a variable, and a best value for the variable, are each O(n).\n",
-       "    If you want, you can keep track of conflicted variables, then variable\n",
-       "    selection will also be O(1).\n",
-       "    >>> len(backtracking_search(NQueensCSP(8)))\n",
-       "    8\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, n):\n",
-       "        """Initialize data structures for n Queens."""\n",
-       "        CSP.__init__(self, list(range(n)), UniversalDict(list(range(n))),\n",
-       "                     UniversalDict(list(range(n))), queen_constraint)\n",
-       "\n",
-       "        self.rows = [0] * n\n",
-       "        self.ups = [0] * (2 * n - 1)\n",
-       "        self.downs = [0] * (2 * n - 1)\n",
-       "\n",
-       "    def nconflicts(self, var, val, assignment):\n",
-       "        """The number of conflicts, as recorded with each assignment.\n",
-       "        Count conflicts in row and in up, down diagonals. If there\n",
-       "        is a queen there, it can't conflict with itself, so subtract 3."""\n",
-       "        n = len(self.variables)\n",
-       "        c = self.rows[val] + self.downs[var + val] + self.ups[var - val + n - 1]\n",
-       "        if assignment.get(var, None) == val:\n",
-       "            c -= 3\n",
-       "        return c\n",
-       "\n",
-       "    def assign(self, var, val, assignment):\n",
-       "        """Assign var, and keep track of conflicts."""\n",
-       "        oldval = assignment.get(var, None)\n",
-       "        if val != oldval:\n",
-       "            if oldval is not None:  # Remove old val if there was one\n",
-       "                self.record_conflict(assignment, var, oldval, -1)\n",
-       "            self.record_conflict(assignment, var, val, +1)\n",
-       "            CSP.assign(self, var, val, assignment)\n",
-       "\n",
-       "    def unassign(self, var, assignment):\n",
-       "        """Remove var from assignment (if it is there) and track conflicts."""\n",
-       "        if var in assignment:\n",
-       "            self.record_conflict(assignment, var, assignment[var], -1)\n",
-       "        CSP.unassign(self, var, assignment)\n",
-       "\n",
-       "    def record_conflict(self, assignment, var, val, delta):\n",
-       "        """Record conflicts caused by addition or deletion of a Queen."""\n",
-       "        n = len(self.variables)\n",
-       "        self.rows[val] += delta\n",
-       "        self.downs[var + val] += delta\n",
-       "        self.ups[var - val + n - 1] += delta\n",
-       "\n",
-       "    def display(self, assignment):\n",
-       "        """Print the queens and the nconflicts values (for debugging)."""\n",
-       "        n = len(self.variables)\n",
-       "        for val in range(n):\n",
-       "            for var in range(n):\n",
-       "                if assignment.get(var, '') == val:\n",
-       "                    ch = 'Q'\n",
-       "                elif (var + val) % 2 == 0:\n",
-       "                    ch = '.'\n",
-       "                else:\n",
-       "                    ch = '-'\n",
-       "                print(ch, end=' ')\n",
-       "            print('    ', end=' ')\n",
-       "            for var in range(n):\n",
-       "                if assignment.get(var, '') == val:\n",
-       "                    ch = '*'\n",
-       "                else:\n",
-       "                    ch = ' '\n",
-       "                print(str(self.nconflicts(var, val, assignment)) + ch, end=' ')\n",
-       "            print()\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NQueensCSP)" ] @@ -961,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -993,126 +225,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def min_conflicts(csp, max_steps=100000):\n",
-       "    """Solve a CSP by stochastic Hill Climbing on the number of conflicts."""\n",
-       "    # Generate a complete assignment for all variables (probably with conflicts)\n",
-       "    csp.current = current = {}\n",
-       "    for var in csp.variables:\n",
-       "        val = min_conflicts_value(csp, var, current)\n",
-       "        csp.assign(var, val, current)\n",
-       "    # Now repeatedly choose a random conflicted variable and change it\n",
-       "    for i in range(max_steps):\n",
-       "        conflicted = csp.conflicted_vars(current)\n",
-       "        if not conflicted:\n",
-       "            return current\n",
-       "        var = random.choice(conflicted)\n",
-       "        val = min_conflicts_value(csp, var, current)\n",
-       "        csp.assign(var, val, current)\n",
-       "    return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(min_conflicts)" ] @@ -1126,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1144,22 +259,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plot_NQueens(solution)" ] @@ -1173,22 +275,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "eight_queens = NQueensCSP(8)\n", "solution = min_conflicts(eight_queens)\n", @@ -1216,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1245,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1262,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1300,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1309,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1358,125 +447,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def AC3(csp, queue=None, removals=None, arc_heuristic=dom_j_up):\n",
-       "    """[Figure 6.3]"""\n",
-       "    if queue is None:\n",
-       "        queue = {(Xi, Xk) for Xi in csp.variables for Xk in csp.neighbors[Xi]}\n",
-       "    csp.support_pruning()\n",
-       "    queue = arc_heuristic(csp, queue)\n",
-       "    while queue:\n",
-       "        (Xi, Xj) = queue.pop()\n",
-       "        if revise(csp, Xi, Xj, removals):\n",
-       "            if not csp.curr_domains[Xi]:\n",
-       "                return False\n",
-       "            for Xk in csp.neighbors[Xi]:\n",
-       "                if Xk != Xj:\n",
-       "                    queue.add((Xk, Xi))\n",
-       "    return True\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(AC3)" ] @@ -1490,119 +463,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def revise(csp, Xi, Xj, removals):\n",
-       "    """Return true if we remove a value."""\n",
-       "    revised = False\n",
-       "    for x in csp.curr_domains[Xi][:]:\n",
-       "        # If Xi=x conflicts with Xj=y for every possible y, eliminate Xi=x\n",
-       "        if all(not csp.constraints(Xi, x, Xj, y) for y in csp.curr_domains[Xj]):\n",
-       "            csp.prune(Xi, x, removals)\n",
-       "            revised = True\n",
-       "    return revised\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(revise)" ] @@ -1634,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1653,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1662,20 +525,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "AC3(csp, removals=removals)" ] @@ -1689,7 +541,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1700,20 +552,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "AC3(csp,removals=removals)" ] @@ -1736,7 +577,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1745,40 +586,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0: 'R',\n", - " 1: 'R',\n", - " 2: 'R',\n", - " 3: 'R',\n", - " 4: 'G',\n", - " 5: 'R',\n", - " 6: 'G',\n", - " 7: 'R',\n", - " 8: 'B',\n", - " 9: 'R',\n", - " 10: 'G',\n", - " 11: 'B',\n", - " 12: 'G',\n", - " 13: 'G',\n", - " 14: 'Y',\n", - " 15: 'Y',\n", - " 16: 'B',\n", - " 17: 'B',\n", - " 18: 'B',\n", - " 19: 'G',\n", - " 20: 'B'}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "result # A dictonary of assignments." ] @@ -1792,20 +602,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "coloring_problem1.nassigns" ] @@ -1819,20 +618,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "len(coloring_problem1.assignment_history)" ] @@ -1848,350 +636,27 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def mrv(assignment, csp):\n",
-       "    """Minimum-remaining-values heuristic."""\n",
-       "    return argmin_random_tie(\n",
-       "        [v for v in csp.variables if v not in assignment],\n",
-       "        key=lambda var: num_legal_values(csp, var, assignment))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(mrv)" ] }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def num_legal_values(csp, var, assignment):\n",
-       "    if csp.curr_domains:\n",
-       "        return len(csp.curr_domains[var])\n",
-       "    else:\n",
-       "        return count(csp.nconflicts(var, val, assignment) == 0\n",
-       "                     for val in csp.domains[var])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(num_legal_values)" ] }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def nconflicts(self, var, val, assignment):\n",
-       "        """Return the number of conflicts var=val has with other variables."""\n",
-       "\n",
-       "        # Subclasses may implement this more efficiently\n",
-       "        def conflict(var2):\n",
-       "            return (var2 in assignment and\n",
-       "                    not self.constraints(var, val, var2, assignment[var2]))\n",
-       "\n",
-       "        return count(conflict(v) for v in self.neighbors[var])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(CSP.nconflicts)" ] @@ -2205,114 +670,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def lcv(var, assignment, csp):\n",
-       "    """Least-constraining-values heuristic."""\n",
-       "    return sorted(csp.choices(var),\n",
-       "                  key=lambda val: csp.nconflicts(var, val, assignment))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(lcv)" ] @@ -2333,7 +693,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2343,68 +703,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'SD': 'R',\n", - " 'MN': 'G',\n", - " 'ND': 'B',\n", - " 'MT': 'G',\n", - " 'IA': 'B',\n", - " 'WI': 'R',\n", - " 'NE': 'G',\n", - " 'MO': 'R',\n", - " 'IL': 'G',\n", - " 'WY': 'B',\n", - " 'ID': 'R',\n", - " 'KA': 'B',\n", - " 'UT': 'G',\n", - " 'NV': 'B',\n", - " 'OK': 'G',\n", - " 'CO': 'R',\n", - " 'OR': 'G',\n", - " 'KY': 'B',\n", - " 'AZ': 'R',\n", - " 'CA': 'Y',\n", - " 'IN': 'R',\n", - " 'OH': 'G',\n", - " 'WA': 'B',\n", - " 'MI': 'B',\n", - " 'AR': 'B',\n", - " 'NM': 'B',\n", - " 'TN': 'G',\n", - " 'TX': 'R',\n", - " 'MS': 'R',\n", - " 'AL': 'B',\n", - " 'VA': 'R',\n", - " 'WV': 'Y',\n", - " 'PA': 'R',\n", - " 'LA': 'G',\n", - " 'GA': 'R',\n", - " 'MD': 'G',\n", - " 'NC': 'B',\n", - " 'DC': 'B',\n", - " 'DE': 'B',\n", - " 'SC': 'G',\n", - " 'FL': 'G',\n", - " 'NJ': 'G',\n", - " 'NY': 'B',\n", - " 'MA': 'R',\n", - " 'CT': 'G',\n", - " 'RI': 'B',\n", - " 'VT': 'G',\n", - " 'NH': 'B',\n", - " 'ME': 'R'}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "backtracking_search(solve_simple)\n", "backtracking_search(solve_parameters, order_domain_values=lcv, select_unassigned_variable=mrv, inference=mac)" @@ -2412,40 +713,18 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "49" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "solve_simple.nassigns" ] }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "49" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "solve_parameters.nassigns" ] @@ -2471,127 +750,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def tree_csp_solver(csp):\n",
-       "    """[Figure 6.11]"""\n",
-       "    assignment = {}\n",
-       "    root = csp.variables[0]\n",
-       "    X, parent = topological_sort(csp, root)\n",
-       "\n",
-       "    csp.support_pruning()\n",
-       "    for Xj in reversed(X[1:]):\n",
-       "        if not make_arc_consistent(parent[Xj], Xj, csp):\n",
-       "            return None\n",
-       "\n",
-       "    assignment[root] = csp.curr_domains[root][0]\n",
-       "    for Xi in X[1:]:\n",
-       "        assignment[Xi] = assign_value(parent[Xi], Xi, csp, assignment)\n",
-       "        if not assignment[Xi]:\n",
-       "            return None\n",
-       "    return assignment\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(tree_csp_solver)" ] @@ -2609,7 +770,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2626,17 +787,9 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'NT': 'R', 'Q': 'B', 'NSW': 'R', 'V': 'B', 'WA': 'B'}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "assignment = tree_csp_solver(australia_small)\n", "print(assignment)" @@ -2660,7 +813,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2741,7 +894,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2757,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2773,38 +926,9 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1882dd95ddd0465c8ec91d93a8a7224f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(IntSlider(value=0, description='iteration', max=20), Output()), _dom_classes=('widget-in…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3967e7c0226d434e8c08c7f4a59e2b2a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(ToggleButton(value=False, description='Visualize'), ToggleButtons(description='Extra Del…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import ipywidgets as widgets\n", "from IPython.display import display\n", @@ -2833,7 +957,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2895,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2906,7 +1030,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2922,38 +1046,9 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "582e8f9b8d2e4a31aa7d45de68fd5b7c", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(IntSlider(value=0, description='iteration', max=473, step=0), Output()), _dom_classes=('…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "bb0f50b970764cb4bbebeb69cd4fbd19", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(ToggleButton(value=False, description='Visualize'), ToggleButtons(description='Extra Del…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)\n", "matplotlib.rcParams['font.family'].append(u'Dejavu Sans')\n", @@ -2980,7 +1075,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2990,7 +1085,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3006,38 +1101,9 @@ }, { "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "409c4961f6e04fbea5d07a01cb1797ea", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(IntSlider(value=0, description='iteration', max=27, step=0), Output()), _dom_classes=('w…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a55b1b50a9a44085a484b357aa26b50f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(ToggleButton(value=False, description='Visualize'), ToggleButtons(description='Extra Del…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iteration_slider = widgets.IntSlider(min=0, max=len(conflicts_instru_queen.assignment_history)-1, step=0, value=0)\n", "w=widgets.interactive(conflicts_step,iteration=iteration_slider)\n", @@ -3081,10 +1147,10 @@ "pycharm": { "stem_cell": { "cell_type": "raw", - "source": [], "metadata": { "collapsed": false - } + }, + "source": [] } } }, diff --git a/notebooks/dynamic_decision_network.ipynb b/notebooks/dynamic_decision_network.ipynb index deb71059a..1579647c5 100644 --- a/notebooks/dynamic_decision_network.ipynb +++ b/notebooks/dynamic_decision_network.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "07e68a51", + "id": "1", "metadata": {}, "source": [ "# Dynamic Decision Networks (Section 17.4)\n", @@ -21,16 +22,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "bded6ebb", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:10.709493Z", - "iopub.status.busy": "2026-06-23T10:42:10.709226Z", - "iopub.status.idle": "2026-06-23T10:42:10.874538Z", - "shell.execute_reply": "2026-06-23T10:42:10.872073Z" - } - }, + "execution_count": null, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "from aima.mdp import POMDP, update_belief, pomdp_lookahead" @@ -38,7 +32,7 @@ }, { "cell_type": "markdown", - "id": "f0fb1298", + "id": "3", "metadata": {}, "source": [ "A two-state 'tiger-like' POMDP: action 0 pays off in state 0, action 1 in state 1, and action 2 is a sensing action (small cost, informative observation)." @@ -46,16 +40,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "cccf717e", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:10.877731Z", - "iopub.status.busy": "2026-06-23T10:42:10.877319Z", - "iopub.status.idle": "2026-06-23T10:42:10.883821Z", - "shell.execute_reply": "2026-06-23T10:42:10.882142Z" - } - }, + "execution_count": null, + "id": "4", + "metadata": {}, "outputs": [], "source": [ "t_prob = [[[0.65, 0.35], [0.65, 0.35]], [[0.65, 0.35], [0.65, 0.35]], [[1.0, 0.0], [0.0, 1.0]]]\n", @@ -66,7 +53,7 @@ }, { "cell_type": "markdown", - "id": "1b6315c8", + "id": "5", "metadata": {}, "source": [ "### Belief update (POMDP filtering, Equation 17.17)\n", @@ -75,32 +62,17 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "e117ad73", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:10.888179Z", - "iopub.status.busy": "2026-06-23T10:42:10.887720Z", - "iopub.status.idle": "2026-06-23T10:42:10.910700Z", - "shell.execute_reply": "2026-06-23T10:42:10.909496Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "belief after sensing obs 0: [0.727, 0.273]\n" - ] - } - ], + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], "source": [ "print('belief after sensing obs 0:', [round(b, 3) for b in update_belief(pomdp, [0.5, 0.5], '2', 0)])" ] }, { "cell_type": "markdown", - "id": "578f7466", + "id": "7", "metadata": {}, "source": [ "### Look-ahead decisions\n", @@ -109,27 +81,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "d904ab41", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:10.914146Z", - "iopub.status.busy": "2026-06-23T10:42:10.913844Z", - "iopub.status.idle": "2026-06-23T10:42:10.937111Z", - "shell.execute_reply": "2026-06-23T10:42:10.936126Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "belief [0.9, 0.1], depth 1 -> action 0\n", - "belief [0.1, 0.9], depth 1 -> action 1\n", - "belief [0.5, 0.5], depth 2 -> action 2 (sense)\n" - ] - } - ], + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], "source": [ "print('belief [0.9, 0.1], depth 1 -> action', pomdp_lookahead(pomdp, [0.9, 0.1], depth=1))\n", "print('belief [0.1, 0.9], depth 1 -> action', pomdp_lookahead(pomdp, [0.1, 0.9], depth=1))\n", diff --git a/notebooks/expectation_maximization.ipynb b/notebooks/expectation_maximization.ipynb index e1889d455..8e26c7f49 100644 --- a/notebooks/expectation_maximization.ipynb +++ b/notebooks/expectation_maximization.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "eec33447", + "id": "1", "metadata": {}, "source": [ "# Expectation-Maximization (Section 20.3)\n", @@ -21,16 +22,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "6adde261", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:04.240499Z", - "iopub.status.busy": "2026-06-23T10:42:04.240195Z", - "iopub.status.idle": "2026-06-23T10:42:06.059481Z", - "shell.execute_reply": "2026-06-23T10:42:06.057558Z" - } - }, + "execution_count": null, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -41,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "b6d161a3", + "id": "3", "metadata": {}, "source": [ "## 20.3.1 Unsupervised clustering: mixture of Gaussians\n", @@ -50,37 +44,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "3cb0c395", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:06.062328Z", - "iopub.status.busy": "2026-06-23T10:42:06.061924Z", - "iopub.status.idle": "2026-06-23T10:42:06.430470Z", - "shell.execute_reply": "2026-06-23T10:42:06.429308Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "recovered means:\n", - " [[-0.03 0.02]\n", - " [ 8.01 7.94]]\n" - ] - }, - { - "data": { - "image/png": "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TCYTBoOBwMBAbrvtNubMmcP06dPx8PDgk08+QdM0m0CoIlVJVi1177338vzzz/P222/z008/MXny5CrdL2qGzIgIGzfffDMeHh6MGTOG2NhY7rvvvgt6ztatWzl+/DiKorB+/XrrWnlllG4HPbdQVtn18XOVftCfy8fHh6CgIIKDgwkODiYkJISGDRsyY8YMunfv7vCe0t/QHY25dExlf4uvDF9fXxo3bszOnTttfqMFy2/PpbMhpR9IcHbGoHv37mzcuJE33niDKVOmMGnSJLstsy4uLg4Lizn6nk2dOpVDhw7xzDPPUFhYyOTJk2nYsCE//fRTla45V1XGC5Z8mHN/Ey79+st+LRcylrLPKy/5Mjg42PqzERISQkhICEOHDmXGjBkYjUbrf2Oz2Vzu88/3s1L25+S2227D29ubr776CrDMSJhMJocfxOcbW6nyfu7d3d0JCgqyeUZoaChTpkyxBrmKojj82ir6eh0p7xmKoth8/Y8++ihZWVn8+OOPFBYW8s0339CtWzeHQdzFcuedd1JcXMw999xDVlYW99xzT7X1JS6czIgIGx4eHtx666189dVXdOrUyToDUBXJycncfvvttG/fnmeeeYZbb72Vl156iZdfftl6TekHzrkfyoB1Cef06dM27Xv37q30GCIjIwkKCsLT07PKv0XVqVMHX19f646FskrbLuQfzzFjxvDss8/yxx9/MGzYsPNen5eXR0JCAg8++KDNP+hJSUmcOHGCDh062Iw5JSUFs9lsE8yU9z1r0qQJTzzxBE888QR5eXl06dKFqVOnMnLkyCpdc6HjraqqjqUipTMcnTt35uabbz7vdVu3bi13lqC0fffu3TazE5qmsWfPHpufE09PT0aOHMncuXN5//33mT17Nr1796Zx48ZVHltF2rdvz5IlS5gwYUKFNV5atWrF6tWrKSkpsbmubPJ5Zezdu5dbbrnFpm3Pnj00b97c5mexS5cuXHXVVXzyySe4uLiQlpbGG2+8UaW+qqp0abm0bk91Lg+LCyczIsLOlClTmDFjBu+++26V7zWbzYwaNYrCwkLmz5/PiBEjePrpp3nttdesW10B69bLsltVSzVt2pTw8HDmzp1rbSsoKOCLL76o9Dh0Oh2TJk1i8eLF1uJFZf3zzz/WvI1z6fV6xowZw5IlS6y7LABiY2P58MMP6dWrV5WnrwGe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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], "source": [ "np.random.seed(42)\n", "data = np.vstack([np.random.randn(150, 2) + [0, 0], np.random.randn(150, 2) + [8, 8]])\n", @@ -94,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "31f53132", + "id": "5", "metadata": {}, "source": [ "## 20.3.2 Bayes net with a hidden variable: the candy bags\n", @@ -103,28 +70,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "6964eed0", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:06.435537Z", - "iopub.status.busy": "2026-06-23T10:42:06.435081Z", - "iopub.status.idle": "2026-06-23T10:42:06.538439Z", - "shell.execute_reply": "2026-06-23T10:42:06.536494Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "class weights : [0.528 0.472]\n", - "P(feature=1 | bag) :\n", - " [[0.767 0.769 0.792]\n", - " [0.287 0.308 0.308]]\n" - ] - } - ], + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], "source": [ "np.random.seed(0)\n", "bag1 = (np.random.rand(1000, 3) < 0.8).astype(int)\n", @@ -136,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "b444572e", + "id": "7", "metadata": {}, "source": [ "## 20.3.3 Learning an HMM: Baum-Welch\n", @@ -145,26 +94,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "fad88173", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:06.541531Z", - "iopub.status.busy": "2026-06-23T10:42:06.541229Z", - "iopub.status.idle": "2026-06-23T10:42:06.626153Z", - "shell.execute_reply": "2026-06-23T10:42:06.624475Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "log-likelihood per iteration: [np.float64(-8.676), np.float64(-7.811), np.float64(-7.712), np.float64(-7.666), np.float64(-7.637), np.float64(-7.617), np.float64(-7.603), np.float64(-7.594), np.float64(-7.587), np.float64(-7.582), np.float64(-7.579)]\n", - "monotonically non-decreasing: True\n" - ] - } - ], + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], "source": [ "hmm = HiddenMarkovModel([[0.7, 0.3], [0.3, 0.7]], [[0.9, 0.2], [0.1, 0.8]])\n", "obs = [T, T, F, T, T, F, F, F, T, F, T, T]\n", diff --git a/notebooks/game_theory.ipynb b/notebooks/game_theory.ipynb index 4f7fcbf96..77a07861c 100644 --- a/notebooks/game_theory.ipynb +++ b/notebooks/game_theory.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "172aa32c", + "id": "1", "metadata": {}, "source": [ "# Game Theory and Social Choice (Chapter 18)\n", @@ -21,16 +22,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "3ef4f748", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:01.803870Z", - "iopub.status.busy": "2026-06-23T10:42:01.803624Z", - "iopub.status.idle": "2026-06-23T10:42:02.525662Z", - "shell.execute_reply": "2026-06-23T10:42:02.524026Z" - } - }, + "execution_count": null, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "from aima.game_theory import *" @@ -38,7 +32,7 @@ }, { "cell_type": "markdown", - "id": "7c29c30e", + "id": "3", "metadata": {}, "source": [ "## 18.2 Non-cooperative game theory\n", @@ -49,27 +43,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "7c27c8af", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:02.528013Z", - "iopub.status.busy": "2026-06-23T10:42:02.527706Z", - "iopub.status.idle": "2026-06-23T10:42:02.535439Z", - "shell.execute_reply": "2026-06-23T10:42:02.534219Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ali dominant strategy (0 = testify): 0\n", - "Iterated dominance leaves (rows, cols): ([0], [0])\n", - "Pure Nash equilibria: [(0, 0)]\n" - ] - } - ], + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], "source": [ "ali = [[-5, 0], [-10, -1]]\n", "bo = [[-5, -10], [0, -1]]\n", @@ -80,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "e8b2e804", + "id": "5", "metadata": {}, "source": [ "### Zero-sum games: two-finger Morra\n", @@ -89,27 +66,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "2a459e05", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:02.537737Z", - "iopub.status.busy": "2026-06-23T10:42:02.537462Z", - "iopub.status.idle": "2026-06-23T10:42:02.598999Z", - "shell.execute_reply": "2026-06-23T10:42:02.598176Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "value = -0.0833 (exact -1/12 = -0.0833 )\n", - "row player strategy = [np.float64(0.5833), np.float64(0.4167)]\n", - "matching pennies = -0.0\n" - ] - } - ], + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], "source": [ "value, row, col = solve_zero_sum_game([[2, -3], [-3, 4]])\n", "print('value =', round(value, 4), ' (exact -1/12 =', round(-1/12, 4), ')')\n", @@ -119,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "d89ded35", + "id": "7", "metadata": {}, "source": [ "## 18.3 Cooperative game theory\n", @@ -130,27 +90,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "28bf885d", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:02.605949Z", - "iopub.status.busy": "2026-06-23T10:42:02.605353Z", - "iopub.status.idle": "2026-06-23T10:42:02.615872Z", - "shell.execute_reply": "2026-06-23T10:42:02.613758Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Shapley value: {1: 0.167, 2: 0.167, 3: 0.667}\n", - "(0, 0, 1) in the core? True\n", - "(0.5, 0, 0.5) in the core? False\n" - ] - } - ], + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], "source": [ "def gloves(coalition):\n", " return min(len({1, 2} & coalition), len({3} & coalition))\n", @@ -163,7 +106,7 @@ }, { "cell_type": "markdown", - "id": "29beaf04", + "id": "9", "metadata": {}, "source": [ "## 18.4 Making collective decisions\n", @@ -174,28 +117,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "27788c85", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:02.622124Z", - "iopub.status.busy": "2026-06-23T10:42:02.621817Z", - "iopub.status.idle": "2026-06-23T10:42:02.646127Z", - "shell.execute_reply": "2026-06-23T10:42:02.645193Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "plurality: a\n", - "Borda : b\n", - "Condorcet: b\n", - "Condorcet's paradox -> None\n" - ] - } - ], + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], "source": [ "election = [['a', 'b', 'c']] * 4 + [['b', 'c', 'a']] * 3 + [['c', 'b', 'a']] * 2\n", "print('plurality:', plurality_winner(election))\n", @@ -207,7 +132,7 @@ }, { "cell_type": "markdown", - "id": "242ab579", + "id": "11", "metadata": {}, "source": [ "### Auctions, contract net and bargaining" @@ -215,28 +140,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "12d77b9a", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:02.648670Z", - "iopub.status.busy": "2026-06-23T10:42:02.648373Z", - "iopub.status.idle": "2026-06-23T10:42:02.673784Z", - "shell.execute_reply": "2026-06-23T10:42:02.672151Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vickrey winner, price: ('a', 8)\n", - "Contract net: {'paint': ('cheap_painter', 7), 'wire': ('electrician', 5)}\n", - "Bargaining (equal patience 0.8): (0.5555555555555556, 0.4444444444444444)\n", - "Bargaining (A more patient) : (0.9090909090909091, 0.09090909090909094)\n" - ] - } - ], + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], "source": [ "print('Vickrey winner, price:', vickrey_auction({'a': 10, 'b': 8, 'c': 5}))\n", "\n", diff --git a/notebooks/games.ipynb b/notebooks/games.ipynb index 737ca7d47..fbf5b5d7a 100644 --- a/notebooks/games.ipynb +++ b/notebooks/games.ipynb @@ -36,10 +36,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.games import *\n", @@ -78,9 +76,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## `Game` class\n", "\n", @@ -92,9 +88,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%psource Game" @@ -144,18 +138,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "output_type": "stream", - "text": "\u001b[1;32mclass\u001b[0m \u001b[0mTicTacToe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mGame\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"Play TicTacToe on an h x v board, with Max (first player) playing 'X'.\n A state has the player to move, a cached utility, a list of moves in\n the form of a list of (x, y) positions, and a board, in the form of\n a dict of {(x, y): Player} entries, where Player is 'X' or 'O'.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mh\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mv\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mh\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mh\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mv\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mv\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mmoves\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mh\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mv\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitial\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mGameState\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mto_move\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'X'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mutility\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmoves\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mactions\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"Legal moves are any square not yet taken.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmove\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstate\u001b[0m \u001b[1;31m# Illegal move has no effect\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mboard\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mmove\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_move\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mmoves\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mmoves\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmove\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mGameState\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mto_move\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'O'\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_move\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'X'\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;34m'X'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mutility\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompute_utility\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_move\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmoves\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mutility\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"Return the value to player; 1 for win, -1 for loss, 0 otherwise.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutility\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mplayer\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'X'\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;33m-\u001b[0m\u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutility\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mterminal_test\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"A state is terminal if it is won or there are no empty squares.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutility\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmoves\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mboard\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mh\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mv\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'.'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mend\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m' '\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mcompute_utility\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"If 'X' wins with this move, return 1; if 'O' wins return -1; else return 0.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk_in_row\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mor\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk_in_row\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mor\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk_in_row\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mor\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk_in_row\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;36m1\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mplayer\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'X'\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\n\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mk_in_row\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdelta_x_y\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;34m\"\"\"Return true if there is a line through move on board for player.\"\"\"\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mdelta_x\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdelta_y\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdelta_x_y\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;31m# n is number of moves in row\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mwhile\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mn\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mdelta_x\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mdelta_y\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmove\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mwhile\u001b[0m \u001b[0mboard\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mplayer\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mn\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mx\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mdelta_x\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mdelta_y\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[0mn\u001b[0m \u001b[1;33m-=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;31m# Because we counted move itself twice\u001b[0m\u001b[1;33m\n\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mn\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "metadata": {}, - "execution_count": 4 - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource TicTacToe" ] @@ -233,10 +218,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "moves = dict(A=dict(a1='B', a2='C', a3='D'),\n", @@ -258,17 +241,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(moves['A']['a1'])" ] @@ -282,10 +257,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "fig52 = Fig52Game()" @@ -301,9 +274,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game.actions)" @@ -311,17 +282,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['b1', 'b2', 'b3']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(fig52.actions('B'))" ] @@ -336,9 +299,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game.result)" @@ -346,17 +307,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(fig52.result('A', 'a1'))" ] @@ -371,9 +324,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game.utility)" @@ -381,18 +332,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "-3\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(fig52.utility('B1', 'MAX'))\n", "print(fig52.utility('B1', 'MIN'))" @@ -408,9 +350,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game.terminal_test)" @@ -418,17 +358,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(fig52.terminal_test('C3'))" ] @@ -443,9 +375,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game.to_move)" @@ -453,17 +383,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAX\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(fig52.to_move('A'))" ] @@ -478,9 +400,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(Fig52Game)" @@ -501,44 +421,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ MINIMAX-DECISION(_state_) __returns__ _an action_ \n", - " __return__ arg max _a_ ∈ ACTIONS(_s_) MIN\\-VALUE(RESULT(_state_, _a_)) \n", - "\n", - "---\n", - "__function__ MAX\\-VALUE(_state_) __returns__ _a utility value_ \n", - " __if__ TERMINAL\\-TEST(_state_) __then return__ UTILITY(_state_) \n", - " _v_ ← −∞ \n", - " __for each__ _a_ __in__ ACTIONS(_state_) __do__ \n", - "   _v_ ← MAX(_v_, MIN\\-VALUE(RESULT(_state_, _a_))) \n", - " __return__ _v_ \n", - "\n", - "---\n", - "__function__ MIN\\-VALUE(_state_) __returns__ _a utility value_ \n", - " __if__ TERMINAL\\-TEST(_state_) __then return__ UTILITY(_state_) \n", - " _v_ ← ∞ \n", - " __for each__ _a_ __in__ ACTIONS(_state_) __do__ \n", - "   _v_ ← MIN(_v_, MAX\\-VALUE(RESULT(_state_, _a_))) \n", - " __return__ _v_ \n", - "\n", - "---\n", - "__Figure__ ?? An algorithm for calculating minimax decisions. It returns the action corresponding to the best possible move, that is, the move that leads to the outcome with the best utility, under the assumption that the opponent plays to minimize utility. The functions MAX\\-VALUE and MIN\\-VALUE go through the whole game tree, all the way to the leaves, to determine the backed\\-up value of a state. The notation argmax _a_ ∈ _S_ _f_(_a_) computes the element _a_ of set _S_ that has maximum value of _f_(_a_)." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pseudocode(\"Minimax-Decision\")" ] @@ -555,9 +440,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "psource(minmax_decision)" @@ -580,19 +463,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b1\n", - "c1\n", - "d3\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(minmax_decision('B', fig52))\n", "print(minmax_decision('C', fig52))\n", @@ -608,17 +481,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(minmax_decision('A', fig52))" ] @@ -634,10 +499,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.notebook_utils import Canvas_min_max\n", @@ -692,50 +555,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ ALPHA-BETA-SEARCH(_state_) __returns__ an action \n", - " _v_ ← MAX\\-VALUE(_state_, −∞, +∞) \n", - " __return__ the _action_ in ACTIONS(_state_) with value _v_ \n", - "\n", - "---\n", - "__function__ MAX\\-VALUE(_state_, _α_, _β_) __returns__ _a utility value_ \n", - " __if__ TERMINAL\\-TEST(_state_) __then return__ UTILITY(_state_) \n", - " _v_ ← −∞ \n", - " __for each__ _a_ __in__ ACTIONS(_state_) __do__ \n", - "   _v_ ← MAX(_v_, MIN\\-VALUE(RESULT(_state_, _a_), _α_, _β_)) \n", - "   __if__ _v_ ≥ _β_ __then return__ _v_ \n", - "   _α_ ← MAX(_α_, _v_) \n", - " __return__ _v_ \n", - "\n", - "---\n", - "__function__ MIN\\-VALUE(_state_, _α_, _β_) __returns__ _a utility value_ \n", - " __if__ TERMINAL\\-TEST(_state_) __then return__ UTILITY(_state_) \n", - " _v_ ← +∞ \n", - " __for each__ _a_ __in__ ACTIONS(_state_) __do__ \n", - "   _v_ ← MIN(_v_, MAX\\-VALUE(RESULT(_state_, _a_), _α_, _β_)) \n", - "   __if__ _v_ ≤ _α_ __then return__ _v_ \n", - "   _β_ ← MIN(_β_, _v_) \n", - " __return__ _v_ \n", - "\n", - "\n", - "---\n", - "__Figure__ ?? The alpha\\-beta search algorithm. Notice that these routines are the same as the MINIMAX functions in Figure ??, except for the two lines in each of MIN\\-VALUE and MAX\\-VALUE that maintain _α_ and _β_ (and the bookkeeping to pass these parameters along)." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pseudocode(\"Alpha-Beta-Search\")" ] @@ -753,10 +575,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "%psource alpha_beta_search" @@ -773,17 +593,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(alpha_beta_search('A', fig52))" ] @@ -799,19 +611,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b1\n", - "c1\n", - "d3\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(alpha_beta_search('B', fig52))\n", "print(alpha_beta_search('C', fig52))\n", @@ -829,10 +631,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.notebook_utils import Canvas_alpha_beta\n", @@ -885,10 +685,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "game52 = Fig52Game()" @@ -903,18 +701,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n", - "a3\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(random_player(game52, 'A'))\n", "print(random_player(game52, 'A'))" @@ -929,19 +718,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n", - "b1\n", - "c1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print( alpha_beta_player(game52, 'A') )\n", "print( alpha_beta_player(game52, 'B') )\n", @@ -957,40 +736,18 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'a1'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "minmax_decision('A', game52)" ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'a1'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "alpha_beta_search('A', game52)" ] @@ -1004,118 +761,36 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B1\n" - ] - }, - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "game52.play_game(alpha_beta_player, alpha_beta_player)" ] }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B2\n" - ] - }, - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "game52.play_game(alpha_beta_player, random_player)" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "current state:\n", - "A\n", - "available moves: ['a1', 'a2', 'a3']\n", - "\n", - "Your move? a1\n", - "B1\n" - ] - }, - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "game52.play_game(query_player, alpha_beta_player)" ] }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "current state:\n", - "B\n", - "available moves: ['b1', 'b2', 'b3']\n", - "\n", - "Your move? b1\n", - "B1\n" - ] - }, - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "game52.play_game(alpha_beta_player, query_player)" ] @@ -1138,10 +813,8 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "ttt = TicTacToe()" @@ -1156,19 +829,9 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". . . \n", - ". . . \n", - ". . . \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ttt.display(ttt.initial)" ] @@ -1184,10 +847,8 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "my_state = GameState(\n", @@ -1210,19 +871,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "X O X \n", - "O . O \n", - "X . . \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ttt.display(my_state)" ] @@ -1236,40 +887,18 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 2)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "random_player(ttt, my_state)" ] }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 2)" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "random_player(ttt, my_state)" ] @@ -1283,20 +912,9 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 2)" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "alpha_beta_player(ttt, my_state)" ] @@ -1310,29 +928,9 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "O O . \n", - "X O X \n", - "X X O \n" - ] - }, - { - "data": { - "text/plain": [ - "-1" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ttt.play_game(random_player, alpha_beta_player)" ] @@ -1348,56 +946,9 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n", - "X X O \n", - "O O X \n", - "X O X \n", - "0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "for _ in range(10):\n", " print(ttt.play_game(alpha_beta_player, alpha_beta_player))" @@ -1412,56 +963,9 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "X O O \n", - "X O . \n", - "O X X \n", - "-1\n", - "O X . \n", - "O X X \n", - "O . . \n", - "-1\n", - "X X O \n", - "O O X \n", - "O X . \n", - "-1\n", - "O O O \n", - ". X X \n", - "X . . \n", - "-1\n", - "O O O \n", - ". . X \n", - "X . X \n", - "-1\n", - "O X O \n", - "X O X \n", - "X . O \n", - "-1\n", - "O X X \n", - "O X X \n", - "O O . \n", - "-1\n", - "O O X \n", - "X O X \n", - "X O . \n", - "-1\n", - "O O X \n", - "X O . \n", - "X O X \n", - "-1\n", - "O O X \n", - "X X O \n", - "O X X \n", - "0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "for _ in range(10):\n", " print(ttt.play_game(random_player, alpha_beta_player))" @@ -1480,10 +984,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.notebook_utils import Canvas_TicTacToe" @@ -1491,50 +993,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "\n", - "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "bot_play = Canvas_TicTacToe('bot_play', 'random', 'alpha_beta')" ] @@ -1548,50 +1009,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "\n", - "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rand_play = Canvas_TicTacToe('rand_play', 'human', 'random')" ] @@ -1605,50 +1025,9 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "\n", - "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ab_play = Canvas_TicTacToe('ab_play', 'human', 'alpha_beta')" ] diff --git a/notebooks/improving_sat_algorithms.ipynb b/notebooks/improving_sat_algorithms.ipynb index ee8e11378..1ed6a101a 100644 --- a/notebooks/improving_sat_algorithms.ipynb +++ b/notebooks/improving_sat_algorithms.ipynb @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -55,66 +55,18 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mdpll_satisfiable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mno_branching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Check satisfiability of a propositional sentence.\u001b[0m\n", - "\u001b[0;34m This differs from the book code in two ways: (1) it returns a model\u001b[0m\n", - "\u001b[0;34m rather than True when it succeeds; this is more useful. (2) The\u001b[0m\n", - "\u001b[0;34m function find_pure_symbol is passed a list of unknown clauses, rather\u001b[0m\n", - "\u001b[0;34m than a list of all clauses and the model; this is more efficient.\u001b[0m\n", - "\u001b[0;34m >>> dpll_satisfiable(A |'<=>'| B) == {A: True, B: True}\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_cnf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\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[0mbranching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource dpll_satisfiable" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mno_branching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"See if the clauses are true in a partial model.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munknown_clauses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# clauses with an unknown truth value\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munknown_clauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0munknown_clauses\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfind_pure_symbol\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0munknown_clauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfind_unit_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0munknown_clauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdpll\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbranching_heuristic\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource dpll" ] @@ -143,46 +95,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mmin_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmin_len\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmin_len\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmin_len\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource min_clauses" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mmoms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m MOMS (Maximum Occurrence in clauses of Minimum Size) heuristic\u001b[0m\n", - "\u001b[0;34m Returns the literal with the most occurrences in all clauses of minimum size\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmin_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource moms" ] @@ -202,29 +126,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mmomsf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m MOMS alternative heuristic\u001b[0m\n", - "\u001b[0;34m If f(x) the number of occurrences of the variable x in clauses with minimum size,\u001b[0m\n", - "\u001b[0;34m we choose the variable maximizing [f(x) + f(-x)] * 2^k + f(x) * f(-x)\u001b[0m\n", - "\u001b[0;34m Returns x if f(x) >= f(-x) otherwise -x\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmin_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mpow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource momsf" ] @@ -238,27 +142,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mposit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Freeman's POSIT version of MOMs\u001b[0m\n", - "\u001b[0;34m Counts the positive x and negative x for each variable x in clauses with minimum size\u001b[0m\n", - "\u001b[0;34m Returns x if f(x) >= f(-x) otherwise -x\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmin_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource posit" ] @@ -272,25 +158,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mzm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Zabih and McAllester's version of MOMs\u001b[0m\n", - "\u001b[0;34m Counts the negative occurrences only of each variable x in clauses with minimum size\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmin_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mop\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'~'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource zm" ] @@ -313,27 +183,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mdlis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m DLIS (Dynamic Largest Individual Sum) heuristic\u001b[0m\n", - "\u001b[0;34m Choose the variable and value that satisfies the maximum number of unsatisfied clauses\u001b[0m\n", - "\u001b[0;34m Like DLCS but we only consider the literal (thus Cp and Cn are individual)\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource dlis" ] @@ -347,29 +199,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mdlcs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m DLCS (Dynamic Largest Combined Sum) heuristic\u001b[0m\n", - "\u001b[0;34m Cp the number of clauses containing literal x\u001b[0m\n", - "\u001b[0;34m Cn the number of clauses containing literal -x\u001b[0m\n", - "\u001b[0;34m Here we select the variable maximizing Cp + Cn\u001b[0m\n", - "\u001b[0;34m Returns x if Cp >= Cn otherwise -x\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource dlcs" ] @@ -396,29 +228,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mjw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Jeroslow-Wang heuristic\u001b[0m\n", - "\u001b[0;34m For each literal compute J(l) = \\sum{l in clause c} 2^{-|c|}\u001b[0m\n", - "\u001b[0;34m Return the literal maximizing J\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mpow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource jw" ] @@ -432,30 +244,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mjw2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m Two Sided Jeroslow-Wang heuristic\u001b[0m\n", - "\u001b[0;34m Compute J(l) also counts the negation of l = J(x) + J(-x)\u001b[0m\n", - "\u001b[0;34m Returns x if J(x) >= J(-x) otherwise -x\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mpow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource jw2" ] @@ -479,56 +270,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mcdcl_satisfiable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvsids_decay\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.95\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrestart_strategy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mno_restart\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m >>> cdcl_satisfiable(A |'<=>'| B) == {A: True, B: True}\u001b[0m\n", - "\u001b[0;34m True\u001b[0m\n", - "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTwoWLClauseDatabase\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_cnf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDiGraph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflicts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrestarts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msum_lbd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue_lbd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munit_propagation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mconflict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdl\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflicts\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlearn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlbd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconflict_analysis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue_lbd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlbd\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msum_lbd\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mlbd\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbackjump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlearn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlearn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msymbol\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*=\u001b[0m \u001b[0mvsids_decay\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrestart_strategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflicts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrestarts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue_lbd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msum_lbd\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbackjump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mqueue_lbd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrestarts\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdl\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0massign_decision_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource cdcl_satisfiable" ] @@ -553,82 +297,27 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mconflict_analysis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict_clause\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'K'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'antecedent'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpred\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'K'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnode\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnode\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;34m'K'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnode\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dl'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mdl\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0min_degree\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnode\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfirst_uip\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimmediate_dominators\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mP\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'K'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'K'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict_side\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdescendants\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfirst_uip\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflict_clause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintersection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflict_side\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mantecedent\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'antecedent'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpred\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict_clause\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpl_binary_resolution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflict_clause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mantecedent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# the literal block distance is calculated by taking the decision levels from variables of all\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# literals in the clause, and counting how many different decision levels were in this set\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlbd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dl'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflict_clause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlbd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfirst_uip\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflict_clause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlbd\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mheapq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlargest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlbd\u001b[0m\u001b[0;34m)\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[0mconflict_clause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlbd\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource conflict_analysis" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mpl_binary_resolution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mci\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mci\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdi\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m~\u001b[0m\u001b[0mdj\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m~\u001b[0m\u001b[0mdi\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mdj\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpl_binary_resolution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mci\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\n", - "\u001b[0;34m\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mremove_all\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcj\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0massociate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mci\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcj\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource pl_binary_resolution" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mbackjump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mdelete\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mnode\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnode\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnodes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnode\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dl'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove_nodes_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnode\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdelete\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnode\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbols\u001b[0m \u001b[0;34m|=\u001b[0m \u001b[0mdelete\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource backjump" ] @@ -651,187 +340,18 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0munit_propagation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcheck\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mw1\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_neg_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_pos_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mw2\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_neg_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_pos_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0munit_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwatching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwatching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_edges_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcycle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mantecedent\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mconflict_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_edges_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprop_symbols\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcycle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'K'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mantecedent\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcheck\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_clauses\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# we need only visit each clause when one of its two watched literals is assigned to 0 because, until\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# this happens, we can guarantee that there cannot be more than n-2 literals in the clause assigned to 0\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfirst_watched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msecond_watched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfirst_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munit_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mfirst_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0msecond_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if the only literal with a non-zero value is the other watched literal then\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0msecond_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# if it is free, then the clause is a unit clause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munit_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# else (it is False) the clause is a conflict clause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0msecond_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfirst_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if the only literal with a non-zero value is the other watched literal then\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfirst_watched\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# if it is free, then the clause is a unit clause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0munit_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbcp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# else (it is False) the clause is a conflict clause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mconflict_clause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mbcp\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource unit_propagation" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mTwoWLClauseDatabase\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdefaultdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mclauses\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_clauses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mset_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_watching\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mset_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\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[0mnew_watching\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_pos_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_neg_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ml\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\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__assign_watching_literals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp1\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw1\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[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mw1\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mw2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp2\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw2\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[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__twl\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp1\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw1\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[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mw1\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mw2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp2\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw2\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[0mdiscard\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mupdate_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if a non-zero literal different from the other watched literal is found\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfound\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__find_new_watching_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfound\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# then it will replace the watched literal\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\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[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\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[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mupdate_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if a non-zero literal different from the other watched literal is found\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfound\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__find_new_watching_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_second_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfound\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# then it will replace the watched literal\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\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[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_first_watched\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_watching\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__watch_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mw\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[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__find_new_watching_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother_watched\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if a non-zero literal different from the other watched literal is found\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mother_watched\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# then it is returned\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__assign_watching_literals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclause\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdisjuncts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclause\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpl_true\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource TwoWLClauseDatabase" ] @@ -854,26 +374,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0massign_decision_literal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mP\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msymbols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0msymbol\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m~\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbols\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mG\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mP\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource assign_decision_literal" ] @@ -926,30 +431,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mluby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflicts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrestarts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue_lbd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msum_lbd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0munit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m512\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# in the state-of-art tested with unit value 1, 2, 4, 6, 8, 12, 16, 32, 64, 128, 256 and 512\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_luby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m<<\u001b[0m \u001b[0mk\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;34m<<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m<<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mk\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m<<\u001b[0m \u001b[0mk\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_luby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\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[0mk\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0munit\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0m_luby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrestarts\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue_lbd\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%psource luby" ] @@ -972,23 +456,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mglucose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconflicts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrestarts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueue_lbd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msum_lbd\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.7\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# in the state-of-art tested with (x, k) as (50, 0.8) and (100, 0.7)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# if there were at least x conflicts since the last restart, and then the average LBD of the last\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# x learnt clauses was at least k times higher than the average LBD of all learnt clauses\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue_lbd\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue_lbd\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueue_lbd\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0msum_lbd\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mconflicts\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource glucose" ] @@ -1004,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1027,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1036,28 +506,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 154 µs, sys: 37 µs, total: 191 µs\n", - "Wall time: 194 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP needs 72 consistency-checks'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%time _, checks = AC3b(australia_csp, arc_heuristic=dom_j_up)\n", "f'AC3b with DOM J UP needs {checks} consistency-checks'" @@ -1065,28 +516,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 263 µs, sys: 0 ns, total: 263 µs\n", - "Wall time: 268 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "{'Q': 'R', 'SA': 'G', 'NSW': 'B', 'NT': 'B', 'V': 'R', 'WA': 'R'}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%time backtracking_search(australia_csp, select_unassigned_variable=mrv, inference=forward_checking)" ] @@ -1100,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1116,162 +548,81 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 43.3 ms, sys: 0 ns, total: 43.3 ms\n", - "Wall time: 41.5 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=no_branching_heuristic)" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 36.4 ms, sys: 0 ns, total: 36.4 ms\n", - "Wall time: 35.3 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=moms)" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 36.1 ms, sys: 3.9 ms, total: 40 ms\n", - "Wall time: 39.2 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=momsf)" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 45.2 ms, sys: 0 ns, total: 45.2 ms\n", - "Wall time: 44.2 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=posit)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 31.2 ms, sys: 0 ns, total: 31.2 ms\n", - "Wall time: 30.5 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=zm)" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 57 ms, sys: 0 ns, total: 57 ms\n", - "Wall time: 55.9 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=dlis)" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 51.8 ms, sys: 0 ns, total: 51.8 ms\n", - "Wall time: 50.7 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=dlcs)" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 40.6 ms, sys: 0 ns, total: 40.6 ms\n", - "Wall time: 39.3 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=jw)" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 43.2 ms, sys: 1.81 ms, total: 45.1 ms\n", - "Wall time: 43.9 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(australia_sat, branching_heuristic=jw2)" ] @@ -1285,38 +636,18 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 32.9 ms, sys: 16 µs, total: 33 ms\n", - "Wall time: 31.6 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = cdcl_satisfiable(australia_sat)" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{NSW_B, NT_B, Q_G, SA_R, V_G, WA_G}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "{var for var, val in model.items() if val}" ] @@ -1337,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1352,28 +683,9 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 599 µs, sys: 112 µs, total: 711 µs\n", - "Wall time: 716 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP needs 516 consistency-checks'" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%time _, checks = AC3b(france_csp, arc_heuristic=dom_j_up)\n", "f'AC3b with DOM J UP needs {checks} consistency-checks'" @@ -1381,48 +693,9 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 560 µs, sys: 0 ns, total: 560 µs\n", - "Wall time: 563 µs\n" - ] - }, - { - "data": { - "text/plain": [ - "{'NH': 'R',\n", - " 'NB': 'G',\n", - " 'CE': 'B',\n", - " 'PL': 'R',\n", - " 'BR': 'B',\n", - " 'IF': 'G',\n", - " 'PI': 'B',\n", - " 'BO': 'R',\n", - " 'CA': 'Y',\n", - " 'FC': 'G',\n", - " 'LO': 'R',\n", - " 'PC': 'G',\n", - " 'AU': 'G',\n", - " 'AL': 'B',\n", - " 'RA': 'B',\n", - " 'LR': 'R',\n", - " 'LI': 'R',\n", - " 'AQ': 'B',\n", - " 'MP': 'Y',\n", - " 'PA': 'G',\n", - " 'NO': 'R'}" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time backtracking_search(france_csp, select_unassigned_variable=mrv, inference=forward_checking)" ] @@ -1436,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1458,162 +731,81 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.32 s, sys: 0 ns, total: 3.32 s\n", - "Wall time: 3.32 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=no_branching_heuristic)" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.17 s, sys: 390 µs, total: 3.17 s\n", - "Wall time: 3.17 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=moms)" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.49 s, sys: 0 ns, total: 3.49 s\n", - "Wall time: 3.49 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=momsf)" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.5 s, sys: 0 ns, total: 3.5 s\n", - "Wall time: 3.5 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=posit)" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3 s, sys: 2.6 ms, total: 3.01 s\n", - "Wall time: 3.01 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=zm)" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 12.5 s, sys: 11.4 ms, total: 12.5 s\n", - "Wall time: 12.5 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=dlis)" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.41 s, sys: 0 ns, total: 3.41 s\n", - "Wall time: 3.41 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=dlcs)" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.92 s, sys: 3.89 ms, total: 2.92 s\n", - "Wall time: 2.92 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=jw)" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.71 s, sys: 0 ns, total: 3.71 s\n", - "Wall time: 3.73 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(france_sat, branching_heuristic=jw2)" ] @@ -1627,58 +819,18 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 159 ms, sys: 3.94 ms, total: 163 ms\n", - "Wall time: 162 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = cdcl_satisfiable(france_sat)" ] }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{AL_G,\n", - " AQ_G,\n", - " AU_R,\n", - " BO_G,\n", - " BR_Y,\n", - " CA_R,\n", - " CE_B,\n", - " FC_B,\n", - " IF_Y,\n", - " LI_Y,\n", - " LO_Y,\n", - " LR_G,\n", - " MP_B,\n", - " NB_R,\n", - " NH_G,\n", - " NO_Y,\n", - " PA_B,\n", - " PC_R,\n", - " PI_B,\n", - " PL_G,\n", - " RA_Y}" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "{var for var, val in model.items() if val}" ] @@ -1699,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1717,28 +869,9 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.58 ms, sys: 17 µs, total: 1.6 ms\n", - "Wall time: 1.6 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP needs 1284 consistency-checks'" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%time _, checks = AC3b(usa_csp, arc_heuristic=dom_j_up)\n", "f'AC3b with DOM J UP needs {checks} consistency-checks'" @@ -1746,76 +879,9 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.15 ms, sys: 0 ns, total: 2.15 ms\n", - "Wall time: 2.15 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "{'NM': 'R',\n", - " 'TX': 'G',\n", - " 'OK': 'B',\n", - " 'AR': 'R',\n", - " 'MO': 'G',\n", - " 'KA': 'R',\n", - " 'LA': 'B',\n", - " 'NE': 'B',\n", - " 'TN': 'B',\n", - " 'MS': 'G',\n", - " 'IA': 'R',\n", - " 'SD': 'G',\n", - " 'IL': 'B',\n", - " 'CO': 'G',\n", - " 'MN': 'B',\n", - " 'KY': 'R',\n", - " 'AL': 'R',\n", - " 'GA': 'G',\n", - " 'FL': 'B',\n", - " 'VA': 'G',\n", - " 'WI': 'G',\n", - " 'IN': 'G',\n", - " 'NC': 'R',\n", - " 'WV': 'B',\n", - " 'OH': 'Y',\n", - " 'PA': 'R',\n", - " 'MD': 'Y',\n", - " 'SC': 'B',\n", - " 'MI': 'R',\n", - " 'DC': 'R',\n", - " 'DE': 'G',\n", - " 'WY': 'R',\n", - " 'ND': 'R',\n", - " 'NJ': 'B',\n", - " 'NY': 'G',\n", - " 'UT': 'B',\n", - " 'AZ': 'G',\n", - " 'ID': 'G',\n", - " 'MT': 'B',\n", - " 'NV': 'R',\n", - " 'CA': 'B',\n", - " 'OR': 'Y',\n", - " 'WA': 'R',\n", - " 'VT': 'R',\n", - " 'MA': 'B',\n", - " 'NH': 'G',\n", - " 'CT': 'R',\n", - " 'RI': 'G',\n", - " 'ME': 'R'}" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time backtracking_search(usa_csp, select_unassigned_variable=mrv, inference=forward_checking)" ] @@ -1829,7 +895,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1854,162 +920,81 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 46.2 s, sys: 0 ns, total: 46.2 s\n", - "Wall time: 46.2 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=no_branching_heuristic)" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 54.6 s, sys: 0 ns, total: 54.6 s\n", - "Wall time: 54.6 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=moms)" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 44 s, sys: 0 ns, total: 44 s\n", - "Wall time: 44 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=momsf)" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 43.8 s, sys: 0 ns, total: 43.8 s\n", - "Wall time: 43.8 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=posit)" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 52.6 s, sys: 0 ns, total: 52.6 s\n", - "Wall time: 52.6 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=zm)" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 57 s, sys: 0 ns, total: 57 s\n", - "Wall time: 57 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=dlis)" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 43.8 s, sys: 0 ns, total: 43.8 s\n", - "Wall time: 43.8 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=dlcs)" ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 53.3 s, sys: 3.82 ms, total: 53.3 s\n", - "Wall time: 53.3 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=jw)" ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 44 s, sys: 3.99 ms, total: 44 s\n", - "Wall time: 44 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(usa_sat, branching_heuristic=jw2)" ] @@ -2023,86 +1008,18 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 559 ms, sys: 0 ns, total: 559 ms\n", - "Wall time: 558 ms\n" - ] - } - ], + "outputs": [], "source": [ "%time model = cdcl_satisfiable(usa_sat)" ] }, { "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{AL_B,\n", - " AR_B,\n", - " AZ_R,\n", - " CA_B,\n", - " CO_R,\n", - " CT_Y,\n", - " DC_G,\n", - " DE_Y,\n", - " FL_Y,\n", - " GA_R,\n", - " IA_B,\n", - " ID_Y,\n", - " IL_G,\n", - " IN_R,\n", - " KA_G,\n", - " KY_B,\n", - " LA_G,\n", - " MA_G,\n", - " MD_R,\n", - " ME_G,\n", - " MI_G,\n", - " MN_Y,\n", - " MO_R,\n", - " MS_Y,\n", - " MT_B,\n", - " NC_B,\n", - " ND_G,\n", - " NE_Y,\n", - " NH_Y,\n", - " NJ_G,\n", - " NM_G,\n", - " NV_G,\n", - " NY_R,\n", - " OH_Y,\n", - " OK_Y,\n", - " OR_R,\n", - " PA_B,\n", - " RI_B,\n", - " SC_Y,\n", - " SD_R,\n", - " TN_G,\n", - " TX_R,\n", - " UT_B,\n", - " VA_Y,\n", - " VT_B,\n", - " WA_B,\n", - " WI_R,\n", - " WV_G,\n", - " WY_G}" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "{var for var, val in model.items() if val}" ] @@ -2123,7 +1040,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2132,45 +1049,18 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Milk': 3, 'Norwegian': 1}\n" - ] - } - ], + "outputs": [], "source": [ "zebra_csp.display(zebra_csp.infer_assignment())" ] }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.04 ms, sys: 4 µs, total: 2.05 ms\n", - "Wall time: 2.05 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "'AC3b with DOM J UP needs 737 consistency-checks'" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "%time _, checks = AC3b(zebra_csp, arc_heuristic=dom_j_up)\n", "f'AC3b with DOM J UP needs {checks} consistency-checks'" @@ -2178,69 +1068,18 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Blue': 2, 'Milk': 3, 'Norwegian': 1}\n" - ] - } - ], + "outputs": [], "source": [ "zebra_csp.display(zebra_csp.infer_assignment())" ] }, { "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.13 ms, sys: 0 ns, total: 2.13 ms\n", - "Wall time: 2.14 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "{'Milk': 3,\n", - " 'Blue': 2,\n", - " 'Norwegian': 1,\n", - " 'Coffee': 5,\n", - " 'Green': 5,\n", - " 'Ivory': 4,\n", - " 'Red': 3,\n", - " 'Yellow': 1,\n", - " 'Kools': 1,\n", - " 'Englishman': 3,\n", - " 'Horse': 2,\n", - " 'Tea': 2,\n", - " 'Ukranian': 2,\n", - " 'Spaniard': 4,\n", - " 'Dog': 4,\n", - " 'Japanese': 5,\n", - " 'Parliaments': 5,\n", - " 'LuckyStrike': 4,\n", - " 'OJ': 4,\n", - " 'Water': 1,\n", - " 'Chesterfields': 2,\n", - " 'Winston': 3,\n", - " 'Snails': 3,\n", - " 'Fox': 1,\n", - " 'Zebra': 5}" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%time backtracking_search(zebra_csp, select_unassigned_variable=mrv, inference=forward_checking)" ] @@ -2254,7 +1093,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2270,162 +1109,81 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13min 6s, sys: 2.44 ms, total: 13min 6s\n", - "Wall time: 13min 6s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=no_branching_heuristic)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 15min 4s, sys: 22.4 ms, total: 15min 4s\n", - "Wall time: 15min 4s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=moms)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 22min 28s, sys: 40 ms, total: 22min 28s\n", - "Wall time: 22min 28s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=momsf)" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 22min 25s, sys: 36 ms, total: 22min 25s\n", - "Wall time: 22min 25s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=posit)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 14min 52s, sys: 32 ms, total: 14min 52s\n", - "Wall time: 14min 52s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=zm)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2min 31s, sys: 9.87 ms, total: 2min 31s\n", - "Wall time: 2min 32s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=dlis)" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4min 27s, sys: 12 ms, total: 4min 27s\n", - "Wall time: 4min 27s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=dlcs)" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 6min 55s, sys: 39.2 ms, total: 6min 55s\n", - "Wall time: 6min 56s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=jw)" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 8min 57s, sys: 7.94 ms, total: 8min 57s\n", - "Wall time: 8min 57s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = dpll_satisfiable(zebra_sat, branching_heuristic=jw2)" ] @@ -2439,64 +1197,20 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "pycharm": {} }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.64 s, sys: 0 ns, total: 1.64 s\n", - "Wall time: 1.64 s\n" - ] - } - ], + "outputs": [], "source": [ "%time model = cdcl_satisfiable(zebra_sat)" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{Englishman_house2,\n", - " Englishman_milk,\n", - " Englishman_oldGold,\n", - " Englishman_redHouse,\n", - " Englishman_snails,\n", - " Japanese_coffee,\n", - " Japanese_greenHouse,\n", - " Japanese_house4,\n", - " Japanese_parliament,\n", - " Japanese_zebra,\n", - " Norwegian_fox,\n", - " Norwegian_house0,\n", - " Norwegian_kool,\n", - " Norwegian_water,\n", - " Norwegian_yellowHouse,\n", - " Spaniard_dog,\n", - " Spaniard_house3,\n", - " Spaniard_ivoryHouse,\n", - " Spaniard_luckyStrike,\n", - " Spaniard_orangeJuice,\n", - " Ukrainian_blueHouse,\n", - " Ukrainian_chesterfield,\n", - " Ukrainian_horse,\n", - " Ukrainian_house1,\n", - " Ukrainian_tea}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "{var for var, val in model.items() if val and var.op.startswith(('Englishman', 'Japanese', 'Norwegian', 'Spaniard', 'Ukrainian'))}" ] diff --git a/notebooks/intro.ipynb b/notebooks/intro.ipynb index 228880c85..efa6ba55e 100644 --- a/notebooks/intro.ipynb +++ b/notebooks/intro.ipynb @@ -45,9 +45,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Helpful Tips\n", "\n", @@ -56,10 +54,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.logic import *" @@ -76,10 +72,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "%psource WalkSAT" @@ -106,10 +100,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "WalkSAT?" diff --git a/notebooks/kalman_filter.ipynb b/notebooks/kalman_filter.ipynb index b7f044c26..0f5cea384 100644 --- a/notebooks/kalman_filter.ipynb +++ b/notebooks/kalman_filter.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "7de6191c", + "id": "1", "metadata": {}, "source": [ "# Kalman Filter and Dynamic Bayesian Networks\n", @@ -21,16 +22,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "96ba1e6d", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:08.169338Z", - "iopub.status.busy": "2026-06-23T10:42:08.169076Z", - "iopub.status.idle": "2026-06-23T10:42:08.886951Z", - "shell.execute_reply": "2026-06-23T10:42:08.885986Z" - } - }, + "execution_count": null, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -40,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "706b05aa", + "id": "3", "metadata": {}, "source": [ "## 15.4 Kalman filter: tracking a 1-D random walk\n", @@ -49,28 +43,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "d537d976", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:08.889538Z", - "iopub.status.busy": "2026-06-23T10:42:08.889092Z", - "iopub.status.idle": "2026-06-23T10:42:09.149463Z", - "shell.execute_reply": "2026-06-23T10:42:09.148519Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], "source": [ "np.random.seed(7)\n", "truth, x = [], 0.0\n", @@ -92,7 +68,7 @@ }, { "cell_type": "markdown", - "id": "5f1f127d", + "id": "5", "metadata": {}, "source": [ "## 15.5 Dynamic Bayesian network: the umbrella world\n", @@ -101,27 +77,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "88cf7e65", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:09.151520Z", - "iopub.status.busy": "2026-06-23T10:42:09.151221Z", - "iopub.status.idle": "2026-06-23T10:42:09.157898Z", - "shell.execute_reply": "2026-06-23T10:42:09.156797Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "unrolled (2 steps): ['Rain_0', 'Rain_1', 'Umbrella_1', 'Rain_2', 'Umbrella_2']\n", - "P(Rain_1 | umbrella) = 0.8182\n", - "P(Rain_2 | umbrella, umbrella) = 0.8834\n" - ] - } - ], + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], "source": [ "dbn = DynamicBayesNet(prior=[('Rain', '', 0.5)],\n", " transition=[('Rain', 'Rain_prev', {T: 0.7, F: 0.3})],\n", diff --git a/notebooks/knowledge_current_best.ipynb b/notebooks/knowledge_current_best.ipynb index 3a2913ddc..0172f0561 100644 --- a/notebooks/knowledge_current_best.ipynb +++ b/notebooks/knowledge_current_best.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -74,9 +74,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## CURRENT-BEST LEARNING\n", "\n", @@ -102,41 +100,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ Current-Best-Learning(_examples_, _h_) __returns__ a hypothesis or fail \n", - " __if__ _examples_ is empty __then__ \n", - "   __return__ _h_ \n", - " _e_ ← First(_examples_) \n", - " __if__ _e_ is consistent with _h_ __then__ \n", - "   __return__ Current-Best-Learning(Rest(_examples_), _h_) \n", - " __else if__ _e_ is a false positive for _h_ __then__ \n", - "   __for each__ _h'_ __in__ specializations of _h_ consistent with _examples_ seen so far __do__ \n", - "     _h''_ ← Current-Best-Learning(Rest(_examples_), _h'_) \n", - "     __if__ _h''_ ≠ _fail_ __then return__ _h''_ \n", - " __else if__ _e_ is a false negative for _h_ __then__ \n", - "   __for each__ _h'_ __in__ generalizations of _h_ consistent with _examples_ seen so far __do__ \n", - "     _h''_ ← Current-Best-Learning(Rest(_examples_), _h'_) \n", - "     __if__ _h''_ ≠ _fail_ __then return__ _h''_ \n", - " __return__ _fail_ \n", - "\n", - "---\n", - "__Figure ??__ The current-best-hypothesis learning algorithm. It searches for a consistent hypothesis that fits all the examples and backtracks when no consistent specialization/generalization can be found. To start the algorithm, any hypothesis can be passed in; it will be specialized or generalized as needed." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pseudocode('Current-Best-Learning')" ] @@ -156,194 +122,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def current_best_learning(examples, h, examples_so_far=None):\n",
-       "    """ [Figure 19.2]\n",
-       "    The hypothesis is a list of dictionaries, with each dictionary representing\n",
-       "    a disjunction."""\n",
-       "    if not examples:\n",
-       "        return h\n",
-       "\n",
-       "    examples_so_far = examples_so_far or []\n",
-       "    e = examples[0]\n",
-       "    if is_consistent(e, h):\n",
-       "        return current_best_learning(examples[1:], h, examples_so_far + [e])\n",
-       "    elif false_positive(e, h):\n",
-       "        for h2 in specializations(examples_so_far + [e], h):\n",
-       "            h3 = current_best_learning(examples[1:], h2, examples_so_far + [e])\n",
-       "            if h3 != 'FAIL':\n",
-       "                return h3\n",
-       "    elif false_negative(e, h):\n",
-       "        for h2 in generalizations(examples_so_far + [e], h):\n",
-       "            h3 = current_best_learning(examples[1:], h2, examples_so_far + [e])\n",
-       "            if h3 != 'FAIL':\n",
-       "                return h3\n",
-       "\n",
-       "    return 'FAIL'\n",
-       "\n",
-       "\n",
-       "def specializations(examples_so_far, h):\n",
-       "    """Specialize the hypothesis by adding AND operations to the disjunctions"""\n",
-       "    hypotheses = []\n",
-       "\n",
-       "    for i, disj in enumerate(h):\n",
-       "        for e in examples_so_far:\n",
-       "            for k, v in e.items():\n",
-       "                if k in disj or k == 'GOAL':\n",
-       "                    continue\n",
-       "\n",
-       "                h2 = h[i].copy()\n",
-       "                h2[k] = '!' + v\n",
-       "                h3 = h.copy()\n",
-       "                h3[i] = h2\n",
-       "                if check_all_consistency(examples_so_far, h3):\n",
-       "                    hypotheses.append(h3)\n",
-       "\n",
-       "    shuffle(hypotheses)\n",
-       "    return hypotheses\n",
-       "\n",
-       "\n",
-       "def generalizations(examples_so_far, h):\n",
-       "    """Generalize the hypothesis. First delete operations\n",
-       "    (including disjunctions) from the hypothesis. Then, add OR operations."""\n",
-       "    hypotheses = []\n",
-       "\n",
-       "    # Delete disjunctions\n",
-       "    disj_powerset = powerset(range(len(h)))\n",
-       "    for disjs in disj_powerset:\n",
-       "        h2 = h.copy()\n",
-       "        for d in reversed(list(disjs)):\n",
-       "            del h2[d]\n",
-       "\n",
-       "        if check_all_consistency(examples_so_far, h2):\n",
-       "            hypotheses += h2\n",
-       "\n",
-       "    # Delete AND operations in disjunctions\n",
-       "    for i, disj in enumerate(h):\n",
-       "        a_powerset = powerset(disj.keys())\n",
-       "        for attrs in a_powerset:\n",
-       "            h2 = h[i].copy()\n",
-       "            for a in attrs:\n",
-       "                del h2[a]\n",
-       "\n",
-       "            if check_all_consistency(examples_so_far, [h2]):\n",
-       "                h3 = h.copy()\n",
-       "                h3[i] = h2.copy()\n",
-       "                hypotheses += h3\n",
-       "\n",
-       "    # Add OR operations\n",
-       "    if hypotheses == [] or hypotheses == [{}]:\n",
-       "        hypotheses = add_or(examples_so_far, h)\n",
-       "    else:\n",
-       "        hypotheses.extend(add_or(examples_so_far, h))\n",
-       "\n",
-       "    shuffle(hypotheses)\n",
-       "    return hypotheses\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(current_best_learning, specializations, generalizations)" ] @@ -386,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -410,23 +191,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "False\n", - "True\n", - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "initial_h = [{'Species': 'Cat'}]\n", "\n", @@ -443,23 +210,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "True\n", - "False\n", - "False\n", - "False\n", - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "h = current_best_learning(animals_umbrellas, initial_h)\n", "\n", @@ -476,17 +229,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'Species': 'Cat', 'Rain': '!No'}, {'Species': 'Dog', 'Coat': 'Yes'}, {'Coat': 'Yes'}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(h)" ] @@ -529,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -541,16 +286,14 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "In code:" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -579,28 +322,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "False\n", - "True\n", - "True\n", - "False\n", - "True\n", - "False\n", - "True\n", - "False\n", - "False\n", - "False\n", - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "initial_h = [{'Alt': 'Yes'}]\n", "h = current_best_learning(restaurant, initial_h)\n", @@ -617,17 +341,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'Alt': 'Yes', 'Type': '!Thai', 'Hun': '!No', 'Bar': '!Yes'}, {'Alt': 'No', 'Fri': 'No', 'Pat': 'Some', 'Price': '$', 'Type': 'Burger', 'Est': '0-10'}, {'Rain': 'Yes', 'Res': 'No', 'Type': '!Burger'}, {'Alt': 'No', 'Bar': 'Yes', 'Hun': 'Yes', 'Pat': 'Some', 'Price': '$$', 'Rain': 'Yes', 'Res': 'Yes', 'Est': '0-10'}, {'Alt': 'No', 'Bar': 'No', 'Pat': 'Some', 'Price': '$$', 'Est': '0-10'}, {'Alt': 'Yes', 'Hun': 'Yes', 'Pat': 'Full', 'Price': '$', 'Res': 'No', 'Type': 'Burger', 'Est': '30-60'}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(h)" ] diff --git a/notebooks/knowledge_foil.ipynb b/notebooks/knowledge_foil.ipynb index d97981cc4..d7595a338 100644 --- a/notebooks/knowledge_foil.ipynb +++ b/notebooks/knowledge_foil.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -116,233 +116,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class FOIL_container(FolKB):\n",
-       "    """Hold the kb and other necessary elements required by FOIL."""\n",
-       "\n",
-       "    def __init__(self, clauses=None):\n",
-       "        self.const_syms = set()\n",
-       "        self.pred_syms = set()\n",
-       "        FolKB.__init__(self, clauses)\n",
-       "\n",
-       "    def tell(self, sentence):\n",
-       "        if is_definite_clause(sentence):\n",
-       "            self.clauses.append(sentence)\n",
-       "            self.const_syms.update(constant_symbols(sentence))\n",
-       "            self.pred_syms.update(predicate_symbols(sentence))\n",
-       "        else:\n",
-       "            raise Exception("Not a definite clause: {}".format(sentence))\n",
-       "\n",
-       "    def foil(self, examples, target):\n",
-       "        """Learn a list of first-order horn clauses\n",
-       "        'examples' is a tuple: (positive_examples, negative_examples).\n",
-       "        positive_examples and negative_examples are both lists which contain substitutions."""\n",
-       "        clauses = []\n",
-       "\n",
-       "        pos_examples = examples[0]\n",
-       "        neg_examples = examples[1]\n",
-       "\n",
-       "        while pos_examples:\n",
-       "            clause, extended_pos_examples = self.new_clause((pos_examples, neg_examples), target)\n",
-       "            # remove positive examples covered by clause\n",
-       "            pos_examples = self.update_examples(target, pos_examples, extended_pos_examples)\n",
-       "            clauses.append(clause)\n",
-       "\n",
-       "        return clauses\n",
-       "\n",
-       "    def new_clause(self, examples, target):\n",
-       "        """Find a horn clause which satisfies part of the positive\n",
-       "        examples but none of the negative examples.\n",
-       "        The horn clause is specified as [consequent, list of antecedents]\n",
-       "        Return value is the tuple (horn_clause, extended_positive_examples)."""\n",
-       "        clause = [target, []]\n",
-       "        # [positive_examples, negative_examples]\n",
-       "        extended_examples = examples\n",
-       "        while extended_examples[1]:\n",
-       "            l = self.choose_literal(self.new_literals(clause), extended_examples)\n",
-       "            clause[1].append(l)\n",
-       "            extended_examples = [sum([list(self.extend_example(example, l)) for example in\n",
-       "                                      extended_examples[i]], []) for i in range(2)]\n",
-       "\n",
-       "        return (clause, extended_examples[0])\n",
-       "\n",
-       "    def extend_example(self, example, literal):\n",
-       "        """Generate extended examples which satisfy the literal."""\n",
-       "        # find all substitutions that satisfy literal\n",
-       "        for s in self.ask_generator(subst(example, literal)):\n",
-       "            s.update(example)\n",
-       "            yield s\n",
-       "\n",
-       "    def new_literals(self, clause):\n",
-       "        """Generate new literals based on known predicate symbols.\n",
-       "        Generated literal must share atleast one variable with clause"""\n",
-       "        share_vars = variables(clause[0])\n",
-       "        for l in clause[1]:\n",
-       "            share_vars.update(variables(l))\n",
-       "        for pred, arity in self.pred_syms:\n",
-       "            new_vars = {standardize_variables(expr('x')) for _ in range(arity - 1)}\n",
-       "            for args in product(share_vars.union(new_vars), repeat=arity):\n",
-       "                if any(var in share_vars for var in args):\n",
-       "                    # make sure we don't return an existing rule\n",
-       "                    if not Expr(pred, args) in clause[1]:\n",
-       "                        yield Expr(pred, *[var for var in args])\n",
-       "\n",
-       "\n",
-       "    def choose_literal(self, literals, examples): \n",
-       "        """Choose the best literal based on the information gain."""\n",
-       "\n",
-       "        return max(literals, key = partial(self.gain , examples = examples))\n",
-       "\n",
-       "\n",
-       "    def gain(self, l ,examples):\n",
-       "        """\n",
-       "        Find the utility of each literal when added to the body of the clause. \n",
-       "        Utility function is: \n",
-       "            gain(R, l) = T * (log_2 (post_pos / (post_pos + post_neg)) - log_2 (pre_pos / (pre_pos + pre_neg)))\n",
-       "\n",
-       "        where: \n",
-       "        \n",
-       "            pre_pos = number of positive bindings of rule R (=current set of rules)\n",
-       "            pre_neg = number of negative bindings of rule R \n",
-       "            post_pos = number of positive bindings of rule R' (= R U {l} )\n",
-       "            post_neg = number of negative bindings of rule R' \n",
-       "            T = number of positive bindings of rule R that are still covered \n",
-       "                after adding literal l \n",
-       "\n",
-       "        """\n",
-       "        pre_pos = len(examples[0])\n",
-       "        pre_neg = len(examples[1])\n",
-       "        post_pos = sum([list(self.extend_example(example, l)) for example in examples[0]], [])           \n",
-       "        post_neg = sum([list(self.extend_example(example, l)) for example in examples[1]], []) \n",
-       "        if pre_pos + pre_neg ==0 or len(post_pos) + len(post_neg)==0:\n",
-       "            return -1\n",
-       "        # number of positive example that are represented in extended_examples\n",
-       "        T = 0\n",
-       "        for example in examples[0]:\n",
-       "            represents = lambda d: all(d[x] == example[x] for x in example)\n",
-       "            if any(represents(l_) for l_ in post_pos):\n",
-       "                T += 1\n",
-       "        value = T * (log(len(post_pos) / (len(post_pos) + len(post_neg)) + 1e-12,2) - log(pre_pos / (pre_pos + pre_neg),2))\n",
-       "        return value\n",
-       "\n",
-       "\n",
-       "    def update_examples(self, target, examples, extended_examples):\n",
-       "        """Add to the kb those examples what are represented in extended_examples\n",
-       "        List of omitted examples is returned."""\n",
-       "        uncovered = []\n",
-       "        for example in examples:\n",
-       "            represents = lambda d: all(d[x] == example[x] for x in example)\n",
-       "            if any(represents(l) for l in extended_examples):\n",
-       "                self.tell(subst(example, target))\n",
-       "            else:\n",
-       "                uncovered.append(example)\n",
-       "\n",
-       "        return uncovered\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(FOILContainer)" ] @@ -363,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -372,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -422,17 +198,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[Parent(x, y), [Father(x, y)]], [Parent(x, y), [Mother(x, y)]]]\n" - ] - } - ], + "outputs": [], "source": [ "# run the FOIL algorithm \n", "clauses = small_family.foil([examples_pos, examples_neg], target)\n", @@ -462,17 +230,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[Grandparent(x, y), [Parent(x, v_6), Parent(v_6, y)]]]\n" - ] - } - ], + "outputs": [], "source": [ "target = expr('Grandparent(x, y)')\n", "\n", @@ -535,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -564,17 +324,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[Reach(x, y), [Conn(x, y)]], [Reach(x, y), [Reach(x, v_12), Reach(v_14, y), Reach(v_12, v_16), Reach(v_12, y)]], [Reach(x, y), [Reach(x, v_20), Reach(v_20, y)]]]\n" - ] - } - ], + "outputs": [], "source": [ "target = expr('Reach(x, y)')\n", "examples_pos = [{x: A, y: B},\n", @@ -636,10 +388,10 @@ "pycharm": { "stem_cell": { "cell_type": "raw", - "source": [], "metadata": { "collapsed": false - } + }, + "source": [] } } }, diff --git a/notebooks/knowledge_version_space.ipynb b/notebooks/knowledge_version_space.ipynb index 31f2bda1c..4fe0cc701 100644 --- a/notebooks/knowledge_version_space.ipynb +++ b/notebooks/knowledge_version_space.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -94,46 +94,16 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ Version-Space-Learning(_examples_) __returns__ a version space \n", - " __local variables__: _V_, the version space: the set of all hypotheses \n", - "\n", - " _V_ ← the set of all hypotheses \n", - " __for each__ example _e_ in _examples_ __do__ \n", - "   __if__ _V_ is not empty __then__ _V_ ← Version-Space-Update(_V_, _e_) \n", - " __return__ _V_ \n", - "\n", - "---\n", - "__function__ Version-Space-Update(_V_, _e_) __returns__ an updated version space \n", - " _V_ ← \\{_h_ ∈ _V_ : _h_ is consistent with _e_\\} \n", - "\n", - "---\n", - "__Figure ??__ The version space learning algorithm. It finds a subset of _V_ that is consistent with all the _examples_." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode('Version-Space-Learning')" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "### Implementation\n", "\n", @@ -146,413 +116,27 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def version_space_learning(examples):\n",
-       "    """ [Figure 19.3]\n",
-       "    The version space is a list of hypotheses, which in turn are a list\n",
-       "    of dictionaries/disjunctions."""\n",
-       "    V = all_hypotheses(examples)\n",
-       "    for e in examples:\n",
-       "        if V:\n",
-       "            V = version_space_update(V, e)\n",
-       "\n",
-       "    return V\n",
-       "\n",
-       "\n",
-       "def version_space_update(V, e):\n",
-       "    return [h for h in V if is_consistent(e, h)]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(version_space_learning, version_space_update)" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def all_hypotheses(examples):\n",
-       "    """Build a list of all the possible hypotheses"""\n",
-       "    values = values_table(examples)\n",
-       "    h_powerset = powerset(values.keys())\n",
-       "    hypotheses = []\n",
-       "    for s in h_powerset:\n",
-       "        hypotheses.extend(build_attr_combinations(s, values))\n",
-       "\n",
-       "    hypotheses.extend(build_h_combinations(hypotheses))\n",
-       "\n",
-       "    return hypotheses\n",
-       "\n",
-       "\n",
-       "def values_table(examples):\n",
-       "    """Build a table with all the possible values for each attribute.\n",
-       "    Returns a dictionary with keys the attribute names and values a list\n",
-       "    with the possible values for the corresponding attribute."""\n",
-       "    values = defaultdict(lambda: [])\n",
-       "    for e in examples:\n",
-       "        for k, v in e.items():\n",
-       "            if k == 'GOAL':\n",
-       "                continue\n",
-       "\n",
-       "            mod = '!'\n",
-       "            if e['GOAL']:\n",
-       "                mod = ''\n",
-       "\n",
-       "            if mod + v not in values[k]:\n",
-       "                values[k].append(mod + v)\n",
-       "\n",
-       "    values = dict(values)\n",
-       "    return values\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(all_hypotheses, values_table)" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def build_attr_combinations(s, values):\n",
-       "    """Given a set of attributes, builds all the combinations of values.\n",
-       "    If the set holds more than one attribute, recursively builds the\n",
-       "    combinations."""\n",
-       "    if len(s) == 1:\n",
-       "        # s holds just one attribute, return its list of values\n",
-       "        k = values[s[0]]\n",
-       "        h = [[{s[0]: v}] for v in values[s[0]]]\n",
-       "        return h\n",
-       "\n",
-       "    h = []\n",
-       "    for i, a in enumerate(s):\n",
-       "        rest = build_attr_combinations(s[i+1:], values)\n",
-       "        for v in values[a]:\n",
-       "            o = {a: v}\n",
-       "            for r in rest:\n",
-       "                t = o.copy()\n",
-       "                for d in r:\n",
-       "                    t.update(d)\n",
-       "                h.append([t])\n",
-       "\n",
-       "    return h\n",
-       "\n",
-       "\n",
-       "def build_h_combinations(hypotheses):\n",
-       "    """Given a set of hypotheses, builds and returns all the combinations of the\n",
-       "    hypotheses."""\n",
-       "    h = []\n",
-       "    h_powerset = powerset(range(len(hypotheses)))\n",
-       "\n",
-       "    for s in h_powerset:\n",
-       "        t = []\n",
-       "        for i in s:\n",
-       "            t.extend(hypotheses[i])\n",
-       "        h.append(t)\n",
-       "\n",
-       "    return h\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(build_attr_combinations, build_h_combinations)" ] @@ -568,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -588,19 +172,9 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n" - ] - } - ], + "outputs": [], "source": [ "V = version_space_learning(party)\n", "for e in party:\n", @@ -622,20 +196,9 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "959\n", - "[{'Pizza': 'Yes'}, {'Soda': 'Yes'}]\n", - "[{'Pizza': 'Yes'}, {'Pizza': '!No', 'Soda': 'No'}]\n", - "True\n" - ] - } - ], + "outputs": [], "source": [ "print(len(V))\n", "\n", @@ -684,45 +247,9 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ Minimal-Consistent-Det(_E_, _A_) __returns__ a set of attributes \n", - " __inputs__: _E_, a set of examples \n", - "     _A_, a set of attributes, of size _n_ \n", - "\n", - " __for__ _i_ = 0 __to__ _n_ __do__ \n", - "   __for each__ subset _Ai_ of _A_ of size _i_ __do__ \n", - "     __if__ Consistent-Det?(_Ai_, _E_) __then return__ _Ai_ \n", - "\n", - "---\n", - "__function__ Consistent-Det?(_A_, _E_) __returns__ a truth value \n", - " __inputs__: _A_, a set of attributes \n", - "     _E_, a set of examples \n", - " __local variables__: _H_, a hash table \n", - "\n", - " __for each__ example _e_ __in__ _E_ __do__ \n", - "   __if__ some example in _H_ has the same values as _e_ for the attributes _A_ \n", - "    but a different classification __then return__ _false_ \n", - "   store the class of _e_ in_H_, indexed by the values for attributes _A_ of the example _e_ \n", - " __return__ _true_ \n", - "\n", - "---\n", - "__Figure ??__ An algorithm for finding a minimal consistent determination." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode('Minimal-Consistent-Det')" ] @@ -736,239 +263,18 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def minimal_consistent_det(E, A):\n",
-       "    """Return a minimal set of attributes which give consistent determination"""\n",
-       "    n = len(A)\n",
-       "\n",
-       "    for i in range(n + 1):\n",
-       "        for A_i in combinations(A, i):\n",
-       "            if consistent_det(A_i, E):\n",
-       "                return set(A_i)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(minimal_consistent_det)" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def consistent_det(A, E):\n",
-       "    """Check if the attributes(A) is consistent with the examples(E)"""\n",
-       "    H = {}\n",
-       "\n",
-       "    for e in E:\n",
-       "        attr_values = tuple(e[attr] for attr in A)\n",
-       "        if attr_values in H and H[attr_values] != e['GOAL']:\n",
-       "            return False\n",
-       "        H[attr_values] = e['GOAL']\n",
-       "\n",
-       "    return True\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(consistent_det)" ] @@ -989,17 +295,9 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Pizza'}\n" - ] - } - ], + "outputs": [], "source": [ "print(minimal_consistent_det(party, {'Pizza', 'Soda'}))" ] @@ -1013,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1040,34 +338,18 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Temp', 'Material'}\n" - ] - } - ], + "outputs": [], "source": [ "print(minimal_consistent_det(conductance, {'Mass', 'Temp', 'Material', 'Size'}))" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Temp', 'Size', 'Mass'}\n" - ] - } - ], + "outputs": [], "source": [ "print(minimal_consistent_det(conductance, {'Mass', 'Temp', 'Size'}))\n" ] diff --git a/notebooks/learning.ipynb b/notebooks/learning.ipynb index cce6f92f5..cc340dee0 100644 --- a/notebooks/learning.ipynb +++ b/notebooks/learning.ipynb @@ -20,15 +20,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:35.443128Z", - "iopub.status.busy": "2026-06-27T12:55:35.442770Z", - "iopub.status.idle": "2026-06-27T12:55:38.340569Z", - "shell.execute_reply": "2026-06-27T12:55:38.338462Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import math\n", @@ -126,16 +119,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.354614Z", - "iopub.status.busy": "2026-06-27T12:55:38.352319Z", - "iopub.status.idle": "2026-06-27T12:55:38.408101Z", - "shell.execute_reply": "2026-06-27T12:55:38.406335Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "%psource DataSet" @@ -196,16 +181,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.414409Z", - "iopub.status.busy": "2026-06-27T12:55:38.413959Z", - "iopub.status.idle": "2026-06-27T12:55:38.429426Z", - "shell.execute_reply": "2026-06-27T12:55:38.428190Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "iris = DataSet(name=\"iris\")" @@ -220,25 +197,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.444628Z", - "iopub.status.busy": "2026-06-27T12:55:38.440224Z", - "iopub.status.idle": "2026-06-27T12:55:38.453911Z", - "shell.execute_reply": "2026-06-27T12:55:38.452358Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5.1, 3.5, 1.4, 0.2, 'setosa']\n", - "[0, 1, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.examples[0])\n", "print(iris.inputs)" @@ -260,24 +221,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.573527Z", - "iopub.status.busy": "2026-06-27T12:55:38.572601Z", - "iopub.status.idle": "2026-06-27T12:55:38.592943Z", - "shell.execute_reply": "2026-06-27T12:55:38.588777Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\",exclude=[1])\n", "print(iris2.inputs)" @@ -296,24 +242,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.597066Z", - "iopub.status.busy": "2026-06-27T12:55:38.596698Z", - "iopub.status.idle": "2026-06-27T12:55:38.606712Z", - "shell.execute_reply": "2026-06-27T12:55:38.604341Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[5.1, 3.5, 1.4, 0.2, 'setosa'], [4.9, 3.0, 1.4, 0.2, 'setosa'], [4.7, 3.2, 1.3, 0.2, 'setosa']]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.examples[:3])" ] @@ -327,27 +258,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.612338Z", - "iopub.status.busy": "2026-06-27T12:55:38.610682Z", - "iopub.status.idle": "2026-06-27T12:55:38.624868Z", - "shell.execute_reply": "2026-06-27T12:55:38.620495Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "attrs: [0, 1, 2, 3, 4]\n", - "attrnames (by default same as attrs): [0, 1, 2, 3, 4]\n", - "target: 4\n", - "inputs: [0, 1, 2, 3]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"attrs:\", iris.attrs)\n", "print(\"attrnames (by default same as attrs):\", iris.attr_names)\n", @@ -364,24 +277,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.632407Z", - "iopub.status.busy": "2026-06-27T12:55:38.630025Z", - "iopub.status.idle": "2026-06-27T12:55:38.642309Z", - "shell.execute_reply": "2026-06-27T12:55:38.641280Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4.7, 5.5, 5.0, 4.9, 5.1, 4.6, 5.4, 4.4, 4.8, 4.3, 5.8, 7.0, 7.1, 4.5, 5.9, 5.6, 6.9, 6.5, 6.4, 6.6, 6.0, 6.1, 7.6, 7.4, 7.9, 5.7, 5.3, 5.2, 6.3, 6.7, 6.2, 6.8, 7.3, 7.2, 7.7]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.values[0])" ] @@ -395,25 +293,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.653354Z", - "iopub.status.busy": "2026-06-27T12:55:38.652897Z", - "iopub.status.idle": "2026-06-27T12:55:38.667683Z", - "shell.execute_reply": "2026-06-27T12:55:38.663514Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: iris\n", - "source: \n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"name:\", iris.name)\n", "print(\"source:\", iris.source)" @@ -428,24 +310,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.671257Z", - "iopub.status.busy": "2026-06-27T12:55:38.670860Z", - "iopub.status.idle": "2026-06-27T12:55:38.680086Z", - "shell.execute_reply": "2026-06-27T12:55:38.679248Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'versicolor', 'virginica']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(iris.values[iris.target])" ] @@ -472,25 +339,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.685610Z", - "iopub.status.busy": "2026-06-27T12:55:38.685061Z", - "iopub.status.idle": "2026-06-27T12:55:38.712005Z", - "shell.execute_reply": "2026-06-27T12:55:38.694127Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sanitized: [5.1, 3.5, 1.4, 0.2, None]\n", - "Original: [5.1, 3.5, 1.4, 0.2, 'setosa']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Sanitized:\",iris.sanitize(iris.examples[0]))\n", "print(\"Original:\",iris.examples[0])" @@ -505,24 +356,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.718499Z", - "iopub.status.busy": "2026-06-27T12:55:38.717599Z", - "iopub.status.idle": "2026-06-27T12:55:38.749524Z", - "shell.execute_reply": "2026-06-27T12:55:38.744753Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'versicolor']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\")\n", "\n", @@ -539,25 +375,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.763865Z", - "iopub.status.busy": "2026-06-27T12:55:38.763094Z", - "iopub.status.idle": "2026-06-27T12:55:38.789843Z", - "shell.execute_reply": "2026-06-27T12:55:38.780079Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Class of first example: setosa\n", - "Class of first example: 0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Class of first example:\",iris2.examples[0][iris2.target])\n", "iris2.classes_to_numbers()\n", @@ -580,27 +400,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.800881Z", - "iopub.status.busy": "2026-06-27T12:55:38.800243Z", - "iopub.status.idle": "2026-06-27T12:55:38.845568Z", - "shell.execute_reply": "2026-06-27T12:55:38.837580Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Setosa feature means: [5.006, 3.418, 1.464, 0.244]\n", - "Versicolor mean for first feature: 5.936\n", - "Setosa feature deviations: [0.3524896872134513, 0.38102439795469095, 0.17351115943644543, 0.10720950308167838]\n", - "Virginica deviation for second feature: 0.32249663817263746\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "means, deviations = iris.find_means_and_deviations()\n", "\n", @@ -624,29 +426,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:38.852396Z", - "iopub.status.busy": "2026-06-27T12:55:38.852017Z", - "iopub.status.idle": "2026-06-27T12:55:39.215160Z", - "shell.execute_reply": "2026-06-27T12:55:39.212501Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/david/Insync/donato.meoli.95@gmail.com/Google Drive/aima-python/notebook_utils.py:93: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", - " plt.show()\n", - "/home/david/Insync/donato.meoli.95@gmail.com/Google Drive/aima-python/notebook_utils.py:93: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", - " plt.show()\n", - "/home/david/Insync/donato.meoli.95@gmail.com/Google Drive/aima-python/notebook_utils.py:93: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", - " plt.show()\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", @@ -677,24 +459,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.222314Z", - "iopub.status.busy": "2026-06-27T12:55:39.221936Z", - "iopub.status.idle": "2026-06-27T12:55:39.235394Z", - "shell.execute_reply": "2026-06-27T12:55:39.232027Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Manhattan Distance between (1,2) and (3,4) is 4\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def manhattan_distance(X, Y):\n", " return sum([abs(x - y) for x, y in zip(X, Y)])\n", @@ -715,24 +482,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.250666Z", - "iopub.status.busy": "2026-06-27T12:55:39.249714Z", - "iopub.status.idle": "2026-06-27T12:55:39.268062Z", - "shell.execute_reply": "2026-06-27T12:55:39.264400Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Euclidean Distance between (1,2) and (3,4) is 2.8284271247461903\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def euclidean_distance(X, Y):\n", " return math.sqrt(sum([(x - y)**2 for x, y in zip(X,Y)]))\n", @@ -753,24 +505,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.274190Z", - "iopub.status.busy": "2026-06-27T12:55:39.273288Z", - "iopub.status.idle": "2026-06-27T12:55:39.295697Z", - "shell.execute_reply": "2026-06-27T12:55:39.294351Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamming Distance between 'abc' and 'abb' is 1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def hamming_distance(X, Y):\n", " return sum(x != y for x, y in zip(X, Y))\n", @@ -791,24 +528,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.302076Z", - "iopub.status.busy": "2026-06-27T12:55:39.301714Z", - "iopub.status.idle": "2026-06-27T12:55:39.320877Z", - "shell.execute_reply": "2026-06-27T12:55:39.315861Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Boolean Error Distance between (1,2,3) and (1,4,5) is 0.6666666666666666\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def mean_boolean_error(X, Y):\n", " return mean(int(x != y) for x, y in zip(X, Y))\n", @@ -829,24 +551,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.328793Z", - "iopub.status.busy": "2026-06-27T12:55:39.328414Z", - "iopub.status.idle": "2026-06-27T12:55:39.347876Z", - "shell.execute_reply": "2026-06-27T12:55:39.342477Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Error Distance between (1,0,5) and (3,10,5) is 4\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def mean_error(X, Y):\n", " return mean([abs(x - y) for x, y in zip(X, Y)])\n", @@ -867,24 +574,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.353032Z", - "iopub.status.busy": "2026-06-27T12:55:39.352676Z", - "iopub.status.idle": "2026-06-27T12:55:39.368244Z", - "shell.execute_reply": "2026-06-27T12:55:39.366279Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Square Distance between (1,0,5) and (3,10,5) is 34.666666666666664\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def ms_error(X, Y):\n", " return mean([(x - y)**2 for x, y in zip(X, Y)])\n", @@ -905,24 +597,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.372060Z", - "iopub.status.busy": "2026-06-27T12:55:39.371612Z", - "iopub.status.idle": "2026-06-27T12:55:39.391304Z", - "shell.execute_reply": "2026-06-27T12:55:39.387901Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Root of Mean Error Distance between (1,0,5) and (3,10,5) is 5.887840577551898\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def rms_error(X, Y):\n", " return math.sqrt(ms_error(X, Y))\n", @@ -960,142 +637,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.399384Z", - "iopub.status.busy": "2026-06-27T12:55:39.398967Z", - "iopub.status.idle": "2026-06-27T12:55:39.523465Z", - "shell.execute_reply": "2026-06-27T12:55:39.520880Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def PluralityLearner(dataset):\n",
-       "    """\n",
-       "    A very dumb algorithm: always pick the result that was most popular\n",
-       "    in the training data. Makes a baseline for comparison.\n",
-       "    """\n",
-       "    most_popular = mode([e[dataset.target] for e in dataset.examples])\n",
-       "\n",
-       "    def predict(example):\n",
-       "        """Always return same result: the most popular from the training set."""\n",
-       "        return most_popular\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PluralityLearner)" ] @@ -1120,24 +664,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.528793Z", - "iopub.status.busy": "2026-06-27T12:55:39.528446Z", - "iopub.status.idle": "2026-06-27T12:55:39.539252Z", - "shell.execute_reply": "2026-06-27T12:55:39.537742Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mammal\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "zoo = DataSet(name=\"zoo\")\n", "\n", @@ -1190,139 +719,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.550609Z", - "iopub.status.busy": "2026-06-27T12:55:39.549998Z", - "iopub.status.idle": "2026-06-27T12:55:39.566248Z", - "shell.execute_reply": "2026-06-27T12:55:39.564510Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def NearestNeighborLearner(dataset, k=1):\n",
-       "    """k-NearestNeighbor: the k nearest neighbors vote."""\n",
-       "\n",
-       "    def predict(example):\n",
-       "        """Find the k closest items, and have them vote for the best."""\n",
-       "        best = heapq.nsmallest(k, ((dataset.distance(e, example), e) for e in dataset.examples))\n",
-       "        return mode(e[dataset.target] for (d, e) in best)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NearestNeighborLearner)" ] @@ -1347,24 +746,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.572104Z", - "iopub.status.busy": "2026-06-27T12:55:39.571550Z", - "iopub.status.idle": "2026-06-27T12:55:39.590303Z", - "shell.execute_reply": "2026-06-27T12:55:39.587958Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", @@ -1414,45 +798,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.596196Z", - "iopub.status.busy": "2026-06-27T12:55:39.594246Z", - "iopub.status.idle": "2026-06-27T12:55:39.715938Z", - "shell.execute_reply": "2026-06-27T12:55:39.714362Z" - } - }, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ DECISION-TREE-LEARNING(_examples_, _attributes_, _parent\\_examples_) __returns__ a tree \n", - " __if__ _examples_ is empty __then return__ PLURALITY\\-VALUE(_parent\\_examples_) \n", - " __else if__ all _examples_ have the same classification __then return__ the classification \n", - " __else if__ _attributes_ is empty __then return__ PLURALITY\\-VALUE(_examples_) \n", - " __else__ \n", - "   _A_ ← argmax_a_ ∈ _attributes_ IMPORTANCE(_a_, _examples_) \n", - "   _tree_ ← a new decision tree with root test _A_ \n", - "   __for each__ value _vk_ of _A_ __do__ \n", - "     _exs_ ← \\{ _e_ : _e_ ∈ _examples_ __and__ _e_._A_ = _vk_ \\} \n", - "     _subtree_ ← DECISION-TREE-LEARNING(_exs_, _attributes_ − _A_, _examples_) \n", - "     add a branch to _tree_ with label \\(_A_ = _vk_\\) and subtree _subtree_ \n", - "   __return__ _tree_ \n", - "\n", - "---\n", - "__Figure ??__ The decision\\-tree learning algorithm. The function IMPORTANCE is described in Section __??__. The function PLURALITY\\-VALUE selects the most common output value among a set of examples, breaking ties randomly." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pseudocode(\"Decision Tree Learning\")" ] @@ -1467,164 +815,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.724691Z", - "iopub.status.busy": "2026-06-27T12:55:39.722362Z", - "iopub.status.idle": "2026-06-27T12:55:39.864476Z", - "shell.execute_reply": "2026-06-27T12:55:39.859525Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class DecisionFork:\n",
-       "    """\n",
-       "    A fork of a decision tree holds an attribute to test, and a dict\n",
-       "    of branches, one for each of the attribute's values.\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, attr, attr_name=None, default_child=None, branches=None):\n",
-       "        """Initialize by saying what attribute this node tests."""\n",
-       "        self.attr = attr\n",
-       "        self.attr_name = attr_name or attr\n",
-       "        self.default_child = default_child\n",
-       "        self.branches = branches or {}\n",
-       "\n",
-       "    def __call__(self, example):\n",
-       "        """Given an example, classify it using the attribute and the branches."""\n",
-       "        attr_val = example[self.attr]\n",
-       "        if attr_val in self.branches:\n",
-       "            return self.branches[attr_val](example)\n",
-       "        else:\n",
-       "            # return default class when attribute is unknown\n",
-       "            return self.default_child(example)\n",
-       "\n",
-       "    def add(self, val, subtree):\n",
-       "        """Add a branch. If self.attr = val, go to the given subtree."""\n",
-       "        self.branches[val] = subtree\n",
-       "\n",
-       "    def display(self, indent=0):\n",
-       "        name = self.attr_name\n",
-       "        print('Test', name)\n",
-       "        for (val, subtree) in self.branches.items():\n",
-       "            print(' ' * 4 * indent, name, '=', val, '==>', end=' ')\n",
-       "            subtree.display(indent + 1)\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return 'DecisionFork({0!r}, {1!r}, {2!r})'.format(self.attr, self.attr_name, self.branches)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(DecisionFork)" ] @@ -1638,144 +831,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.877242Z", - "iopub.status.busy": "2026-06-27T12:55:39.874487Z", - "iopub.status.idle": "2026-06-27T12:55:39.974034Z", - "shell.execute_reply": "2026-06-27T12:55:39.967338Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class DecisionLeaf:\n",
-       "    """A leaf of a decision tree holds just a result."""\n",
-       "\n",
-       "    def __init__(self, result):\n",
-       "        self.result = result\n",
-       "\n",
-       "    def __call__(self, example):\n",
-       "        return self.result\n",
-       "\n",
-       "    def display(self):\n",
-       "        print('RESULT =', self.result)\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return repr(self.result)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(DecisionLeaf)" ] @@ -1789,185 +847,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:39.982966Z", - "iopub.status.busy": "2026-06-27T12:55:39.982541Z", - "iopub.status.idle": "2026-06-27T12:55:40.010709Z", - "shell.execute_reply": "2026-06-27T12:55:40.009042Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def DecisionTreeLearner(dataset):\n",
-       "    """[Figure 18.5]"""\n",
-       "\n",
-       "    target, values = dataset.target, dataset.values\n",
-       "\n",
-       "    def decision_tree_learning(examples, attrs, parent_examples=()):\n",
-       "        if len(examples) == 0:\n",
-       "            return plurality_value(parent_examples)\n",
-       "        if all_same_class(examples):\n",
-       "            return DecisionLeaf(examples[0][target])\n",
-       "        if len(attrs) == 0:\n",
-       "            return plurality_value(examples)\n",
-       "        A = choose_attribute(attrs, examples)\n",
-       "        tree = DecisionFork(A, dataset.attr_names[A], plurality_value(examples))\n",
-       "        for (v_k, exs) in split_by(A, examples):\n",
-       "            subtree = decision_tree_learning(exs, remove_all(A, attrs), examples)\n",
-       "            tree.add(v_k, subtree)\n",
-       "        return tree\n",
-       "\n",
-       "    def plurality_value(examples):\n",
-       "        """\n",
-       "        Return the most popular target value for this set of examples.\n",
-       "        (If target is binary, this is the majority; otherwise plurality).\n",
-       "        """\n",
-       "        popular = argmax_random_tie(values[target], key=lambda v: count(target, v, examples))\n",
-       "        return DecisionLeaf(popular)\n",
-       "\n",
-       "    def count(attr, val, examples):\n",
-       "        """Count the number of examples that have example[attr] = val."""\n",
-       "        return sum(e[attr] == val for e in examples)\n",
-       "\n",
-       "    def all_same_class(examples):\n",
-       "        """Are all these examples in the same target class?"""\n",
-       "        class0 = examples[0][target]\n",
-       "        return all(e[target] == class0 for e in examples)\n",
-       "\n",
-       "    def choose_attribute(attrs, examples):\n",
-       "        """Choose the attribute with the highest information gain."""\n",
-       "        return argmax_random_tie(attrs, key=lambda a: information_gain(a, examples))\n",
-       "\n",
-       "    def information_gain(attr, examples):\n",
-       "        """Return the expected reduction in entropy from splitting by attr."""\n",
-       "\n",
-       "        def I(examples):\n",
-       "            return information_content([count(target, v, examples) for v in values[target]])\n",
-       "\n",
-       "        n = len(examples)\n",
-       "        remainder = sum((len(examples_i) / n) * I(examples_i) for (v, examples_i) in split_by(attr, examples))\n",
-       "        return I(examples) - remainder\n",
-       "\n",
-       "    def split_by(attr, examples):\n",
-       "        """Return a list of (val, examples) pairs for each val of attr."""\n",
-       "        return [(v, [e for e in examples if e[attr] == v]) for v in values[attr]]\n",
-       "\n",
-       "    return decision_tree_learning(dataset.examples, dataset.inputs)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(DecisionTreeLearner)" ] @@ -1996,24 +878,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.020013Z", - "iopub.status.busy": "2026-06-27T12:55:40.017869Z", - "iopub.status.idle": "2026-06-27T12:55:40.050350Z", - "shell.execute_reply": "2026-06-27T12:55:40.046557Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", @@ -2064,151 +931,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.063393Z", - "iopub.status.busy": "2026-06-27T12:55:40.062943Z", - "iopub.status.idle": "2026-06-27T12:55:40.086574Z", - "shell.execute_reply": "2026-06-27T12:55:40.082955Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def RandomForest(dataset, n=5):\n",
-       "    """An ensemble of Decision Trees trained using bagging and feature bagging."""\n",
-       "\n",
-       "    def data_bagging(dataset, m=0):\n",
-       "        """Sample m examples with replacement"""\n",
-       "        n = len(dataset.examples)\n",
-       "        return weighted_sample_with_replacement(m or n, dataset.examples, [1] * n)\n",
-       "\n",
-       "    def feature_bagging(dataset, p=0.7):\n",
-       "        """Feature bagging with probability p to retain an attribute"""\n",
-       "        inputs = [i for i in dataset.inputs if probability(p)]\n",
-       "        return inputs or dataset.inputs\n",
-       "\n",
-       "    def predict(example):\n",
-       "        print([predictor(example) for predictor in predictors])\n",
-       "        return mode(predictor(example) for predictor in predictors)\n",
-       "\n",
-       "    predictors = [DecisionTreeLearner(DataSet(examples=data_bagging(dataset), attrs=dataset.attrs,\n",
-       "                                              attr_names=dataset.attr_names, target=dataset.target,\n",
-       "                                              inputs=feature_bagging(dataset))) for _ in range(n)]\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(RandomForest)" ] @@ -2227,25 +952,9 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.091994Z", - "iopub.status.busy": "2026-06-27T12:55:40.091616Z", - "iopub.status.idle": "2026-06-27T12:55:40.150769Z", - "shell.execute_reply": "2026-06-27T12:55:40.148387Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'setosa', 'setosa', 'versicolor', 'setosa']\n", - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "\n", @@ -2368,25 +1077,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.155239Z", - "iopub.status.busy": "2026-06-27T12:55:40.154860Z", - "iopub.status.idle": "2026-06-27T12:55:40.174178Z", - "shell.execute_reply": "2026-06-27T12:55:40.172313Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.3333333333333333\n", - "0.10588235294117647\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dataset = iris\n", "\n", @@ -2417,24 +1110,9 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.177520Z", - "iopub.status.busy": "2026-06-27T12:55:40.177139Z", - "iopub.status.idle": "2026-06-27T12:55:40.185939Z", - "shell.execute_reply": "2026-06-27T12:55:40.184360Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def predict(example):\n", " def class_probability(targetval):\n", @@ -2456,159 +1134,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.191002Z", - "iopub.status.busy": "2026-06-27T12:55:40.189990Z", - "iopub.status.idle": "2026-06-27T12:55:40.214695Z", - "shell.execute_reply": "2026-06-27T12:55:40.207715Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def NaiveBayesDiscrete(dataset):\n",
-       "    """\n",
-       "    Just count how many times each value of each input attribute\n",
-       "    occurs, conditional on the target value. Count the different\n",
-       "    target values too.\n",
-       "    """\n",
-       "\n",
-       "    target_vals = dataset.values[dataset.target]\n",
-       "    target_dist = CountingProbDist(target_vals)\n",
-       "    attr_dists = {(gv, attr): CountingProbDist(dataset.values[attr]) for gv in target_vals for attr in dataset.inputs}\n",
-       "    for example in dataset.examples:\n",
-       "        target_val = example[dataset.target]\n",
-       "        target_dist.add(target_val)\n",
-       "        for attr in dataset.inputs:\n",
-       "            attr_dists[target_val, attr].add(example[attr])\n",
-       "\n",
-       "    def predict(example):\n",
-       "        """\n",
-       "        Predict the target value for example. Consider each possible value,\n",
-       "        and pick the most likely by looking at each attribute independently.\n",
-       "        """\n",
-       "\n",
-       "        def class_probability(target_val):\n",
-       "            return (target_dist[target_val] * product(attr_dists[target_val, attr][example[attr]]\n",
-       "                                                      for attr in dataset.inputs))\n",
-       "\n",
-       "        return max(target_vals, key=class_probability)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NaiveBayesDiscrete)" ] @@ -2624,25 +1152,9 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.219592Z", - "iopub.status.busy": "2026-06-27T12:55:40.218075Z", - "iopub.status.idle": "2026-06-27T12:55:40.243006Z", - "shell.execute_reply": "2026-06-27T12:55:40.239243Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5.006, 3.418, 1.464, 0.244]\n", - "[0.5161711470638634, 0.3137983233784114, 0.46991097723995795, 0.19775268000454405]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "means, deviations = dataset.find_means_and_deviations()\n", "\n", @@ -2667,24 +1179,9 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.247667Z", - "iopub.status.busy": "2026-06-27T12:55:40.247115Z", - "iopub.status.idle": "2026-06-27T12:55:40.267400Z", - "shell.execute_reply": "2026-06-27T12:55:40.264593Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "def predict(example):\n", " def class_probability(targetval):\n", @@ -2708,153 +1205,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.271469Z", - "iopub.status.busy": "2026-06-27T12:55:40.271088Z", - "iopub.status.idle": "2026-06-27T12:55:40.294897Z", - "shell.execute_reply": "2026-06-27T12:55:40.289892Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def NaiveBayesContinuous(dataset):\n",
-       "    """\n",
-       "    Count how many times each target value occurs.\n",
-       "    Also, find the means and deviations of input attribute values for each target value.\n",
-       "    """\n",
-       "    means, deviations = dataset.find_means_and_deviations()\n",
-       "\n",
-       "    target_vals = dataset.values[dataset.target]\n",
-       "    target_dist = CountingProbDist(target_vals)\n",
-       "\n",
-       "    def predict(example):\n",
-       "        """Predict the target value for example. Consider each possible value,\n",
-       "        and pick the most likely by looking at each attribute independently."""\n",
-       "\n",
-       "        def class_probability(target_val):\n",
-       "            prob = target_dist[target_val]\n",
-       "            for attr in dataset.inputs:\n",
-       "                prob *= gaussian(means[target_val][attr], deviations[target_val][attr], example[attr])\n",
-       "            return prob\n",
-       "\n",
-       "        return max(target_vals, key=class_probability)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NaiveBayesContinuous)" ] @@ -2874,151 +1227,9 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.303006Z", - "iopub.status.busy": "2026-06-27T12:55:40.302569Z", - "iopub.status.idle": "2026-06-27T12:55:40.334054Z", - "shell.execute_reply": "2026-06-27T12:55:40.330606Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def NaiveBayesSimple(distribution):\n",
-       "    """\n",
-       "    A simple naive bayes classifier that takes as input a dictionary of\n",
-       "    CountingProbDist objects and classifies items according to these distributions.\n",
-       "    The input dictionary is in the following form:\n",
-       "        (ClassName, ClassProb): CountingProbDist\n",
-       "    """\n",
-       "    target_dist = {c_name: prob for c_name, prob in distribution.keys()}\n",
-       "    attr_dists = {c_name: count_prob for (c_name, _), count_prob in distribution.items()}\n",
-       "\n",
-       "    def predict(example):\n",
-       "        """Predict the target value for example. Calculate probabilities for each\n",
-       "        class and pick the max."""\n",
-       "\n",
-       "        def class_probability(target_val):\n",
-       "            attr_dist = attr_dists[target_val]\n",
-       "            return target_dist[target_val] * product(attr_dist[a] for a in example)\n",
-       "\n",
-       "        return max(target_dist.keys(), key=class_probability)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NaiveBayesSimple)" ] @@ -3041,32 +1252,9 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.340479Z", - "iopub.status.busy": "2026-06-27T12:55:40.340015Z", - "iopub.status.idle": "2026-06-27T12:55:40.356698Z", - "shell.execute_reply": "2026-06-27T12:55:40.354533Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Discrete Classifier\n", - "setosa\n", - "setosa\n", - "setosa\n", - "\n", - "Continuous Classifier\n", - "setosa\n", - "versicolor\n", - "virginica\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "nBD = NaiveBayesLearner(iris, continuous=False)\n", "print(\"Discrete Classifier\")\n", @@ -3095,16 +1283,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.362294Z", - "iopub.status.busy": "2026-06-27T12:55:40.361867Z", - "iopub.status.idle": "2026-06-27T12:55:40.373281Z", - "shell.execute_reply": "2026-06-27T12:55:40.369872Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "bag1 = 'a'*50 + 'b'*30 + 'c'*15\n", @@ -3124,16 +1304,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.377137Z", - "iopub.status.busy": "2026-06-27T12:55:40.376766Z", - "iopub.status.idle": "2026-06-27T12:55:40.385188Z", - "shell.execute_reply": "2026-06-27T12:55:40.383567Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "dist = {('First', 0.5): dist1, ('Second', 0.3): dist2, ('Third', 0.2): dist3}\n", @@ -3149,26 +1321,9 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.390374Z", - "iopub.status.busy": "2026-06-27T12:55:40.389930Z", - "iopub.status.idle": "2026-06-27T12:55:40.409484Z", - "shell.execute_reply": "2026-06-27T12:55:40.406624Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First\n", - "Second\n", - "Third\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(nBS('aab')) # We can handle strings\n", "print(nBS(['b', 'b'])) # And lists!\n", @@ -3219,150 +1374,9 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.419072Z", - "iopub.status.busy": "2026-06-27T12:55:40.418702Z", - "iopub.status.idle": "2026-06-27T12:55:40.442352Z", - "shell.execute_reply": "2026-06-27T12:55:40.439149Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def PerceptronLearner(dataset, learning_rate=0.01, epochs=100):\n",
-       "    """Logistic Regression, NO hidden layer"""\n",
-       "    i_units = len(dataset.inputs)\n",
-       "    o_units = len(dataset.values[dataset.target])\n",
-       "    hidden_layer_sizes = []\n",
-       "    raw_net = network(i_units, hidden_layer_sizes, o_units)\n",
-       "    learned_net = BackPropagationLearner(dataset, raw_net, learning_rate, epochs)\n",
-       "\n",
-       "    def predict(example):\n",
-       "        o_nodes = learned_net[1]\n",
-       "\n",
-       "        # forward pass\n",
-       "        for node in o_nodes:\n",
-       "            in_val = dot_product(example, node.weights)\n",
-       "            node.value = node.activation(in_val)\n",
-       "\n",
-       "        # hypothesis\n",
-       "        return find_max_node(o_nodes)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PerceptronLearner)" ] @@ -3387,24 +1401,9 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:40.450973Z", - "iopub.status.busy": "2026-06-27T12:55:40.450588Z", - "iopub.status.idle": "2026-06-27T12:55:41.306361Z", - "shell.execute_reply": "2026-06-27T12:55:41.305276Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "iris.classes_to_numbers()\n", @@ -3440,168 +1439,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.321375Z", - "iopub.status.busy": "2026-06-27T12:55:41.320949Z", - "iopub.status.idle": "2026-06-27T12:55:41.367655Z", - "shell.execute_reply": "2026-06-27T12:55:41.366214Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def LinearLearner(dataset, learning_rate=0.01, epochs=100):\n",
-       "    """\n",
-       "    [Section 18.6.3]\n",
-       "    Linear classifier with hard threshold.\n",
-       "    """\n",
-       "    idx_i = dataset.inputs\n",
-       "    idx_t = dataset.target\n",
-       "    examples = dataset.examples\n",
-       "    num_examples = len(examples)\n",
-       "\n",
-       "    # X transpose: the actual value of each input feature across the examples\n",
-       "    X_col = [[example[i] for example in examples] for i in idx_i]  # vertical columns of X\n",
-       "\n",
-       "    # add dummy\n",
-       "    ones = [1 for _ in range(len(examples))]\n",
-       "    X_col = [ones] + X_col\n",
-       "\n",
-       "    # initialize random weights\n",
-       "    num_weights = len(idx_i) + 1\n",
-       "    w = random_weights(min_value=-0.5, max_value=0.5, num_weights=num_weights)\n",
-       "\n",
-       "    for epoch in range(epochs):\n",
-       "        err = []\n",
-       "        # pass over all examples\n",
-       "        for example in examples:\n",
-       "            x = [1] + [example[i] for i in idx_i]\n",
-       "            y = np.dot(w, x)\n",
-       "            t = example[idx_t]\n",
-       "            err.append(t - y)\n",
-       "\n",
-       "        # update weights\n",
-       "        for i in range(len(w)):\n",
-       "            w[i] = w[i] + learning_rate * (np.dot(err, X_col[i]) / num_examples)\n",
-       "\n",
-       "    def predict(example):\n",
-       "        x = [1] + [example[i] for i in idx_i]\n",
-       "        return np.dot(w, x)\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(LinearLearner)" ] @@ -3619,24 +1459,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.377922Z", - "iopub.status.busy": "2026-06-27T12:55:41.377459Z", - "iopub.status.idle": "2026-06-27T12:55:41.536451Z", - "shell.execute_reply": "2026-06-27T12:55:41.534600Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-0.30907513960973826\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "iris.classes_to_numbers()\n", @@ -3675,141 +1500,9 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.546856Z", - "iopub.status.busy": "2026-06-27T12:55:41.546508Z", - "iopub.status.idle": "2026-06-27T12:55:41.557297Z", - "shell.execute_reply": "2026-06-27T12:55:41.556249Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def EnsembleLearner(learners):\n",
-       "    """Given a list of learning algorithms, have them vote."""\n",
-       "\n",
-       "    def train(dataset):\n",
-       "        predictors = [learner(dataset) for learner in learners]\n",
-       "\n",
-       "        def predict(example):\n",
-       "            return mode(predictor(example) for predictor in predictors)\n",
-       "\n",
-       "        return predict\n",
-       "\n",
-       "    return train\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(EnsembleLearner)" ] @@ -3832,16 +1525,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.564293Z", - "iopub.status.busy": "2026-06-27T12:55:41.563983Z", - "iopub.status.idle": "2026-06-27T12:55:41.579172Z", - "shell.execute_reply": "2026-06-27T12:55:41.578229Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "iris = DataSet(name=\"iris\")" @@ -3858,25 +1543,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.582307Z", - "iopub.status.busy": "2026-06-27T12:55:41.581993Z", - "iopub.status.idle": "2026-06-27T12:55:41.605886Z", - "shell.execute_reply": "2026-06-27T12:55:41.605011Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for Discrete: 0.033333333333333326\n", - "Error ratio for Continuous: 0.040000000000000036\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "nBD = NaiveBayesLearner(iris, continuous=False)\n", "print(\"Error ratio for Discrete:\", err_ratio(nBD, iris))\n", @@ -3903,45 +1572,9 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:41.609363Z", - "iopub.status.busy": "2026-06-27T12:55:41.609062Z", - "iopub.status.idle": "2026-06-27T12:55:43.664768Z", - "shell.execute_reply": "2026-06-27T12:55:43.663781Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for k=1: 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for k=3: 0.06000000000000005\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for k=5: 0.1266666666666667\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for k=7: 0.19999999999999996\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "kNN_1 = NearestNeighborLearner(iris, k=1)\n", "kNN_3 = NearestNeighborLearner(iris, k=3)\n", @@ -3974,24 +1607,9 @@ }, { "cell_type": "code", - "execution_count": 53, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:43.672457Z", - "iopub.status.busy": "2026-06-27T12:55:43.672020Z", - "iopub.status.idle": "2026-06-27T12:55:44.372046Z", - "shell.execute_reply": "2026-06-27T12:55:44.370195Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for Perceptron: 0.31333333333333335\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\")\n", "iris2.classes_to_numbers()\n", @@ -4039,149 +1657,9 @@ }, { "cell_type": "code", - "execution_count": 54, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:44.385682Z", - "iopub.status.busy": "2026-06-27T12:55:44.375524Z", - "iopub.status.idle": "2026-06-27T12:55:44.424855Z", - "shell.execute_reply": "2026-06-27T12:55:44.419458Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def ada_boost(dataset, L, K):\n",
-       "    """[Figure 18.34]"""\n",
-       "\n",
-       "    examples, target = dataset.examples, dataset.target\n",
-       "    n = len(examples)\n",
-       "    eps = 1 / (2 * n)\n",
-       "    w = [1 / n] * n\n",
-       "    h, z = [], []\n",
-       "    for k in range(K):\n",
-       "        h_k = L(dataset, w)\n",
-       "        h.append(h_k)\n",
-       "        error = sum(weight for example, weight in zip(examples, w) if example[target] != h_k(example))\n",
-       "        # avoid divide-by-0 from either 0% or 100% error rates\n",
-       "        error = np.clip(error, eps, 1 - eps)\n",
-       "        for j, example in enumerate(examples):\n",
-       "            if example[target] == h_k(example):\n",
-       "                w[j] *= error / (1 - error)\n",
-       "        w = normalize(w)\n",
-       "        z.append(np.log((1 - error) / error))\n",
-       "    return weighted_majority(h, z)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(ada_boost)" ] @@ -4198,141 +1676,9 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:44.430078Z", - "iopub.status.busy": "2026-06-27T12:55:44.429620Z", - "iopub.status.idle": "2026-06-27T12:55:44.445203Z", - "shell.execute_reply": "2026-06-27T12:55:44.442762Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def WeightedLearner(unweighted_learner):\n",
-       "    """\n",
-       "    [Page 749 footnote 14]\n",
-       "    Given a learner that takes just an unweighted dataset, return\n",
-       "    one that takes also a weight for each example.\n",
-       "    """\n",
-       "\n",
-       "    def train(dataset, weights):\n",
-       "        return unweighted_learner(replicated_dataset(dataset, weights))\n",
-       "\n",
-       "    return train\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(WeightedLearner)" ] @@ -4355,16 +1701,8 @@ }, { "cell_type": "code", - "execution_count": 56, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T12:55:44.450641Z", - "iopub.status.busy": "2026-06-27T12:55:44.450204Z", - "iopub.status.idle": "2026-06-27T12:55:44.458768Z", - "shell.execute_reply": "2026-06-27T12:55:44.456309Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "WeightedPerceptron = WeightedLearner(PerceptronLearner)" @@ -4372,27 +1710,9 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:44.461594Z", - "iopub.status.busy": "2026-06-27T12:55:44.461302Z", - "iopub.status.idle": "2026-06-27T12:55:49.889365Z", - "shell.execute_reply": "2026-06-27T12:55:49.885324Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "iris2 = DataSet(name=\"iris\")\n", "iris2.classes_to_numbers()\n", @@ -4411,33 +1731,16 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:49.903548Z", - "iopub.status.busy": "2026-06-27T12:55:49.902992Z", - "iopub.status.idle": "2026-06-27T12:55:50.020946Z", - "shell.execute_reply": "2026-06-27T12:55:50.003020Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for adaboost: 0.013333333333333308\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Error ratio for adaboost: \", err_ratio(adaboost, iris2))" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "It reduced the error rate considerably. Unlike the `PerceptronLearner`, `AdaBoost` was able to learn the complexity in the iris dataset." ] @@ -4460,160 +1763,9 @@ }, { "cell_type": "code", - "execution_count": 59, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:50.031572Z", - "iopub.status.busy": "2026-06-27T12:55:50.031065Z", - "iopub.status.idle": "2026-06-27T12:55:50.107129Z", - "shell.execute_reply": "2026-06-27T12:55:50.100632Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def cross_validation(learner, dataset, size=None, k=10, trials=1):\n",
-       "    """\n",
-       "    Do k-fold cross_validate and return their mean.\n",
-       "    That is, keep out 1/k of the examples for testing on each of k runs.\n",
-       "    Shuffle the examples first; if trials > 1, average over several shuffles.\n",
-       "    Returns Training error, Validation error\n",
-       "    """\n",
-       "    k = k or len(dataset.examples)\n",
-       "    if trials > 1:\n",
-       "        trial_errT = 0\n",
-       "        trial_errV = 0\n",
-       "        for t in range(trials):\n",
-       "            errT, errV = cross_validation(learner, dataset, size, k, trials)\n",
-       "            trial_errT += errT\n",
-       "            trial_errV += errV\n",
-       "        return trial_errT / trials, trial_errV / trials\n",
-       "    else:\n",
-       "        fold_errT = 0\n",
-       "        fold_errV = 0\n",
-       "        n = len(dataset.examples)\n",
-       "        examples = dataset.examples\n",
-       "        random.shuffle(dataset.examples)\n",
-       "        for fold in range(k):\n",
-       "            train_data, val_data = train_test_split(dataset, fold * (n // k), (fold + 1) * (n // k))\n",
-       "            dataset.examples = train_data\n",
-       "            h = learner(dataset, size)\n",
-       "            fold_errT += err_ratio(h, dataset, train_data)\n",
-       "            fold_errV += err_ratio(h, dataset, val_data)\n",
-       "            # reverting back to original once test is completed\n",
-       "            dataset.examples = examples\n",
-       "        return fold_errT / k, fold_errV / k\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(cross_validation)" ] @@ -4627,25 +1779,9 @@ }, { "cell_type": "code", - "execution_count": 60, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T12:55:50.115975Z", - "iopub.status.busy": "2026-06-27T12:55:50.115463Z", - "iopub.status.idle": "2026-06-27T12:55:54.607343Z", - "shell.execute_reply": "2026-06-27T12:55:54.601766Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "training error: 0.090\n", - "validation error: 0.287\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# cross-validate a k-NN learner on the iris dataset.\n", "# cross_validation calls learner(dataset, size), so we let `size` be the\n", diff --git a/notebooks/learning_apps.ipynb b/notebooks/learning_apps.ipynb index 202db28d3..2a4f0da78 100644 --- a/notebooks/learning_apps.ipynb +++ b/notebooks/learning_apps.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -89,20 +89,9 @@ }, { "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training images size: (60000, 784)\n", - "Training labels size: (60000,)\n", - "Testing images size: (10000, 784)\n", - "Testing labels size: (10000,)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Training images size:\", train_img.shape)\n", "print(\"Training labels size:\", train_lbl.shape)\n", @@ -121,20 +110,9 @@ }, { "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAKoCAYAAABUXzFLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xm8VdP/x/FXpEHznJCxpEimkCTSIBrM85RExkJFQoPoR5lJKFNKlHnKlCFjMiTzlClSac6Uzu8P38/a69x77nXvueeevc8+7+fj4dG29hlWqzPt9fmsz6qQSCQSiIiIiIiIxMQGYXdAREREREQkk3SRIyIiIiIisaKLHBERERERiRVd5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFY0UWOiIiIiIjEii5yREREREQkVnSR41m9ejUDBgygSZMmVKlShTZt2vDAAw+E3a3IW7VqFYMHD6ZLly40aNCAChUqMHz48LC7lRNeeukl+vTpQ4sWLahWrRqbbropvXr1Yu7cuWF3LdI++OADDjroIJo2bUrVqlWpW7cue+21F5MnTw67aznpzjvvpEKFClSvXj3srkTayy+/TIUKFVL+99Zbb4XdvZwwe/ZsunfvTp06dahatSrNmjVj1KhRYXcr0k4++eQiX3d67RXv/fffp3fv3jRp0oSNN96YFi1aMHLkSNauXRt21yLvnXfeoWvXrtSoUYPq1auz33778frrr4fdrVKpGHYHouTQQw9lzpw5jBkzhubNmzNlyhSOOeYY1q9fz7HHHht29yJr6dKl3H777ey000707t2bO++8M+wu5Yzx48ezdOlSzjvvPFq2bMnixYsZN24ce+65JzNnzmT//fcPu4uRtHz5cjbffHOOOeYYNt10U9asWcP999/PCSecwIIFCxg2bFjYXcwZP/30ExdeeCFNmjRhxYoVYXcnJ1x55ZXst99+SW077LBDSL3JHVOmTOGEE07gyCOP5N5776V69ep8/fXXLFy4MOyuRdqll17KGWecUai9R48eVK5cmd133z2EXkXfJ598Qrt27dhuu+24/vrrqV+/Pq+++iojR45k7ty5PPbYY2F3MbLmzJlDhw4daNu2Lffddx+JRIKrr76aTp06MWvWLPbaa6+wu1gyCUkkEonEU089lQASU6ZMSWrv3LlzokmTJol169aF1LPoW79+fWL9+vWJRCKRWLx4cQJIXH755eF2KkcsWrSoUNuqVasSjRo1SnTq1CmEHuW2PfbYI7H55puH3Y2ccvDBByd69OiROOmkkxLVqlULuzuRNmvWrASQeOihh8LuSs758ccfE9WqVUv0798/7K7Ewssvv5wAEsOGDQu7K5F1ySWXJIDEV199ldTer1+/BJD47bffQupZ9HXt2jXRqFGjxJo1a1zbypUrE/Xr10+0a9cuxJ6VjtLV/ueRRx6hevXqHHHEEUntp5xyCgsXLuTtt98OqWfRZyFzKb2GDRsWaqtevTotW7bkhx9+CKFHua1+/fpUrKgAdUlNnjyZV155hVtvvTXsrkjM3XnnnaxZs4YhQ4aE3ZVYmDhxIhUqVKBPnz5hdyWyNtpoIwBq1aqV1F67dm022GADKlWqFEa3csLrr79Ox44d2XjjjV1bjRo16NChA2+88QY///xziL0rOV3k/M/8+fPZfvvtC/1Aat26tTsvkg0rVqzgvffeo1WrVmF3JfLWr1/PunXrWLx4MbfeeiszZ87Uj6gS+vXXXxkwYABjxoxhs802C7s7OeWss86iYsWK1KxZk65duzJ79uywuxR5r776KnXr1uWzzz6jTZs2VKxYkYYNG3LGGWewcuXKsLuXU1asWMH06dPp1KkTW221VdjdiayTTjqJ2rVr079/f7755htWrVrFk08+yYQJEzjrrLOoVq1a2F2MrL/++ovKlSsXare2jz76KNtdSosucv5n6dKl1K1bt1C7tS1dujTbXZI8ddZZZ7FmzRouueSSsLsSeWeeeSYbbbQRDRs2ZODAgdx4442cfvrpYXcrJ5x55plst9129O/fP+yu5IxatWpx3nnnMWHCBGbNmsUNN9zADz/8QMeOHZk5c2bY3Yu0n376ibVr13LEEUdw1FFH8cILLzBo0CDuvfdeunfvTiKRCLuLOWPq1Kn8/vvvnHrqqWF3JdK23HJL3nzzTebPn88222xDzZo16dGjByeddBI33HBD2N2LtJYtW/LWW2+xfv1617Zu3TqX1ZQrv4mV1+EpLuVK6ViSDZdeein3338/N910E7vuumvY3Ym8oUOH0rdvX3799VeeeOIJzj77bNasWcOFF14YdtcibcaMGTzxxBO8//77+mwrhZ133pmdd97Z/f8+++zDIYccwo477sjgwYPp2rVriL2LtvXr1/PHH39w+eWXc9FFFwHQsWNHKlWqxIABA3jxxRc54IADQu5lbpg4cSL16tXjkEMOCbsrkbZgwQJ69OhBo0aNmD59Og0aNODtt9/miiuuYPXq1UycODHsLkbWOeecw6mnnsrZZ5/NJZdcwvr16xkxYgTfffcdABtskBsxktzoZRbUq1cv5ZXpb7/9BpAyyiOSSSNGjOCKK65g9OjRnH322WF3Jyc0bdqU3Xbbje7duzN+/Hj69evHxRdfzOLFi8PuWmStXr2as846i3POOYcmTZqwfPlyli9fzl9//QX8W7luzZo1Ifcyd9SuXZuDDz6YefPm8fvvv4fdnciqV68eQKELwQMPPBCA9957L+t9ykXz5s3j3Xff5fjjj0+ZTiSBiy66iJUrVzJz5kwOO+wwOnTowKBBg7j++uuZNGkSr7zySthdjKw+ffowZswY7rvvPjbbbDOaNm3KJ5984iYQN91005B7WDK6yPmfHXfckU8//ZR169YltVveocqDSnkaMWIEw4cPZ/jw4QwdOjTs7uSstm3bsm7dOr755puwuxJZS5YsYdGiRYwbN446deq4/6ZOncqaNWuoU6cOxx13XNjdzCmWaqWoWNFsfWtBNna5MjMcNos+9O3bN+SeRN8HH3xAy5YtC629sZLbWmtdvCFDhrBkyRI++ugjFixYwBtvvMGyZcuoVq1azmSa6FPlfw455BBWr17NjBkzktrvuecemjRpwh577BFSzyTuRo0axfDhwxk2bBiXX3552N3JabNmzWKDDTZg6623DrsrkdW4cWNmzZpV6L+uXbtSpUoVZs2axRVXXBF2N3PGsmXLePLJJ2nTpg1VqlQJuzuRddhhhwHwzDPPJLU//fTTAOy5555Z71Ou+fPPP5k8eTJt27bVxGsJNGnShI8//pjVq1cntb/55psAKrhSApUrV2aHHXZgiy224Pvvv2fatGmcdtppVK1aNeyulYjW5PzPgQceSOfOnenfvz8rV65k2223ZerUqTz77LNMnjyZDTfcMOwuRtozzzzDmjVrWLVqFfDvJlzTp08HoHv37kllCCUwbtw4LrvsMrp168ZBBx1UaOdqffGn1q9fP2rWrEnbtm1p1KgRS5Ys4aGHHmLatGkMGjSIBg0ahN3FyKpSpQodO3Ys1H733Xez4YYbpjwn/zr22GNdimT9+vX58ssvGTduHIsWLeLuu+8Ou3uR1qVLF3r06MHIkSNZv349e+65J++++y4jRozg4IMPpn379mF3MfIeffRRfvvtN0VxSmjAgAH07t2bzp07M3DgQOrXr89bb73FVVddRcuWLV2qpBQ2f/58ZsyYwW677UblypX58MMPGTNmDM2aNWPUqFFhd6/kQt6nJ1JWrVqVOPfccxONGzdOVKpUKdG6devE1KlTw+5WTthiiy0SQMr/vv3227C7F1n77rtvkeOmt2fRJk2alNhnn30S9evXT1SsWDFRu3btxL777pu47777wu5aztJmoP/tqquuSrRp0yZRq1atxIYbbpho0KBB4pBDDkm88847YXctJ6xduzYxZMiQxOabb56oWLFiomnTpomLL7448ccff4TdtZzQuXPnRLVq1RIrV64Muys546WXXkp06dIl0bhx40TVqlUTzZs3T1xwwQWJJUuWhN21SPv8888THTp0SNStWzdRqVKlxLbbbpsYNmxYYvXq1WF3rVQqJBKq2ygiIiIiIvGhNTkiIiIiIhIrusgREREREZFY0UWOiIiIiIjEii5yREREREQkVnSRIyIiIiIisaKLHBERERERiRVd5IiIiIiISKxUDLsDqVSoUCHsLkRCOlsYaez+pbFLn8YufaUdO43bv/SaS5/GLn0au/Rp7NKnsUtfacdOkRwREREREYkVXeSIiIiIiEis6CJHRERERERiRRc5IiIiIiISK5EsPCAiIiLxd91117njAQMGAHDEEUcAMH369FD6JCLxoEiOiIiIiIjESoVEOrXsyplK5f1LZQbTF5Wxa9CggTs+/vjjAdhuu+0A6NChgztnbdYHv/9XXnklAHfeeScA3333Xcb76YvK2OUilZBOj15z6cvVsdtzzz0BeO2111zbt99+C8Auu+wCwOrVq8u1D7k6dlGgsUufxi59KiEtIiIiIiJ5La8jObVq1QLgm2++cW21a9dOus3y5cvd8ZQpUwC4+OKLAc0yRVnYY2cRnKefftq12eyk9c1/voJtfv+tbfHixQB07NjRnfvss88y1ueCfSkNve7+pUhOevSaS1+ujt0TTzwBQLdu3VzbiSeeCMDUqVOz0odcHbso0NilT2OXPkVyREREREQkr+kiR0REREREYiUv09UsTe3BBx8EoFOnTiXqiw3VSy+9BECfPn3cuR9//DHj/cz1kGaNGjXcsaUmDBs2DIDZs2eX63Nnc+wGDhwIwN577+3aDj300EL9KJiK5j+fpaJZmltx93vvvffcud133z2tPhcnKq+7unXruuOjjjoKgJ49ewKwySabuHM77bQTELyfR4wY4c598sknGe9XcZSulp6ovOZ89erVA4L3pv0JMGPGjKQ/M8FST3/66adS3S+KY1ecAw88EIDHH38cgKVLl7pzjRs3zmpfcm3sjH23jh071rWddtppQPBZ+dBDD5VrH3Jh7A455BB3PHr0aKBwkR//3Oeffw7APffc487Za9J//5dVLoxdVCldTURERERE8lreRHKqVq3qjk8++WQAbrrpplL1peBQ3Xjjje548ODBAKxbt64s3UyS61f7FuGAYMbpo48+AmCfffZx51atWpXx587m2N12220A9O3bt9BjpYrIPPzwwwA8+uij7pyVUa1fvz4AQ4cOdedsNsoe6/fff3fnLJKTyQIEYbzuWrdu7Y6bNm0KJEdk2rRpU+LHWrFihTveYYcdAFi4cGGZ+ldSuRTJqVatGhBsuNi1a1d3zt6fr7/+elb6EsXPujp16gAwb948ADbddNNyfb4XX3wRgM6dO5fqflEcu+LY682i3f7r7vnnn89qX3Jt7PbYYw8Arr76agDat29f6Da2xYBFuCH3v2NLy74z7733Xte28cYbA6Uv/GOFfjKZfRLFsatcuTIQFNZK9XnXokULIDlDwrJzMhnpKo4iOSIiIiIiktfyJpIzatQod2yz5PZX//vvv905y2O1fGGbCQY47LDDANh+++0LPf6gQYMAuO666zLW5yhe7ZfGW2+95Y4t4mB/J38Gyr9dpmRz7Oy15UdfCkZtIJjxKEnUxWZMIJg1STUDNWHCBAD69++fVt9TyebYWfRr3Lhxrq169eoArF+/3rU999xzQPC+nDlzZqHHeuSRR4DkqNAxxxwDBOt1ylvUIzk2thCU6e3evXuh21kp3/vvvz8r/YryZ13Dhg2B5E14bdbTXo/FRQr9NTYrV64E4KuvvgJg2bJl7pxtSTB//vxS9S/KY2f8da8Wwf7zzz8BaNasmTvnj0c2RHnsLNLau3dv12bZIwW3uvD99ddfQBARh/KZZY/i2Nma1kWLFgHJf+9LL70UCL6TW7Zs6c7ZGpwtttii0P0aNWqU8X5Gcezs724b8paUfb5ZBLo8trXwKZIjIiIiIiJ5TRc5IiIiIiISKxXD7kB5s8VTVmwgFX8H+bfffjvpnC2ShGBxuIXb/WIGlqqUyXS1XOeX+Y2zq666qlCbpU75odu1a9eW+DH9+1l4NoKZpWVmqaKWqgNBWtB5553n2mbNmlXkY9iC0g020JzNf5kyZYo7Lpim5qemWYGQ0tp6662B4N8E4JdffgFgyZIlaT1mWCpVqgTAzTffDAQpagBPPvkkAP369QPg119/zXLvcoON4ZAhQ1ybpWFdeOGFQPZT1KKoSZMm7vjwww8HghTk5s2bu3OWsvT1118DwfvN98orrwDZWwgeJQWL9JxwwgnunKU8m1dffdUd2287S/G78sory7WfUXTssccm/b+9xgBuvfVWIPgst6IhECzjmDNnDgDbbLONOxeFz0X9KhARERERkViJfeGBadOmAcHsiP/46S7aPvfcc4HUURsrXHD00UeXvrMFRHFxWknYLO6XX37p2mym6o033gCSN84sD7k6dqnYAvziSl9uuOGGGXu+MMZus802c8el3VjXyqraa8uXj4UH/IiWlUG2WfPzzz/fnatYMTmQb6XQ/dvZ4vBUatasCQQlR/37+aX0jz/+eCCIbqYSxfervXYswrVmzRp3rlWrVgB8//335dqHkoji2BkbJz8yaBE9i1AsX748K31JJYyx8yOC++67LwDjx493bVtttVXS7efOneuO77jjDiDIOHn//fcLPb6V3vdL8JeHKL7uLJJjm/T6hX/834AAu+66qzt++umngeD9XB6bbPuiMnYWaYXg726FVrp06eLOvfDCC0X2xQpj2Hfstdde685ZhtM///yTsT6r8ICIiIiIiOQ1XeSIiIiIiEisxLLwQJUqVdyxpcH4IS5b2OynWZSGpXX06tXLtVnY2cLz+cz2PvHry1vKlS3YlZIrrvCAH47PZaVNUfMVLCrij1Mmw+S5wlLUIFj4mWon74L8ned32203AF5//fVCt7N0G1vg7O+sbo//+++/uzZ/b56osn2pbL8MSN4jDYK0O4hGmlou2H///Qu12S70YaaphWnnnXd2x8888wyQnP5j42Op9i+++KI7Z3vg2Hsu1fvZUubzkaXEfvrpp0DyHkP+3nMQpKgB1KtXD4AzzjijvLsYKf6Y1KhRA4Cff/4ZSJ3+bfzXnY35JZdcAsCYMWPcuS+++AKAiRMnZqjHpadIjoiIiIiIxEosIzl+BMEWJfts4WO6M0k2m5KqJOp2220HJO/w7M/ExJnNfI4cObLI2/jFCKRkCi449P8/18ryZoqVoQU44IADks5NnTrVHdsC1Hxg5fJtV3QIXiupFq2efvrpQLCYuaRsQarNJvuPbZ+p48aNc2333XdfqR4/DLZIO9WC48mTJwOKQqfDClHYdyYkF7goqG7dukAQjWzXrp07Z9s5+FHCXOQXErCojl8K2l5nfvGOgg4++OAiz33yySdl7WLOswwHW/gOQcloi0I0aNDAnRs9ejRQfHGUOLKS2RBsiWK/30qz5QXA2LFjAWjfvr1ra9myZVm7WGaK5IiIiIiISKzEMpLjb3iXyl133ZWR5/E3l7INkayU72mnnebO5Uskx3LvU+XgL1y4EICnnnoqq32Ksg4dOrjjgvnC/v8XtybH3zQ0n/ilLwtuiJevM+4WyfFneQu+Zq644gp3PGnSpBI/9oEHHuiOb7rppqTH9iPiPXr0AFKv5Ymy4jats3x92xQUgjL5VpbWj2bZmgjbQK/gBtP5wMpD25rYb7/91p376quvkm7rbx44c+ZMIPUml7aG1taLlXamOSpsA2SAefPmJf1ZUrVq1SrU9s0335StYzFy5513Asm/wyxyY59b/nrWVBt656tUZckL2nbbbd3x5ptvDgQbdtt6KAg+O8OkSI6IiIiIiMSKLnJERERERCRWYpmu5oe/U/n4448z8jwPPPCAOx4yZEjSc/vlWG0R5bJlyzLyvFHi75puJQRTLXK2XXBzfdFoWQwcOBCAiy66CEhe+Ggh9FSlflV4oHQs5SUfWDoQBJ9H/nvSWGlkPy2jJOW1LW3ylltucW2WnrBq1SoguchArqWpmcceewyAE0880bVZSVU/Va+gNWvWAMmFME444QQgSN2zBfMQLISO+/vWPussfTtVcQsrMuCn81nbSy+9BMCff/7pztm/g5Uwz9V0tbKw9J9TTz0VSP4usIXfEmwTctlll7m2ggUv/LSsfHwtlYaliB599NEAHHXUUe5c48aNAdhrr72A4HcgpP4uyjZFckREREREJFbCv8wqB/7sRqqogpUSLCubxQP45ZdfAGjWrBkANWvWdOeicDVbXnbZZRd3bDNtqRbI51vBAYvS2MZuEJTeTVVIoOCYpRpDa/NngV977bUM9Tg+Onfu7I7jvjGelYEG2GKLLYBg410IIqgWaS4pK+xgEQ57bP/x+/XrB8CDDz5Y2m5HzgsvvADArrvu6tosYlUc2zhvk002cW32mWjFaGxzZIDWrVsD0L17dwB+++23snQ7smwcbZF9quI7hx56KAAbbBDMtdpnpG0060cJJRjX2rVrA8kFMzJVUClODjnkEHdc8HvXMiogKLudbyWki+N/j1rRFft967Pf2JdeeikAvXr1cueKK4OeLYrkiIiIiIhIrMQyxFDcDHl5sQ0I995770LPa1e2VtYwTvzczIJGjRrljr/44otsdCdU/hobm4m0zWGhcFQxVR6wn9tf1P3853nmmWcAaNWqVRo9zl3+5oJWnnarrbYCkmd/jz32WCC5XKix6Ovzzz9fbv0sb2eccUahNr+kc2kjOMY2wPRLhRqLDsUhglOQX964YKnj4vil3K2UqpUyv/rqq925nj17AvD0008DsOeee6bf2YjxyxrbxtBW1thfBzt8+HAgyN23MYEgomb8zzp7XfslmOPCHzvblNFsueWW7tiig8bW+0KwJu+NN94odNsqVaok3c//TrGNy5cuXZpO1yOpW7duQBAZBPjhhx+AYF2T/11rpfVnz54NwOLFi7PSz7B99NFH7njlypVA8NmUKiPKxtAi/ABnn302kByRjZJo9kpERERERCRNusgREREREZFYiWW6WtRYWcw48gsPFDRx4sQs9iR8tiM3BGlqqdIlbZGjX97SWLnZ4goP+Ox5LPVj9OjRpe12TvKLfhxwwAFAkB7Zu3dvd85SYfyUGGMllN966y0gWAwOsHr16gz3uHzYwncI0jD8Xaa//vprIEhh8T3xxBNAkPp3wQUXuHPt27cHgteclaCG9FPg8s3nn38OJJdPtrLS/7XNQS7yU+8KpkcNGzbMHdtnlZUzt5RbX7t27YDk962lUObKe7MofjrarbfeCiSnVVlJ3lQKbjHgFzWytHj7/CsuVd//PIjC4vBMSzUGVga5fv36AMyYMcOds+9RKxRUXNn4OLFS2xCkqxVMl4QgRdn+TLVMwU/ZjRJFckREREREJFbyMpKz6aabAvDTTz9l7DH9zT8LimNpx4MPPhiAfffd17XZxm3nnHMOAD/++GP2OxYCW+R43nnnubZUpcsPP/xwIChT6Zflfeedd4q8X3GbgRp77vvuu8+1ff/99yX7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2iKON910U7n2oSSiOHYFtWjRwh1bOWkrxONH/K3NNob3PwfKY0PkXBg7n0UObZsMf5NzfwPybFAkR0RERERE8pouckREREREJFZiuU/Of7HFyLbjtb/zdao64Pnul19+ccevvvoqEOwnJJJNtj+TpXJAUEDA0kmnTZvmzv32229Z7F10+Xu1GEurylf+Xhjdu3cH4NZbb3VttqdQnTp1Ct3XCnfYHkv33nuvO2d7wmRrIa7Ey8KFCwGYPHkykFx4wAraSMn4BX0s5cqKEfhpgFa8xj4TyyNFLZfZnlaWMjdr1qwwu1MqiuSIiIiIiEis5GXhgVyRa4vTokRjlz6NXfqiWnjAZi2//PJL12ZRWSuFH+bspV5z6dPYpU9jlz6NXfpybexsu5VJkyYBQVEVKJ8S28VR4QEREREREclriuREWK5d7UeJxi59Grv0RTWSE3V6zaVPY5c+jV36NHbp09ilT5EcERERERHJa7rIERERERGRWNFFjoiIiIiIxIouckREREREJFYiWXhAREREREQkXYrkiIiIiIhIrOgiR0REREREYkUXOSIiIiIiEiu6yBERERERkVjRRY6IiIiIiMSKLnJERERERCRWdJEjIiIiIiKxooscERERERGJFV3kiIiIiIhIrOgiR0REREREYkUXOSIiIiIiEiu6yBERERERkVipGHYHUqlQoULYXYiERCJR6vto7P6lsUufxi59pR07jdu/9JpLn8YufRq79Gns0qexS19px06RHBERERERiRVd5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFYiWR1NREREclPDRs2BGDs2LGu7YgjjgBg9uzZAHTu3Dn7HRORnKJIjoiIiIiIxIoiOQVssMG/131XXHEFABdffLE7d/755wNw3XXXZb9jOchm3gAeeOABAJYvXw4kz8K999572e1Yhh144IEAHH300a7NatofdthhhW4/ffp0IPm1tXDhwvLsoohkUN++fQHYZJNNCp078cQTAahRowYAn332mTt39tlnAzB//vzy7mJOatCgAQDPPvssAG3atHHn5syZA8CYMWOy3zERyUmK5IiIiIiISKzoIkdERERERGJF6WoFdOrUCYAhQ4YAsH79enfu9NNPB+Cxxx4DYMGCBe6cfzspLJFIAFCrVi0AOnTo4M7larpaq1atABg/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z/bX4pj77rsPCNbk5EumQyb98ssvhdoK/u6z728IIj+p7pctiuSIiIiIiEis6CJHRERERERiJW/S1fzd5T/99FMA5syZAwSlff/Ll19+CQSL2dLdATvX+OU///nnHyAo+2n/D/lXurIkUhVosDS1Cy+80LVZ6N3S2/y0GXu9+WlqxnYBt3K3fmpMLqV8tG/f3h3vvffeAFx55ZUZe3wbux9//NG1WfpgvryP02EpWoMGDXJtV111FRAsEo+Tjz/+2B0/8MADAPTv3x8I3qMQjMu55577n4+5bt06dzx16tRCzxMXI0eOdMeWpnLAAQcAyWm7liZku67nW5pVaVnBGQhSgew7xF6b+chStf3v2IKL3/3y0nZ7u419jknZ2O++J554Agje1wAXXHABEKRZ+r8Xs0WRHBERERERiZUKiVRTzSEr740m7fE333xzAE499VR3zmZNrCTv999/787dcccdQPJscHlK55+mvMfuxhtvBODMM88EkheNpirgEJYojt1+++0HBJsD+guZa9euDQRRGyskEIYwxq5Nmzbu+IUXXgBKHmE11u8FCxa4tgkTJgDBgm8r411eSjt2UdhU14o6vPPOO67N31AVgg1sIZgRzWTkNorvV2Oz5f5i5oIbx/rfEwVLr9pGv1A+i52jPHZRlwtjZwvmIfh9Ym3+RrPZFvbYWfGPevXquTbb1mO77bYDYIMNgnl8i+AMGzYMCLfwQNhjVx6sWNJdd93l2uzvacUelixZUubnKe3YKZIjIiIiIiKxooscERERERGJlbxMV8sVcQxpZovGLn1hj52lrg0dOtS1WWEF4++SvnDhQiBII73nnnsy1pfSysV0NeMvcL733nuTzvXq1csdP/nkkxl/7rBfc7lMY5e+XBg7+3yDIE3y/PPPB+CGG27Ial98YY+dFQIZO3asa2vQoAEQ9M0vLmDHUdjnK+yxKw9WjMpfwtCvXz9A6WoiIiIiIiIZo0hOhMXxaj9bNHbp09ilL5cjOWHSay59Grv05cLYpYrkdOvWDYDnn38+q33x5cLYRVWcx84vqGTZFYrkiIiIiIiIZEjebAYqIiIikku+/fZbd1yjRg0Afv7557C6I1IsP/Lol/AOS/g9EBERERERySBd5IiIiIiISKyo8ECExXlxWnnT2KVPY5c+FR5Ij15z6dPYpU9jlz6NXfo0dulT4QEREREREclrkYzkiIiIiIiIpEuRHBERERERiRVd5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFY0UWOiIiIiIjEii5yREREREQkVnSRIyIiIiIisaKLHBERERERiRVd5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFYqRh2B1KpUKFC2F2IhEQiUer7aOz+pbFLn8YufaUdO43bv/SaS5/GLn0au/Rp7NKnsUtfacdOkRwREREREYkVXeSIiIiIiEis6CJHRERERERiRRc5IiIiIiISK7rIERERERGRWIlkdTURERGJr0022QSAli1burbNNtsMgLvuugtIrihlVZWmT58OwJlnnunOLVmypHw7KyI5SZEcERERERGJFUVyinDHHXcA0LdvX9e2cOFCALp27QrA/Pnzs9+xHLDBBv9eO7/55puurW3btgDssMMOAHz88cfZ71jI7O8+bNgwAI466ih3bvz48QBUrly50P223nprAF566SUgedbS7icikku6dOkCwKRJkwqds6hNqj0xGjVqBEDt2rVdmyI5IpKKIjkiIiIiIhIrusgREREREZFYqZBIFQ8Omb/YMCxvvfUWALvvvnuhc5a21qxZM9f2xx9/ZLwP6fzTRGHsOnfuDMCzzz5b6NzAgQMBuPHGG8u1D1EZu1NOOcUdT5gwAYANN9ywTI/p/90WL14MBGOeiRTKqIxdLirt2Gnc/qXXXPpyYewqVarkjq3gwPPPPw/ANttsU+j269atA+Cvv/5ybV9//TUAvXr1AuC7774rc79yYeyiKhfGbvjw4WV+jMsvvxyAl19+GYARI0a4c9ZWWrkwdlFV2rFTJEdERERERGIlrwsP2AJ5/wp5xx13BGCnnXYCYP369e6c3a5JkyYATJw40Z2zq/2vvvqqHHucG6pWrVrkuVWrVmWxJ+Gz1xiUPYJj/Ndrw4YNAXjnnXcAOOecc9w5//WZ6+zvbEU/jjzySHdur732AuD7778H4OSTT3bnfv755yz1MDr8WfNjjz0WCIpe2OcUwJo1a0r8mH5BjM8//xwIIpNXXXVV+p3NAePGjQPg/PPPd232mrOIf3H23HNPd2y3t9fv4YcfXuj2RxxxRKG2XJ/FveGGG9xxv379irzd6tWrAbjooosAFVaR/9axY0d3bJ9vflumn8d/7P322w9IP6ITJfb7xLJthg4d6s5ZkQ/7HPKjKdZmkVn/M23lypXl2OOSUSRHRERERERiJa8jOaeffjoAffr0cW02G2yzoWeffbY7ZzOfNrt09NFHu3NW3leRnOQZz4Is4pAv7r//fndsUYjDDjss489jM+2jR492bXPmzAFg3rx5GX++bKhTp447vu2224BgBtzP1bdS5bYu6dFHH3Xn9thjj3LvZ9Tceuut7vjUU08F4MMPPwTgl19+cefGjh1b4sf0y51vscUWQDDrHlebb745kPrzzF5zDz30UKFzFrmx++ezNm3aAEHkK5UpU6a44xdeeAGAe+65p3w7Vk7sfbLbbrsVeRs/OrV27VoAVqxY4dp+//33cupdvERhOblFdXI1krPpppu6Y3vPWXTKZ2P95ZdfAsnbg9jvmk6dOgFw9dVXu3NnnHFGhntceorkiIiIiIhIrOgiRyuHefkAACAASURBVEREREREYiUv09W6desGwJVXXgkkL5QvuFBq6tSp7nj58uVJ5+688053bCG6F198EYAFCxZkrsOSs/zS4ieddBIA5513Xqkew0LKF198MQC9e/cu8rYNGjRwxxZKz4V0NVsYD3DhhRcCQalYCErKplqQbO9ZC6Vvt9127pyNh5XajrOePXsCQbEBCF4zjz/+OBCk45aWv5jUSujfe++9aT1WrhgwYMB/3iZVkYCSsDS3H374wbVZepv/mMWl/kbZgw8+CARbMDRt2tSd++effwCYNm0aAOeee647t2zZsmx1sVzY1gj169cv8jb+v6kt2n799ddd27fffpt0+3fffdcdv/LKK0U+7hdffAHEO92tLCWhLaWsuDG02/gFWsqjiEHYKlb896e//1q0NDX7zXLNNde4c/b7NlVp9ypVqgDw8MMPA8kl4e157H5hUCRHRERERERiJW8iORtvvLE7HjlyJAA1a9YEkjettCt4m21PVQLPZjBPPPFE12ZXwWeddRYAgwYNyljfc4WNcXElpPOZzbCVdqbNyiDbgvriIjl//vmnO7ZSv1FUrVo1AC655BIgKAICQcEBv2iDFQDxF+gWpVatWu7YZpnywZgxYwD4+++/XZuNoR8xKA2LIvoLx222uiT/FrnGLxZQmihKqgIE06dPL9RmEY7i+OXRS3L7KLKNsi2CM3fuXHfOCqLYd2Wc2CLsm266ybXZe8gKdqTSrl27lMcAxx13nDtOVcLXWHlyK4JkWSWQuwvj01XWkut+9Ka4SE6ujqsVR0kVrb7sssuAoHT+f7HIjxW3GTx4cKHnmT17dvqdLSNFckREREREJFZ0kSMiIiIiIrGSN+lq/t4Zu+66KxCEzf19Syz0dsIJJ/znY/oLfD/77DMg2JfD3+l+/fr16XY7p3Tv3h1IvUeAjfWPP/6Y1T7FgS3Kv+WWW/7ztv4O7DNnziy3PpXVzTffDATFGGzRIgQpVo888kiJHqtly5ZAkBbi3y/uBQf8vbq23357IHlvgnTT1Izts+MvpI5yGmRZ2WL4VPy9gsozjSxXU9T8ggn+/huQXKTn9ttvz1qfsu2DDz4AoEuXLq7Ndou3IihWjAGgQ4cOAOy9996ubauttkrruS01yP4cMmSIO/fJJ58AQQql/12S68UeUrF0vhEjRri2khQtsNQ0v/BAcXI1Xc3fm8pYcRr7bi6p1q1bA8kp58b2rlO6moiIiIiISIbEPpKz7777ArDPPvu4NisFbeVo/TK/pfHrr7+641mzZgHBAt18ieTYAnKACy64oMjbWSQnjouVy4M/szd06FAgeawLstewv9twlL399ttAMHtU0qhNKsOGDQOCghdWNhmgbt26Sbf1CzMsXbo07ecMmxX5sMINPvssygQrHW1lfyH9MtRRZov9/QILxooK5GqEJVssggBB9GLy5MlA8RGy4vgRRHt/r1q1Cii8pUOU+MVl7NgKyPgl/SdOnAgUXyylf//+7tje96kKD5x88slAMGZWvhdgxx13TPrT38bAiiRYQaYo86Mx9tuuuMIAfkTGji364kd5ShPB8e+XS/zfFP5WE8aKEPjfkSXRqlUrIPk1bJ555plSPVZ5UCRHRERERERipUIi1ZRAyMpa/q9hw4bu2MooWt4+BLmDfp5wWc2YMQMIyvv6kaM33ngjrcdM55+mrGNXWv7snb+hGSTPtNkMqW1YVt5yYexSsfH0N7u0nNdU1q5dC8A555wDwN13313mPuTC2PlltC2/2GZ6/ddY8+bNk+7nRxJt5spKwmci4lrasUt33KzUsR9V+eabb4BgzSGUfbbbol221gCgU6dOZXrMVMJ4zfmfXRal8UtIl4ZfQtoi2mVdD1VSYb9fbcz8tTb2GvS/i0vCZoPt/X3mmWe6c7bW09Ya9uvXz51Ld61n2GNXnvwIx4EHHggEEZxKlSoVur2ffVISURk7P3Jdnht3WgTItgspizDGzt/Q2SKrzz33nGvr0aMHUPqNO//v//4PCDbx/uqrr9w5W3+WaiuWdJV27BTJERERERGRWNFFjoiIiIiIxEosCw/4IXJLU7NUDshsmlpRrJQ0pJ+ulguK28XZ/3tnK00tVx1zzDFAkKZWo0aNIm87f/58d3z99dcDmUlTywUbbbQRAGPGjHFtlqZmpVBtYTLANddcAwTpLP4u9nfddRcQLI5ctGhReXU7K2677TYgMwuyLZ3FUlhsN2ufFcKwRfsQlBH2ywmvWbOmzP0pD34f001TS/VYdmwlp+NYsMBPd7L3kZ/G4+96/l/8tLNu3boB0KtXryJv37VrVyBYRA/amiAVv7yxHbdp0waAAw44IIQelQ//dWeFCUpSlKAszxMX/tYqJUlT22WXXQAYOHCga7My0cbKlUNm09TSpUiOiIiIiIjESqwiOTbraCV3faNHjy7X57aFp/6C6Hxw/PHHh92FnGMlPm+88UbXZhupFhfBsdk4i/pAchnzfGAb5W233Xau7emnnwaCRbX+wseC/Fmm559/Pukxcz2Skyraki6bUbdSwL/88os7ZyVnbTGzvyD2uOOOA6IbvfFZFBSCkuZ+BN7arLiDv9GuH70CGDt2rDu2qJAt7vU3xrzuuusy0vew+eWJU81w23urOBbxGjdunGuzEslSdpUrV3bHFvm2mXjfd999l7U+lbeCG376/1/SDT4hOQoWxwiO8SOmVjjEfkf7kdJLL70UCL4XCpY5jzJFckREREREJFZiFcmxcpOWCw3BxkbPPvtsuT53wVng0047zR3HZfautCZNmhR2FyKlXr16AEydOhWA/fffv0T3sxKZxx57LJB/0RufzTrutNNOrs3We5VkU9/tt9++UJu/xilXpIqgvvTSS2V6zA033NAdW3TLWJlQCNY8WXTcXs+QWxuF+iWe7bik62cK3s7/f1uLaGXzr732Wndu+vTphZ47X1nURtGb8jFhwgR3fMIJJySd89co2yx9nJRmc09fJstER827777rjr/99lsgWN8GwVYMm222GZD8fWBRHfv8st8iUPrS49kW7d6JiIiIiIiUki5yREREREQkVmKVrmblZX22GNlfOFse/LAfBDuFx1WLFi0AaN++faFztmDX3003X1kJcwgKDZQkFO4vfCxJmlrjxo2B8n+dh83ST+fNm5fW/f3Sl6tXrwZg/fr1Ze9YBNgu835awj///POf97OF8SNGjHBtp556atJtHnjgAXdsJfhffPHF9DsbAvu3t3QMv/BAJtPHrEz5m2++WeicpbDlW7qaXybayhjb94Rv4cKFQPBv5b9f99xzz/LsYmz0798fgBNPPNG12S7xlu7rp6j57+1c5JeJtvS0TJaOjosFCxa4Y/v3nzx5smsrWEzFt3btWiBI9456ipovd3oqIiIiIiJSArGK5Fhp3a+//tq1ZWuWolmzZkn///DDD2flecOy++67A1CzZs1C56zUai6Ukc2kunXrumNbbOxvElhc2UUbK5uJuv/++905i+DYDPSWW27pzp1zzjkA7LDDDkDyInpbiH/SSSeV8m8SP1aau06dOq7NFubaLFUusRm4K6+80rXZ+84v32vRKiurve222xZ6LHs93XHHHa7toIMOAoINP/2Z3+JKdEeZXwAAkjeQzGRxGL/UdL6yEu8Wtb7qqqvcOcu4sLL5H3zwgTtnC+Rts1F7/frs89Df9Ddf+WWi7fPMj+CYjz/+GICePXsCybP6ucrKQ5e2uEBxLALkR4L8rIq4eOKJJ4Dk8u2W9eSXhzdWHMSyBT777DN3rk+fPgAceuihABx22GHuXK1atQBYsWJFxvpeWorkiIiIiIhIrMQqkmObLPqzP+U523PyySe74x49egDBjPxtt91Wbs8bBYccckiR5+IexSrIZsJPOeUU11awZGcqy5Ytc8e2PuCRRx4Bktfy2GzLvvvuCyRvLliQrZUC+Ouvv4DkGfrZs2f/Z7/iyN6rtrkl5HZpd1u7YJ95AIMGDQKCKIzPIs32moBgdt0iP/5sW+fOnQHo0KEDEKyFymW2YbNFV8urtLNtBprPSpJBYesHbdNUCEqjDxkypNDtLYJz+umnA/n7WQZQtWpVINiYF4LvHFt/Y9EbgNatW2exd+Un1fqbkrI1h/Y9Wty6nbhHcuw38uDBg13bjBkzgCDCmirqb7/t7HcKBGtae/fuDSRvP2DZVWH+HlYkR0REREREYkUXOSIiIiIiEiuxSlfLliZNmgBw6623ujbbHfbqq68G4Pfff89+xyQUtggvVQnz4tiuwxCE0v0yvunwyyHb4tJ8TuswVor2yy+/dG25XObdSkP7f4eLLroo6c+ysIWplpbaqFEjdy5Xyx9bSWe/GIixlNDiyqgWx09R89OvpGhWvMb+/C+WDvzss8+WW59yRfPmzYHkFGljqZepUv5yXWlLQ/vbNRRMO7O0PvmXlXRPVdo9XZtssknGHitdiuSIiIiIiEisKJJTCnZV+tRTTwHJ5RsnTZoEwNixY7PfsSyyhe3dunUrdM5Kp77zzjtZ7VOu2mWXXdK6n19Mw19IDsmzyFZeOp9tvfXWQBCJsEXLEJTYlsJyOcpVFCs0YZEc25jTb/NLql5wwQVFPpZtTGn386NDBQsPWMEDgAcffDCtvuerL774wh2/8cYbIfYkGqyE77Bhw4q8zciRI4F4lIlOl0Vw4lg0QEpHkRwREREREYmVWEZybCMxCEotlnaNjK27sU33ANq3bw8E62/8DZFshthfExFHe++9N5AcxTK77bYbEEQotCle6dlaC3+Dyp9++gkINnt7+umn3blc3ZgxW2wTS4t42VoTKd73338PBON29NFHu3PvvvtuKH3KlKOOOgqA119/3bVZ9OX88893bXZskRjbjBeSo0BFsfsVFxHKVX///bc7tuixjWsmzJ07F0hec7Jy5cqMPX6usvehberp69SpEwCffvppVvuUTbYBKBRfQnrWrFlA6jU5pV3XIyXz3nvvFWqzsuaZ3LC1tBTJERERERGRWNFFjoiIiIiIxEqs0tUsFeXss892bS+88AIAZ511lmv74IMPgKCQgL8bsC1Qth3oa9WqVeh5bAHkaaed5trinqZmDjjggCLPWenBOXPmZKs7kWDpY7169SrR7S3Vwy9haaWNR48eDagMbVlcdtll7vikk04CgrLKK1asCKVPucbS1aw4g6X9xoGVwL7wwgtdmxWMKVg0AFKXnC7qMSEocGB/xpGfrnbuuecCcMcdd7i222+/HQgKf/hjYWW658+fD8A111xT6PEtRdcvPCBBqlWFChUAePTRR925fFtkX5L0M0tbS/expeReffVVILloTbVq1cLqjqNIjoiIiIiIxEqFRAR3RLJZitKqV68ekHz13qpVKwCWLVvm2uxKs3r16gA0bty4RI9/1113AUFU6M8//0yrnyWVzj9NumNXUhb9evHFF4FgDAH2339/IBqL4cMYu8GDB7vjdu3aAbDpppu6Npt1u+2224DolumN4uuuJLbccksAPvroI9f2/vvvA0HJc7+gQ3ko7dhFYdyK89xzzwHJi+5tMe+iRYsy9jxhv+YsguOXkDYWyfFLQVvkxtrCLLIS9tjlslwYu4MOOsgdW7aKFVKyYgOQ/ddgVMbO/71X1qIC2So9HZWxKw9+YSQree5vJl1WpR07RXJERERERCRWdJEjIiIiIiKxEqt0tbiJc0izvGns0pdrY2e7zz/11FMA1K1b153baqutgOzt/h23dLWGDRsCQdofwPTp0wG44YYbAFi4cKE7Z4UKSivXXnNRorFLXy6MnZ+GtsceewDBnkH+uf79+wPwzTffZKVfURw7S1ezP4vbn8VPSRsxYkShtvIUxbHLlEmTJrljS7VUupqIiIiIiEiGxKqEtIjEW4sWLYCgDC0EO9PbDM+hhx7qzn333XdZ7F38/Prrr0ByeXRbbL/jjjsC0Lt3b3cu3UiOiKQ2fvx4d9y2bVsgKPjjf779/PPP2e1YBFkkxv4cPnx4aH3JVxbhB/h/9u480Krp///4MxEiQ0plKqQy9WlCkimRKaESJVPITMjQJJQxTWYyRCiRKZIhGaK+SMgsJBSSMZHS7w+/99pr33vu6Zx9z7jP6/FP217nnrPuss85d6/3e71X7dq189iT/yiSIyIiIiIisaI1OQUsznmb2aaxi05jF13c1uTkiq656DR20RXb2FkE2yKstjE5wPLly3Pal2Ibu0KisYtOa3JERERERKSk6SZHRERERERiRelqBUwhzeg0dtFp7KJTulo0uuai09hFp7GLTmMXncYuOqWriYiIiIhISSvISI6IiIiIiEhUiuSIiIiIiEis6CZHRERERERiRTc5IiIiIiISK7rJERERERGRWNFNjoiIiIiIxIpuckREREREJFZ0kyMiIiIiIrGimxwREREREYkV3eSIiIiIiEis6CZHRERERERiRTc5IiIiIiISK7rJERERERGRWFkz3x1IpEqVKvnuQkFYtWpV2j+jsfuPxi46jV106Y6dxu0/uuai09hFp7GLTmMXncYuunTHTpEcERERERGJFd3kiIiIiIhIrOgmR0REREREYkU3OSIiIiIiEisFWXhAREREStMtt9wCwGmnnebO9e3bF4AbbrghL30SkeKjSI6IiIiIiMSKIjnA3nvv7Y4vv/zy0L++xx9/HIDDDjsMgJdffjkHvZNituWWW7rjM844A4D1118fgKZNm7q2N998E4A777wTgPnz57u2v/76K+v9FBHJty5dugBBBOeHH35wbY8++mhe+iQixUuRHBERERERiZUqq6LsSpRlud706IUXXnDH++67L5B8wyHLDR4xYkRW+6UNo6LL99g1aNAAgLffftud23jjjVP++VmzZrnjU045BYC5c+dmpnOrkY+xO+aYY9yxH/0qy/LxV65cWanXyxZtBhpNvt+vxazYx659+/bu+LHHHgPgl19+AaBJkyaubenSpRl/7WIfu3zS2EWnsYtOm4GKiIiIiEhJ002OiIiIiIjEigoPAL///ntaj589e3aWelJ8atSo4Y6nTp0KQOvWrQG45pprXFu/fv1y27E8s+IC6aSo+XbbbTd3bON6wQUXADB+/PhK9i4/xo4d644PPvjgUNuGG27ojtdcs+KPJUsV9X366acAjBkzplybpbXdd9996XVWJKK6desCUL16dQDWXXdd12app4lssskmAPTo0cOdO+mkkwC49957M93NgtGnTx93bGM2aNAgIDspaiIAG220kTtu27YtEBS+6Nq1q2uz9++CBQsAuOeee1zb4MGDs91NqSRFckREREREJFZUeAA45JBD3PGTTz4JJF/c9NBDDwHQs2fPrParGBan2cwHwIQJE0JtK1ascMeHHnooAM8//3xO+pXvsdtpp50AeO+998q1vfjiiwDMnDnTnfvxxx+BYKZ3m222cW02k7Ro0SIgHAWZM2dOxvpssjV2/vPm6mPHXmfy5MkAHHXUUa7t77//ztrrpSpX79datWoBMGXKFHeuRYsWQBApLBtd8/n97NatGwCdOnUCwkUjosr3+zWqrbbaCoBevXq5c/YerlOnTqWf/5VXXgGCgjiJFOvY2XfHww8/7M5Z5MbPEMimQh47+9z3o9y23UXLli2BoMANQOfOnQF46623AGjXrp1rK5WiDWus8d+8vb1fLEIDsM8++4Qe628dYr799lsgnK0zb948ALbeemsAOnTo4NoOOOAAAF577bW0+lkoY3fEEUe440mTJgHw9ddfA+HfyYpz+VGsfFHhARERERERKWlakwM0atTIHdtMwL///lvh420G058lSPdOPi46duxYYdtaa61V7nG5iuTk22+//QbA4sWL3TmbTd9vv/2A8GagZ599NgA777wzEF7PdP755wNBrv8zzzzj2iziUwwbhlqePQRRAxsDf93CZ599BsB3333nzg0cOHC1z3/qqacCcNBBB7lzts7B/j/40cVS8uWXXwKwbNkyd+7KK68EUssr99eS3HbbbQBMnz49cx0sMmeddRYAl156KQD16tVzbVGjlD///DMQzKhCUDI9jvr371/u3JAhQ/LQk9ywWfPDDz/cnfvzzz+B4D0FQUTGIg9t2rRxbTabn+gas3MW5bGsFAi+c+Lo+OOPd8e2btUyKT755BPX9n//939AEH3xI/m33HILAAMGDADCn5Omfv36QPBZCvDHH39U/hfIA/tcsQ3KIbh+bAsHP0JvGRCNGzcG4JJLLslJPzNBkRwREREREYkV3eSIiIiIiEisqPAAwaIqCBasJSorbWWBrX8//fSTa7PUNStnmwmFsjgtGb8s8LHHHlthXywVY/vttwfghx9+yGq/CmXs/FLQlh60++67A+FSyZbelmixsoWNrQxy1apVXZuNv6UTZSIdK5djt//++wPBewuCtAJbBJqqtddeG4CJEye6c1bwwviLeNMtHZ+KQis8YKl7lrpy0UUXubYRI0ak/DzLly93x/b/pXfv3gA899xzle5nobxfk/FT9iy9xdKb/b788ssvQJAOY2mqAOPGjQOC74k777zTtdni8ESpMskUw9j52rdvDwTXjRVigSCVK1elo3M5do8//jgQ/kxKln5m5s+f744tldce/9VXX7m2jz/+GICrr74aCK5DgM022yxSn5PJ93VnqaL2vQrwwAMPADB69GgA3n//fddmn2H2ftx2221d26xZs1b7ehdeeCEQTtWyv2escFCq8jF2Vp4dYO7cuUC4cIV9755zzjlAeMmGpQRaSvh5553n2m699dZK9StdKjwgIiIiIiIlraQLD9hiPH9hny0EPPHEE4Fg5gTg5ptvBoKoTc2aNV2bbYCZyUhOMbj88svd8d133w3AtGnTyj3ONt5KttFjHPkzRLbg0fhlov2NycqykuVWVtVfpGozLDZT/9hjj1Wyx7kVtRCFX9TCihbYzF7Z6A0EkbICDFxnnL/IeOTIkUDwez/yyCNpPdfFF18MhKOHw4YNAzITwSkmu+66qzu2CI7xZ9ttawErRuMXZ3nqqaey2cWCVbt2bXdsEUC7JocPH+7a4rz5p/1NMXToUHfuzTffDP2biJ8xsnDhwtW+jr1n11tvPXduhx12AODDDz9Mo8eFxwoKQBDB8cfzsssu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cMIJQLA/i+13BkE6RSJvvvkmEN7J+8477wSCtDWRbEm0X5ilTsWxGE2qbIG7pckDdO/eHQjenyeffLJrmzVrVoXPVb16dQC6dOkChIuHZDJNrdTccMMNAAwdOhQIUv8AGjZsCMDnn3+e1T4okiMiIiIiIrGiwgMFrFQWp2WDxi46jV10hV544Oijj3bHDz74IACdOnUCgmhrPuiai05jF10xjJ1futyiiWPGjAGgd+/eOe2LrxjGrlCVythZee9PP/0UCP8OzZs3B1Iv5W9UeEBEREREREqaIjkFrFTu9rNBYxedxi66Qo/kFCpdc9Fp7KLT2EWnsYtOYxedIjkiIiIiIlLSdJMjIiIiIiKxopscERERERGJFd3kiIiIiIhIrBRk4QEREREREZGoFMkREREREZFY0U2OiIiIiIjEim5yREREREQkVnSTIyIiIiIisaKbHBERERERiRXd5IiIiIiISKzoJkdERERERGJFNzkiIiIiIhIruskREREREZFY0U2OiIiIiIjEim5yREREREQkVnSTIyIiIiIisbJmvjuQSJUqVfLdhYKwatWqtH9GY/cfjV10Grvo0h07jdt/dM1Fp7GLTmMXncYuOo1ddOmOnSI5IiIiIiISK7rJERERERGRWNFNjoiIiIiIxIpuckREREREJFZ0kyMiIiIiIrFSkNXVREREJL4aNWoEwMEHH+zOde7cGYDRo0cDMHHixNx3TERiQ5EcERERERGJlSqrohTszrJc1QP/+OOPAWjcuLE7d+uttwJw9dVXA7BgwYKc9CWRYqilPmPGDHc8e/ZsAM4+++yc9iGRYhi7QlXIY9elSxcgPMNr/X3vvfeA8DU5fPhwAObNm5eT/sVtn5waNWoA8Prrr7tz6623HgB77LEHAAsXLqz06xTyNVfoim3sdtttNwAmT54MQM2aNcs95p9//gFgyy23dOd+/PHHjPel2MaukGjsotPYRad9ckREREREpKTpJkdERERERGKlJNPVdtxxRwCmTZsGQK1atco9ZsWKFQBceeWV7tyQIUOy2q+yiiGk6acGNW3aFIDtt98egG+++SanffEV4titvfbaQJCC0b1793KPWWuttQDo0aNHSs9pzzFz5sxMdBEozLEzhx56KABPPvlkSo//+uuvAWjQoEG2uhQSt3S1unXrAonfy82aNQNg7ty5lX6dQr7mErGUvTp16gDwxRdf5K0vxTB29p0L8MorrwDBGD7//POuzb6Tt956awDOP/9812bfyZlUDGNXqIpt7GrXrg3AscceC4SXKZx66qlA8DtVrVo1q33J5dhVr14dgP3339+dGzhwIADNmzcv9/gxY8YA0Lt3b3duk002CT3mp59+itSXTFC6moiIiIiIlLSSKSF93HHHuePbbrsNCGbWE1lzzf+GZtCgQe5c3759AXjggQeA8Oz5fffdl7nOFqn1118fgH322QeAcePG5bE3+bXTTjsBwTUDQYSrVatWkZ7TZosffPBBd+6dd96J2sWiZLO+J554oju38cYbA7DzzjsD4fe6zbTbrPHSpUtz0k+Jt5EjRwJw0kknAeH35L333ht67BlnnOGO7XslVfZcjz32WIReFo4LL7zQHdv7dc6cOQB07NgxL32S+Ovfv787PvnkkwHYaqutgHBEwIpaXHXVVTnsXW7Y721FeCCICiWKivTq1QsI3qcQFAuxx8+aNcu1devWLcM9zixFckREREREJFZKZk2O3Z0C3HHHHRl5zpUrV7rjESNGAHDxxRdn5LmhOHJe/TU5bdq0AaBnz55AfiM5+Ri7ww8/3B0/8sgjAKyxRubmEex38n+3hx56KPR6TzzxRMZeJx2FlKe+ZMkSd7zBBhsAsPfeewPh6zUbtCYnmmK45vy1m3YdNWzYsFxfMvmVatGOli1bVviYQh47u0ZsewEI3p/bbbcdAD///HNO+pJIIY6drcusX78+EI5MWwR7iy22AMLvPYv2WXT/8ccfd23Z+DOvEMfO3ifPPPMMEKzDgSBaY5k4fknyoUOHAjBp0iQg2KogW3IxdraO5rXXXgOC9xvAsmXLgHCU2Z7fNuft2rVrSv1NNzpdWVqTIyIiIiIiJU03OSIiIiIiEislU3jAwuarY2kZl1xyCQDHHHOMazvkkENCj/XLDPbp0yfUlsm0NSkO/u7cydLUFi9eDCQuibruuusCsM4667hzViDDwsl+2NpKTdu/L7/8smuzRZR+idY4a926NRCMIcDy5cuB7KepSXxttNFGAEyePNmd22abbXLy2i+88EJOXidb2rdvD4RTTN566y0gv2lqhcI+q44++mh3rl+/fkDya+zff/8FYIcddnDn/GMIp+iPHTsWyE7aWr4dccQR7tiKSlmqlpUrh6AcuaVOWtloCMbF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+nd1bAZ5zz33BIp348/x48e7Y8u9j5q/65dVrVq1KhCsAygmNgvuR4yNlTwt5TLF6brxxhuBYDw/+OAD12bXTLol7m3jYyt5DME6nfvuuw8IbxSaydngQmbrZizS4Edyttlmm9X+vF37/voy+6zLZCSnWNnakbLRGwjWHyfbMLlU1K5d2x3XqlULCNZG+98vFiWxLB9bowPQpEkTILgmJbHvvvsOCK+DsvLStk6nV69ers0+j7NNkRwREREREYkV3eSIiIiIiEisxCpdzXZXPeqoo8q1+WHdjTfeGAgWI/upQbag99hjjwXgoIMOcm1169ZdbR/uueceAF588UV37uOPP07tFyhyljrzyiuvAOG0IQuv2067/uK0YnL00Uen9Di7jtZcM9pbzC91bOO60UYbAeHrtVOnTgAcdthhQLh8ty2i9Bc+F2q6jJ/OYikGb7/9tjuXTqqAhcghSEOw4h9xkas0teHDhwNwwQUXlGvr27cvkNnCG9l05plnAsHC1V122cW1WYpFonRa2wIg0eJtS8u666673DlLsbL3vv8d4pf1LQWLFi0CwoumbRd6+1xK9P3Ytm1bILzIOG7v4cqwFKpEXnvtNSD91Ms4sr/jIFgEb0WQvv7663KPt9LRVm4aggIZO+64Y7a6GSsvvfSSO7bPR/v7+4wzznBtVjrets3IFkVyREREREQkVmIVybHN2hJFcvwZeCshOG3aNAC6du3q2mrWrJny661cudId2yI2W0xVKtEbn80cJZohqVatGgAHHnggULyRHH+BcceOHSt8nEWukvFLJM+aNQsIZnr98qo202GRRCsyANC5c2cguIb9Esk2u+xvVmqbGBaaa6+91h1buXd/rC2SYOPjF/YwNlPvL1b++++/ARg8eHBmO1xiEpXtLMDdB5L69NNPgfAmvMbKxNq/PovkvPXWW+7cF198AcDkyZMBuPrqqyt8Xdssz3+OUtkg1DIbjjzySHeudevWQFBg5OGHH3ZtVpTAri0/YmlbRJQyK9N78sknV/iYiRMn5qo7Bc//7kvl88r+bvMfG3Wz71I1c+ZMd2yZJfb963/22t/pt956a1b7o0iOiIiIiIjESqwiObYO5vfff3fnatSoUe5xdjeZaEYvGds07+abbwaCNT2QfGOzUmPj4+fDGst5LVa2BgaCkuJdunQBgnU4AP/88w8QlJIGeOONN4CgBOojjzyS1mtbfrs/U2fHlm9ss6Q+60shGzdunDu22Vt/hsdmhG1WfMqUKa6tXr16QFDa3cpGQxDd9TdXldK03377AXDaaacBQflnCNbNJNpIeo01/psL3HXXXd05O7YMAX/NSdkZY3+z1e+//z76L1CELAp9yCGHuHMWobXNbhOt97IIrB+xsEhcKbP1bw0aNCjXZmsRFy5cmMsuFQ17j/plpSti73kIIrmlwqKFVhK6Muya9LfeMLZ5vCI5IiIiIiIiadBNjoiIiIiIxEqs0tWs5OzAgQPduWHDhgHpl/K1FB+/NOj1118PFO+u8rlSbAuSo7IQrF1jVpocghB3JkK+qbCFvbbLOgSlpseMGZOTPmSKlYKfPn26O3fTTTcBcMwxxwDJF976JSz9oiJS2qwsu//9YFq1agUEKY8QlDreYostVvvcidLVLJ3ZT9Uo1cXzfmq3FZ+55ZZbgCDdF4KCDpdeeimQfkpv3NlWAYlYym8xpCfnin2XQPCdYcV3/DQ0KxzSv3//cm1Dhw7Nej8LgaW6P//88wA888wzKf3ciBEjKmyzIl/2mZiPvw0VyRERERERkVipsqoAp939WbHKsjtJ2xgR4PDDDwdg7ty5QLiEpRk7diwA33zzTcb6kq4o/2syOXZR2aJIf0GpzYqeffbZQLD5XrYU69gVgkIcO3t+e+/6RS1soaTNZNoMMeR+5ijd1yv0a84Kt4waNcodNjTTAAAgAElEQVSdswWjNus5fvz4Sr9OIV5zVo7dCoq0b9/etZXdGNAfH2MLwLO9nUAhjl2xKIaxs/cbwNSpU4GgQMYTTzzh2qwkr781QTYVw9j5rFiNRRL9aI0VGrBz/qbZtmlwJt/HhTh2FsmxwlHNmjVzbcn6a/1K5TGLFy925yx6NnLkyLT6me7YKZIjIiIiIiKxopscERERERGJldinqxWzQgxpFguNXXQau+jilq6WK7rmotPYRVcMYzdgwAB3bEUs5s2bB8ABBxzg2nJdEKkYxs5Xq1YtIEh1ttRngO233x6ASZMmAcFeThAuXpAphTx2lqLsF7moW7duqA8HH3ywa7N0ymS/k6Wk+WM5Y8aMSP1TupqIiIiIiJQ0RXIKWCHf7Rc6jV10GrvoFMmJRtdcdBq76Ap57Nq2bQuES+LbAnmbEffLb+daIY9dodPYRadIjoiIiIiIlLRYbQYqIiIiUuyqVq0KBNEbn5XfFZHkFMkREREREZFY0U2OiIiIiIjEigoPFDAtTotOYxedxi46FR6IRtdcdBq76DR20WnsotPYRafCAyIiIiIiUtIKMpIjIiIiIiISlSI5IiIiIiISK7rJERERERGRWNFNjoiIiIiIxIpuckREREREJFZ0kyMiIiIiIrGimxwREREREYkV3eSIiIiIiEis6CZHRERERERiRTc5IiIiIiISK7rJERERERGRWNFNjoiIiIiIxIpuckREREREJFbWzHcHEqlSpUq+u1AQVq1alfbPaOz+o7GLTmMXXbpjp3H7j6656DR20WnsotPYRaexiy7dsVMkR0REREREYkU3OSIiIiIiEiu6yRERERERkVjRTY6IiIiIiMSKbnJERERERCRWdJMjIiIiIiKxUpAlpEVEMunMM88E4MYbb3Tn7r77bgB69+4NwMqVK3PfMRGpULNmzdzxUUcdBcDFF18MwBprBHO0V111FQATJ0505+bMmZOLLopIAVMkR0REREREYkWRnEqoW7euOz7wwANDbc8++6w7XrRoUc76VOhmzpwJwODBg905f6xKQePGjQGoXbu2O3fiiSeG/vXZJmDjx48HYOjQoa5t7ty5Wetnsdpqq63c8UknnQRAnz59gPBGYjbWjzzyCFB616FEt9566wHQvn17AA4//HDXduSRRwLw2WefAdCqVasc9654rb/++gBcf/31ABxwwAGuzd7X//77b7mfu+iiiwD4+++/3TlFckREkRwREREREYkV3eSIiIiIiEisKF0tgo022giA++67z53bd999gWAxpB8qt8fdfPPN7tyKFSuy3s9CsuuuuwLQvHnzPPck/yyNxb9+LKXlm2++AWD58uWubeuttwaChbedO3d2bWPHjgXglFNOyWKPC1vVqlUBOP300wEYMmSIa6tRo8Zqf37QoEEAPPfcc+5copSYYuGnzk6ZMgWA4447DoD7778/L30qZi+88AIALVq0cOfsmrP0x1dffdW1nXfeeQC89NJLuepibNhnYseOHfPcE4mDJk2auOOzzz4bgB133BGAOnXqlHvchAkTgHDa+LJly7LeT8keRXJERERERCRWFMlJg0VwHn30UQD22muvCh/btGlTdzxs2DAgvCDaZlRLZXGkLQy1CMXnn3+ez+7kjD+TZDPsVnjAnxk2Dz30EAB33nmnO2eRhh49egDBLDIEUR0rjfzee+9lrO/Fwmbak70fP/zwQwCmT5/uzp1xxhkA7LbbbgBss802ri0u16dFpCySqkhO+mwm1z7/Abp37w4E197ixYtz37EiZ+M5evRod65Tp05A4kjqL7/8AsA555wDwOuvv17hY4rF2muvDUDfvn3dOfu8X3PN8n+eWRGacePGAdC/f3/X9vXXX2etn8WiYcOGAAwcOBCAI444wrVZsRAbQz9bwgpWWLaEv53A8ccfD5Re9k1cKJIjIiIiIiKxokjOavhloi1fONmMcTI2AwXw119/AaUTydl5550BePzxx4H4zJRXxGZ/rrjiCnduiy22qPDxX3zxBQDffvstEJ5lsjLIb775JgAjR450bRtuuCEATz75JAANGjSobNeLjv3uFj397rvvXJv9f7BIjv//wCI5Nq5ffvll9jubA/Xq1St3zt53qdp4440B2G677QB45513XNs///xTid4Vn/fffx+AQw45xJ2zcu4SnUVwjjnmmAof88QTT7jjO+64AwivnSt29tl++eWXl2vzy92XPWeRxF122cW1devWDQii+Yl+Po6qVavmju+55x4A2rRpU+5xb7/9NgAjRowAgs9935gxYwA4+uij3bnHHnsMCLYaKBXVq1d3x/Y9ahvx+n8X2xYpw4cPB+Dee+91bb/99lu2u7laiuSIiIiIiEis6CZHRERERERiRelqFTj55JOBoPQqwO67756x57eF+P7CwbjxF91vttlmQFC0IY4spAtB2NtKiq+OLXq3UPonn3zi2mxBadu2bSv8+c033xwIrlu/D3FnYzZ16lQA5s+f79qWLl0aeqy973yWfuUvNi1ma621VrlzLVu2BODFF1+s8OcsRQ3ggQceAKBDhw4AjBo1yrVdeOGFQHGX2U6Hpfpdcskl7pylhX711Vd56FFxa9asGRAUYvE/Iy1t11KEEr1fi91BBx3kjocOHVqu3dJtLXXZZ4vnd9hhByBIJwWYPXs2AA8//DAA1157rWuLc1r8AQcc4I732GMPIPgs91PMbIuBZMUp7P285557unNWjCDu6Wq23YKlPfbr18+11a9fP/RY/3vVvm/se9gvzV0If98qkiMiIiIiIrGiSE4ZAwYMAIKFgP4sk81c2qzIu+++W+7nbSGhvwB83rx55R732muvZabDBezKK68sd+6jjz7KQ09yw1+olyyCYxt++jNKNnNpi/a+//77cj9nC0q7dOlSrs1ez+9DqbHiAonYZr1du3Yt1xaXTRs32WQTILxo1my55Zar/fnrr7/eHVsE5+mnnwZgwYIFrq1UFjSbP//8s9w5m0FXJCc1NssLcNhhhwFB5NCPCB566KFAOJIdNxYJhaBwjM+KEtn72L/G7PEWXTjrrLNc248//ggEn3FWjhuCGXUrIR+nkud+IR77bLLv0VQ3ybbvT8uI8P3f//0fAOussw4A7du3d21WBMMvFFSobBNUgA8++ACADTbYwJ0bPHgwEGxmbH+nQLClxYwZMwCYNm2aa/vjjz+AINrvX5OK5IiIiIiIiGSYbnJERERERCRWSjpdzXYU9sNrVgc80aJaWxA4duxYILxTc1m1atVyx4me66677orQ4+JgO1n7Yd27774biHcawkMPPeSOLRXNTxmwELGNhe2yDKmlD1g6kb83QseOHSvR4/hr1KgRANdccw0QDs8/++yzQOLFv8Vo2223BWDvvfcu13brrbdW+HM1a9YEwteVsYXfH3/8cSa6WJS23377cudKLWUvKisyYClqAFtttVWFj4/z94Px9xHZZ599yrVbEZrDDz8cCKdj/frrr0CQPuQX8vn999+BYL8wKx4CMGzYMCB4j9s+O3Hg/5623MAKEKSqXbt2oX/9dHHbX8fG2gpmQLDXTuvWrdPtds41bNjQHVsxI38fKtv/0fYwtLGAcOpaReya7NmzZ+U7m0GK5IiIiIiISKyUdCTHIjj+gtuy/NKLRx55JBAuUVuR6667rpK9K15W0tGfNb/xxhvz1Z2c8QsJWFTHj+5Uli1utBk7SczKlQNMnDgRgJ122gkIojcQLN71I2rFLNEu3+PHjweSR2Js92obI5HKsu0DbGG2X57c2OflOeeck7uOFQD7TIIgUmoloSHI/EhU2KisJUuWlDtnkYfnn3/enbNCGZtuummEHhc2K9Tgs0wa+2wDWLRoUegxfmTDykNbRsXMmTNd2wsvvABAlSpVgHAUd8KECZXqey75f7fadih+1N8iYlEjMUOGDAGCcSoUiuSIiIiIiEislGQk58svvwTC62bKsplP21gLUovg2MxBotKQtpYHYNKkSal1tgjddNNNAKxYscKd848l82xDy1Su0bipV68eEJTWtvLvELwPbUbZ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yUDppKu1atUKgHr16gHhQhgtWrQAoHfv3kCQYglw+OGHA/Daa6/lpJ+Fwi9GcNlllwFBunebNm1cm6XxWcEgn5WmnTFjRtb6WWz8VN0BAwYAUKtWrQof76czlxpLcU6UfmbXYO3atYFwoYynn346B70rfs2aNQOCEt0A06dPB8Lp6IVEkRwREREREYmVKqv829kCEXURmJXkrVOnTkrPb2V6C7UkZZT/NdlYQGelswFOOOEEINiMrFBndfMxdi1btnTHVu7UZnUhKCbwxhtvAIVbcrFQrrtilO7YFdK4rbvuuu7YiqxYxMJKlQNccMEFGX/tQrzmbGbygw8+AGDnnXcu99qjR48O/QtB1DFXCnHsikUxjJ0f2X7//fcrfNyDDz4IBJuyZvtPu0IcOysEcuuttwLJt2lYtmyZO7aS537RmmwqxLFLxZgxYwDo1auXO2fFRR599NGc9CHdsVMkR0REREREYkU3OSIiIiIiEiuxSleLm2INaRYCjV10GrvoijldzWcLTJ977jkgvJi5Xbt2QLC3UybomotOYxddMYxdqulqllKajXTSRAp57Jo0aQJAnz593DlLSZs6dSoA48aNc225Th0v5LFLxooM7LLLLu6c7ZmTq/3AlK4mIiIiIiIlTZGcAlasd/uFQGMXncYuurhEcnJN11x0GrvoimHs/EJKtsVAjx49AJg7d65r22+//YBwqf5sKoaxK1TFNnYbbLABAPPnzwfCBacsapYriuSIiIiIiEhJUySngBXb3X4h0dhFp7GLTpGcaHTNRaexi05jF53GLrpiGzuL1rzzzjsAXHTRRa7txhtvzGlfFMkREREREZGSppscERERERGJFaWrFbBiC2kWEo1ddBq76JSuFo2uueg0dtFp7KLT2EWnsYtO6WoiIiIiIlLSCjKSIyIiIiIiEpUiOSIiIiIiEiu6yRERERERkVjRTY6IiIiIiMSKbnJERERERCRWdJMjIiIiIiKxopscERERERGJFd3kiIiIiIhIrOgmR0REREREYkU3OSIiIiIiEiu6yRERERERkVjRTY6IiIiIiMSKbnJERERERCRW1sx3BxKpUqVKvrtQEFatWpX2z2js/qOxi05jF126Y6dx+4+uueg0dtFp7KLT2EWnsYsu3bFTJEdERERERGJFNzkiIiIiIhIruskREREREZFY0U2OiIiIiIjEim5yREREREQkVnSTIyIiIiIisaKbHBERERERiRXd5IiIiIiISKwU5Gag2bbmmv/92s2aNQOgU6dOrm2XXXYBYP/99wdgjTWC+8CpU6cC8MILLwBwyy23uLY///wziz0uLccee6w7vvfee8u1t2rVCoA5c+bkqksiIpJB9evXB2DIkCHunH32v//++wDsscceru3333/PYe9EJA4UyRERERERkVjRTY6IiIiIiMRKlVWrVq3KdyfKqlKlSsafs1q1au74hhtuAOD0009Pqy9lh+rHH390x/vuuy8AH3/8caX66YvyvyYbY5dte+21FwBNmjQBwmmA//77b7nH77rrrkDydLVSGbtsKIax23zzzd1x06ZNAejSpUvoX4AaNWqEfu7WW291x2eeeWbG+5Xu2Oma+08xXHOFqtjGztLFJ0yYAMDhhx9e4WM322wzd/z9999nvC/5HjtLz2vevLk799BDDwFw6KGHAuU/wwC22247AA455BB3bunSpQB899135R7/9NNPA/DHH38AcO2117q2qKn2+R67Yqaxiy7dsVMkR0REREREYqVkIjlXX321O+7bt2+o7bfffnPHNuPx4osvVvhcVqigY8eO7pwVI7jssssAmDVrViV7HO+7fYveANx8880ANG7cGAgXe7BIzgMPPODO2f+/xYsXV/j8+Ri7HXfc0R0fcMABAGy66abu3HPPPQcEEcC5c+dW6vWypRCvu549ewLQo0cPANq0aePa1l9/fSC1fq9YscId2/+vzz//PGP9zFUkZ5tttgFgrbXWcucWLFgA5K4ISv/+/YHgWgd4+OGHgeA9napCvOZSYVGJddddt9LPtXz5cgD+/vvvtH6uGMbO/0wfNGgQAAMHDqzw8Q8++CAAp5xyijv3119/Zbxf+R67lStXrrYfybJJEj0ulcfcd9997tyJJ56YWmfLyPfYVZb/nrXjJUuW5OS1i33sGjVq5I4tmnjccccBQWYFQLt27QB4+eWXM/baiuSIiIiIiEhJi30kp0GDBgDMmDHDnatTp07oMX4JaYvkJGMzx35+v93NWunL448/3rV99dVX6XX6/yv2u/1kTj31VHd80003hdoSRXJslhqCsU62/ikXY3fEEUcAcOmllwLBmiJIHl2w3Gk/x3zy5MkAPProo0B4vZHlUedKvq+7unXrAuG1NcOGDQPCkYuyrz1v3jwgPHYWpbnooovK9fPOO+8EoHfv3hnre7YjOccccwwAd911FwDrrLOOa7M1Dv7MbDZmv4191vkmTZoEBBHtVOX7mjNVq1Z1xxtttFGFj7O1FBaRts+CdPn/f6655hoArrjiirSeo1DGLhn/s/GDDz4Itf3yyy/u2CL29plqn5XZku+xy1ckxy/H3bZtWyD9zIJ8j126bF12165dAejTp49r23bbbYGgZPmHH34Y+XXsc8O2KJk+fXq5xxTD2FWvXt0d299ctp7d/96pWbNmhc9h71/L0lm0aFGl+6VIjoiIiIiIlDTd5IiIiIiISKzEMl3NLy9r5Rj9hco///wzABdccAEAjzzyiGuLumjXSjLaQkk/zL7bbrsBiUs7JlMMIc10WfpZotLQxk8ZsZSu0047zZ17/PHHV/s6uRg7ew37Xfw0qWeeeQaAH374wZ3bf//9geB6qFWrVoXPbT8PQanzb775Jq3+RZWP6+7cc891x7agfZNNNnHnLK3j119/LfezZ511FhCk+vnFBSxF4dVXXwVgl112cW0zZ84Ewp8NlZWNdDU/HeD1118HoGHDhgC8++67rs0WfPoLui0FKpO22morICiuct1117m2ESNGRHrOfFxzG264oTuuV68eEB47Sw2sLH+rARsfu47fe+891+anVKejkL8nbIHy888/785tscUWocf4v7dfkCYX8j12VkhlwIAB7txbb70FBKk99tkFMHv27JSf27+We/XqBQR99/8WsXS1+fPnp9X3fI9dKuxzEoKCF927dy/3OFt6MGrUKCD1YjT2/P369XPn9t57bwDq168PBMVJfIU4dvZ9a3+n2N/HEJQ4TyUl0mePv/766wG45JJLKt1Ppen/ZV4AACAASURBVKuJiIiIiEhJK3+LGQM77bSTO040S2szuH4Zxcq6+OKLAahduzYQlNPz+5NuJCdObGFuKpEcvzS0LQ5MJXqTazfeeCMQLPj2Z9mWLVtW4eNtZt7foNbKkdts08EHH+zabBbUFkwWaunpyvDLEFuEy5+xsXFJNzJhG+m1atWqsl3MG/tMgWBm3MqRH3jgga7Niqz4kYNsOPnkk4HyBVyKxdFHHw0E1xSEF8Znml8+1SK0tm2BX1AljmxWuGz0BoKMikzM7hYrK7Tgb5FQWWuvvTYQnvm3Yyvq8/XXX7u2dCM4xcAisy+99JI7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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes 5-10 seconds to execute this\n", "show_MNIST(train_lbl, train_img)" @@ -142,20 +120,9 @@ }, { "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAKoCAYAAABUXzFLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xm8VdP/x/FXSkql0uimMlVKE5FEA6mIKGT2jVQaDEWI0CCUhEx9UaZSqMzJnAiF0jeVmcjcoDlDOr8//D57r3Pvuadzz73nnn32eT8fj+/D/u517rnrrvYZ9vp81meViEQiEUREREREREJil3R3QEREREREpCjpJkdEREREREJFNzkiIiIiIhIquskREREREZFQ0U2OiIiIiIiEim5yREREREQkVHSTIyIiIiIioaKbHBERERERCRXd5IiIiIiISKjoJsexefNmBg0aRE5ODmXKlKF58+Y88cQT6e5W4G3atImrrrqKTp06Ua1aNUqUKMGIESPS3a2M8Oabb9KrVy8OPPBAypUrR61atTj55JNZtGhRursWaEuWLOGEE06gTp06lC1blj333JMjjjiCqVOnprtrGWnSpEmUKFGC8uXLp7srgfbWW29RokSJmP9bsGBBuruXEebPn0+XLl2oXLkyZcuWpV69etx4443p7lagnX/++fled7r24vv444/p1q0bOTk57L777hx44IGMGjWKrVu3prtrgffBBx/QuXNnKlSoQPny5Tn66KN59913092tAimV7g4EySmnnMKHH37ImDFjqF+/PtOmTeOss85ix44dnH322enuXmCtXbuWBx54gGbNmtGtWzcmTZqU7i5ljIkTJ7J27Vouu+wyGjVqxOrVqxk/fjytWrXilVde4Zhjjkl3FwNp/fr11K5dm7POOotatWqxZcsWHn/8cc477zxWrlzJddddl+4uZowff/yRIUOGkJOTw4YNG9LdnYxw8803c/TRR0eda9y4cZp6kzmmTZvGeeedx+mnn85jjz1G+fLl+frrr/npp5/S3bVAu/766+nXr1+e8127dmW33XbjsMMOS0Ovgm/FihW0bt2aBg0acOedd1K1alXefvttRo0axaJFi3juuefS3cXA+vDDD2nbti0tW7ZkypQpRCIRbr31Vjp06MDcuXM54ogj0t3FxEQkEolEIrNnz44AkWnTpkWd79ixYyQnJyeyffv2NPUs+Hbs2BHZsWNHJBKJRFavXh0BIsOHD09vpzLEr7/+mufcpk2bIjVq1Ih06NAhDT3KbIcffnikdu3a6e5GRjnxxBMjXbt2jfTs2TNSrly5dHcn0ObOnRsBIjNmzEh3VzLODz/8EClXrlykf//+6e5KKLz11lsRIHLdddeluyuBNWzYsAgQ+eqrr6LO9+3bNwJE1q1bl6aeBV/nzp0jNWrUiGzZssU7t3HjxkjVqlUjrVu3TmPPCkbpav/vmWeeoXz58vTo0SPq/AUXXMBPP/3EwoUL09Sz4LOQuRRc9erV85wrX748jRo1YtWqVWnoUWarWrUqpUopQJ2oqVOnMm/ePO677750d0VCbtKkSWzZsoWrr7463V0JhcmTJ1OiRAl69eqV7q4E1q677gpAxYoVo85XqlSJXXbZhdKlS6ejWxnh3XffpX379uy+++7euQoVKtC2bVvee+89fv755zT2LnG6yfl/y5Yto2HDhnm+IDVt2tRrFykOGzZsYPHixRx00EHp7krg7dixg+3bt7N69Wruu+8+XnnlFX2JStBvv/3GoEGDGDNmDHvvvXe6u5NRBg4cSKlSpdhjjz3o3Lkz8+fPT3eXAu/tt99mzz335LPPPqN58+aUKlWK6tWr069fPzZu3Jju7mWUDRs2MHPmTDp06MC+++6b7u4EVs+ePalUqRL9+/fnm2++YdOmTbz44ovcf//9DBw4kHLlyqW7i4H1119/sdtuu+U5b+c++eST4u5SUnST8//Wrl3Lnnvumee8nVu7dm1xd0my1MCBA9myZQvDhg1Ld1cCb8CAAey6665Ur16dwYMHc9ddd3HRRRelu1sZYcCAATRo0ID+/funuysZo2LFilx22WXcf//9zJ07lwkTJrBq1Srat2/PK6+8ku7uBdqPP/7I1q1b6dGjB2eccQavv/46V155JY899hhdunQhEomku4sZY/r06Wzbto0LL7ww3V0JtH322Yf333+fZcuWsf/++7PHHnvQtWtXevbsyYQJE9LdvUBr1KgRCxYsYMeOHd657du3e1lNmfKdWHkdjngpV0rHkuJw/fXX8/jjj3P33XfTokWLdHcn8K699lp69+7Nb7/9xgsvvMDFF1/Mli1bGDJkSLq7FmizZs3ihRde4OOPP9Z7WwEcfPDBHHzwwd7/b9OmDd27d6dJkyZcddVVdO7cOY29C7YdO3bwxx9/MHz4cIYOHQpA+/btKV26NIMGDeKNN97g2GOPTXMvM8PkyZOpUqUK3bt3T3dXAm3lypV07dqVGjVqMHPmTKpVq8bChQsZPXo0mzdvZvLkyenuYmBdcsklXHjhhVx88cUMGzaMHTt2MHLkSL777jsAdtklM2IkmdHLYlClSpWYd6br1q0DiBnlESlKI0eOZPTo0dx0001cfPHF6e5ORqhTpw6HHnooXbp0YeLEifTt25drrrmG1atXp7trgbV582YGDhzIJZdcQk5ODuvXr2f9+vX89ddfwL+V67Zs2ZLmXmaOSpUqceKJJ7J06VK2bduW7u4EVpUqVQDy3Agef/zxACxevLjY+5SJli5dykcffcS5554bM51IfEOHDmXjxo288sornHrqqbRt25Yrr7ySO++8k4ceeoh58+alu4uB1atXL8aMGcOUKVPYe++9qVOnDitWrPAmEGvVqpXmHiZGNzn/r0mTJnz66ads37496rzlHao8qKTSyJEjGTFiBCNGjODaa69Nd3cyVsuWLdm+fTvffPNNursSWGvWrOHXX39l/PjxVK5c2fvf9OnT2bJlC5UrV+acc85JdzcziqVaKSqWP1vfmpuNXabMDKebRR969+6d5p4E35IlS2jUqFGetTdWcltrreO7+uqrWbNmDZ988gkrV67kvffe4/fff6dcuXIZk2mid5X/1717dzZv3sysWbOizj/66KPk5ORw+OGHp6lnEnY33ngjI0aM4LrrrmP48OHp7k5Gmzt3Lrvssgv77bdfursSWDVr1mTu3Ll5/te5c2fKlCnD3LlzGT16dLq7mTF+//13XnzxRZo3b06ZMmXS3Z3AOvXUUwGYM2dO1PmXXnoJgFatWhV7nzLNn3/+ydSpU2nZsqUmXhOQk5PD8uXL2bx5c9T5999/H0AFVxKw22670bhxY+rWrcv333/Pk08+SZ8+fShbtmy6u5YQrcn5f8cffzwdO3akf//+bNy4kQMOOIDp06fz8ssvM3XqVEqWLJnuLgbanDlz2LJlC5s2bQL+3YRr5syZAHTp0iWqDKH4xo8fzw033MBxxx3HCSeckGfnan3wx9a3b1/22GMPWrZsSY0aNVizZg0zZszgySef5Morr6RatWrp7mJglSlThvbt2+c5/8gjj1CyZMmYbfKvs88+20uRrFq1Kl9++SXjx4/n119/5ZFHHkl39wKtU6dOdO3alVGjRrFjxw5atWrFRx99xMiRIznxxBM56qij0t3FwHv22WdZt26dojgJGjRoEN26daNjx44MHjyYqlWrsmDBAm655RYaNWrkpUpKXsuWLWPWrFkceuih7Lbbbvzvf/9jzJgx1KtXjxtvvDHd3UtcmvfpCZRNmzZFLr300kjNmjUjpUuXjjRt2jQyffr0dHcrI9StWzcCxPzft99+m+7uBVa7du3yHTe9PPP30EMPRdq0aROpWrVqpFSpUpFKlSpF2rVrF5kyZUq6u5axtBnozt1yyy2R5s2bRypWrBgpWbJkpFq1apHu3btHPvjgg3R3LSNs3bo1cvXVV0dq164dKVWqVKROnTqRa665JvLHH3+ku2sZoWPHjpFy5cpFNm7cmO6uZIw333wz0qlTp0jNmjUjZcuWjdSvXz9yxRVXRNasWZPurgXa559/Hmnbtm1kzz33jJQuXTpywAEHRK677rrI5s2b0921AikRiahuo4iIiIiIhIfW5IiIiIiISKjoJkdEREREREJFNzkiIiIiIhIquskREREREZFQ0U2OiIiIiIiEim5yREREREQkVHSTIyIiIiIioVIq3R2IpUSJEunuQiAks4WRxu5fGrvkaeySV9Cx07j9S9dc8jR2ydPYJU9jlzyNXfIKOnaK5IiIiIiISKjoJkdEREREREJFNzkiIiIiIhIquskREREREZFQCWThAREREQmvsmXLAtCxY0fv3IwZMwB48803AejTp4/X9sMPPxRj70QkDBTJERERERGRUCkRSaaWXYqpVN6/Mq3M4HXXXQdA7dq1AZgyZYrXNn/+/GLtSyaMXZUqVbzjI444AoDjjz8egH79+nlt3333XdR/J06c6LU99dRTRd6vTBi7oFIJ6eTomktepo3drrvuCsCkSZMAOO+88/J97CGHHOIdL1mypMj7kmljFyQau+Rp7JKnEtIiIiIiIpLVsnpNzh577AHAiBEjvHOnnXYa4EcjbrnlFq/t9ttvB2DNmjXF1MPMcsEFFwBQp04dwJ+xg+KP5ATZ0UcfDfj55wCVKlUC/Nkad7bCxtP+26ZNG6/trbfeAuC3335LXYdFJOVat24NwJdffumdW716dbq6kzKXXnopED+Cc//99wOwYsWKYumTiISTIjkiIiIiIhIquskREREREZFQyep0tV69egEwaNCgPG2WLjR06FDv3LHHHgtAly5dAKWtSXKuvvpqwE9RK4znnnsO8AsXZItmzZp5x23btgWgatWqgF8AA+Cdd94B4OSTTwZgw4YNxdXFrHHAAQd4x2+88Qbgp14B/Pjjj8Xep6Jk11Ws9/tYr+EGDRpE/f999tnHO165ciUAhx56KAAtWrTw2nJycoDoUsm9e/dOrtMB07lzZ+/4xhtvjGpzX5NWrMZS2kRSxZYrADRp0gTwU8Ld733W9u677wLR6eISfIrkiIiIiIhIqGRlJMdm1saMGZPvYz766KM852z2bfbs2YAf0QFYu3ZtEfYwMz300EOAX8jh888/T2NvgssW01pksDC2bNlS6OfIBFZa+8477wSiZ9DdUtwQXbTBZt3s56w4hhRe+fLlAZg6dap3rmbNmunqTpG7/vrrAejfvz8AmzZtyvOY3XffPc85i8jEEquwSG7u78n0SI5F+Z588knvXJkyZaIeM2HCBO/YLQKU7apVqwbADTfc4J0bMGAAALvs8u/8tG0rAHDTTTcBfkGb9evXF0s/g8SKHVWsWBHwIzMA3bt3B+DUU08Fol+7VmgqlgDuspISRx11FABXXnklAF27ds33sW4569zj416vn3zyCeBnnKSDIjkiIiIiIhIqWRnJsTU4pUuXBuDvv//22qxktP3XvWN95plnAD+/2F3LY7N+2aZbt27esc0AmLFjxxZ3dzLCNddcA0DHjh29cw0bNgRg69atAIwaNcprsyiGrT1xvfzyyynrZ7rZ3w3w8MMPA/76iHgzSbHUrVsXgHLlynnnsiUKlir22rexBZg1axaQuetw7DMB4NxzzwWgRo0aUf91JRKZicWuvT///NM7Z69lG8NMZuNy+eWXA9HrH4xtBnrzzTcXX8cyQMmSJQE/M8J9H7TrbMeOHQDsvffeXpttEt23b18ATjzxRK/t119/TWGPg8PGIJGIvfsZ8sUXXwBw9913A/42D+BHgMLEXo9nn322d27cuHGAH+GK955mW1eAH3Fs1KgRACNHjvTa7L1MkRwREREREZEiopscEREREREJlaxJV7NFsgDHHXdcVNu3337rHcdb+HjfffcBSlcDfzz/85//eOcqVKiQru5kFEtRsdKUO2MFCtzwuglLypX7t91xxx1A9I7otpA0WZbqZ4srAV555ZVCPWcmqFy5MgCnnHIK4Jd4Br+ccUHZYvJbb70ViC4CYeXRM9WFF17oHbulsSH6c2LffffNt80W28YqVDBt2jQAPv30UyB64XiYnHTSSQD069cvT9svv/wC+Onff/31V/F1LAPY+5+bpmaWL18OwMKFC4Ho4jW2yP7ggw8GolOE7N/jt99+S0GP08vGC/xtQWKlWtl1Zu/7VhIa/OIpmzdvBqBHjx6p6WwanXnmmd6xlXHfb7/98n28m3L88ccfA36K6bx587y2smXLAv5nzYcffpjnuaw40AMPPOCds+JetjQkVRTJERERERGRUMmaSI4bZahfvz7gl31OtJSvzZ5s3LgR8BcIZiNbAO6WGbTFkFJ4bulLW9AXa3bKFlpmOnc27uKLL07qOZ5//nkgenY896aCVkoa/GIPYXb++ecDfnnZBx980Gu77LLLEn6e3XbbzTu+5JJLAP89YPjw4V7bqlWrku5rELibmFp00RbSugtqJT6LHMRi0b45c+YUV3cCr2fPnt6xlSw3L730knd82mmnAX5Uwn1dWqGfgQMHAv6WF+BHOCz6GqbPavfvzG3y5MnesWXiLFmyJN/HDxkyBIi94adtHZIprCCAFaC4/fbbvbZYhUBsE2Ir926FLwA+++yzfH+PfR+24hbuxr/r1q0D/IIObqGqI488ElAkR0REREREpEB0kyMiIiIiIqGSNelqrVq1ynPu8ccfB/ww3c7Yor2LLroI8BeRuufuv//+QvUzDNJZEz3TWfqBW8hir732Sld3itQ+++zjHVuqmL1uYqUHxOOmpM2cORPwi4a4vyd3uprbZoUNpkyZUqDfHVS28NNdYHrbbbcB/oLa8ePHJ/Xc7r+PpatZ0QvbwyhssmWn86LSvHlz79jSqoy7F53S1HxWCMX2KAE/TXLbtm2AX6QC8hZpcPdZskJIOTk5gF9sBGD06NGAn761evXqovkDAmD+/PnesY2nfbcbOnSo12apU7Hsv//+gJ8q7RbCeeeddwAYM2ZMEfW4eFjaWbt27fK02evxyy+/9M5ZsYV4qWmJeO+997zjE044AYBOnToV6jkLQ5EcEREREREJldBHcnbddVcArr322jxtTz/9dFLPaWUc3bt9W8RrpQjDUto3GW6ZXikYm42Pt2PzihUriqs7RcrKOIMf8bTX58789NNPgP86HjVqlNd20EEHATBjxgwADjzwwHyfx53BfPvttxP63Zmidu3aQHRxBXuPsr/Viq0kysooP/bYY3narBCLlQQOg1gL5m12t0WLFt65xYsXRz3Grj3w3/uTLdGdqdyFzbm3E3ALpKxZs2anz2XXnZWeBTj33HMBuPfee4HCzziny5577ukd23cQ95y5+eabgYIvzP78888L0bvMM2vWLO/YvoedffbZQHQUw6LasYr1PPHEE4D/HuqWT7bIdSZwC1Hk3qLin3/+8Y4tcliUW5/Y77YCGOAXvrH3A7fghUWaUk2RHBERERERCZXQR3IOO+wwIHoWzsTatCgRVjLv999/987Z7LHdsWZzJMedfZOiZxt5ZRo3GjBs2DDAz4Xemd133x2Ayy+/HIC6det6bW657USfx32OTN6Q0d2I02a43ejY9OnTAX/TXnc2LxEdO3YEoGbNmt657du3A9HRtLBwNwi0Uqg2y2755e6xRcrcGdE//vgD8NdBuOugwrjxpb2GY33GfvHFF0D8GWN3Q8LBgwcDcNZZZwGxIxx2LdtaPIA+ffoAmVEaecCAAd5xrL9v69atALz22mvF1qdMZptKAnTv3h3woza2/QL42xRYhOPNN9/02g455JCo57RS0gBLly4t4h6njrstQO5ryx2noozg2HvhFVdcAcReA2Tc6GtBtjAoDEVyREREREQkVHSTIyIiIiIioRL6dDUr+7xhwwbvXMWKFQE/nOcuMkvE999/D8DXX3/tnbNdd1u2bAn4u6+H3S676D65KNl14xa1MFbUwl3knKmsLKctMHb973//A6ILA9iC8GbNmgHR1128FBV7nD3GCjtA3nKh8+bNK+BfkX62ezz4O0i//PLL3rlk09QsBSlWWoOVrU209H4mueaaa7xjK3ZRunTpfB9v146bqtWgQQPAT1dzd/k+/PDDi66zaVSyZEnv2Eqw5y42AH6hj02bNuVpq1+/PhB9vbol3vNjv8ctzmJpbpZKHmQ7S2W39zo3vaggjj322Dzn7PtPQd8HMs0rr7wCwAcffABEfw9r3bo1AL169QLgnHPOyfPzVoAgUz9jFy1a5B1b2myZMmWA6JRjKwjwyCOP5PtcF154oXdcvnx5wN/OwsqVg/9eENTvgsHslYiIiIiISJJCH8mpXr064EdvipI7S2CRHFvoli2RnExY6JkJjj/+eMCfEY61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92HFihXesW1e5s54GtvwK4yRHLfohy0WfeihhwA/ChOLuxGwRR4bNWoEFGxzzEzlRlltNtiik08//bTXFpb3sVtuucU7tteIzcy6G6ka97VsY/DHH3/kedzcuXMB+Pnnn4Ho9wWLBtkmoO57gEU27Fqz4g+Zxv3ssyIKsV53iURwbAzBn223Ag0//fRTofoZNhbBtmvYfc+yqGU2vI/lxwohWZaFu9GsW3Ic/KIY4H922PVqG0wDfPXVV6npbAazrKadueGGG1Lck51TJEdEREREREIlayI5bq61sfKdbv6m5V/bLF+sGXLjlvKdM2e/92S6AAAgAElEQVROkfQzk1kef48ePQDIyclJZ3dS7tNPP823LVZ5cduQ9t577wWiN47dtm1bUn2wNSOxrlPbANI23yvM70k3W1Nn626sRC34671sU1b7L/glteOtCYv1mDCWPweoXLmyd2zvf7kjYWHibupnkSpbJ+dunmobA5YvX947Z5F++6/LysDbzG+is+f2eFtf9/777yf0c0HjvlZsM133NWnrvf773//m+VnbcNGiNm4p6F9++aXoO5vhbJ0IwD333BPVZptBgzYiB387B3s9uuuTLPrYunVrIDpaY4+38vK2vYBEs60b4m2Q6l6TX3/9dcr7tDPh/CQXEREREZGspZscEREREREJlaxJV3MXStqC0nLlygHw4IMPFui5LAQXL2SXjZYsWQL4C/zefvttr23MmDEAPPfcc8XfsRQZP348AG+++Sbgp7CAX57YdksGuOuuuwBYt25dkfXBSq1a6N3tg4WWg74jcSLs7+zYsSPgL/wGaNiwYb4/Z2k18dKJYj3G0onCxl0cbmlYkyZNAmKX2Q8TW+Rv/x05cqTX1qBBAwAqVqzonTvttNMAv/hMs2bNvDY37W9n3G0FrBCCld4vyveCdLEUn0QXI0vBXHXVVd5x7nQsK6sNsHXr1uLtWABZCWnjpqRamtoxxxyT788PGTIE8LdfkGhWROXII4/M9zFLly71jv/+++9Ud2mnFMkREREREZFQKREJYL3BVG+UdtJJJwH+AmUr9RmLRScABg0aBPibSbkbzaVCMv80Yd9kLlEau+Rlwti5hR2mTp0KQNOmTQE/Quv2K97fZI/59ttvvXPnn38+4C/KT1RBx664xs1KZ7vFMizCYBEKdybYjXwXh0y45tyNgOPNBufmbrJqEcmilAljF1RBHjvbcHHBggXeOSuNbFs3HHDAAcXSl1iCOHYWlXY3i86P+35n3wWfffZZAP76668U9M4XxLFLhBUXcd/TcrMMEoiOYheVgo6dIjkiIiIiIhIquskREREREZFQycp0tUyRqSHNINDYJS9Tx2727NlA9E72iaSrWRrqlClTvHPJLsIParpa/fr1geg0gzVr1gD+vk2DBw/22g466CAA1q9fXyz9y9RrLgg0dskL8tg1btwYiE6ZN1bsoUOHDt45N62tOARx7Cx977XXXgOgTp06Xpu9l9l+WRMmTPDali1bltJ+5RbEsUuE0tVERERERETSTJGcAMvUu/0g0NglT2OXvKBGcoJO11zyNHbJC/LYWZGB999/3zu39957AzB69GgAbr31Vq+tuEtIB3nsgi5Tx06RHBERERERkTRTJCfAMvVuPwg0dsnT2CVPkZzk6JpLnsYueRq75GnskqexS54iOSIiIiIiktV0kyMiIiIiIqGimxwREREREQkV3eSIiIiIiEioBLLwgIiIiIiISLIUyRERERERkVDRTY6IiIiIiISKbnJERERERCRUdJMjIiIiIiKhopscEREREREJFd3kiIiIiIhIqOgmR0REREREQkU3OSIiIiIiEiq6yRERERERkVDRTY6IiIiIiISKbnJERERERCRUdJMjIiIiIiKhUirdHYilRIkS6e5CIEQikQL/jMbuXxq75GnsklfQsdO4/UvXXPI0dsnT2CVPY5c8jV3yCjp2iuSIiIiIiEio6CZHRERERERCRTc5IiIiIiISKrrJERERERGRUNFNjoiIiIiIhEogq6uJiIhIdqlfvz4AAwYMAOC8887z2jp27AjA4sWLi79jIpKRFMkREREREZFQKRFJpmB3igWhHvguu/x7/9ewYUPv3Ouvvw5AzZo1AVi6dKnXdswxxwCwdu3aIutDttRSr1ChAgBjx44FoH///l7be++9B8CRRx5ZoOfMlrFLBY1d8sK2T87EiRMB6NevX562vfbaC4Bffvml0L8n2665PffcE4CjjjrKOzd58mQAtm/f7p3r0KEDACtWrMj3uTJ97O6++27v+IwzzgD88XFt2LABgCpVqhTZ7870sUsnjV3yNHbJ0z45IiIiIiKS1XSTIyIiIiIioaLCA7n06dMH8NMEevTokecxO3bsAKBx48beuREjRgBwySWXpLiH4XDWWWd5x0cffTQAF154IeCPb+7jbHXAAQcAUK9ePQDat2/vteXk5AB+qstbb71VrH2TcCpV6t+PhrZt2wJ6HSajatWqALRr1847d+qppwJ+enONGjXiPsf06dMBaNasWSq6WGwsJRn8tGT7m1q1auW15U5F+eKLL7zjokwFl+xTpkwZAI499lgAhg0b5rXZNThq1Kio/wL8888/xdVFSQFFckREREREJFSyuvCAlat0F7p3794dgNq1a+f7c3/99Rfgz0gB3H777QBs3LixyPoXxsVpNr4PPPCAdy7WIlNjhQfatGlToN8TlLGrVKmSd9ygQQMATjzxRMD/2wDWrVsH+JGZU045xWvr1q0bALvvvnue57c+//333wC8/PLLXttll10GwMqVKwvU56CMXVGySGs8bhQs2YhYWAoPWKR16tSpedr+/PNPAPbZZx8Afvvtt0L/vky/5mzBPMBpp50G+BGcatWqJf283377LQD77bdfvo8J8tjZe9Zdd93lnTv//PPz7Uvuv+XMM8/0jmfOnFnk/Uv32NnngxvpMpbZEKstlhYtWgCwaNEiAB5++GGvbdmyZYXqZyzpHrtEHHjggd6xZTu4kcP8uMUt1q9fn+9zWlaFfUaD/x3Qsnp+/fXXPM+fCWNXUBdddBHgF6sB/7uHfVacffbZXtsTTzyR1O9R4QEREREREclqWbkmxyI4L730EgD77rtvgX7++++/B2DGjBneOSs5LbGVL18e8HPR40VvXAsXLkxZn4qDWx7VncXIj83WxJqtsBlzd9bYrt0xY8YAfpQI/DG39WVhECsiYzPm7lqlZAwfPtw7HjlyZL6/L+j2339/7/jyyy8H/PeqBQsWeG1//PFH1M+5awzvvPPOfJ/fojtFEcHJJIcffrh33Lt3bwDq1q0L+BtVJspmh91/j2effRaASy+91Dt3zz33JNfZgDjhhBOAvNEb17x587zj559/PqptyZIlKelXOtm6X4ArrrgC8NddxhIv0hXrcVaW3NZ/Adxwww0APPbYY0n0OHPYGAwdOhSAIUOGeG1uVkV+Yq09POmkkwDo2rUr4EdqAfbYY498n8u2GBk9evROf2+msagh+BFWy0JZvXq112ZRrFq1agHRn6fJRnIKSt/MRUREREQkVHSTIyIiIiIioZI1hQds0TfA7Nmzgfhp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HnjgAe/cV199VbwdExGRpNl7O8Ctt94KQIcOHQA4/fTTvbYvvviieDuWJebNmwfA8ccfD8DMmTO9tg0bNqSlTyISbIrkiIiIiIhIqOgmR0REREREQkXpaoVQuXJl77hOnTqAvzjylFNOyfP4EiVKeMdXXnllinsXbJ988ol3nJOTA/hlQBcuXJiWPqVTuXLlAOjevTsARx11VJ7H3HnnnQB89tlnxdexgKlWrRoALVq08M5dc801ALRp0waASCTitd18880ATJo0CYDvvvuuWPoZFDVr1gT8lNn33nvPa/vzzz/T0qdMVaFCBe948ODBUW2LFi3yjkeOHAnA7bffDsCOHTuKoXfhYu+Hf/31l3euefPmgH/drlixovg7FjBnnnmmd3zCCScAsM8++wBw8cUXe23/+9//irVfmaZ27dqAP2aHHXaY19asWTMAHn74YQCGDBlSzDeznt4AACAASURBVL2TwlAkR0REREREQqVExJ32DAg34hEkjRs3BuCSSy4BoFWrVl7bQQcdBPh9d4d18eLFgL9IFWDTpk07/X3J/NMEdexM9erVAfjwww+9c3vvvTcAM2bMAKJnp5IV5LGzaMRjjz3mnbNIoJVHdftif4uVR3VnmVIR1Qni2FmEy2bHbbzA72+s156ds6If/fv3T2k/Czp2qR43i5haJOe8887z2qZPn57S310QQbzmcitTpox3PGfOHMCPLrh92WOPPYD45Yxnz54NwKpVq/K03XLLLd7xmjVrdtqvTBi7RNl7/5FHHglA+/btvTb7jL3tttsAuOqqqwr9+zJh7A455BDvePjw4YA/PpUqVcq3X+PGjfOOhw4dWuT9yoSxi6Vnz54AjBgxwju31157AbDbbrvl+3NW6KJHjx6F7kOmjp058cQTvWPLXrLvIu51l4poa0HHTpEcEREREREJFa3JyYfNGlmeP8Do0aOB6NmTRNhGZaVKZe9wW471iy++CECtWrXyPCaMG7nVrVvXO7bITay1IzZL8+mnnwLw/fffe21Vq1YF/HUos2bN8trsOg0jN9pnf3vuqI0r3rm+ffsC8Oqrr3ptzzzzTNF1NqAaNWoE+OPmlrbPHcmxMQL/Gh00aBAAa9euTWk/M8Eff/zhHduaS4tM29on8PP67THudblly5aoc25E0mTb50SNGjW8Y4u42oz62LFjvTabQU8kupXJ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5Zdf9o5t13QrQPD66697bW7qWrazIkbua8/StzIp/TZV7PuX+zlhKWnGLWtuyw2sPLl7rR199NFAYim/mczGYO7cuUD0tiv23nfCCScAsb/3jRs3DoguWBAEiuSIiIiIiEiohKKEtM2k28Z1sTbIcxeU2oxHItzSqbYBnLsA1dhml1YW02awCiOIZQatjKdFadyIlS0utbv9bdu2pbQv8RTH2NmMpF1/PXv29NpibfZqhRksghCv1HGsiEwiJZJjLR6Pda5kyZL5/l1BvO6SZQtQLepqm8SBH80qilK0JtUlpHNzS2nbdei+13300Uc7fQ6btaxcubJ3zv6Op59+Gogu5Wtj6o5lIl577bV824JyzbkbGHfp0gWAO++8E4C9997ba4v3+rFZTlukm2rpGDt3Ftxmbi16A372gpU8t8/HWBo3buwd26JwK+zw5JNPFqqfOxOU6y6W0qVLA9HfN2wbAStA4vb/77//BvzCS24hCNs2oygFcezs+9q8efOA6KJP9957705/3qLOViwF4MwzzwSK9loM4tgl4osvvgDggAMO8M59/fXXgF+u2y3NnQoqIS0iIiIiIlktFGtyrASlRXDcjdps06yCRG/Anw2dPXu2d87d/BNg6NCh3vF///tfIPV3senWr18/wI/grF+/3mu74IILgPRGcIqTXVt2jbhrveJFZGKtu7HyxzfffDMQXfqyQYMGgD9LZf/fZc8Va12Fey7RtSyZbMqUKd6xRXBsLNyoTVFGcNIl1nqieBGTWP766688537//XcARo0aBcCyZcuS6F3msdlwgOeeey7qv+3bt/fa7LOga9eugP++CP4MfLZxIzm2/ipeBMfG010fOHjwYCB4ZWhTzd2E9vzzzwf8z9imTZsm9BwWhbRNfd1sgjfeeKMIehl8NWvWLNTPP//88wBMmDDBO2fRs1RHFYPMMpTsOnUj+7Y+LKjffRXJERERERGRUNFNjoiIiIiIhEoo0tVsgail5Xz55Zdemy2KisXCu1byE/wd6u053UXb9ry2K+7KlSsL2/WM4BZfcNMyILpMtJsmmA0WLVoE+DsFX3bZZV6bLQJ3F2fnTo+y1DSAZ555JqotVrnabGHlZt0SlnadxSvoYSUwzz77bO9c7sWazz77bJH1M8xWrVoFZE+aWiLeeuutPOdiFaHJBm7698KFC4HorRts8XvLli2B6HQsK7d96623AtFp4H369AHgiSeeSEGvg8u2FwC/JPemTZuA6M9YG0d3awIzevRowC8kEoZ03OJWo0YNIPp7X506ddLVncCw4itWcMXSmAGWLl2alj4lSpEcEREREREJlVCUkP7nn38Af3Hx+++/77W5JQTNFVdcAfiFCixqE4uVoIbij+AEpczgtGnTvOMzzjgD8GfjjjzyyCL/fUUhHWPnzvhYFCJeJCeo0n3d/frrr4AfDQM/spC7QINr+fLlQOwS21ZwwUqvpkpxl5AuClbu1120a/8GNqv84IMPprQP6b7mrDz0Dz/8kNDjrdy2ldhu166d12YlZ5966qki61886R67+vXrA4m/v1kE3MZ62LBhXlu8QgWpkO6xi8WKHuXk5AD+Ynjwo9xWXMXtv/07fPXVVyntnwni2NkWF7adhcs2xXYLZORm2zvY6xr8AlNW0KEoBHHscnMLa1mWxC+//AJEb0LtFmspDiohLSIiIiIiWS0Ua3JmzpwJ+KXsjjjiCK/NZo1csTZVNBYFmjt3LgAPPfSQ15Yta3CM5VVb9Ab8vPTjjjsuHV0KtO+//z7msRRM9erVgejS13Xr1gX8aJnNaELsct3GopB33XVXajobAraprY07+JHI2rVrp6VPxc027vzpp5+8c5MnTwb8aKx7fVmZX4vguGuX3Jn3bGBrVd31SRZpaNKkCQAzZszw2iwK++233wJ+Job8K/cGvqVK+V/TevXqBcTehkD80sYWRR03bpzXZpk4L/wfe3ceaNX0/3/8GUrKkIRSIWPSh1SIQuYhRUJSmTIUmTJPSZnHr6JMKRQlUyIhczKUKSWEQolUiApFvz/83muvfe+5t3v2PcM++7we/9j2OvecdVf7nHP3er/Xe40bV+rn7L3dtWtXIJyBYVkrxcKi1P76a1uLc/HFFwO5j95UhiI5IiIiIiKSKLrJERERERGRRElEupotXGzevDkAjRo1qtDPvf3220CQmgbB4rLly5dnsosFo3Hjxu7Y0tX81CtL6yikcKUUFiuFetlll5VqS5WeUfKc///33nsvAAsXLsxkFxPFUotSLawtlrTLX375BQjvdH7jjTcCQTp0tWrVXJul8Nq19tBDD7k2fzfwYmBj4G/XsOeee+arO4mzwQYbuGO/wIWU7b777gOCv2Eg2FpgwoQJQDhNsnv37kCw5OG5555zbW+88UZ2Oxsz9p3ppyrb38p+2mmhUCRHREREREQSJRGRHCuZaKUX/UXJqTZyuv322wH47bffgOKbeSvPNddc445t8fHZZ5/tzhVKGWQpXFa22N8Ez0qCWlnpVEUGbLHoCSec4M5NmjQpa/1MCiu9nUqxbPBrERx/I+kDDzwQgEMPPRQIil9AUHbboo5DhgzJST9FfP57t6Llz4uBbVbrbyprm3VbgYy///7bte26665AUCo/21sNxFHVqlWBcDaPsQyelStX5rRPmaBIjoiIiIiIJIpuckREREREJFGqrIphofU47AIeB7ncFbd27dpAePGoparst99+7tzixYsjPX+uFcKOwnEVx7GztFNLNbWdqSHo7zHHHAPA008/ndW+lCfdsYvTNXfssce6Y0vNsjQuP7UjG+J4zRUKjV10hTB26667rjseP348AG3atAHCe5nYYvtcKYSxs79rAHr16gUE+4FttdVWrs1SpD/++OOc9CuOY7f++usDQSruF1984dratm0LBGmA+ZTu2CmSIyIiIiIiiaJITozF8W6/UGjsotPYRVfIkZx80jUXncYuOo1ddBq76OI4djVr1gTgm2++AWDw4MGuzS9IlW+K5IiIiIiISFFTJCfG4ni3Xyg0dtFp7KJTJCcaXXPRaeyi09hFp7GLTmMXnSI5IiIiIiJS1HSTIyIiIiIiiaKbHBERERERSRTd5IiIiIiISKLEsvCAiIiIiIhIVIrkiIiIiIhIougmR0REREREEkU3OSIiIiIikii6yRERERERkUTRTY6IiIiIiCSKbnJERERERCRRdJMjIiIiIiKJopscERERERFJFN3kiIiIiIhIougmR0REREREEkU3OSIiIiIikii6yRERERERkURZK98dSKVKlSr57kIsrFq1Ku2f0dj9R2MXncYuunTHTuP2H11z0WnsotPYRaexi05jF126Y6dIjoiIiIiIJIpuckREREREJFF0kyMiIiIiIomimxwREREREUkU3eSIiIiIiEii6CZHREREREQSJZYlpEVERCR5DjroIAAmTJgAwFlnneXahgwZkpc+iUgyKZIjIiIiIiKJokiO5NQGG2wAwE8//eTOvfPOOwDsu+++eelTNm2yySbuuFGjRgBceeWVpR732WefAXDJJZfkpmMFwL8eDjvsMAAuvPBCABYuXOjafv31VwBGjhwJwK233ura/vjjj6z3U0QqrkWLFqH/r1WrVp56IsVkww03BOD0008HoE6dOmU+9ttvv3XHjzzyCAC//fZbFnsn2aJIjoiIiIiIJIpuckREREREJFGqrFq1alW+O1FSlSpV8vbaG220EQBnn302APvss49rs/CmpRZdccUVru2rr77KeF+i/NPkc+wqYsCAAUA4ZWvYsGEAnHLKKRl7nXyP3SGHHALAnXfe6c4tWbIEgB133BGA6tWrl/q5xYsXA9CsWTN3bu7cuRnrV0Xke+zMxx9/7I4bNGgABOPjpwGut956oZ+bNWuWOz744IOBcPpBNqU7dtl+v/bs2RMIPseeffZZ1/bYY49l/PXWWOO/ebNHH33UnTvmmGOA4N+zZLoSxOeai2q77bar0OOOO+44AKpWrQrA/vvv79rWXnttAMaPH+/OffLJJwA88cQTZT5noY3d1KlTgeA92a1bN9e2fPnynPal0MYuTuI8dvb+8v9+e+ihhwCoW7dumf1K9TuNGDECgBNPPDFj/Yvz2MVdumOnSI6IiIiIiCRKUUdyNt98cyAcQejRowcA9erVK9WXkkM1e/Zsd9yyZUsgs4vTknS3v/vuuwPw1ltvAcFMC8BRRx0FwNNPP52x18vH2Fn0BoLfxWZnfTNnzgRgzpw57tz2228PwFZbbQUE1yEEka5cict1t/XWW7tjG0eLotr7DeDcc88FoEOHDgCsu+66rs0irBY9W7lyZcb76YtbJKdVq1YATJo0CYClS5e6NisCUln+zOjAgQOB4D3tGzx4MADnnHNOqba4XHOprLXWf/V59tprL3fu6KOPBmCXXXYBgnHOhBUrVrjjH374AQiKlqQS57EzBxxwgDt+6aWXAGjevDkQjtjmWr7Hzj7Xzj//fHeuffv2AOy5554A3HDDDa5t+PDhZT7XzjvvDMB7770HwHfffZexfqaS77Erj/29MXny5DIf88Ybb7jjl19+GQi+f/2/CRXJge7duwPBuLRt29a1WebE8ccfD8CXX37p2ix7JZMUyRERERERkaJW1CWkbVbXNiWDYEbd8sjL48+uWV7x3XffnckuFrQtt9zSHVuOvh/BSQqL4PiRKJuh82eLbLbOohF///23azvwwAMBeOqppwC4+eabXZuVSM5kpKsQfP3112W2WV4/BLNMxx57LAAPPPCAa9tmm22AYP3c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G+aOLcXAfk+/qELNmjWBYDdsv5Sllae18ubFxlKCrAz8d99959rikKYWF1aK2y/zb4VsDj74YCD83rISyVbC3R4LQfEQSxH0CxYU6+elX0Dg/vvvB+CAAw4A4Pbbb0/5uGKy1VZbuePy0vceeughIL9pavlg5d7PPfdcd84Wxtt15LP3sRUZAOjfvz9QvO/BdKX6+zgV+3zLdppaVIrkiIiIiIhIoiSq8IDxIyw241GrVq1Sz1/er26FA/zNA63wgC3Y/eSTT1ybzQ74i8krK9+FB2yRtl9G24o6TJgwoVKvk21xWdhns8AAzzzzDBBs6GYbNEL0SI7p1asXEJ65st/HL59ekc0I4zJ2PovWvPrqqwC0bNmy1GNGjhwJBFFGCEcuciFuhQdsTGxTRSsXDeWXhs+1OF5zhUJjF12+x84+j++44w53rmfPnmU+3hbUl1c8KVfyMXYbbLCBO7btE/ztOoz93RfXMtH5vu4q4tJLL3XHlhGQihXnOvHEE7PeJ1DhARERERERKXK6yRERERERkURJZLqazxbS+zW/bY+NBQsWAPDwww+7NkuDsVQiewwEKTNWqz7bCiGkGVcau+g0dtHFPV3thhtucG353J+kJF1z0Wnsosv32FlqvZ/6Xh7bm2/o0KEZ60NU+R67QlYIY+entvsFWQCWLVvmjvfaay8g2Dsx25SuJiIiIiIiRS3xkZxCVgh3+3GlsYtOYxdd3CI5hULXXHQau+jyPXZW6Oe+++5z5yzTZOHChQBce+21rm3w4MFAUPI8n/I9doWsEMbOfz0rUnPkkUcC4QI2Y8aMyWm/FMkREREREZGipkhOjBXC3X5caeyi09hFp0hONLrmotPYRaexi05jF53GLjpFckREREREpKjpJkdERERERBJFNzkiIiIiIpIouskREREREZFEiWXhARERERERkagUyRERERERkUTRTY6IiIiIiCSKbnJERERERCRRdJMjIiIiIiKJopscERERERFJFN3kiIiIiIhIougmR0REREREEkU3OSIiIiIikii6yRERERERkUTRTY6IiIiIiCSKbnJERERERCRRdJMjIiIiIiKJsla+O5BKlSpV8t2FWFi1alXaP6Ox+4/GLjqNXXTpjp3G7T+65qLT2EWnsYtOYxedxi66dMdOkRwREREREUkU3eSIiIiIiEii6CZHREREREQSJZZrckRERCR56tWrB8C8efOA8FqDAw44AIBXXnkl9x0TkcRRJEdERERERBJFkRwREZEybLHFFgCsueaapdp23nlnAPbZZ59SbYMHDwZg5cqVZT73999/746rV68OwO+//x69szFVt25dd/zcc88BQZUkv1pSkyZNAEVyRCQzFMkREREREZFEUSRHssbyqwGuvPJKAI477jgAfvzxx7z0Ke522203IJjVBXjzzTfz1Z2ss3z8atWquXOHH344AH379nXn/ve//4UeP3fuXNfWv39/AIYOHQrAv//+m8UeS7HYe++9AXjxxReB8DVakr+uxCITdh03atSozJ979dVX3XGdOnUA+O6779y5jz76CIB+/fql0/XYsc81gGbNmoXalixZ4o4nT56csz5JcWratCkA119/vTtnEcStttoKgDPPPNO1TZgwAYA5c+bkqIeSSYrkiIiIiIhIougmR0REREREEqXKKn/VX0z4of9caN++vTu2UKZ555133PHrr7+eqy4B4QWZFZXrsUvF0jqefPJJd65du3YA7L///gC89tprWe1DIYzdpptu6o5vuukmAI4//vhSffn777/LfA5LpXn66acBeOSRRyrdr1yO3bHHHgvAY4895s799ddfADzxxBPu3Keffhr6ua5du7pjS2UbMGAAkN/UnnTHLg7v1ziIy/t1k002cce2QL5FixZp9SUbX6mpih5U5vVydd3ttNNOQPA5BeExBjjqqKPc8dixY3PSLxPnsYu7Qhs7ex+/9NJLANSqVavMx/7xxx/u2NLVTjrpJACWL19e6b4U2tjFSbpjp0iOiIiIiIgkSlEWHrAZ9F69egFw2WWXuba11goPiV/+0xaSvvzyy9nuYkEbOHAgEERvJOzCCy8E4Pzzz3fnbIO8VNZZZ50y24488kgAOnToAECDBg1c25AhQwD49ddfo3c2g9Zbbz13bMUC9tprLwBGjBjh2m6++WYAZsyYUeZz+ZHASZMmAcFC8apVq7q2FStWVLbbiWfXYcOGDd25Pn36lPl4u+YsenjQQQe5tkL/bPTHwMpDm3/++ccd33///UC4AIaxstBPPfUUAK1bt3ZtLVu2DD12+PDh7tgyCvzF936WQSE6+uijgdLRGwh+z+effz6nfZLiUbNmTXd81113AVCjRg0giPxD8F41fiTHLwIEcMwxx7jjzz77DCj/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6VjZHot0xOX96n9PWEqGFagoz5IlS9yxfbZZUQH/s852YLe0y7/++quSPY7P2BWiQh87//1sxWcsRd8vUHPRRRdl/LXjMnZ+upq918rrm6WV+985ll6ZK3EZu3RZsRp/u4XBgwcDwXKRbEt37BTJERERERGRRElkJCcVfzNHm6GzxaY+m1nr379/qTZbtJtu6d+oCvVu34ov9OnTp1SbbWSZ7c23CnXs4iDfY2fPdfTRR7tz++67LwBHHHEEEC4aYBFD2wju4Ycfdm253tQzn5Ec29zONvmEoFR3p06dgCCiGjf5vuYKmcYuukIfO7/Ygz+7DuECTDNmzMj4a8dx7Cz6v99++wFBsQEIoqj9+vXLah8qIo5jV561114bgEmTJgHhTWhz9TedUSRHRERERESKmm5yREREREQkUYomXa0QFVpIM040dtFp7KLLZ7qaFWyYMGGCO2dFGE444YSMvU426JqLTmMXXaGPnb/o3gojWYpWMaarFYpCG7tXXnkFCNLG/T1xevfuDcDKlStz0helq4mIiIiISFFbK98dEBGRzFmwYIE7vvHGG/PYExHJJtttHnJfZEWKR4MGDQD46quvgKDID+QughOVIjkiIiIiIpIoiuSIiCTASy+9BEDdunXz3BMRyTXb0HL58uVAuMy+SGVsv/32+e5CZIrkiIiIiIhIougmR0REREREEkUlpGOs0MoMxonGLjqNXXT5LCFdyHTNRaexiy5JY1enTh0A/vzzTyD76WpJGrtc09hFpxLSIiIiIiJS1GIZyREREREREYlKkRwREREREUkU3eSIiIiIiEii6CZHREREREQSRTc5IiIiIiKSKLrJERERERGRRNFNjoiIiIiIJIpuckREREREJFF0kyMiIiIiIomimxwREREREUkU3eSIiIiIiEii6CZHREREREQSRTc5IiIiIiKSKGvluwOpVKlSJd9diIVVq1al/TMau/9o7KLT2EWX7thp3P6jay46jV10GrvoNHbRaeyiS3fsFMkREREREZFE0U2OiIiIiIgkim5yREREREQkUXSTIyIiIiIiiaKbHBERERERSRTd5IiIiIiISKLEsoS0iIiIJMNxxx3njrt06QLA4YcfDsAaawRzrX379gVgwIABOeydiCSVIjkiIiIiIpIoVVZF2ZUoy/K56dF9990HQN26dQHo37+/a/vpp58A+OeffwD44YcfstoXbRgVXaGN3amnngrAnnvuCcDJJ5/s2uw6u+eee0r93K+//grAoEGDMtaXfIxd1apV3fEhhxwCwJZbbunO7bDDDqHHb7LJJu64U6dOQNDvZ5991rU988wzALz++usAzJkzp1L9XJ1C3Ay0Zs2aAMyePdudO+eccwAYNWpUTvpQaO/XOInz2G2zzTYAvPzyy+5cw4YNQ4/p2LGjO37//feB4Ls22+I8dnFX6GNn37kAJ554IgCtW7cGoF27dq7thRdeyPhrF/rY5ZM2AxURERERkaKmmxwREREREUkUpasBQ4YMccenn346UH5IbPny5QAMHTrUnbvqqqsA+P333zPWrySGNA8++GAAjjnmGHfOQsMWFj7llFMq/TpxHLuePXsCQUpa586dXdtaa61VqT48+OCDQDgEH1U+xq5+/fru+LvvvqvUc6Xy0UcfAbD33nu7c8uWLcv46xRiutoFF1wAwC233OLOHXjggQC88sorOelDHN+v9p601GX7bqiMs846C4DatWsDMHXqVNdm16Z9v1RUHMfOzJgxA4Dtt9++zLadd945J31JJc5jF3eFNna77747AI899hgQ/s6xv9vuuusuIEhvLnmcKYU2dnGidDURERERESlqRV1C2mbWbdFZRdWoUQOA3r17u3P77rsvEMyALliwIBNdTIx69eoB8PjjjwOw7rrrujZbPP/oo4/mvmNZYpGVo48+2p2zBd7lzcjMnTu31LkGDRqs9vVs8f3AgQPduWnTplWsszGwcuVKd7x06VIgGK9M2GWXXYBwIZELL7wwY89fyDbffHMgfF1+++23+epOXvnv16uvvhqAJk2aZPx1/v33XwCaN2/uzq2zzjpA+pGcOGrVqhVQusiA79prr81Vd0RcgYstttgCCH/XXnLJJQA8//zzQDLeg/IfRXJERERERCRRijKSs9lmmwFw8cUXA1CtWrVKP+eOO+4IBDNYfhlbgeHDhwPhCI5p3749AJMnT85ll7KqQ4cOQPj3HTlyJBD8nhbV8q1YsaLUOSuvbGWU33zzzVKPsfUD66+/fmW6nTd+ydiuXbsC4cje9OnTgSDCcP/991foedu2bQvA5ZdfDkCPHj1c2x133AHAvHnzIvY6WWK4PDNnbENKe99C6QiObR0AQbQx1fvN3sN//fVXqZ/zjwH+7//+zx1nY41Yvtx+++1AkPWQypQpUwA44YQT3DmL/Fx33XVZ7F1+2NouP4L15JNPpvUc9nn2999/A+HIY6p1T8aitDfccAMQfB4m3QEHHOCO7e+9e++9N/T/kNm11IWqcePGQLAhr23aC7Bo0SIgeF+OGDHCtf3888+56mIkiuSIiIiIiEii6CZHREREREQSpSjT1WyhrS1A81mKTPfu3Uu1tWjRAgjKRe+///6uzcLyTz/9NAD77befa3vjjTcy0e2CYyUbISjMYGbNmuWOk7jIuWnTpkB4MbeFdf1F9ulYsmRJmW1WvGHSpEmRnjtOxo0bB4Tfn5YeZClAFWWleo2fXmSFQy677LJI/ZTk2HTTTYEgVdL3ww8/ANCnTx937q233gKCxcy+OXPmAPDFF18AwXsTYPHixZnpcIxUr14dgF69erlzlr6dim29MH/+/FJtH374YYZ7Fx+WunzyySe7c3bsf09UJG3066+/BmDhwoXu3LvvvgsE112jRo1cm5Unt3S3pLNCPGPGjHHnXn75ZSB8nZZlvfXWc8e33norEIznSSed5Nrss6HQbLPNNkCQmgbBZ5kV/PGvQ/seve222wA4/vjjXdthhx0GxDdtTZEcERERERFJlKKJ5Ky99tru2BY6ppoxsRKCqXzwwQcAHHnkkaHngaBksLENLqF4IzlHHHGEO15zzTVDbTaGkMyF3z/++GPGnmujjTYCgoXyvj/++AMIlzNPiqiz3lZYBMIzVSVZZFakPL/88gsQnhU2/kbSxWqDDTYAwpvJlvTpp5+647PPPhsIFs8//PDDab2eldr2izjYc8WZbXLsf+6MGjUKCMYEYPbs2QBsueWWQBAZ9FmhlvIWzNtz+5JU3CcV++y3TXf9v/EqsrGxRXmOO+44d65Nmzahx5x22mnu+Jprrone2RzzMyOGDRsGQOvWrSM9l38NW/GUVFHwOFAkR0REREREEkU3OSIiIiIikihFk6625557uuPTTz891Pbll1+641Qh3rLYQj8IUmtsgVbnzp1dm1+PvRjYIl5/QbeFja3eeqpFp5KahYNLFm8AeP311wEYO3ZsLrsUS5be4Y9FebvVp1vEIOn8xc8SsCIDkppfZKckW5jtp/+kk1pm72kI9naxfdX8Rd/nnnsuEO/CK/Z7f/zxx+6c7U2SyldffRXpdXbbbTcADjroIHfOUt7KS99Ngu222w6AnXbaCYAZM2a4tptvvjn0WFtgDzBw4EAgKAThp7nNnTsXCP5ufP/99zPd7Zx45pln3PHOO+9cqt2uT0vL7devn2uz8bD9xJ566inXZn/rWkrqjTfemMFeV54iOSIiIiIikihFE8k5/PDDy2wrr9hAefwIkJUMtuIEfglCm13wH59EtkB+woQJQHg2xI4nTpwIwG+//Zbj3hWWZs2auWO/gAPA1KlT3bGVdEw6K9feo0ePMh9z7LHHAuVHJPyFumeeeWaGehdfVu5+5syZADzxxBNlPtZ/v+6zzz5A9NnkJClvJ3kpP1pqBWasrHFF2SLpF1980Z3beuutQ4/ZeOON3bH9G8U5kpMrtnWDFYQAGDlyJADLli3LS59yZZdddgFgww03BOC5554r9ZitttoKCP/dZ3+jWREkKxsNQVGp8oo8FAL/b1Lj/0166aWXAuGIT0kWybGCR/45K0+uSI6IiIiIiEgWJT6SYzOS/kZu//77LxCU3c1EGdAFCxYAwWxorVq1XJvlhyY9klO1alUgWJPjmz59OgDnn39+TvtUaCwadv3117tztomczaoffPDBrs3K2yaRH5Gxsp3HHHNMpZ7Tz6f+/vvvK/VcceXnmlse+fLly4HyIzn+eBdr2ftUbBNBf/3E559/nq/uxI6/OWJJ6b7HOnToAASzwSWjN1K25s2bA0H01l+z5JeoTrLhw4cDcN555wHhbT5sDbWtIfMjtJaBY+tLvvnmm6z3NQ7uvfded1xeBMfY387+37KtWrXKfMcySJEcERERERFJFN3kiIiIiIhIoiQ+Xa1du3ZAEGaDYBHk448/nvHXs3Q1vzytlU1OOtst2NLVli5d6toshP7jjz/mvmMFpGPHjgAccsgh7pwteLQxTHKKmq9atWru2C8lG4WVbbWF0Enmv+9sobEt0rZrCODNN98M/ZxfeKA8lgJcLCltljpqC3MhWOBuu9g/8sgjpX7OSqr6/x5J9PDDDwPh8THpliVfc801gdTFHmw87XX8IgP+lg3FytIGLeXZig0UE/tutGtkxIgRrm3w4MFA8H607Rcg+L5Np7x5oXnhhRfc8VlnnQXAe++9l9ZzWIGGAw88sFRb3bp1AahRo4Y7F4dCF4rkiIiIiIhIoiQ+kpNqhscWoGUywtKwYUMA1llnHSAoRADw2muvZex14uyoo44K/b+/6dmzzz6b6+4UFFtQ75euNJdccgkAo0ePzmmf8s2PhtpC0F133TXSc9mMexxmlnLJZtKtpOo111xTqi1VBOftt98GggW5derUcW22kZzN6n377beZ7nbOdevWbbWPWX/99d3xYYcdFmrr2bNnqcdbhOOmm25y55JYsKBBgwZA6uuoItHBli1buuO77ror9HMrVqxwbVa0xr5PrSBLMevevbs7tiIj9hl3++2356VPcWCFn/zvkOrVqwPBxqh+AR//OkuqK6+80h1buWf/77Krr74aCG/0aawAyGOPPQZAvXr1Sj3GCmz53xX2vZtPiuSIiIiIiEiiJD6SY/zNi+68886MP/8DDzwAQO3atQEYN25cxl8jjmz2CGDHHXcMtVk5Rwmza8TWiwEMGjQICGaLrWwtlF/2t1hYNMsipn6JdpsdtzUmVoYWghmr9u3bA+Hr9b777steh2PCZsQtsnzttde6ts033xwIohB+6WmbjbNc9RkzZrg2W9eUhAiOsfebv2l0mzZtVvtzs2fPBqBRo0al2qx87aGHHurOWdRi7ty50TsbM7aO0Gf5/xVZP+ivFbCIo7F1nlA6I6Lk900x6tq1qzu2LRzGjBkDhDMpis3ChQuB8N99FsmxzWv9aOzYsWNz2Lv88Ddgv//++4Hwxp32N4gf8TGptgUpFIrkiIiIiIhIougmR0REREREEqXKqorWDc2hdMtOlnTssce6Y1soNW/ePHfO0jSiWmut/7L8/LCeX5oVwgtRLTSYrij/NJUdu4paY43/7o/9tDxLbXnyySeBYJd6CIdKcyHOY2e7T6dKm7Qyqfvvv787Z6H3XMnH2NmiRQjSUD777DN37pNPPon0vJYyaQt0/bHMRgg+3bHL9jVn5Z5//vlnIDymxnav3mabbdw5Kyrw1VdfZbV/Ji7v17XXXtsdN2vWbLWPt+8C/ztn3333BYJSvv4CedtV3L4fli9fXske52fs/GIBVsrZxgLg3HPPBeDuu+8u8zms7Pbxxx/vztnvMnXqVAD22msv12aLw0888UQA7rnnHtfWu3dvAIYOHZrW7xGX6y5d9evXB2DmzJnunG2TYSmXfontbIjj2NnnlqVA2nUEQWrpxRdfDITfe3369AHg3nvvzWr/TFzGzv87wwoOrLfeeqv9OT9V2UpH22fngAEDXJsVM8ikdMdOkRwREREREUmURBYe8O/07DiTAatTTz0VCEdy7Pnnz58PRI/eFIoLL7wQCG9aOXnyZCDYPC/X0Zu4swW61113Xam2iRMnhtrSjd7YolMr9Qjw008/AfHePLRp06ZAeGO2DTbYAAhvzGZFAqwE8uLFiyv0/BdddBEQLDbdYYcdXFurVq2AoKR8ElVkw06L7tg1BMkqKpAOv+RsOhvlWcltCDaytMIDPXr0cG1WqtrGt2/fvtE7m0dWCASCCI4f9Rs1alSZP2sFV/wCIea2224DgsXzvn79+gFw5plnAuENvotlmwZjkUA/SmifjdmO4MSZ/W1mm0f7GTVWmMaK1xx33HGuzSKBtkF8nL8zM+mVV15xxy1atACCjT7tu9lnkUPLkILgb0H7TLAsn7iIV29EREREREQqKZGRnGyxWbczzjijzMekKqeZJDVq1ADCpXiNbSxVzKUrS/KvB9sc0Er1fvjhh66tS5cuQPkb1FarVg2AzTbbzJ2zTUQtKmGzMAC77bYbEM9ZKZuBtKifRW989vtCMNNms8D+7Hh50Qpbi2IRMn+jsyFDhgBBqeClS5em+Vskg12PW2yxhTtnx7lak5MkX3zxBQBXXHEFEET3IViHZ3nshcrWPlSUH2G2tTh+yXJjUQj7zPLXLZb8znnwwQfdsW0WnHRW2t1mz3///XfXVqwRHFsDB0H01NZr+VF6i9LefPPNQDiSY5H+Ymaf9el+5vvbCwCccsop7rjkWvV8UCRHREREREQSRTc5IiIiIiKSKIlMV3v++efdsaUK1KtXz52zEJpf6q4kSwnyiwtYiowttPzhhx9cm+0k/tFHH1Wq73HXuXNnIPUO33456WJnIfQRI0a4c+ussw4QlLW87LLLXJulSllpUFscCUEp7tq1awNwxBFHlHq977//HginUn7++eeV/C2yx8p4WvpZRdl19+KLL7pzVvbTUt/89Dy/eEFJVrbaPhuKNTXLCg/45UQlcyylNEneeecdd2ypa34JcktdPvLII4GgnDbA+uuvX+bzPvTQQ0CweNlfWF/yMZYOWEzuuusuICjXaynQEF5EXkxOOukkd7zxxhsD8NJLLwHhdD6z3377lflcG264IRDPFO+4si1D7G/lipSgziVFckREREREJFESGclZtmyZO7Y7+QYNGrhztoCxVq1aZT6HzTBvu+22pdqsdKWVtYXcbSKVD/6mibbY00pm24w8xDtykAsWqYGgnKJ/zlgEcO+993bnzjvvPKBikY1//vnHHVup8oEDBwKF829gBSyMH3EZOXIkEGzoBnD00UcDwaaLfrljK0pg/7VSoRCU4vaLNYjkgpXX33333fPck8zzS/NaoYVbbrnFnbPf2S+6UBHlRXmmTJkCBBFwKyqSdBadADjooINCbR988EGuuxMbVjDGig1AUPRo7NixpR5vY2dlyn29evUCiqeARSbZpqrTpk0DoHXr1vnsTimK5IiIiIiISKIkMpLj69+/PxDMDkOQg3/uueeWenyVKlWA8jcRtecsb01Pkhx11FHu2MbD1kRYqUYJr4cpOePms03wUm2Gl4rNlMybNw8IX3dWjrXQWPnmr7/+GghHbebMmVPq8ePHjw/9vz921atXD7X5EbLyWETW31SwGNkGbz4rqVos65SsnLG/Fi5qVLRTp05AUM7djzqaJM3A33333UB4o12/jGwU3333HRD+frG1OAsWLKjUcxcafwys1L5tljps2LC89CkOrIy2/zfa5ZdfDsAmm2wCQNeuXV2brRmx9a+jR492bcU8jpli69H9vxcPP/xwAJ577rm89AkUyRERERERkYTRTY6IiIiIiCRKlVWp8rHyzFLGMslPV7MyyOW9dqphsd3rc1UqOco/TSbHzoo1+GWxrRSopSbYotO4ycfYnX322e7Y36m7IlasWAEE6Vt++NxSE1KlcWVDvq+7ivBL0vbp0weASy+9NK3nsJKr5aUWpivdscv1uJXHL7dqJfFvuummnLx2Pq656667zh3bwmM/tcx2SH/qqaeAoIQ7BJ+NftlkYyVUbasBny3It89Uv4hIVHF5v1pZY4C2bdsCcPDBBwPh8uQ77rgjAMOHDwfC152lqVkarhUOyZa4jF0qzZs3B2DChAnunF2Te+21F5C774RU8j12lvLsp4nbdWOloP1CPlbcxlKnrAAV5L5kdL7HLhvse9S/Xp955hkgnMJWWemOnSI5IiIiIiKSKIkvPGDOOussd2wlZm0WrkWLFqUebxuK+ovT0i2HWehsIzZ/BtMW7dmMkgQGDRrkjqtVqwZA37593Tmb4Z0+fToQvrasNHexXWNRLVq0yB3bpoA2nv5mqbYZYbNmzQD4888/XdvNN9+c9X4WEr/0dp06dfLYk9zwy5jbgu5U7bYJdLpmzZoFBKWkIYhUJLHYhf+dYIVp/E17pWLse9c+z1JFrfMZwYmzbt26hf7fLwltpcefeOKJnPapWNjWLX502qK2VtjF/n7MJUVyREREREQkUXSTIyIiIiIiiVI0hQcKUb4XpzVu3BiAGTNmuHOTJ08GgoWPcZXvsStkGrvoCrnwQD7l45o79NBD3XGrVq2A8OfaW2+9BQSLZv203QceeACAzTffHAjvum5FQ/r16wfA3LlzK9XP1dH7Nbo4jt35558PwK233lqqrXfv3kCw6D6f4jh2hSLJY+dfm1YUYo899gDgvffeq/Tzq/CAiIiIiIgUNUVyYizJd/vZprGLTmMXnSI50eiai05jF10cx+7nn38Ggsih/T8Epbk///zzrPahIuI4doUiyWN3wAEHuOOXXnoJCLZd8YsCRaVIjoiIiIiIFLWiKSEtIiIiEmevvfYaADNnzgTgjjvucG2//vprXvokUlFTp051xxMnTgSgSZMm+eqOIjkiIiIiIpIsuskREREREZFEUeGBGEvy4rRs09hFp7GLToUHotE1F53GLjqNXXQau+g0dtGp8ICIiIiIiBS1WEZyREREREREolIkR0REREREEkU3OSIiIiIikii6yRERERERkUTRTY6IiIiIiCSKbnJERERERCRRdJMjIiIiIiKJopscERERERFJFN3kiIiIiIhIougmR0REREREEkU3OSIiIiIikii6yRERERERkUTRTY6IiIiIiCTKWvnuQCpVqlTJdxdiYdWqVWn/jMbuPxq76DR20aU7dhq3/+iai05jF53GLjqNXXQau+jSHTtFckREREREJFF0kyMiIiIiIomimxwREREREUkU3eSIiIiIiEii6CZHREREREQSRTc5IiIiIiKSKInSH0kAACAASURBVLrJERERERGRRNFNjoiIiIiIJEosNwPNtfbt27vjFi1aANC3b18A3nzzTdf24osvAnDXXXcB8Pvvv+eqi0XFxt7Xv3//PPQkuoYNGwKw5557unNt2rQB4MgjjwSgdu3arm3evHkATJkyBYCzzz7btS1evDi7nRVJw/vvvw8En5VHHXWUaxs7dmxe+pRN9erVA2CdddZx5xYtWgTAb7/9VurxW265JQCHHnooANtvv71rO+2000LP9dRTT7m2kSNHAvD0009nqusFZ7311gPgtttuA6BHjx5lPrZWrVruWN/FUlH2PdyxY0d3brfddgOCa2rOnDmu7eOPPwZgwIABAPz999+56KZkiCI5IiIiIiKSKLrJERERERGRRKmyatWqVfnuRElVqlTJyetYutD48ePduV133bXMvthQLV26FIDevXu7tocffjjj/YvyT5OrscskS1HYaKONAHjnnXdcm4WGt9hii7SeM5djd+qppwJw/PHHu3NNmjQBoE6dOqWevyJ9u/POO93xBRdcEKlfUcXxurP0nsMPPxwIpzTuuOOOZfbFfpdJkyYB8MILL7i2G264IeP9THfsCuX9aqlXAM899xwQ/K59+vRxbQMHDoz0/HG85uwzx1JI7fMJ4LPPPgPgm2++KfVzNlZrrrlmWq83e/ZsALbZZpu0fi6OY5cOP23oqquuAmDnnXcGyv/dLrroInd8xx13RHrtQh+7fCqEsatRo4Y7ts9+S02zFHGA+fPnA7D11lsDULdu3VLPNX36dACuu+46d2706NGR+lUIY+dr164dELxX/RTcUaNGAXD33XfnpC/pjp0iOSIiIiIikihFWXjgoIMOAuDSSy8FSkdvVqdmzZoADBkyxJ2z2bsuXbpkoouJ58+wDBs2DIDdd98dgI033ti1vfbaa7ntWBq6d+8OwKBBgwCoWrWqa1uyZAkAP//8sztnMzGzZs0C4OWXX3Ztm222GQAnn3wyAF27dnVt9vz+YsikqV+/vju2qE3Pnj3duX322QeA5s2bl/rZkjM7qWZ6WrduDUCzZs3cuQ8++ACAl156KWq3i0bJaJlv5syZOexJ7pSMMPtsPCxim65ffvkFgOXLl7tzjRo1ivRchcY++wcPHgwEhVgA1l133dBj/ai+zR5bBoZ9jibBhRde6I5vueUWAP79918Avv32W9dmi9/9iLSxIhj+NVXsjjjiCHdsBUEOPPBAIIju++z6s+8LgG7dugHQqVMnAB555BHXFjWSE0drrfXf7YAV4vKLPTVt2hSAlStXAuHiC61atQJgp512AuCMM87IfmfToEiOiIiIiIgkStGsybF1ExDk7/rRhJIs59rPM7R1EnbH61u2bBkA5513HgBDhw6tZI8LL28zHVZiGYJc9Oeffx4I/w4W0Ui3RGguxs7Kv+6xxx4APPTQQ67NyozPnTs3ref89NNPgfAM8Y033gjAFVdckdZzRZWLsatevToQ5OD7709/HVM22UywRRBTlQNOV1LX5Eyb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AEyZMiXsUwSnlipSZmb14kiOmZmZmZkViiM5ZjmwwQYbAHDooYcCMHz48HBMs6H675gxY8KxyZMnA/DYY4814zRzY4011gjbyu0fOHAgkJ49fvrppwHYbLPNAHjxxRebdYpmHUGfR4suumi3j3nnnXfC9uuvv97oU7IOt8ACCwDJ+i+A1VZbDYDddtsNgJVXXrmi5zrrrLMAOP744wF47bXXwjFHKvPPkRwzMzMzMysU3+SYmZmZmVmhOF3NmuLHP/4xAEcffTQA5557bji2zz77tOScmu2zn/0sAF/60pcAOOqoo8KxzTffHIAFF1wQgH/961/h2NVXXw3ALrvsAsAiiywSji288MINPOP8+PKXvwwk6XwjRowIxzQeWeVqv/CFLwDwxz/+EYBvfOMb4dg///nPxpxsh5kxY0bYVhrh1ltvHfbdfffdTT8na6yFFloobFfyGXTYYYeF7b/85S8NOSfrTP/3f8lcvb4jjzzySAC++MUvdvvnsr4vsuy7776p/+61117h2MUXXwwUK21t2WWXBZL0PEj/nXsSp85fddVVAPz85z8H4M033wzHPvroo16dZ6UcyTEzMzMzs0KZ75Mc3oLON998rT6Fiqy77rphO55NAHjiiSfCdv/+/QF45plnwr558+b1+Py1/NPkdexmzpwJwNprrw2kZ9FXWGGFur9eHsfuySefBGDAgAElxzT7ceaZZwJw/vnnlzxGs0a77rpr2HfMMccA8JOf/KRu59nqsfvUp/4XYP7ud78b9p1zzjmpY7FHH30UgLfffhtI3m9Qem1ts802YftPf/pTnc44Ue3YNev9uvjiiwPpmbR6PWdczOHTn/40kERsobJrs9XXnGy66aZhWxGHYcOGAUmDS4CJEycC8KMf/aiq59dz/PWvf009T2+0Yuzif1NFV7Oe//777wfgW9/6Vjj28ssv9+q16ykv1107avXYLb300gCccMIJYd8ee+xR03PNnTsXSL5f4ihPuYIaffv2BeCNN96o6vVaPXZZlltuOQBuvvlmoHwUrFYPPPBA2FZ2jzJVoLJxqXbsHMkxMzMzM7NC8ZocYPXVVw/bgwcPBmDPPfcEkhK0AE899RSQND8bOnRoONb1Lvuaa64pef5LL7007ItnHzrBaaedBsAll1wCdF7JY4D//Oc/qf+PZ9U33nhjIJlRyvLss8+W7Js+fXqdzq614ujLr3/9ayBZp5RFUTFI1tm89NJLAHzmM58Jxw4//HAgydHuNFr39f3vfx+AnXfeORy76667anrO+eefP/Xc8ZqMV199FYCLLrqopudutazITD3XkChSFEeMpB5RnUYbOXIkABMmTCj7OGU26PszT9GbIlE0A+Dggw8G4IADDgDg3nvvDcd22mknoP3XIcZ/3xtvvBFI1rj25MMPPwSSrJLf/OY34ZjWjiy//PIAvPXWW+GYIv5ZJaf1W/Cyyy6r7C+QM0sssUTYvummm4DGRHBk0KBBYXvatGkAfO5znwv73n333bq/piM5ZmZmZmZWKL7JMTMzMzOzQunodLXTTz8dSMoOAiy55JKpx2SlFaioQFx4oNxiKC2gjsvwaXFXrSkj7SBe9H377bcDScqfFtF3EhVdGD58OJCUNwbYYIMNgCQEn0UpkUVa+Pr5z38egBtuuCHsi9NHRSkDd955J5BOh1Kamrz33nth+/nnn6/bubajcePGAUmX7nqkA2ix7YEHHlhyTO/zdk1Pyvq8r1bX4gKVPLZdrLnmmkDPi39nzZoFJOmiVru4ZcC2224LwI477gikf4Pos1TppOutt1441qdPH6B909WWWmopIP39WEmaWtyK4ac//SmQ/O7LMmfOnJJ9P/vZzwA444wzSo6ts846QPulq+kaGT16dNiX9b3blQosPP7442HfPffcA8CoUaNKHt+vX7/U62XRtQyNKcntSI6ZmZmZmRVKx0Ry4gW3WjA7cOBAoPKZcc1ObbXVVkDlsyIPPvggANtvv33Yp5lpzbC0mwUWWADILv984oknAknkApIFyauuuiqQXvDWaeKSidXYbrvtgGI1HlNTQUUHIIn2xQu+taj23//+d4/PudFGG4XtepbWbhdaQArphboAjzzySK+fXyWDsyKLapjXbqqN4CgCc9xxx6X+v+h23333ih6nYiCdHkmthQqn6L209957h2NqPzB79mwArr322nDsyiuvBJLGx9ddV2MHRgAAEtVJREFUd104pjL77UYlnZX5ombDPdFvs/i7QGNWCTXuhuyItfzhD3+o+DnzRFlFKgiV5YMPPgjbitbod3TWb9+DDjqoZJ8KXvzyl78Esn/3qdAQJBExFYmoB0dyzMzMzMysUHyTY2ZmZmZmhVKodDWlTSiVCpL+GEpRg6SGv0Ji8eM//vhj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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes 5-10 seconds to execute this\n", "show_MNIST(test_lbl, test_img)" @@ -170,64 +137,9 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of all images in training dataset.\n", - "Digit 0 : 5923 images.\n", - "Digit 1 : 6742 images.\n", - "Digit 2 : 5958 images.\n", - "Digit 3 : 6131 images.\n", - "Digit 4 : 5842 images.\n", - "Digit 5 : 5421 images.\n", - "Digit 6 : 5918 images.\n", - "Digit 7 : 6265 images.\n", - "Digit 8 : 5851 images.\n", - "Digit 9 : 5949 images.\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAACBCAYAAADjY3ScAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztnXmsVdXZxh8EGQSZp4LgBIoXUYyKQypiLVJRUqmxjbbGVq0V0Yqp81BB/SppQqJtorFRYxWlRk3baGtJW1HjgIgjiDOiOBQBleHiUHrP94c+Zz933dfj5Ubu3mf7/BJyD3ufYe13v2utvd5pdahUKhUYY4wxxhhjTEnYJu8GGGOMMcYYY8zXiRc5xhhjjDHGmFLhRY4xxhhjjDGmVHiRY4wxxhhjjCkVXuQYY4wxxhhjSoUXOcYYY4wxxphS4UWOMcYYY4wxplR4kWOMMcYYY4wpFV7kGGOMMcYYY0qFFznCxo0bMWPGDAwZMgRdu3bF2LFj8ac//SnvZhWeDRs24Pzzz8cRRxyBAQMGoEOHDpg5c2bezaoLHnjgAZx88skYNWoUunfvjqFDh+L73/8+nnrqqbybVnieffZZHHXUURg+fDi6deuGvn374qCDDsLcuXPzblrdceONN6JDhw7o0aNH3k0pNA8++CA6dOgQ/lu4cGHezasLHnnkEUyePBl9+vRBt27dMHLkSFx55ZV5N6vQ/PSnP/1SvbPu1eaZZ57BMcccgyFDhmC77bbDqFGjcMUVV2DTpk15N63wLFq0CJMmTcL222+PHj164LDDDsOjjz6ad7O2iE55N6BI/OAHP8CTTz6J2bNnY7fddsMdd9yB448/Hk1NTTjhhBPybl5hWbt2Lf7whz9g7733xjHHHIMbb7wx7ybVDddffz3Wrl2Ls88+Gw0NDVi9ejXmzJmDAw88EPPnz8d3vvOdvJtYWD766CMMGzYMxx9/PIYOHYrGxkbcfvvtOPHEE7FixQpceumleTexLnjnnXdw7rnnYsiQIVi3bl3ezakLfvOb3+Cwww5rdmzPPffMqTX1wx133IETTzwRP/zhD3HrrbeiR48eeP311/Huu+/m3bRCc9lll+H0009vcXzKlCno0qUL9t9//xxaVXyWLVuGgw8+GLvvvjuuueYa9O/fHw8//DCuuOIKPPXUU/jrX/+adxMLy5NPPonx48dj3LhxuO2221CpVPDb3/4Whx9+OBYsWICDDjoo7ya2joqpVCqVyt/+9rcKgModd9zR7PjEiRMrQ4YMqWzevDmnlhWfpqamSlNTU6VSqVRWr15dAVC5/PLL821UnbBq1aoWxzZs2FAZNGhQ5fDDD8+hRfXPAQccUBk2bFjezagbjj766MqUKVMqJ510UqV79+55N6fQLFiwoAKgctddd+XdlLrj7bffrnTv3r0ybdq0vJtSCh588MEKgMqll16ad1MKyyWXXFIBUHnttdeaHT/ttNMqACoffPBBTi0rPpMmTaoMGjSo0tjYWD22fv36Sv/+/SsHH3xwji3bMhyu9gV//vOf0aNHDxx33HHNjv/sZz/Du+++iyeeeCKnlhUfuszNljNw4MAWx3r06IGGhgasXLkyhxbVP/3790enTnZSt4a5c+fioYcewnXXXZd3U0zJufHGG9HY2IgLLrgg76aUgptuugkdOnTAySefnHdTCsu2224LAOjVq1ez471798Y222yDzp0759GsuuDRRx/FhAkTsN1221WPbb/99hg/fjwee+wxvPfeezm2rvV4kfMFS5cuxR577NHi4WivvfaqnjemPVi3bh2efvppjB49Ou+m1AVNTU3YvHkzVq9ejeuuuw7z58/3g1QreP/99zFjxgzMnj0bO+ywQ97NqSumT5+OTp06oWfPnpg0aRIeeeSRvJtUeB5++GH07dsXL730EsaOHYtOnTph4MCBOP3007F+/fq8m1dXrFu3DnfffTcOP/xw7Lzzznk3p7CcdNJJ6N27N6ZNm4bly5djw4YNuO+++3DDDTdg+vTp6N69e95NLCyfffYZunTp0uI4jy1ZsqS9m9QmvMj5grVr16Jv374tjvPY2rVr27tJ5hvK9OnT0djYiEsuuSTvptQFZ5xxBrbddlsMHDgQ55xzDn73u9/hF7/4Rd7NKjxnnHEGdt99d0ybNi3vptQNvXr1wtlnn40bbrgBCxYswLXXXouVK1diwoQJmD9/ft7NKzTvvPMONm3ahOOOOw4/+tGP8K9//QvnnXcebr31VkyePBmVSiXvJtYN8+bNw8cff4xTTjkl76YUmp122gmPP/44li5dil133RU9e/bElClTcNJJJ+Haa6/Nu3mFpqGhAQsXLkRTU1P12ObNm6tRTfXyTOyYDqFWyJXDsUx7cNlll+H222/H73//e+y77755N6cuuPjii3Hqqafi/fffx7333oszzzwTjY2NOPfcc/NuWmG55557cO+99+KZZ57x2LYF7LPPPthnn32q/z/kkEMwdepUjBkzBueffz4mTZqUY+uKTVNTEz755BNcfvnluPDCCwEAEyZMQOfOnTFjxgz8+9//xne/+92cW1kf3HTTTejXrx+mTp2ad1MKzYoVKzBlyhQMGjQId999NwYMGIAnnngCV111FTZu3Iibbrop7yYWlrPOOgunnHIKzjzzTFxyySVoamrCrFmz8OabbwIAttmmPnwk9dHKdqBfv37hyvSDDz4AgNDLY8zXyaxZs3DVVVfh//7v/3DmmWfm3Zy6Yfjw4dhvv/0wefJkXH/99TjttNNw0UUXYfXq1Xk3rZBs3LgR06dPx1lnnYUhQ4bgo48+wkcffYTPPvsMwOdV6xobG3NuZf3Qu3dvHH300Xj++efx8ccf592cwtKvXz8AaLEQPPLIIwEATz/9dLu3qR55/vnnsXjxYvzkJz8Jw4lMxoUXXoj169dj/vz5OPbYYzF+/Hicd955uOaaa3DzzTfjoYceyruJheXkk0/G7Nmzcdttt2GHHXbA8OHDsWzZsqrxcOjQoTm3sHV4kfMFY8aMwYsvvojNmzc3O864Q5cHNVuTWbNmYebMmZg5cyYuvvjivJtT14wbNw6bN2/G8uXL825KIVmzZg1WrVqFOXPmoE+fPtV/8+bNQ2NjI/r06YMf//jHeTezrmColb1iXw7zW1Mou3qxDOcNvQ+nnnpqzi0pPs8++ywaGhpa5N6w5LZzrWtzwQUXYM2aNViyZAlWrFiBxx57DB9++CG6d+9eN5EmHlW+YOrUqdi4cSPuueeeZsf/+Mc/YsiQITjggANyapkpO1deeSVmzpyJSy+9FJdffnnezal7FixYgG222Qa77LJL3k0pJIMHD8aCBQta/Js0aRK6du2KBQsW4Kqrrsq7mXXDhx9+iPvuuw9jx45F165d825OYTn22GMBAPfff3+z43//+98BAAceeGC7t6ne+PTTTzF37lyMGzfOhtdWMGTIELzwwgvYuHFjs+OPP/44ALjgSivo0qUL9txzT+y444546623cOedd+LnP/85unXrlnfTWoVzcr7gyCOPxMSJEzFt2jSsX78eI0aMwLx58/CPf/wDc+fORceO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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of all images in testing dataset.\n", - "Digit 0 : 980 images.\n", - "Digit 1 : 1135 images.\n", - "Digit 2 : 1032 images.\n", - "Digit 3 : 1010 images.\n", - "Digit 4 : 982 images.\n", - "Digit 5 : 892 images.\n", - "Digit 6 : 958 images.\n", - "Digit 7 : 1028 images.\n", - "Digit 8 : 974 images.\n", - "Digit 9 : 1009 images.\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAACBCAYAAADjY3ScAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztnXmMVtX9xh8WWRxk3zoIuLCJiLghmp+ItUhFSaXGNtoaW7VWRCum7mIFtZU0IdE20diosYpSo6ZttLUkrahRBBVBAcENUVzKKssMLqVzf3/o895nzhxehikz977X55OQebn3Xc793u85557vdlolSZLAGGOMMcYYYwpC66wbYIwxxhhjjDF7Ey9yjDHGGGOMMYXCixxjjDHGGGNMofAixxhjjDHGGFMovMgxxhhjjDHGFAovcowxxhhjjDGFwoscY4wxxhhjTKHwIscYY4wxxhhTKLzIMcYYY4wxxhQKL3KEmpoaTJs2DdXV1ejQoQNGjRqFP/3pT1k3K/ds374dV199NU455RT06tULrVq1wowZM7JuVkXw9NNP4/zzz8ewYcNQVVWFfv364Xvf+x4WL16cddNyz9KlS3HaaadhwIAB6NixI7p3747jjjsOc+bMybppFcc999yDVq1aoVOnTlk3Jdc888wzaNWqVfTfwoULs25eRfD8889j4sSJ6NatGzp27IjBgwfjlltuybpZueYnP/nJLvXOuleeJUuW4IwzzkB1dTX23XdfDBs2DDfffDN27NiRddNyz0svvYQJEyZgv/32Q6dOnXDSSSfhhRdeyLpZe0TbrBuQJ77//e/j5ZdfxqxZszBkyBA8/PDDOPvss1FXV4dzzjkn6+bllk2bNuEPf/gDDj/8cJxxxhm45557sm5SxXDXXXdh06ZNuPzyyzF8+HBs2LABs2fPxpgxYzBv3jx8+9vfzrqJuWXLli3o378/zj77bPTr1w+1tbV46KGHcO6552LNmjWYPn161k2sCD766CNceeWVqK6uxtatW7NuTkXwm9/8BieddFK9YyNGjMioNZXDww8/jHPPPRc/+MEP8MADD6BTp05499138fHHH2fdtFxz44034uKLL25wfNKkSWjfvj2OOeaYDFqVf9544w0cf/zxGDp0KG6//Xb07NkTzz33HG6++WYsXrwYf/3rX7NuYm55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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Average of all images in training dataset.\")\n", "show_ave_MNIST(train_lbl, train_img)\n", @@ -247,18 +159,9 @@ }, { "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(60000, 784) (60000,)\n", - "(60000, 785)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(train_img.shape, train_lbl.shape)\n", "temp_train_lbl = train_lbl.reshape((60000,1))\n", @@ -275,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -301,17 +204,9 @@ }, { "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pL = PluralityLearner(MNIST_DataSet)\n", "print(pL(177))" @@ -319,39 +214,9 @@ }, { "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 8\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 103, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -377,17 +242,9 @@ }, { "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes ~45 Secs. to execute this\n", "\n", @@ -404,39 +261,9 @@ }, { "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 7\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -455,17 +282,9 @@ }, { "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes ~20 Secs. to execute this\n", "kNN = NearestNeighborLearner(MNIST_DataSet, k=3)\n", @@ -481,39 +300,9 @@ }, { "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 5\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -559,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -577,20 +366,9 @@ }, { "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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fhgzZgyOHz+OoUOHol69eti6dSty5sxplT1w4AC6d++OwYMHo2zZsq4Tkz/Ys2cPgOtWtdSsDfLGL7/8gjp16iB37tx49913kTNnTsycORPdunXD0aNHMWDAAMTGxqJVq1aYPn06hg4daptsp06diixZslgWqiNHjqBGjRrIlCkThgwZguLFiyMhIQEjRozA/v37MXXqVNv13333XZQqVQpjxoxBdHQ0SpYs6df7SwktWrRA5syZ8e2331pply5dQps2bdC7d28MGjTIejGYOXMmunTpgrZt22L69OkICQnBBx98gKZNm2LJkiXWx9Jjjz2GzZs349VXX0WpUqVw8uRJbN68GSdOnAAAnD17Fo0bN0ZcXBzee+895MmTB0eOHMGqVatw+vTpW98IPnL16lWsXLkSVatWtY1DyfHkk09i0qRJ6Nu3L1q1aoX9+/fj5ZdfxurVq7F582bkypULAPDbb7+hdu3a6NWrF2JiYrB//368+eabqFevHn788UeEhISgV69e+OuvvzBu3DjMnTsX+fLlAxAYLra1a9fG5MmT8cwzz+CRRx5BlSpVbC9FZPfu3WjRogWee+45ZM2aFT///DNGjRqFjRs3JnEdvnz5Mtq0aYOePXuif//++PbbbzF8+HDExMRgyJAhAK5rxu+//34cOnQII0eORKlSpfD111+jY8eOSa69f/9+lC5dGp06dUKOHDlw+PBhvP/++6hevTp27dplPYtAw9e2Ba4r0Pr3749BgwYhT548mDx5Mnr27IkSJUrg3nvv9Xodtz5fsGBBPPHEE/jtt9/SxL3TV/zdBikZr/fv34/evXujcOHCAID169fj3//+N/73v/9ZcujEGIMXXngB7777LiZPnmy90F+7dg1t27bF2rVrMWDAANSpUwcHDhxAfHw8GjRogE2bNtksPZs3b8ZPP/2E//u//0NcXFxAuIXTc8EYg6NHj+KNN97A2bNn0blzZ6uMr23WvXt3zJkzBwMGDMB9992HXbt24YEHHsCpU6fS9B7Onz+PTz/9FNWrV0f58uXRo0cP9OrVC59//jm6du2apPx7772HMmXKWOtfXn75ZbRo0QL79u2z3i+dfPbZZ+jSpQt69OiBcePGJevlk1KZcOPy5cto0aKF1XfXrVuHESNG4MCBA9ZaeWMM2rVrhxUrVmDw4MG45557sH37dsTHxyMhIQEJCQmWUs+XeWvChAmpHxvMbaRr164ma9asKTqmT58+JleuXF7LfPjhhwaAeeaZZ2zpr732mgFgjh07ZqXVrVvXNGrUyPp79+7dBoApVaqUuXz5su34hIQEA8B8/PHHrtdt1aqVeeCBB2xpoaGhpmfPnknKdujQwYSFhZmDBw/a0ps0aWIiIyPNqVOnjDHGLFu2zAAwNWrUMNeuXbPK/fbbbyY4ONj06dPHW1MYY7y386JFiwwA06RJkyR57dq1MxEREebw4cO29Pvuu89ER0ebM2fOGGOMef/99w2AJOV47oSEBGOMMd99950BYBYvXpxsXVetWmUAmPfee8+WvnfvXpMlSxYzZMgQK61mzZoGgPn++++93H3KmDp1qgFg1q9fby5fvmxOnz5tFi5caGJjY01UVJQ5cuSIiY+PN25dh8fu27fPSqtfv76pX7++rRwAEx8fb/3dqVMnExoaan7//XdbuebNm5uIiAhz8uRJY4wx8+fPNwDM0qVLrTJXrlwx+fPnN+3bt7fSevfubSIjI82BAwds5xszZowBYHbu3GmMMWbfvn0GgClevLi5dOlSitoptbCNEhMTky2TJ08eU7ZsWWPMddkFYD766CNbmbNnz5ocOXKY1q1b29KvXr1q7r77blOjRg0rLTIy0jz33HPJXm/Tpk0GgPnqq69Sc0u3jSNHjhgAplOnTjcs+9NPPxkA5qmnnrKlb9iwwQAwL774outx165dM5cvXzYHDhwwAMx///tfK++NN95IIu+BwJ9//mnq1atnABgAJiQkxNSpU8eMHDnSnD592vUY3ueaNWsMALNt2zYrjzL42Wef2Y5p0aKFKV26tPU3x0HZRsYY8/jjjxsAZurUqcnW+cqVK+bMmTMma9as5p133rHSOR6uWrUqBS2QdvjatkWKFDFhYWG2Mej8+fMmR44cpnfv3laa2/0l1+eNMaZly5amSJEiaXJvvuLvNvB1vHZy9epVc/nyZTNs2DCTM2dO2/tBkSJFTMuWLc25c+dM+/btTUxMjFm+fLnt+E8//dQAMF9++aUtPTEx0QAwEyZMsJ0vc+bM5pdffklBS6UdnEec/0JDQ231dpJcm+3cudMAMAMHDrSVZxt17do1ze5lxowZBoCZOHGiMcaY06dPm8jISHPPPffYynG+rlChgrly5YqVvnHjRgPAfPrpp1aafOd7/fXXTebMmc2oUaOSXNv5fpISmXCDfVeOYcYY8+qrrxoA5rvvvjPGGLN48WIDwIwePdpWbs6cOQaAmTRpkjEmZfNWaseGgHWH4xc+/5n/b7qsUaMG/vzzTzzyyCOYP3++pc11wxmMgMEMfv/99xtev23btimyKpw+fRrLli1D+/btfSq/cuVKNGnSBAUKFLCld+3aFWfOnMGGDRts6Z07d7aZ94oVK4aaNWv6zXXJrd4rV65Es2bNkDdv3iR1PHXqFBITE1N0jTJlyiA6Ohr9+/fHhx9+iJ9//jlJmYULFyJz5szo3Lmz7fkXKlQId911VxJ3m3z58qFOnTopqocv1KpVCyEhIYiKikKrVq2QN29eLFq0KNl1KjfDypUr0ahRoyTa/G7duuHcuXNWoIvmzZsjb968Ns3gkiVLcOjQIfTo0cNKW7hwIRo2bIj8+fPb2rB58+YAgDVr1tiu06ZNm2Q1mbcD4+La4ZTPdevW4a+//kLXrl1t93jt2jU0a9YMiYmJlnWxRo0amDZtGkaMGIH169fj8uXLtnOVKFEC2bNnx8CBAzFx4kTs2rUr7W7uNsFxwunWUaNGDZQtW9bmQnjs2DH06dMHhQoVQnBwMEJCQixr808//XTL6pxacubMibVr1yIxMRGvv/462rZti19//RWDBw9GhQoVLLe+vXv3onPnzsibNy8yZ86MkJAQ1K9fH0DS+wwKCkqyxqBixYo297VVq1YhKioqybwjtdLkzJkzGDhwIEqUKIHg4GAEBwcjMjISZ8+eDeg29rVtAaBSpUqW9h247qpUqlQpn13+fJ1LbzX+boOUjNcrV67E/fffj5iYGEtmhwwZghMnTiSJrHnixAncd9992LhxI7777jubGzGvmy1bNrRu3dp23UqVKiFv3rxJ5tqKFSuiVKlSN91+/mTGjBlITExEYmIiFi1ahK5du+Lpp5/G+PHjrTK+tBnb+F//+pft/B06dEgz7xIyZcoUhIeHo1OnTgCAyMhIPPTQQ1i7di12796dpHzLli1tlhy+1zr7lTEGvXv3Rnx8PGbNmoUBAwbcsC4plYnkcK6b5hjIeYiWdud89NBDDyFr1qzWfJSSeSu1BOxHUJEiRRASEmL9e/XVVwFcb4zJkydj7969ePDBB5E7d27UqlXLtTGk2xQAy7x2/vz5G16f7h2+smDBAhhjfA5L+ffff7teI3/+/ACQ5OPO+SHCNG8fgSnBWZerV6/i1KlTKarjjciZMyfWrFmDsmXL4oUXXkDZsmVRsGBBDB8+HFevXgUAHD16FFevXkX27Nltzz8kJARbt261TTBu9fYXHFy3bNmCQ4cOYfv27ahbt26aXOvEiRM+tXNwcDAee+wxzJs3z/KbnTZtGvLly2e5ZwLX23DBggVJ2q9cuXIAcMvaMDWcPXsWJ06csO4dACIiIhAdHW0rd/ToUQDXJynnfY4aNQrGGCs09Jw5c9C1a1dMnjwZtWvXRo4cOdClSxdrrUZMTAzWrFmDSpUq4cUXX0S5cuWQP39+xMfHJ/lgCiRy5cqFiIgI7Nu374ZlKUPJyRnzr127hiZNmmDu3LkYMGAAVqxYgY0bN1o+576MnYFCtWrVMHDgQHz++ec4dOgQ+vXrh/3792P06NE4c+YM7rnnHmzYsAEjRozA6tWrkZiYiLlz5wJIep8RERFJgt2EhobiwoUL1t8nTpxwVZK4jd2dO3fG+PHj0atXLyxZsgQbN25EYmIiYmNj00Ube2tb4px/gett5sv9ufX5QMNfbeDreL1x40Y0adIEwPWIkN9//z0SExPx0ksvAUgqs7/++is2bNiA5s2bu4ZdPnr0KE6ePGmtoZH/jhw5EtDzBClbtiyqVauGatWqoVmzZvjggw/QpEkTDBgwACdPnvS5zTj+OftvcHCw6zP0F3v27MG3336Lli1bwhiDkydP4uTJk+jQoQMAuK4f8/W99tKlS5gzZw7KlStnfVDfiJTKhBtubcYxkO184sQJBAcHIzY21lYuKCjI9l7r67x1MwTsmqBvvvkGly5dsv6mxSQoKAg9e/ZEz549cebMGaxZswbx8fFo1aoVdu/ejYIFC/rl+ildcPnll19a2gZfyJ49Ow4fPpwk/dChQwCQxCfcbXHtkSNH/NZBnfebOXNmREdH+1RHvhw4Fwm7dZhKlSrh888/x7Vr17Bt2zZMmTIFQ4YMQVRUFJ577jlrwel3333n6rfq9EdNq4WxHFzdkPcrF6P7MkC4kTNnTp9loXv37njjjTcwe/ZsdOzYEfPnz8dzzz1na6tcuXKhYsWKluLAifzAANKuDVPD119/jatXr9r2LnCrH9tk3LhxyUaX4oSWK1cuvP3223j77bfx+++/Y/78+Rg0aBCOHTtmRU6rUKECZs+eDWMMtm/fjmnTpmHYsGEIDw/HoEGD/HyX/iFz5sxo1KgRFi1ahIMHD3od+zhOHD58OEm5Q4cOWe25Y8cObNu2DdOmTbP5o3NNXHolJCQE8fHxeOutt7Bjxw6sXLkShw4dwurVqy3rD4Cb2vMoZ86c2LhxY5J059j9zz//YOHChYiPj7fJ1sWLF9NsT6e0xNm2/iCQxiRfuJk28HW8nj17NkJCQrBw4ULbB/lXX33lelzt2rXx0EMPoWfPngCA999/37aWNFeuXMiZM2ey0SOjoqJsf6eXZ1KxYkUsWbIEv/76q89txvHx6NGjNu+cK1eu+E3R7MZHH30EYwy++OILfPHFF0nyp0+fjhEjRqQqUi+DHDVt2hT3338/Fi9ejOzZs3s9JqUy4QbbTL6bcgxkWs6cOXHlyhUcP37c9iFk/n+o8+rVq9vK32jeuhkC1hJUsWJF6wu/WrVqrl+CkZGRaNmyJQYPHowLFy6kuRtLcl/c586dw+LFi13N98lpvho1aoTly5dbGm0yY8YMREZGokaNGrZ0Z0S2vXv3YsOGDX7d6MqtjkuWLEkSFWTGjBmIjo62PhKKFi0KAEk2kfW2SWymTJlQuXJljB8/HuHh4di8eTMAoFWrVrhy5QqOHj1qe/78R+3Y7SS5++Wiv5TSqFEj66VMMmPGDERERNhe8suWLYuaNWti6tSpmDVrFi5evIju3bvbjmvVqhV27NiB4sWLu7ah8yMoUPj999/xn//8BzExMejdu7fXsnXr1kW2bNmwa9cu13usVq0asmTJkuS4woULo2/fvmjcuLElc5KgoCDcfffdeOutt5AtWzbXMoHE4MGDYYzB448/blMakcuXL2PBggW47777AFwPJiFJTEzETz/9ZLnK8EXHGWmO0fokKbGs30rcFAqAx8Utf/78KbpPX2nYsCFOnz6dZNxzjt1BQUEwxiS59uTJky2LeKDiS9umJb5aktISf7eBr+M1N++WL8Tnz59PElFW0rVrV8yePRtTp05Fly5dbPLVqlUrnDhxAlevXnW9bunSpVN0H4HC1q1bAVwPYuRrmzFIxZw5c2zpX3zxhc/bo6SUq1evYvr06ShevDhWrVqV5F///v1x+PBhLFq0KNXXqFy5MtasWYODBw+iQYMGN9yM3F8y8cknn9j+5hjI91XON8756Msvv8TZs2etfF/nLSD1Y0PAWoKSo3v37oiOjkbdunWRN29eHD58GK+99hqyZ8+OqlWrpum1S5YsibCwMHz88ccoVaoUsmbNigIFCuD777/HpUuX0LZt2yTHVKhQAStXrsTChQuRN29eREdHo1SpUnjllVewaNEiNGjQAC+//DKyZcuGjz/+GEuWLMHYsWOTfHEfPnwYDz74IHr27ImTJ09iyJAhiIiIwMCBA9PsfocOHYqlS5eiQYMGeOmll5AtWzZMnz4dK1aswDvvvGNFh6lbty7i4uLw7LPP4vz584iKisLnn3+OTZs22c735ZdfYtq0aWjbti3i4uJw9epVfPbZZzh//ry1uWyjRo3QpUsXPPLII+jbty/q1auHiIgIHDp0CGvXrkX16tUtzdbtokWLFsiRIwd69uyJYcOGITg4GNOmTbPCiqeU+Ph4yy98yJAhyJEjBz755BN8/fXXGD16dBLrYo8ePdC7d28cOnQIderUSTIwDRs2DMuWLUOdOnXwzDPPoHTp0rhw4QL279+Pb775BhMnTvSbxTS17Nixw/I3PnbsGNauXYupU6cic+bMmDdvXhIzuZPIyEiMGzcOXbt2xV9//YUOHTogd+7cOH78OLZt24bjx4/j/fffxz///IOGDRuic+fOKFOmDKKiopCYmIjFixfjwQcfBHDdD3rChAlo164dihUrBmMM5s6di5MnT1pyGajUrl0b77//Pp566ilUrVoVTz75JMqVK4fLly9jy5YtmDRpEsqXL4958+bhiSeewLhx45ApUyY0b97cirJTqFAh9OvXD8D1dXvFixfHoEGDYIxBjhw5sGDBAixbtizJtStUqAAAeOedd9C1a1eEhISgdOnSPmkL05KmTZuiYMGCaN26NcqUKYNr165h69atGDt2LCIjI/Hss88if/78yJ49O/r06YP4+HiEhITgk08+ualtB7p06YK33noLXbp0wauvvoqSJUvim2++wZIlS2zloqOjce+99+KNN95Arly5ULRoUaxZswZTpkwJqE1n3fClbdOSChUqYO7cuXj//fdRtWpVZMqUKVmLfVrh7zbwdbxu2bIl3nzzTXTu3BlPPPEETpw4gTFjxtxwT7cOHTogIiICHTp0sCKRZcmSBZ06dcInn3yCFi1a4Nlnn0WNGjUQEhKCgwcPYtWqVWjbti0eeOCBm2mqNIfzCHDddWru3LlYtmwZHnjgAcTFxfnc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GjWq2vb2229Lkj72sY9Jkv79739XZUsuuaQk6Vvf+lafY+XnPCHtJadb2lwbGc66m2aaaSRJq6yySrXtxRdflFQf64aCj370o5JSe11++eWrsj/84Q+SpLvvvntAx4x2N+FE3U04UXcTzmDMN054goIgCIIgCIIg6Ck+9N/Bfq0aBDp54/3whz9cfXYLpiStuOKK1efRo0dLSpZQSXrrrbckJY/Q5z//+Qk6z/fff7/6/NJLL0mSLr/88tr/knTuuef2+S7X2FT9bbAW4LmQUl1z7Z/4xCeqMqyEiy222LCc10jX3aOPPiqp3rbuu+8+SclaiddRkv70pz9Jkl599VVJ0lNPPVWVbbHFFpKknXfeWZK00EILVWXPPvusJGmJJZYYtHMf6borMd1000mS9thjD0nSDDPMUJV9+tOfliR96UtfklSvO+rnC1/4giRpzJgxVRketsFkuDxBTV4fh3Zx/PHHS5Ief/zxqmyKKaaQJH32s5+VJM0000xV2d///ndJ0gYbbCCp3lZzfCzmfAZaD93Y5trCcNQdcyVz51xzzVWV/f73v5dU73cDjc7oBH5zyimnlJTGSilFbDz99NN9vtfUV6LdTThRdxNO1N2EE56gIAiCIAiCIAiCiSBegoIgCIIgCIIg6ClaFw7XFEb285//XJK04YYbVtsI63ARg3fffVdScqe7W32jjTaSJP31r3+VVBdGeOedd2rf5/ckabfddqvt87e//a0qIyxsqaWW6ve6SrTBZUqIlySdddZZkqRTTz1VUl00YeONN5ZUT8weSka67i677DJJ0vrrr19to0198pOflCSdd955VRmCEbPOOqskaZ999qnKCDOkLbswwgUXXCBJ2nbbbfucQychlyVGuu5grbXWqj4fccQRktK5XXPNNVUZYTgIlyyzzDJVGfX52muvSaqHaL733nuSpAMOOGDQznmow+GaQnvmm28+SSlsUpKWXnppSUlUw8+PuiC8iMRzSTrppJMkpfGQupKkK664ova3dD1tbXNtZDjqjpBJBAjWXHPNPvvcdNNN1WeESDoN28wpfS/fxjlJSbDBKYXG5US7m3Ci7iacqLsJJ8LhgiAIgiAIgiAIJoKulMhuomRp/NrXviZJ2mSTTSTVRQnYHxljSZp88sklJS/PVFNNVZWdccYZklKStSfy4zF6/vnna78rSbfccouk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Kz6InqCa9C8eHepGudQrstnbbbdds43+pO9cTh1J7dqYwrOB58jzM7DQEzu/7bbbNm3EzHtOFwzb2MWSRF888MADTRvzePXVV5ckbbTRRk0b3z/nnHOm5Tini26uj1Qsd0sssUSzjXnG/CPHRyo5acxpn69Y/MnR8PHy+9//XlK9NtUAppiGcdK9V7qHBg8y3m/PO9ttt90kSW9/+9ubbe9973slFU/1Pvvs07ThyTnrrLMklbILUrEik6+7wgorNG3kDjDO3ePL2krekCT98Ic/bJ1XGF56efM+8IEPNJ8/8YlPtNo8T2089zyePfx+Qc6vr6vjOa5hozv//fmPeyu5PXfeeWfThgeI5zeXrsfLs++++475vcsuu0xS+1mQXCN/7u4eX7+JJyiEEEIIIYQwUuQlKIQQQgghhDBSzPhwOEKPPPkKdx/hRcgpSsWtievUXe7dxDp3tc5EXLoQOPdaOBxMNiRm4YUXntTfzSsQISCZ8r777ptjm1RC1whl8jGJW51t7l7n+7iI3X1MiCYhnd/+9rebtpe85CWS2hK066233oTOcVCg2jfhXLUEaOQ0fT6vttpqkqRf//rXU32I85wttthCUltUg/ACtnlIAesf/7p8NmMV8YQXvehFTRvhh4wvlzGdqDR2GBxY01l7tt9++6YNOXTWIA/HRDLdBVsWWWQRSSV08uGHH27aENchvOj5z39+04aQCeE2XoaC0GLCgQ855JCmDYlsD4U9/PDDJY1OiCbzmNAlFzOhpICX/BgmaqFQjAcXyTn44IMntf+utD+iHVIRAdlmm20kTY1k9iDQnScucMB85/mPciZSCeXn+4w/hzXC5zPP1h52y32GcGy/b0/VPI4nKIQQQgghhDBSzGxXhopl3ZPieOuvFfpkW9cyL421cmIllYoVxmVmhx33ggFv491/pbEy2N5W+z5geazJWg4yyLIuvfTSkqTll1++abv00ksltS1vJPcjA+l9wbih73xsYuliDGN58b9DJhTPhyTdc889kkoC8jCD1CZeHpfORZACD4UXZrztttum6xDnCW9729uaz1/4whckFeu7VOSyWatclh3RA9Y4PDsOlju3KvMZ76OLhmAhrAmJzGR8vvK5lojN+P385z8vqV1+AKune/LwoBx77LGSpMsvv7yfh92iuzZ7CYi11lpLUvHEsuZJRZQFIQJJ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes 5-10 seconds to execute this\n", "show_MNIST(train_lbl, train_img, fashion=True)" @@ -598,20 +376,9 @@ }, { "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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d2JKD7Zu3QqctaqlJTYoJX788UcaN25M4cKFef755ylQoABvvPEGffr0Yf/+/QwaNIhChQrRsWNHXnvtNYYPH+6ZbKdOnUpkZKRjodq3bx/169fnkksuYejQoZQrV46VK1cyYsQIduzYwdSpUz3nf/7556lYsSJjxowhISGBChUqpOv1pYb27duTK1cuPvvsM2fbiRMn6Ny5M/379+ehhx5yXgzeeOMNevXqRZcuXXjttdeIiIjg5Zdf5uqrr2bhwoXOx1LPnj1Zt24dTzzxBBUrVuTQoUOsW7eOgwcPAnD06FFat25NYmIi48ePp0iRIuzbt4+lS5dy+PDhzO+EIDl9+jRLliyhTp06nnHoXNx555288sor3H333XTs2JEdO3bw6KOPsmzZMtatW0fBggUB2LZtG40aNeLWW28lT5487Nixg2eeeYamTZvy7bffEhERwa233soff/zBCy+8wKxZsyhWrBiQNVxsGzVqxKRJk7jnnnu4+eabqV27tuelSNiyZQvt27dnwIAB5M6dmx9++IFRo0axevXqZK7DJ0+epHPnzvTr14+BAwfy2Wef8fjjj5MnTx6GDh0KnNWMX3XVVezZs4eRI0dSsWJF5s2bx4033pjs3Dt27KBSpUp0796d/Pnzs3fvXiZMmEC9evXYvHmzcy+yGsH2LZxVoA0cOJCHHnqIIkWKMGnSJPr160f58uW58sorUzyP3zNfsmRJbr/9drZt25Yh7p3Bkt59kJrxeseOHfTv35/SpUsD8NVXX/F///d//Prrr44cBmKM4cEHH+T5559n0qRJzgv9mTNn6NKlCytWrGDQoEE0btyYnTt3kpSURPPmzVm7dq3H0rNu3Tq+//57/ve//5GYmJgl3MLFc8EYw/79+3n66ac5evQoPXr0cOoE22d9+/Zl5syZDBo0iJYtW7J582auvfZa/v777wy9hmPHjvH2229Tr149qlWrxi233MKtt97Ku+++S+/evZPVHz9+PJUrV3biXx599FHat2/Pzz//7LxfBvLOO+/Qq1cvbrnlFl544YVzevmkVib8OHnyJO3bt3ee3S+//JIRI0awc+dOJ1beGMM111zDp59+ypAhQ7jiiivYuHEjSUlJrFy5kpUrVzpKvWDmrZdeeintY4O5iPTu3dvkzp07VfvccccdpmDBginWefXVVw1g7rnnHs/2J5980gDmt99+c7Y1adLEtGrVyvn/li1bDGAqVqxoTp486dl/5cqVBjCvv/6673k7duxorr32Ws+2qKgo069fv2R1u3XrZqKjo83u3bs929u0aWPi4uLM33//bYwxZtGiRQYw9evXN2fOnHHqbdu2zYSHh5s77rgjpa4wxqTcz/PnzzeAadOmTbKya665xsTGxpq9e/d6trds2dIkJCSYI0eOGGOMmTBhggGS1ZNjr1y50hhjzOeff24As2DBgnO2denSpQYw48eP92zfvn27iYyMNEOHDnW2NWjQwADmiy++SOHqU8fUqVMNYL766itz8uRJc/jwYTN37lxTqFAhEx8fb/bt22eSkpKM36Mj+/7888/OtmbNmplmzZp56gEmKSnJ+X/37t1NVFSU2bVrl6deu3btTGxsrDl06JAxxpiPPvrIAOaTTz5x6pw6dcoUL17cdO3a1dnWv39/ExcXZ3bu3Ok53pgxYwxgvvvuO2OMMT///LMBTLly5cyJEydS1U9pRfpozZo156xTpEgRU6VKFWPMWdkFzJQpUzx1jh49avLnz286derk2X769Glz+eWXm/r16zvb4uLizIABA855vrVr1xrAfPDBB2m5pIvGvn37DGC6d+9+3rrff/+9Acxdd93l2b5q1SoDmIcffth3vzNnzpiTJ0+anTt3GsB8+OGHTtnTTz+dTN6zAr///rtp2rSpAQxgIiIiTOPGjc3IkSPN4cOHffeR61y+fLkBzIYNG5wykcF33nnHs0/79u1NpUqVnP/LOGj3kTHG3HbbbQYwU6dOPWebT506ZY4cOWJy585tnnvuOWe7jIdLly5NRQ9kHMH2bZkyZUx0dLRnDDp27JjJnz+/6d+/v7PN7/rO9cwbY0yHDh1MmTJlMuTagiW9+yDY8TqQ06dPm5MnT5rHHnvMFChQwPN+UKZMGdOhQwfzzz//mK5du5o8efKYxYsXe/Z/++23DWDef/99z/Y1a9YYwLz00kue4+XKlcv8+OOPqeipjEPmkcB/UVFRnnYHcq4+++677wxgBg8e7KkvfdS7d+8Mu5bp06cbwEycONEYY8zhw4dNXFycueKKKzz1ZL6uXr26OXXqlLN99erVBjBvv/22s81+53vqqadMrly5zKhRo5KdO/D9JDUy4Yc8u/YYZowxTzzxhAHM559/bowxZsGCBQYwo0eP9tSbOXOmAcwrr7xijEndvJXWsSHLusPJF778M//fdFm/fn1+//13br75Zj766CNHm+tHYDICSWawa9eu856/S5cuqbIqHD58mEWLFtG1a9eg6i9ZsoQ2bdpQokQJz/bevXtz5MgRVq1a5dneo0cPj3nv0ksvpUGDBunmuuTX7iVLltC2bVuKFi2arI1///03a9asSdU5KleuTEJCAgMHDuTVV1/lhx9+SFZn7ty55MqVix49enjuf6lSpbjsssuSudsUK1aMxo0bp6odwdCwYUMiIiKIj4+nY8eOFC1alPnz558zTuVCWLJkCa1atUqmze/Tpw///POPk+iiXbt2FC1a1KMZXLhwIXv27OGWW25xts2dO5cWLVpQvHhxTx+2a9cOgOXLl3vO07lz53NqMi8Gxse1I1A+v/zyS/744w969+7tucYzZ87Qtm1b1qxZ41gX69evz7Rp0xgxYgRfffUVJ0+e9ByrfPny5MuXj8GDBzNx4kQ2b96ccRd3kZBxItCto379+lSpUsXjQvjbb79xxx13UKpUKcLDw4mIiHCszd9//32mtTmtFChQgBUrVrBmzRqeeuopunTpwk8//cSQIUOoXr2649a3fft2evToQdGiRcmVKxcRERE0a9YMSH6dYWFhyWIMatSo4XFfW7p0KfHx8cnmHVsrLRw5coTBgwdTvnx5wsPDCQ8PJy4ujqNHj2bpPg62bwFq1qzpaN/hrKtSxYoVg3b5C3YuzWzSuw9SM14vWbKEq666ijx58jgyO3ToUA4ePJgss+bBgwdp2bIlq1ev5vPPP/e4Ect58+bNS6dOnTznrVmzJkWLFk0219aoUYOKFStecP+lJ9OnT2fNmjWsWbOG+fPn07t3b/773//y4osvOnWC6TPp4xtuuMFz/G7dumWYd4kwefJkYmJi6N69OwBxcXFcf/31rFixgi1btiSr36FDB48lR95rA58rYwz9+/cnKSmJt956i0GDBp23LamViXMRGDctY6DMQ2JpD5yPrr/+enLnzu3MR6mZt9JKlv0IKlOmDBEREc6/J554AjjbGZMmTWL79u1cd911FC5cmIYNG/p2hu02BTjmtWPHjp33/OLeESxz5szBGBN0Wso///zT9xzFixcHSPZxF/ghIttS+ghMDYFtOX36NH///Xeq2ng+ChQowPLly6lSpQoPPvggVapUoWTJkjz++OOcPn0agP3793P69Gny5cvnuf8RERF88803ngnGr93phQyu69evZ8+ePWzcuJEmTZpkyLkOHjwYVD+Hh4fTs2dPZs+e7fjNTps2jWLFijnumXC2D+fMmZOs/6pWrQqQaX2YFo4ePcrBgwedaweIjY0lISHBU2///v3A2Ukq8DpHjRqFMcZJDT1z5kx69+7NpEmTaNSoEfnz56dXr15OrEaePHlYvnw5NWvW5OGHH6Zq1aoUL16cpKSkZB9MWYmCBQsSGxvLzz//fN66IkPnkjMpP3PmDG3atGHWrFkMGjSITz/9lNWrVzs+58GMnVmFunXrMnjwYN5991327NnDfffdx44dOxg9ejRHjhzhiiuuYNWqVYwYMYJly5axZs0aZs2aBSS/ztjY2GTJbqKiojh+/Ljz/4MHD/oqSfzG7h49evDiiy9y6623snDhQlavXs2aNWsoVKhQSPRxSn0rBM6/cLbPgrk+v2c+q5FefRDseL169WratGkDnM0I+cUXX7BmzRoeeeQRILnM/vTTT6xatYp27dr5pl3ev38/hw4dcmJo7H/79u3L0vOEUKVKFerWrUvdunVp27YtL7/8Mm3atGHQoEEcOnQo6D6T8S/w+Q0PD/e9h+nF1q1b+eyzz+jQoQPGGA4dOsShQ4fo1q0bgG/8WLDvtSdOnGDmzJlUrVrV+aA+H6mVCT/8+kzGQOnngwcPEh4eTqFChTz1wsLCPO+1wc5bF0KWjQn6+OOPOXHihPN/sZiEhYXRr18/+vXrx5EjR1i+fDlJSUl07NiRLVu2ULJkyXQ5f2oDLt9//31H2xAM+fLlY+/evcm279mzByCZT7hfcO2+ffvS7QENvN5cuXKRkJAQVBvl5SAwSNjvgalZsybvvvsuZ86cYcOGDUyePJmhQ4cSHx/PgAEDnIDTzz//3NdvNdAfNaMCY2Vw9cO+XjsYPZgBwo8CBQoELQt9+/bl6aefZsaMGdx444189NFHDBgwwNNXBQsWpEaNGo7iIBD7AwMyrg/Twrx58zh9+rRn7QK/9kmfvPDCC+fMLiUTWsGCBXn22Wd59tln2bVrFx999BEPPfQQv/32m5M5rXr16syYMQNjDBs3bmTatGk89thjxMTE8NBDD6XzVaYPuXLlolWrVsyfP5/du3enOPbJOLF3795k9fbs2eP056ZNm9iwYQPTpk3z+KNLTFyoEhERQVJSEuPGjWPTpk0sWbKEPXv2sGzZMsf6A1zQmkcFChRg9erVybYHjt1//fUXc+fOJSkpySNb//77b4at6ZSRBPZtepCVxqRguJA+CHa8njFjBhEREcydO9fzQf7BBx/47teoUSOuv/56+vXrB8CECRM8saQFCxakQIEC58weGR8f7/l/qNyTGjVqsHDhQn766aeg+0zGx/3793u8c06dOpVuimY/pkyZgjGG9957j/feey9Z+WuvvcaIESPSlKlXkhxdffXVXHXVVSxYsIB8+fKluE9qZcIP6TP73VTGQNlWoEABTp06xYEDBzwfQub/pzqvV6+ep/755q0LIctagmrUqOF84detW9f3SzAuLo4OHTowZMgQjh8/nuFuLOf64v7nn39YsGCBr/n+XJqvVq1asXjxYkejLUyfPp24uDjq16/v2R6YkW379u2sWrUqXRe68mvjwoULk2UFmT59OgkJCc5HQtmyZQGSLSKb0iKxl1xyCbVq1eLFF18kJiaGdevWAdCxY0dOnTrF/v37Pfdf/ol27GJyruuVoL/U0qpVK+elzGb69OnExsZ6XvKrVKlCgwYNmDp1Km+99Rb//vsvffv29ezXsWNHNm3aRLly5Xz7MPAjKKuwa9cuHnjgAfLkyUP//v1TrNukSRPy5s3L5s2bfa+xbt26REZGJtuvdOnS3H333bRu3dqROZuwsDAuv/xyxo0bR968eX3rZCWGDBmCMYbbbrvNozQSTp48yZw5c2jZsiVwNpmEzZo1a/j+++8dVxl50QnMNCfZ+mxSY1nPTPwUCuC6uBUvXjxV1xksLVq04PDhw8nGvcCxOywsDGNMsnNPmjTJsYhnVYLp24wkWEtSRpLefRDseC2Ld9svxMeOHUuWUdamd+/ezJgxg6lTp9KrVy+PfHXs2JGDBw9y+vRp3/NWqlQpVdeRVfjmm2+As0mMgu0zSVIxc+ZMz/b33nsv6OVRUsvp06d57bXXKFeuHEuXLk32b+DAgezdu5f58+en+Ry1atVi+fLl7N69m+bNm593MfL0kok333zT838ZA+V9VeabwPno/fff5+jRo055sPMWpH1syLKWoHPRt29fEhISaNKkCUWLFmXv3r08+eST5MuXjzp16mTouStUqEB0dDSvv/46FStWJHfu3JQoUYIvvviCEydO0KVLl2T7VK9enSVLljB37lyKFi1KQkICFStWZNiwYcyfP5/mzZvz6KOPkjdvXl5//XUWLlzI2LFjk31x7927l+uuu45+/fpx6NAhhg4dSmxsLIMHD86w6x0+fDiffPIJzZs355FHHiFv3ry89tprfPrppzz33HNOdpgmTZqQmJjIvffey7Fjx4iPj+fdd99l7dq1nuO9//77TJs2jS5dupCYmMjp06d55513OHbsmLO4bKtWrejVqxc333wzd999N02bNiU2NpY9e/awYsUK6tWr52i2Lhbt27cnf/789OvXj8cee4zw8HCmTZvmpBVPLUlJSY5f+NChQ8mfPz9vvvkm8+bNY/To0cmsi7fccgv9+/dnz549NG7cONnA9Nhjj7Fo0SIaN27MPffcQ6VKlTh+/Dg7duzg448/ZuLEielmMU0rmzZtcvyNf/vtN1asWMHUqVPJlSsXs2fPTmYmDyQuLo4XXniB3r1788cff9CtWzcKFy7MgQMH2LBhAwcOHGDChAn89ddftGjRgh49elC5cmXi4+NZs2YNCxYs4LrrrgPO+kG/9NJLXHPNNVx66aUYY5g1axaHDh1y5DKr0qhRIyZMmMBdd91FnTp1uPPOO6latSonT55k/fr1vPLKK1SrVo3Zs2dz++2388ILL3DJJZfQrl07J8tOqVKluO+++4CzcXvlypXjoYcewhhD/vz5mTNnDosWLUp27urVqwPw3HPP0bt3byIiIqhUqVJQ2sKM5Oqrr6ZkyZJ06tSJypUrc+bMGb755hvGjh1LXFwc9957L8WLFydfvnzccccdJCUlERERwZtvvnlByw706tWLcePG0atXL5544gkqVKjAxx9/zMKFCz31EhISuPLKK3n66acpWLAgZcuWZfny5UyePDlLLTrrRzB9m5FUr16dWbNmMWHCBOrUqcMll1xyTot9RpHefRDseN2hQweeeeYZevTowe23387BgwcZM2bMedd069atG7GxsXTr1s3JRBYZGUn37t158803ad++Pffeey/169cnIiKC3bt3s3TpUrp06cK11157IV2V4cg8Amddp2bNmsWiRYu49tprSUxMDLrPqlatyk033cTYsWPJlSsXLVu25LvvvmPs2LHkyZPHN/37hTJ//nz27NnDqFGjfJXZ1apV48UXX2Ty5MlBh1n4UaVKFVasWMFVV13FlVdeyeLFi885/6eHTERGRjJ2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7uspc5+7ieMSSL94IpHabdoTGdXlFbw8Aym42d/XedZYd5MHUpW7e+vnPve5CfsNEzxHu8wwVpkbGN/SxDI0fq8o0TDbxBIUQgghhBBCGCtG0hLUwot+1Wk451e71krFOy6az7vuukvSxOKeUulPil/5W38dNIeGcNhwjTgJILi2q6++umtbddVVJfVqQOkftFktLXBdeEwqfV1rSaWinSJo01OZIsut+zAMiTw23njj7jNp19GSttKO0nceSEyfodnzYxKc20oaMOiQet1T5NI3aCClorlraU35jLXMNZz0G9o6T7vN9+644w5JpYigbwv9aVmC0Bhvttlm3TYC4bmPfv+mO/WuzzOcb6t4ZqvAM3PiVe6wAAAgAElEQVQP1kX3xEAr3JqD2IZMuhUFy0bLg4O2mbQEOVhKOG8/D9qwknoaZ6we1113XbeNscaY9XTNWHQZn56ApO4fvx/0ayuFPd/zeZPrYL1fY401urYTTjih0QPzh89bFL/l3Pw8kMG6rIlULGX89XaSJXz1q1/t2lh36V8vussxWE+9lAC/jRXd13S+5/KNRY4+/MxnPtO1tTyShh3krbX+0nf0hT8vurVtNoklKIQQQgghhDBWjJQlCM2Qa5hWWmklSb0afLQgrdgM3mr7pTXle67FIwYEbaqnCRylmCC0S/RhyzcU/3WP26B/BsUPdEFxDR/XhxxcdtllXRs+wn699EE/CxBtLpv42vJ971fkmpTj3taSO/x1+6WZnW3Q1LU0mS0tcq35dG15HdeA9U4qBZSH0RIExN/55y233LLbdswxx0hqWx5q7ar7cnMP0H66z/t73vMeScM/lmcD5LEVJ/K+971PUrHqSmWccq88NmO6U2S3YoKQleWWW67bRsyha+nRBjM/eSxH7Ynhc1adVtxlkmPWabSlyaefnkrcAop1gD7A6iOVMcS85JadW265RVJvbB/HasXdehyL1DsPYmUgxsZjUUgtzVpC0VSpjHViA6WSBptU2h6f+YlPfEILixf6paA91iZfY1nzuOc+f5Mm3AuEExNEH/gYQQb5HX9G4zfpCzwPpGK5I4223w+s7x7jjBcI3i5+Di996Us1qmCl9HXbLWpS73ONr12zSSxBIYQQQgghhLEiL0EhhBBCCCGEsWKk3OFagZZrrrmmpF6TO64ILfe52pzups9+FcAx+xHU+q1v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hRBCCCGEEMaIWIJCCCGEEEIIY0VegkIIIYQQQghjRV6CQgghhBBCCGNFXoJCCCGEEEIIY0VegkIIIYQQQghjRV6CQgghhBBCCGNFXoJCCCGEEEIIY0VegkIIIYQQQghjRV6CQgghhBBCCGNFXoJCCCGEEEIIY0VegkIIIYQQQghjRV6CQgghhBBCCGPFo2b7BFo84hGPmPJj7r333t3n5ZZbTpL0wx/+UJJ09tlnd21/+9vfJEmPfOQjJUkrrrhi17bVVltJkn73u99Jkr7zne90bQ8++GDP9zjOwvCPf/xjvr8zHX3nbLfddpKkV7/61ZKkyy+/vGtbdNFFJUl33XWXJOkvf/lL17bGGmtIki6++GJJ0pOe9KSu7bjjjpMk/fnPf56y85yJvmN/fuuxj31s17bMMstIklZdddVu2y9/+UtJ0jnnnDPf5yZJH//4xyVJJ598crft4YcfliTddttt8zy/yTKIcrfyyitLknbaaSdJpS+k/uf7kY98RJJ0wgknSJKuvfba6TrFeZ5Li+not4997GPd51/96leSpK9//euSpBtvvLFrW2KJJSSVPnVZXWyxxSRJp59+uiTpyCOPnPLzdAZR5oaFYei7pZdeuvv8+9//XpL00EMPzeg5tBiGvhtUhqHv/umfip7/Fa94hSTpKU95iiTp85///IyeizMMfTeoLEjf9eMR/5jqI04BU3mzn/jEJ0qSdt55527bc5/7XEnlZYYXF4cHch4iJGmRRRbp+d4tt9zStV1wwQVTds4wiAPllFNOkSRtu+22kqRLLrmka+PBn/782c9+1rUtv/zykqSTTjpJkvTAAw90bd/4xjckST/60Y+m7Dynq+98H34DuVhrrbW6Nl7yrrrqqm7boYceKqnIzfvf//5JndcVV1whSTrkkEMk9craKqusIkn661//Kkk677zzurYFfREfFLk79thju88rrbSSJOnRj360pPIAL5Ux/ve//11S78s3L+Qshv6yuNtuu035Oc/mSxBznL8kMz433HDDeX7fz/373/++pKL4me55ZVBkbhgZ5L7j3P70pz9121AGPfnJT5bUO14Z5z/96U9n9Pzmh8jd/zGIfVcr/nzeu/POOyVJBx54oCTp3e9+d9fG8x7rBGvJdDGIfTcsTPUrS9zhQgghhBBCCGNFXoJCCCGEEEIIY8VAxgRNJbhmebzG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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes 5-10 seconds to execute this\n", "show_MNIST(test_lbl, test_img, fashion=True)" @@ -626,64 +393,9 @@ }, { "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of all images in training dataset.\n", - "Apparel 0 : 6000 images.\n", - "Apparel 1 : 6000 images.\n", - "Apparel 2 : 6000 images.\n", - "Apparel 3 : 6000 images.\n", - "Apparel 4 : 6000 images.\n", - "Apparel 5 : 6000 images.\n", - "Apparel 6 : 6000 images.\n", - "Apparel 7 : 6000 images.\n", - "Apparel 8 : 6000 images.\n", - "Apparel 9 : 6000 images.\n" - ] - }, - { - "data": { - "image/png": "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o3v37s45ixcvRvfu3ZGQkIDY2Fh06tQJX375pd919+/fj9tvvx01atRAVFQUkpOT0alTJyxevNg55ocffkBaWhoqVqyIqKgoVK1aFX379sXu3buLpvL55LHHHkNYWBhee+018eM1MjLSsUZfuHABkydPRmpqKqKiolCxYkUMGTIkoI6LFi1C//79Ub16dURHR6Nu3boYOXIkDhw44Bwzfvx4PPDAAwCAlJSUkHK3PXjwICpUqOD3kkqUKuWb8mbPno2ePXuiSpUqiImJQcOGDfHggw/ixIkTfudQG9y2bRv69OmDuLg41KhRA6NGjcKZM2f8js3MzMRf/vIXxMfHIzExETfddFPAuAhcfPEZNGgQateujZiYGNSuXRt//etfA8a4UMOrbIkFCxagZcuWiImJQWpqqqP1JiTXuJz6fNeuXfH5559j586dfi5RRY1XGZB7Wm4yALyN1wAwYcIEtGvXDklJSUhISEDLli0xffp0GGNyLfdLL72E8PBwpKenO9vOnj2LiRMnOmNCcnIyhg8fjv379/udS3WZM2cOWrRogejoaEyYMCHXexY10dHRiIyMREREhLPNq8zOnDmDUaNGoXLlyoiNjcWVV16J77//HrVr18awYcMKtdzTp08HADzxxBPo2LEj3n//fZw8edLvGJqvp0yZgqeeegopKSmIi4tDhw4d/N6xcuLbb79FhQoVkJaWFjDGcby2CTc2b96M7t27o0yZMkhOTsbdd98dUJ/Tp09j7NixSElJQWRkJKpVq4Z//OMfAa7WXuatgo4NRWoRCgZvv/027r77btx7773o27cvwsLCsG3bNvz8888Bx956663o168f3nvvPezcuROjR4/GkCFD8MUXX+R6n6effhqpqal46qmnEB8fj/r162PatGm47bbbMH78eFxzzTUAgBo1ajjnzJ07F+Hh4ejduzfCw8OxcuVKdOnSBb169cLYsWMBAImJiQCALVu2oGPHjqhcuTJeeOEFlCtXDrNmzcKQIUOwf/9+/POf//Qrz5gxY9C6dWu88cYbOHz4MNLT09GlSxesX78etWrVyrc8iVGjRuHKK6/EtGnTcOHCBZQrVw4bN25Ep06dUK1aNbz44osoW7YsZs6ciZtvvhkHDhzAPffck6d7HDlyBD179kRqaipeeeUVJCcnY8+ePViyZIlfxxw2bBhmz56N+++/H1OmTMH+/fsxYcIEdO7cGevWrUP58uWdY3fu3Inhw4dj7NixaNiwoTg5BYNt27YBuGhdy0+skBs///wzOnbsiIoVK+K5555D+fLl8fbbb2PYsGHYu3cvRo8ejeTkZKSlpeHNN9/EhAkT/CbcGTNmIDIy0rFUZWVloW3btihVqhTGjRuHOnXqYOXKlZg4cSJ27NiBGTNm+N3/ueeeQ/369TFlyhQkJCSgXr16Qa1fXujTpw9Kly6Nr7/+2tl29uxZXHvttRg5ciQefPBB5+Xg7bffxpAhQ9C/f3+8+eabiIiIwKuvvoprrrkGCxcudD6YbrnlFqxduxaPPvoo6tevjyNHjmDt2rU4ePAgAODEiRPo0aMHUlJS8OKLL6JSpUrIysrC0qVLcezYsaIXgkeys7OxZMkStGrVym8cyok777wTr732Gu6++26kpaVhx44deOihh/DVV19h7dq1qFChAgDg119/RYcOHXDbbbchMTERO3bswFNPPYXOnTtj48aNiIiIwG233YZDhw7h+eefx5w5c1ClShUAoeFu26FDB0ybNg333HMPbr75ZrRs2dLvxYjYunUr+vTpg/vuuw9lypTBTz/9hEmTJmH16tUBbsTnzp3DtddeixEjRmDUqFH4+uuv8cgjjyAxMRHjxo0DcFFDfvXVVyMzMxOPP/446tevj88//xw33XRTwL137NiBBg0aYNCgQUhKSsKePXvw8ssvo02bNtiyZYvzLEINr7IFLirRRo0ahQcffBCVKlXCtGnTMGLECNStWxdXXnml632kPl+9enXcfvvt+PXXXwvF1dMrwZZBXsbrHTt2YOTIkahZsyYA4LvvvsN//dd/4Y8//nDaoY0xBg888ACee+45TJs2zXmpv3DhAvr374/ly5dj9OjR6NixI3bu3In09HR07doVa9as8bP4rF27Fj/++CP+93//FykpKSHhIk4eDMYY7N27F08++SROnDiBwYMHO8d4ldnw4cMxe/ZsjB49GldddRW2bNmC66+/HkePHi3UOpw6dQrvvfce2rRpg8aNG+PWW2/Fbbfdhg8//BBDhw4NOP7FF19EamqqEw/z0EMPoU+fPti+fbvzfmnzwQcfYMiQIbj11lvx/PPP5+jtk9c2IXHu3Dn06dPH6bsrVqzAxIkTsXPnTid23hiD6667Dl9++SXGjh2LK664Ahs2bEB6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vw9jDDZs2ICZM2fi4YcfRkxMDB588MEg1zI4lC5dGt27d8f8+fOxe/du17GPxok9e/YEHJeZmenIc9OmTVi/fj1mzpzp559OMXKXKhEREUhPT8fTTz+NTZs2YcmSJcjMzMRXX33lWIEAFGhNpPLly2P16tUB2+2x+88//8S8efOQnp7u17bOnDlTaGs+FSa2bINBKI1JXiiIDLyO1++//z4iIiIwb948v4/yTz/9VDyvQ4cOuPHGGzFixAgAwMsvv+wXW1qhQgWUL18+x6yS8fHxfv+/VJ5J06ZNsXDhQvzyyy+eZUbj4969e/28dM6fPx+0l22JN954A8YYfPTRR/joo48C9r/55puYOHFivjL4UuKja665BldffTUWLFiAcuXKuZ6T1zYhQTLj76Y0BtK28uXL4/z589i/f7/fx5D5/2nQ27Rp43d8bvNWQQlZi1DTpk2dL/3WrVuLX4RxcXHo27cvxo4di9OnTxe6S0tOX94nT57EggULRFN+Thqw7t27Y/HixY5mm5g1axbi4uLQtm1bv+12prbffvsNq1atCupiWFIZFy5cGJAtZNasWUhISHA+FGrXrg0AAQvNui0kW6pUKbRo0QIvvPACYmJisHbtWgBAWloazp8/j7179/o9f/pHWrLiJKf6UiBgXunevbvzYsaZNWsWYmNj/V70GzZsiHbt2mHGjBl49913cebMGQwfPtzvvLS0NGzatAl16tQRZWh/CIUKu3btwn//938jMTERI0eOdD22U6dOKFu2LLZs2SLWsXXr1oiMjAw4r2bNmrj77rvRo0cPp81xwsLC0KxZMzz99NMoW7aseEwoMXbsWBhj8Pe//91PcUScO3cOn332Ga666ioAFxNMcDIyMvDjjz86bjP0smNnoKMsfpy8WNiLEkmpAPjc3apWrZqnenqlW7duOHbsWMC4Z4/dYWFhMMYE3HvatGmOZTxU8SLbwsSrRakwCbYMvI7XtMA3fyk+depUQKZZztChQ/H+++9jxowZGDJkiF/7SktLw8GDB5GdnS3et0GDBnmqR6iwbt06ABcTG3mVGSWumD17tt/2jz76yPPSKXklOzsbb775JurUqYOlS5cG/Bs1ahT27NmD+fPn5/seLVq0wLJly7B792507do11wXLg9Um3nnnHb//0xhI76s039jz0ccff4wTJ044+73OW0DBxoaQtQjlxPDhw5GQkIBOnTqhcuXK2LNnDx577DGUK1cOrVq1KtR716tXD9HR0XjrrbdQv359lClTBtWqVcO3336Ls2fPon///gHnNGnSBEuWLMG8efNQuXJlJCQkoH79+hg/fjzmz5+Prl274qGHHkLZsmXx1ltvYeHChZg6dWrAl/eePXtwww03YMSIEThy5AjGjRuH2NhYjBkzptDqO2HCBHzxxRfo2rUr/vWvf6Fs2bJ488038eWXX+LZZ591ssZ06tQJKSkpuPfee3Hq1CnEx8fjww8/xJo1a/yu9/HHH2PmzJno378/UlJSkJ2djQ8++ACnTp1yFqDt3r07hgwZgptvvhl33303OnfujNjYWGRmZmL58uVo06aNo+EqLvr06YOkpCSMGDECDz/8MMLDwzFz5kwn5XheSU9Pd/zEx40bh6SkJLzzzjv4/PPPMXny5AAr46233oqRI0ciMzMTHTt2DBicHn74YSxatAgdO3bEPffcgwYNGuD06dPYsWMH/v3vf+OVV14JmuU0v2zatMnxP963bx+WL1+OGTNmoHTp0vjkk08CTOY2cXFxeP755zF06FAcOnQIAwcORMWKFbF//36sX78e+/fvx8svv4w///wT3bp1w+DBg5Gamor4+HhkZGRgwYIFuOGGGwBc9It+6aWXcN111+Gyyy6DMQZz5szBkSNHnHYZqnTo0AEvv/wy7rrrLrRq1Qp33nknGjVqhHPnzuGHH37Aa6+9hsaNG+OTTz7B7bffjueffx6lSpVC7969new7NWrUwP333w/gYhxfnTp18OCDD8IYg6SkJHz22WdYtGhRwL2bNGkCAHj22WcxdOhQREREoEGDBp60hoXJNddcg+rVq6Nfv35ITU3FhQsXsG7dOkydOhVxcXG49957UbVqVZQrVw533HEH0tPTERERgXfeeadASxIMGTIETz/9NIYMGYJHH30U9erVw7///W8sXLjQ77iEhARceeWVePLJJ1GhQgXUrl0by5Ytw/Tp00NqYVoJL7ItTJo0aYI5c+bg5ZdfRqtWrVCqVKkcLfeFRbBl4HW87tu3L5566ikMHjwYt99+Ow4ePIgpU6bkuubbwIEDERsbi4EDBzoZyiIjIzFo0CC888476NOnD+699160bdsWERER2L17N5YuXYr+/fvj+uuvL4ioCh2aR4CLblRz5szBokWLcP31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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of all images in testing dataset.\n", - "Apparel 0 : 1000 images.\n", - "Apparel 1 : 1000 images.\n", - "Apparel 2 : 1000 images.\n", - "Apparel 3 : 1000 images.\n", - "Apparel 4 : 1000 images.\n", - "Apparel 5 : 1000 images.\n", - "Apparel 6 : 1000 images.\n", - "Apparel 7 : 1000 images.\n", - "Apparel 8 : 1000 images.\n", - "Apparel 9 : 1000 images.\n" - ] - }, - { - "data": { - "image/png": "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BVasWOEo9nyZt15//fWCjQ2mGBk4cKApU6ZMnn5zzz33mISEBNdr3nnnHQPAPPDAA17Hn376aQPA7N+/3znWrl0707lzZ+ff27dvNwBMnTp1THZ2ttfvV6xYYQCY999/X3xuamqquemmm7yOhYWFmSFDhuS6tm/fviY8PNzs3r3b63jXrl1NVFSUOXr0qDHGmPnz5xsApmXLlub8+fPOdb/99psJDg4299xzj5sojDHucp4zZ44BYLp27Zrr3I033mgiIyPNnj17vI5fd911JiYmxhw/ftwYY8wbb7xhAOS6ju69YsUKY4wxy5YtMwDM3LlzL1rWRYsWGQDmtdde8zq+Y8cOExoaakaNGuUca9WqlQFgfvjhB5fa540pU6YYAObHH3802dnZ5tixY2bWrFkmMTHRREdHm71795q0tDQjdR367e+//+4c69Chg+nQoYPXdQBMWlqa8+9+/fqZsLAws2vXLq/revToYSIjI01WVpYxxpiZM2caAObbb791rjl37pypXLmy6dOnj3Ns6NChJioqymRkZHjdb8KECQaA2bx5szHGmN9//90AMLVq1TJnz57Nk5zyC8koPT39otdUqFDB1KtXzxhzoe0CMO+++67XNSdOnDDx8fGmV69eXsdzcnLM1VdfbVq2bOkci4qKMg899NBFn7d69WoDwHz11Vf5qVKxsXfvXgPA9OvX75LXbt261QAw9913n9fxlStXGgDmX//6l/i78+fPm+zsbJORkWEAmP/85z/Oueeeey5Xew8EDh48aNq3b28AGAAmJCTEtG3b1jzzzDPm2LFj4m+onkuWLDEAzPr1651z1AY//fRTr9/07NnT1K1b1/k3jYNcRsYY849//MMAMFOmTLlomc+dO2eOHz9uypQpY1566SXnOI2HixYtyoMECg9fZVujRg0THh7uNQadOnXKxMfHm6FDhzrHpPpdrM8bY0xKSoqpUaNGodTNV/wtA1/Ha5ucnByTnZ1tnnjiCVOuXDmv74MaNWqYlJQUc/LkSdOnTx8TGxtrFixY4PX7jz/+2AAwX3zxhdfx9PR0A8C8/vrrXvcrXbq0+fnnn/MgqcKD5hH7v7CwMK9y21xMZps3bzYAzIgRI7yuJxkNHDiw0Ooybdo0A8C8+eabxhhjjh07ZqKiosw111zjdR3N1w0bNjTnzp1zjq9atcoAMB9//LFz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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"Average of all images in training dataset.\")\n", "show_ave_MNIST(train_lbl, train_img, fashion=True)\n", @@ -694,9 +406,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "Unlike Digits, in Fashion all items appear the same number of times." ] @@ -714,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -724,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -743,17 +453,9 @@ }, { "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pL = PluralityLearner(MNIST_DataSet)\n", "print(pL(177))" @@ -761,39 +463,9 @@ }, { "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 0\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -812,17 +484,9 @@ }, { "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes ~45 Secs. to execute this\n", "\n", @@ -839,39 +503,9 @@ }, { "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 1\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -890,17 +524,9 @@ }, { "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# takes ~20 Secs. to execute this\n", "kNN = NearestNeighborLearner(MNIST_DataSet, k=3)\n", @@ -916,39 +542,9 @@ }, { "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 1\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 123, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%matplotlib inline\n", "\n", @@ -985,10 +581,10 @@ "pycharm": { "stem_cell": { "cell_type": "raw", - "source": [], "metadata": { "collapsed": false - } + }, + "source": [] } } }, diff --git a/notebooks/logic.ipynb b/notebooks/logic.ipynb index f5013aa76..535c8b18f 100644 --- a/notebooks/logic.ipynb +++ b/notebooks/logic.ipynb @@ -11,9 +11,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Logic" ] @@ -29,10 +27,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.utils import *\n", @@ -65,9 +61,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## Logical Sentences" ] @@ -81,20 +75,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "Symbol('x')" ] @@ -108,10 +91,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "(x, y, P, Q, f) = symbols('x, y, P, Q, f')" @@ -126,20 +107,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P & ~Q)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P & ~Q" ] @@ -158,20 +128,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'&'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sentence = P & ~Q\n", "\n", @@ -180,80 +139,36 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P, ~Q)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sentence.args" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'P'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P.op" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "()" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P.args" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'P'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "Pxy = P(x, y)\n", "\n", @@ -262,20 +177,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(x, y)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "Pxy.args" ] @@ -289,20 +193,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(((3 * f(x, y)) + (P(y) / 2)) + 1)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "3 * f(x, y) + P(y) / 2 + 1" ] @@ -330,20 +223,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "~(P & Q) |'==>'| (~P | ~Q)" ] @@ -359,20 +241,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "expr('~(P & Q) ==> (~P | ~Q)')" ] @@ -386,20 +257,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sqrt(((b ** 2) - ((4 * a) * c)))" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "expr('sqrt(b ** 2 - 4 * a * c)')" ] @@ -438,10 +298,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "wumpus_kb = PropKB()" @@ -458,10 +316,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "P11, P12, P21, P22, P31, B11, B21 = expr('P11, P12, P21, P22, P31, B11, B21')" @@ -477,10 +333,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "wumpus_kb.tell(~P11)" @@ -495,10 +349,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "wumpus_kb.tell(B11 | '<=>' | ((P12 | P21)))\n", @@ -514,10 +366,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "wumpus_kb.tell(~B11)\n", @@ -533,29 +383,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[~P11,\n", - " (~P12 | B11),\n", - " (~P21 | B11),\n", - " (P12 | P21 | ~B11),\n", - " (~P11 | B21),\n", - " (~P22 | B21),\n", - " (~P31 | B21),\n", - " (P11 | P22 | P31 | ~B21),\n", - " ~B11,\n", - " B21]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "wumpus_kb.clauses" ] @@ -625,123 +455,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def tt_check_all(kb, alpha, symbols, model):\n",
-       "    """Auxiliary routine to implement tt_entails."""\n",
-       "    if not symbols:\n",
-       "        if pl_true(kb, model):\n",
-       "            result = pl_true(alpha, model)\n",
-       "            assert result in (True, False)\n",
-       "            return result\n",
-       "        else:\n",
-       "            return True\n",
-       "    else:\n",
-       "        P, rest = symbols[0], symbols[1:]\n",
-       "        return (tt_check_all(kb, alpha, rest, extend(model, P, True)) and\n",
-       "                tt_check_all(kb, alpha, rest, extend(model, P, False)))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(tt_check_all)" ] @@ -777,120 +493,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def tt_entails(kb, alpha):\n",
-       "    """Does kb entail the sentence alpha? Use truth tables. For propositional\n",
-       "    kb's and sentences. [Figure 7.10]. Note that the 'kb' should be an\n",
-       "    Expr which is a conjunction of clauses.\n",
-       "    >>> tt_entails(expr('P & Q'), expr('Q'))\n",
-       "    True\n",
-       "    """\n",
-       "    assert not variables(alpha)\n",
-       "    symbols = list(prop_symbols(kb & alpha))\n",
-       "    return tt_check_all(kb, alpha, symbols, {})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(tt_entails)" ] @@ -905,20 +510,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "tt_entails(P & Q, Q)" ] @@ -932,40 +526,18 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "tt_entails(P | Q, Q)" ] }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "tt_entails(P | Q, P)" ] @@ -980,20 +552,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "(A, B, C, D, E, F, G) = symbols('A, B, C, D, E, F, G')\n", "tt_entails(A & (B | C) & D & E & ~(F | G), A & D & E & ~F & ~G)" @@ -1018,20 +579,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(True, False)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "wumpus_kb.ask_if_true(~P11), wumpus_kb.ask_if_true(P11)" ] @@ -1045,20 +595,9 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(False, False)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "wumpus_kb.ask_if_true(~P22), wumpus_kb.ask_if_true(P22)" ] @@ -1130,122 +669,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def to_cnf(s):\n",
-       "    """Convert a propositional logical sentence to conjunctive normal form.\n",
-       "    That is, to the form ((A | ~B | ...) & (B | C | ...) & ...) [p. 253]\n",
-       "    >>> to_cnf('~(B | C)')\n",
-       "    (~B & ~C)\n",
-       "    """\n",
-       "    s = expr(s)\n",
-       "    if isinstance(s, str):\n",
-       "        s = expr(s)\n",
-       "    s = eliminate_implications(s)  # Steps 1, 2 from p. 253\n",
-       "    s = move_not_inwards(s)  # Step 3\n",
-       "    return distribute_and_over_or(s)  # Step 4\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(to_cnf)" ] @@ -1267,375 +693,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def eliminate_implications(s):\n",
-       "    """Change implications into equivalent form with only &, |, and ~ as logical operators."""\n",
-       "    s = expr(s)\n",
-       "    if not s.args or is_symbol(s.op):\n",
-       "        return s  # Atoms are unchanged.\n",
-       "    args = list(map(eliminate_implications, s.args))\n",
-       "    a, b = args[0], args[-1]\n",
-       "    if s.op == '==>':\n",
-       "        return b | ~a\n",
-       "    elif s.op == '<==':\n",
-       "        return a | ~b\n",
-       "    elif s.op == '<=>':\n",
-       "        return (a | ~b) & (b | ~a)\n",
-       "    elif s.op == '^':\n",
-       "        assert len(args) == 2  # TODO: relax this restriction\n",
-       "        return (a & ~b) | (~a & b)\n",
-       "    else:\n",
-       "        assert s.op in ('&', '|', '~')\n",
-       "        return Expr(s.op, *args)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def move_not_inwards(s):\n",
-       "    """Rewrite sentence s by moving negation sign inward.\n",
-       "    >>> move_not_inwards(~(A | B))\n",
-       "    (~A & ~B)"""\n",
-       "    s = expr(s)\n",
-       "    if s.op == '~':\n",
-       "        def NOT(b):\n",
-       "            return move_not_inwards(~b)\n",
-       "        a = s.args[0]\n",
-       "        if a.op == '~':\n",
-       "            return move_not_inwards(a.args[0])  # ~~A ==> A\n",
-       "        if a.op == '&':\n",
-       "            return associate('|', list(map(NOT, a.args)))\n",
-       "        if a.op == '|':\n",
-       "            return associate('&', list(map(NOT, a.args)))\n",
-       "        return s\n",
-       "    elif is_symbol(s.op) or not s.args:\n",
-       "        return s\n",
-       "    else:\n",
-       "        return Expr(s.op, *list(map(move_not_inwards, s.args)))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def distribute_and_over_or(s):\n",
-       "    """Given a sentence s consisting of conjunctions and disjunctions\n",
-       "    of literals, return an equivalent sentence in CNF.\n",
-       "    >>> distribute_and_over_or((A & B) | C)\n",
-       "    ((A | C) & (B | C))\n",
-       "    """\n",
-       "    s = expr(s)\n",
-       "    if s.op == '|':\n",
-       "        s = associate('|', s.args)\n",
-       "        if s.op != '|':\n",
-       "            return distribute_and_over_or(s)\n",
-       "        if len(s.args) == 0:\n",
-       "            return False\n",
-       "        if len(s.args) == 1:\n",
-       "            return distribute_and_over_or(s.args[0])\n",
-       "        conj = first(arg for arg in s.args if arg.op == '&')\n",
-       "        if not conj:\n",
-       "            return s\n",
-       "        others = [a for a in s.args if a is not conj]\n",
-       "        rest = associate('|', others)\n",
-       "        return associate('&', [distribute_and_over_or(c | rest)\n",
-       "                               for c in conj.args])\n",
-       "    elif s.op == '&':\n",
-       "        return associate('&', list(map(distribute_and_over_or, s.args)))\n",
-       "    else:\n",
-       "        return s\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(eliminate_implications)\n", "psource(move_not_inwards)\n", @@ -1651,20 +711,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((A | ~B) & (B | ~A))" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "A, B, C, D = expr('A, B, C, D')\n", "to_cnf(A |'<=>'| B)" @@ -1672,60 +721,27 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((A | ~B | ~C) & (B | ~A) & (C | ~A))" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "to_cnf(A |'<=>'| (B & C))" ] }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(A & (C | B) & (D | B))" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "to_cnf(A & (B | (C & D)))" ] }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((B | ~A | C | ~D) & (A | ~A | C | ~D) & (B | ~B | C | ~D) & (A | ~B | C | ~D))" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "to_cnf((A |'<=>'| ~B) |'==>'| (C | ~D))" ] @@ -1739,168 +755,27 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def pl_resolution(KB, alpha):\n",
-       "    """Propositional-logic resolution: say if alpha follows from KB. [Figure 7.12]"""\n",
-       "    clauses = KB.clauses + conjuncts(to_cnf(~alpha))\n",
-       "    new = set()\n",
-       "    while True:\n",
-       "        n = len(clauses)\n",
-       "        pairs = [(clauses[i], clauses[j])\n",
-       "                 for i in range(n) for j in range(i+1, n)]\n",
-       "        for (ci, cj) in pairs:\n",
-       "            resolvents = pl_resolve(ci, cj)\n",
-       "            if False in resolvents:\n",
-       "                return True\n",
-       "            new = new.union(set(resolvents))\n",
-       "        if new.issubset(set(clauses)):\n",
-       "            return False\n",
-       "        for c in new:\n",
-       "            if c not in clauses:\n",
-       "                clauses.append(c)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(pl_resolution)" ] }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(True, False)" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_resolution(wumpus_kb, ~P11), pl_resolution(wumpus_kb, P11)" ] }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(False, False)" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_resolution(wumpus_kb, ~P22), pl_resolution(wumpus_kb, P22)" ] @@ -1960,115 +835,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def clauses_with_premise(self, p):\n",
-       "        """Return a list of the clauses in KB that have p in their premise.\n",
-       "        This could be cached away for O(1) speed, but we'll recompute it."""\n",
-       "        return [c for c in self.clauses\n",
-       "                if c.op == '==>' and p in conjuncts(c.args[0])]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PropDefiniteKB.clauses_with_premise)" ] @@ -2082,132 +851,9 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def pl_fc_entails(KB, q):\n",
-       "    """Use forward chaining to see if a PropDefiniteKB entails symbol q.\n",
-       "    [Figure 7.15]\n",
-       "    >>> pl_fc_entails(horn_clauses_KB, expr('Q'))\n",
-       "    True\n",
-       "    """\n",
-       "    count = {c: len(conjuncts(c.args[0]))\n",
-       "             for c in KB.clauses\n",
-       "             if c.op == '==>'}\n",
-       "    inferred = defaultdict(bool)\n",
-       "    agenda = [s for s in KB.clauses if is_prop_symbol(s.op)]\n",
-       "    while agenda:\n",
-       "        p = agenda.pop()\n",
-       "        if p == q:\n",
-       "            return True\n",
-       "        if not inferred[p]:\n",
-       "            inferred[p] = True\n",
-       "            for c in KB.clauses_with_premise(p):\n",
-       "                count[c] -= 1\n",
-       "                if count[c] == 0:\n",
-       "                    agenda.append(c.args[1])\n",
-       "    return False\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(pl_fc_entails)" ] @@ -2245,10 +891,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses = ['(B & F)==>E', \n", @@ -2271,10 +915,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "definite_clauses_KB = PropDefiniteKB()\n", @@ -2291,80 +933,36 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_fc_entails(definite_clauses_KB, expr('G'))" ] }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_fc_entails(definite_clauses_KB, expr('H'))" ] }, { "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_fc_entails(definite_clauses_KB, expr('I'))" ] }, { "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pl_fc_entails(definite_clauses_KB, expr('J'))" ] @@ -2435,132 +1033,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def dpll(clauses, symbols, model):\n",
-       "    """See if the clauses are true in a partial model."""\n",
-       "    unknown_clauses = []  # clauses with an unknown truth value\n",
-       "    for c in clauses:\n",
-       "        val = pl_true(c, model)\n",
-       "        if val is False:\n",
-       "            return False\n",
-       "        if val is not True:\n",
-       "            unknown_clauses.append(c)\n",
-       "    if not unknown_clauses:\n",
-       "        return model\n",
-       "    P, value = find_pure_symbol(symbols, unknown_clauses)\n",
-       "    if P:\n",
-       "        return dpll(clauses, removeall(P, symbols), extend(model, P, value))\n",
-       "    P, value = find_unit_clause(clauses, model)\n",
-       "    if P:\n",
-       "        return dpll(clauses, removeall(P, symbols), extend(model, P, value))\n",
-       "    if not symbols:\n",
-       "        raise TypeError("Argument should be of the type Expr.")\n",
-       "    P, symbols = symbols[0], symbols[1:]\n",
-       "    return (dpll(clauses, symbols, extend(model, P, True)) or\n",
-       "            dpll(clauses, symbols, extend(model, P, False)))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(dpll)" ] @@ -2577,119 +1052,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def dpll_satisfiable(s):\n",
-       "    """Check satisfiability of a propositional sentence.\n",
-       "    This differs from the book code in two ways: (1) it returns a model\n",
-       "    rather than True when it succeeds; this is more useful. (2) The\n",
-       "    function find_pure_symbol is passed a list of unknown clauses, rather\n",
-       "    than a list of all clauses and the model; this is more efficient."""\n",
-       "    clauses = conjuncts(to_cnf(s))\n",
-       "    symbols = list(prop_symbols(s))\n",
-       "    return dpll(clauses, symbols, {})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(dpll_satisfiable)" ] @@ -2703,10 +1068,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "A, B, C, D = expr('A, B, C, D')" @@ -2714,20 +1077,9 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True, C: False, D: True}" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dpll_satisfiable(A & B & ~C & D)" ] @@ -2741,20 +1093,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{B: True, C: True, D: False}" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dpll_satisfiable((A & B) | (C & ~A) | (B & ~D))" ] @@ -2770,60 +1111,27 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True}" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dpll_satisfiable(A |'<=>'| B)" ] }, { "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: False, B: True, C: True}" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dpll_satisfiable((A |'<=>'| B) |'==>'| (C & ~A))" ] }, { "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{B: True, C: True}" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dpll_satisfiable((A | (B & C)) |'<=>'| ((A | B) & (A | C)))" ] @@ -2846,138 +1154,9 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def WalkSAT(clauses, p=0.5, max_flips=10000):\n",
-       "    """Checks for satisfiability of all clauses by randomly flipping values of variables\n",
-       "    """\n",
-       "    # Set of all symbols in all clauses\n",
-       "    symbols = {sym for clause in clauses for sym in prop_symbols(clause)}\n",
-       "    # model is a random assignment of true/false to the symbols in clauses\n",
-       "    model = {s: random.choice([True, False]) for s in symbols}\n",
-       "    for i in range(max_flips):\n",
-       "        satisfied, unsatisfied = [], []\n",
-       "        for clause in clauses:\n",
-       "            (satisfied if pl_true(clause, model) else unsatisfied).append(clause)\n",
-       "        if not unsatisfied:  # if model satisfies all the clauses\n",
-       "            return model\n",
-       "        clause = random.choice(unsatisfied)\n",
-       "        if probability(p):\n",
-       "            sym = random.choice(list(prop_symbols(clause)))\n",
-       "        else:\n",
-       "            # Flip the symbol in clause that maximizes number of sat. clauses\n",
-       "            def sat_count(sym):\n",
-       "                # Return the the number of clauses satisfied after flipping the symbol.\n",
-       "                model[sym] = not model[sym]\n",
-       "                count = len([clause for clause in clauses if pl_true(clause, model)])\n",
-       "                model[sym] = not model[sym]\n",
-       "                return count\n",
-       "            sym = argmax(prop_symbols(clause), key=sat_count)\n",
-       "        model[sym] = not model[sym]\n",
-       "    # If no solution is found within the flip limit, we return failure\n",
-       "    return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(WalkSAT)" ] @@ -3002,10 +1181,8 @@ }, { "cell_type": "code", - "execution_count": 56, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "A, B, C, D = expr('A, B, C, D')" @@ -3013,20 +1190,9 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True, C: False, D: True}" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "WalkSAT([A, B, ~C, D], 0.5, 100)" ] @@ -3040,50 +1206,26 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True, C: True}" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "WalkSAT([A & B, A & C], 0.5, 100)" ] }, { "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True, C: True, D: True}" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "WalkSAT([A & B, C & D, C & B], 0.5, 100)" ] }, { "cell_type": "code", - "execution_count": 60, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "WalkSAT([A & B, C | D, ~(D | B)], 0.5, 1000)" @@ -3107,10 +1249,8 @@ }, { "cell_type": "code", - "execution_count": 61, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def WalkSAT_CNF(sentence, p=0.5, max_flips=10000):\n", @@ -3126,20 +1266,9 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{A: True, B: True, C: False, D: True}" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "WalkSAT_CNF((A & B) | (C & ~A) | (B & ~D), 0.5, 1000)" ] @@ -3159,10 +1288,8 @@ }, { "cell_type": "code", - "execution_count": 63, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "sentence_1 = A |'<=>'| B\n", @@ -3172,17 +1299,9 @@ }, { "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.55 ms ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "dpll_satisfiable(sentence_1)\n", @@ -3192,17 +1311,9 @@ }, { "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.02 ms ± 6.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "WalkSAT_CNF(sentence_1)\n", @@ -3245,188 +1356,9 @@ }, { "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def SAT_plan(init, transition, goal, t_max, SAT_solver=dpll_satisfiable):\n",
-       "    """Converts a planning problem to Satisfaction problem by translating it to a cnf sentence.\n",
-       "    [Figure 7.22]"""\n",
-       "\n",
-       "    # Functions used by SAT_plan\n",
-       "    def translate_to_SAT(init, transition, goal, time):\n",
-       "        clauses = []\n",
-       "        states = [state for state in transition]\n",
-       "\n",
-       "        # Symbol claiming state s at time t\n",
-       "        state_counter = itertools.count()\n",
-       "        for s in states:\n",
-       "            for t in range(time+1):\n",
-       "                state_sym[s, t] = Expr("State_{}".format(next(state_counter)))\n",
-       "\n",
-       "        # Add initial state axiom\n",
-       "        clauses.append(state_sym[init, 0])\n",
-       "\n",
-       "        # Add goal state axiom\n",
-       "        clauses.append(state_sym[goal, time])\n",
-       "\n",
-       "        # All possible transitions\n",
-       "        transition_counter = itertools.count()\n",
-       "        for s in states:\n",
-       "            for action in transition[s]:\n",
-       "                s_ = transition[s][action]\n",
-       "                for t in range(time):\n",
-       "                    # Action 'action' taken from state 's' at time 't' to reach 's_'\n",
-       "                    action_sym[s, action, t] = Expr(\n",
-       "                        "Transition_{}".format(next(transition_counter)))\n",
-       "\n",
-       "                    # Change the state from s to s_\n",
-       "                    clauses.append(action_sym[s, action, t] |'==>'| state_sym[s, t])\n",
-       "                    clauses.append(action_sym[s, action, t] |'==>'| state_sym[s_, t + 1])\n",
-       "\n",
-       "        # Allow only one state at any time\n",
-       "        for t in range(time+1):\n",
-       "            # must be a state at any time\n",
-       "            clauses.append(associate('|', [state_sym[s, t] for s in states]))\n",
-       "\n",
-       "            for s in states:\n",
-       "                for s_ in states[states.index(s) + 1:]:\n",
-       "                    # for each pair of states s, s_ only one is possible at time t\n",
-       "                    clauses.append((~state_sym[s, t]) | (~state_sym[s_, t]))\n",
-       "\n",
-       "        # Restrict to one transition per timestep\n",
-       "        for t in range(time):\n",
-       "            # list of possible transitions at time t\n",
-       "            transitions_t = [tr for tr in action_sym if tr[2] == t]\n",
-       "\n",
-       "            # make sure at least one of the transitions happens\n",
-       "            clauses.append(associate('|', [action_sym[tr] for tr in transitions_t]))\n",
-       "\n",
-       "            for tr in transitions_t:\n",
-       "                for tr_ in transitions_t[transitions_t.index(tr) + 1:]:\n",
-       "                    # there cannot be two transitions tr and tr_ at time t\n",
-       "                    clauses.append(~action_sym[tr] | ~action_sym[tr_])\n",
-       "\n",
-       "        # Combine the clauses to form the cnf\n",
-       "        return associate('&', clauses)\n",
-       "\n",
-       "    def extract_solution(model):\n",
-       "        true_transitions = [t for t in action_sym if model[action_sym[t]]]\n",
-       "        # Sort transitions based on time, which is the 3rd element of the tuple\n",
-       "        true_transitions.sort(key=lambda x: x[2])\n",
-       "        return [action for s, action, time in true_transitions]\n",
-       "\n",
-       "    # Body of SAT_plan algorithm\n",
-       "    for t in range(t_max):\n",
-       "        # dictionaries to help extract the solution from model\n",
-       "        state_sym = {}\n",
-       "        action_sym = {}\n",
-       "\n",
-       "        cnf = translate_to_SAT(init, transition, goal, t)\n",
-       "        model = SAT_solver(cnf)\n",
-       "        if model is not False:\n",
-       "            return extract_solution(model)\n",
-       "    return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(SAT_plan)" ] @@ -3440,19 +1372,9 @@ }, { "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n", - "['Right']\n", - "['Left', 'Left']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "transition = {'A': {'Left': 'A', 'Right': 'B'},\n", " 'B': {'Left': 'A', 'Right': 'C'},\n", @@ -3473,17 +1395,9 @@ }, { "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Right', 'Down']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "transition = {(0, 0): {'Right': (0, 1), 'Down': (1, 0)},\n", " (0, 1): {'Left': (1, 0), 'Down': (1, 1)},\n", @@ -3515,10 +1429,8 @@ }, { "cell_type": "code", - "execution_count": 69, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses = []" @@ -3544,10 +1456,8 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"(American(x) & Weapon(y) & Sells(x, y, z) & Hostile(z)) ==> Criminal(x)\"))" @@ -3565,10 +1475,8 @@ }, { "cell_type": "code", - "execution_count": 71, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"Enemy(Nono, America)\"))" @@ -3586,10 +1494,8 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"Owns(Nono, M1)\"))\n", @@ -3598,9 +1504,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "\"All of its missiles were sold to it by Colonel West\"
\n", "If Nono owns something and it classifies as a missile, then it was sold to Nono by West.\n", @@ -3610,10 +1514,8 @@ }, { "cell_type": "code", - "execution_count": 73, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"(Missile(x) & Owns(Nono, x)) ==> Sells(West, x, Nono)\"))" @@ -3631,10 +1533,8 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"American(West)\"))" @@ -3651,10 +1551,8 @@ }, { "cell_type": "code", - "execution_count": 75, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "clauses.append(expr(\"Missile(x) ==> Weapon(x)\"))\n", @@ -3670,10 +1568,8 @@ }, { "cell_type": "code", - "execution_count": 76, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "crime_kb = FolKB(clauses)" @@ -3690,125 +1586,9 @@ }, { "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def subst(s, x):\n",
-       "    """Substitute the substitution s into the expression x.\n",
-       "    >>> subst({x: 42, y:0}, F(x) + y)\n",
-       "    (F(42) + 0)\n",
-       "    """\n",
-       "    if isinstance(x, list):\n",
-       "        return [subst(s, xi) for xi in x]\n",
-       "    elif isinstance(x, tuple):\n",
-       "        return tuple([subst(s, xi) for xi in x])\n",
-       "    elif not isinstance(x, Expr):\n",
-       "        return x\n",
-       "    elif is_var_symbol(x.op):\n",
-       "        return s.get(x, x)\n",
-       "    else:\n",
-       "        return Expr(x.op, *[subst(s, arg) for arg in x.args])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(subst)" ] @@ -3822,20 +1602,9 @@ }, { "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Owns(Nono, M1)" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "subst({x: expr('Nono'), y: expr('M1')}, expr('Owns(x, y)'))" ] @@ -3858,60 +1627,27 @@ }, { "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: 3}" - ] - }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "unify(expr('x'), 3)" ] }, { "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: B}" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "unify(expr('A(x)'), expr('A(B)'))" ] }, { "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: Bella, y: Dobby}" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "unify(expr('Cat(x) & Dog(Dobby)'), expr('Cat(Bella) & Dog(y)'))" ] @@ -3925,17 +1661,9 @@ }, { "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(unify(expr('Cat(x)'), expr('Dog(Dobby)')))" ] @@ -3949,17 +1677,9 @@ }, { "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(unify(expr('Cat(x) & Dog(Dobby)'), expr('Cat(Bella) & Dog(x)')))" ] @@ -3976,143 +1696,9 @@ }, { "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def fol_fc_ask(KB, alpha):\n",
-       "    """A simple forward-chaining algorithm. [Figure 9.3]"""\n",
-       "    # TODO: Improve efficiency\n",
-       "    kb_consts = list({c for clause in KB.clauses for c in constant_symbols(clause)})\n",
-       "    def enum_subst(p):\n",
-       "        query_vars = list({v for clause in p for v in variables(clause)})\n",
-       "        for assignment_list in itertools.product(kb_consts, repeat=len(query_vars)):\n",
-       "            theta = {x: y for x, y in zip(query_vars, assignment_list)}\n",
-       "            yield theta\n",
-       "\n",
-       "    # check if we can answer without new inferences\n",
-       "    for q in KB.clauses:\n",
-       "        phi = unify(q, alpha, {})\n",
-       "        if phi is not None:\n",
-       "            yield phi\n",
-       "\n",
-       "    while True:\n",
-       "        new = []\n",
-       "        for rule in KB.clauses:\n",
-       "            p, q = parse_definite_clause(rule)\n",
-       "            for theta in enum_subst(p):\n",
-       "                if set(subst(theta, p)).issubset(set(KB.clauses)):\n",
-       "                    q_ = subst(theta, q)\n",
-       "                    if all([unify(x, q_, {}) is None for x in KB.clauses + new]):\n",
-       "                        new.append(q_)\n",
-       "                        phi = unify(q_, alpha, {})\n",
-       "                        if phi is not None:\n",
-       "                            yield phi\n",
-       "        if not new:\n",
-       "            break\n",
-       "        for clause in new:\n",
-       "            KB.tell(clause)\n",
-       "    return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(fol_fc_ask)" ] @@ -4126,17 +1712,9 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{x: Nono}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "answer = fol_fc_ask(crime_kb, expr('Hostile(x)'))\n", "print(list(answer))" @@ -4151,17 +1729,9 @@ }, { "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{x: Nono}, {x: JaJa}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "crime_kb.tell(expr('Enemy(JaJa, America)'))\n", "answer = fol_fc_ask(crime_kb, expr('Hostile(x)'))\n", @@ -4193,115 +1763,9 @@ }, { "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def fol_bc_or(KB, goal, theta):\n",
-       "    for rule in KB.fetch_rules_for_goal(goal):\n",
-       "        lhs, rhs = parse_definite_clause(standardize_variables(rule))\n",
-       "        for theta1 in fol_bc_and(KB, lhs, unify(rhs, goal, theta)):\n",
-       "            yield theta1\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(fol_bc_or)" ] @@ -4316,120 +1780,9 @@ }, { "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def fol_bc_and(KB, goals, theta):\n",
-       "    if theta is None:\n",
-       "        pass\n",
-       "    elif not goals:\n",
-       "        yield theta\n",
-       "    else:\n",
-       "        first, rest = goals[0], goals[1:]\n",
-       "        for theta1 in fol_bc_or(KB, subst(theta, first), theta):\n",
-       "            for theta2 in fol_bc_and(KB, rest, theta1):\n",
-       "                yield theta2\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(fol_bc_and)" ] @@ -4443,10 +1796,8 @@ }, { "cell_type": "code", - "execution_count": 89, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# Rebuild KB because running fol_fc_ask would add new facts to the KB\n", @@ -4455,20 +1806,9 @@ }, { "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{v_5: x, x: Nono}" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "crime_kb.ask(expr('Hostile(x)'))" ] @@ -4491,20 +1831,9 @@ }, { "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P |'==>'| ~Q" ] @@ -4518,20 +1847,9 @@ }, { "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "(P | '==>') | ~Q" ] @@ -4545,20 +1863,9 @@ }, { "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PartialExpr('==>', P)" - ] - }, - "execution_count": 93, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P | '==>'" ] @@ -4574,20 +1881,9 @@ }, { "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "partial = PartialExpr('==>', P) \n", "partial | ~Q" @@ -4613,20 +1909,9 @@ }, { "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "expr('~(P & Q) ==> (~P | ~Q)')" ] @@ -4640,20 +1925,9 @@ }, { "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P, Q = symbols('P, Q')\n", "~(P & Q) |'==>'| (~P | ~Q)" @@ -4668,20 +1942,9 @@ }, { "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(((P & Q) ==> P) | Q)" - ] - }, - "execution_count": 97, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P & Q |'==>'| P | Q" ] @@ -4695,20 +1958,9 @@ }, { "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((P & Q) ==> (P | Q))" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "(P & Q) |'==>'| (P | Q)" ] @@ -4722,133 +1974,9 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "
\n", - "\n", - "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from aima.notebook_utils import Canvas_fol_bc_ask\n", "canvas_bc_ask = Canvas_fol_bc_ask('canvas_bc_ask', crime_kb, expr('Criminal(x)'))" @@ -4856,9 +1984,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Authors\n", "\n", diff --git a/notebooks/mdp.ipynb b/notebooks/mdp.ipynb index f99150e02..4fc08055c 100644 --- a/notebooks/mdp.ipynb +++ b/notebooks/mdp.ipynb @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -77,199 +77,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class MDP:\n",
-       "\n",
-       "    """A Markov Decision Process, defined by an initial state, transition model,\n",
-       "    and reward function. We also keep track of a gamma value, for use by\n",
-       "    algorithms. The transition model is represented somewhat differently from\n",
-       "    the text. Instead of P(s' | s, a) being a probability number for each\n",
-       "    state/state/action triplet, we instead have T(s, a) return a\n",
-       "    list of (p, s') pairs. We also keep track of the possible states,\n",
-       "    terminal states, and actions for each state. [page 646]"""\n",
-       "\n",
-       "    def __init__(self, init, actlist, terminals, transitions = {}, reward = None, states=None, gamma=.9):\n",
-       "        if not (0 < gamma <= 1):\n",
-       "            raise ValueError("An MDP must have 0 < gamma <= 1")\n",
-       "\n",
-       "        if states:\n",
-       "            self.states = states\n",
-       "        else:\n",
-       "            ## collect states from transitions table\n",
-       "            self.states = self.get_states_from_transitions(transitions)\n",
-       "            \n",
-       "        \n",
-       "        self.init = init\n",
-       "        \n",
-       "        if isinstance(actlist, list):\n",
-       "            ## if actlist is a list, all states have the same actions\n",
-       "            self.actlist = actlist\n",
-       "        elif isinstance(actlist, dict):\n",
-       "            ## if actlist is a dict, different actions for each state\n",
-       "            self.actlist = actlist\n",
-       "        \n",
-       "        self.terminals = terminals\n",
-       "        self.transitions = transitions\n",
-       "        if self.transitions == {}:\n",
-       "            print("Warning: Transition table is empty.")\n",
-       "        self.gamma = gamma\n",
-       "        if reward:\n",
-       "            self.reward = reward\n",
-       "        else:\n",
-       "            self.reward = {s : 0 for s in self.states}\n",
-       "        #self.check_consistency()\n",
-       "\n",
-       "    def R(self, state):\n",
-       "        """Return a numeric reward for this state."""\n",
-       "        return self.reward[state]\n",
-       "\n",
-       "    def T(self, state, action):\n",
-       "        """Transition model. From a state and an action, return a list\n",
-       "        of (probability, result-state) pairs."""\n",
-       "        if(self.transitions == {}):\n",
-       "            raise ValueError("Transition model is missing")\n",
-       "        else:\n",
-       "            return self.transitions[state][action]\n",
-       "\n",
-       "    def actions(self, state):\n",
-       "        """Set of actions that can be performed in this state. By default, a\n",
-       "        fixed list of actions, except for terminal states. Override this\n",
-       "        method if you need to specialize by state."""\n",
-       "        if state in self.terminals:\n",
-       "            return [None]\n",
-       "        else:\n",
-       "            return self.actlist\n",
-       "\n",
-       "    def get_states_from_transitions(self, transitions):\n",
-       "        if isinstance(transitions, dict):\n",
-       "            s1 = set(transitions.keys())\n",
-       "            s2 = set([tr[1] for actions in transitions.values() \n",
-       "                              for effects in actions.values() for tr in effects])\n",
-       "            return s1.union(s2)\n",
-       "        else:\n",
-       "            print('Could not retrieve states from transitions')\n",
-       "            return None\n",
-       "\n",
-       "    def check_consistency(self):\n",
-       "        # check that all states in transitions are valid\n",
-       "        assert set(self.states) == self.get_states_from_transitions(self.transitions)\n",
-       "        # check that init is a valid state\n",
-       "        assert self.init in self.states\n",
-       "        # check reward for each state\n",
-       "        #assert set(self.reward.keys()) == set(self.states)\n",
-       "        assert set(self.reward.keys()) == set(self.states)\n",
-       "        # check that all terminals are valid states\n",
-       "        assert all([t in self.states for t in self.terminals])\n",
-       "        # check that probability distributions for all actions sum to 1\n",
-       "        for s1, actions in self.transitions.items():\n",
-       "            for a in actions.keys():\n",
-       "                s = 0\n",
-       "                for o in actions[a]:\n",
-       "                    s += o[0]\n",
-       "                assert abs(s - 1) < 0.001\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(MDP)" ] @@ -302,10 +112,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# Transition Matrix as nested dict. State -> Actions in state -> List of (Probability, State) tuples\n", @@ -334,10 +142,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class CustomMDP(MDP):\n", @@ -365,10 +171,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "our_mdp = CustomMDP(init, terminals, t, rewards, gamma=.9)" @@ -392,169 +196,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class GridMDP(MDP):\n",
-       "\n",
-       "    """A two-dimensional grid MDP, as in [Figure 17.1]. All you have to do is\n",
-       "    specify the grid as a list of lists of rewards; use None for an obstacle\n",
-       "    (unreachable state). Also, you should specify the terminal states.\n",
-       "    An action is an (x, y) unit vector; e.g. (1, 0) means move east."""\n",
-       "\n",
-       "    def __init__(self, grid, terminals, init=(0, 0), gamma=.9):\n",
-       "        grid.reverse()  # because we want row 0 on bottom, not on top\n",
-       "        reward = {}\n",
-       "        states = set()\n",
-       "        self.rows = len(grid)\n",
-       "        self.cols = len(grid[0])\n",
-       "        self.grid = grid\n",
-       "        for x in range(self.cols):\n",
-       "            for y in range(self.rows):\n",
-       "                if grid[y][x] is not None:\n",
-       "                    states.add((x, y))\n",
-       "                    reward[(x, y)] = grid[y][x]\n",
-       "        self.states = states\n",
-       "        actlist = orientations\n",
-       "        transitions = {}\n",
-       "        for s in states:\n",
-       "            transitions[s] = {}\n",
-       "            for a in actlist:\n",
-       "                transitions[s][a] = self.calculate_T(s, a)\n",
-       "        MDP.__init__(self, init, actlist=actlist,\n",
-       "                     terminals=terminals, transitions = transitions, \n",
-       "                     reward = reward, states = states, gamma=gamma)\n",
-       "\n",
-       "    def calculate_T(self, state, action):\n",
-       "        if action is None:\n",
-       "            return [(0.0, state)]\n",
-       "        else:\n",
-       "            return [(0.8, self.go(state, action)),\n",
-       "                    (0.1, self.go(state, turn_right(action))),\n",
-       "                    (0.1, self.go(state, turn_left(action)))]\n",
-       "    \n",
-       "    def T(self, state, action):\n",
-       "        if action is None:\n",
-       "            return [(0.0, state)]\n",
-       "        else:\n",
-       "            return self.transitions[state][action]\n",
-       " \n",
-       "    def go(self, state, direction):\n",
-       "        """Return the state that results from going in this direction."""\n",
-       "        state1 = vector_add(state, direction)\n",
-       "        return state1 if state1 in self.states else state\n",
-       "\n",
-       "    def to_grid(self, mapping):\n",
-       "        """Convert a mapping from (x, y) to v into a [[..., v, ...]] grid."""\n",
-       "        return list(reversed([[mapping.get((x, y), None)\n",
-       "                               for x in range(self.cols)]\n",
-       "                              for y in range(self.rows)]))\n",
-       "\n",
-       "    def to_arrows(self, policy):\n",
-       "        chars = {\n",
-       "            (1, 0): '>', (0, 1): '^', (-1, 0): '<', (0, -1): 'v', None: '.'}\n",
-       "        return self.to_grid({s: chars[a] for (s, a) in policy.items()})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP)" ] @@ -590,29 +234,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "sequential_decision_environment" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# VALUE ITERATION\n", "\n", @@ -627,123 +258,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def value_iteration(mdp, epsilon=0.001):\n",
-       "    """Solving an MDP by value iteration. [Figure 17.4]"""\n",
-       "    U1 = {s: 0 for s in mdp.states}\n",
-       "    R, T, gamma = mdp.R, mdp.T, mdp.gamma\n",
-       "    while True:\n",
-       "        U = U1.copy()\n",
-       "        delta = 0\n",
-       "        for s in mdp.states:\n",
-       "            U1[s] = R(s) + gamma * max([sum([p * U[s1] for (p, s1) in T(s, a)])\n",
-       "                                        for a in mdp.actions(s)])\n",
-       "            delta = max(delta, abs(U1[s] - U[s]))\n",
-       "        if delta < epsilon * (1 - gamma) / gamma:\n",
-       "            return U\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(value_iteration)" ] @@ -780,30 +297,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 0): 0.2962883154554812,\n", - " (0, 1): 0.3984432178350045,\n", - " (0, 2): 0.5093943765842497,\n", - " (1, 0): 0.25386699846479516,\n", - " (1, 2): 0.649585681261095,\n", - " (2, 0): 0.3447542300124158,\n", - " (2, 1): 0.48644001739269643,\n", - " (2, 2): 0.7953620878466678,\n", - " (3, 0): 0.12987274656746342,\n", - " (3, 1): -1.0,\n", - " (3, 2): 1.0}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "value_iteration(sequential_decision_environment)" ] @@ -817,40 +313,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ VALUE-ITERATION(_mdp_, _ε_) __returns__ a utility function \n", - " __inputs__: _mdp_, an MDP with states _S_, actions _A_(_s_), transition model _P_(_s′_ | _s_, _a_), \n", - "      rewards _R_(_s_), discount _γ_ \n", - "   _ε_, the maximum error allowed in the utility of any state \n", - " __local variables__: _U_, _U′_, vectors of utilities for states in _S_, initially zero \n", - "        _δ_, the maximum change in the utility of any state in an iteration \n", - "\n", - " __repeat__ \n", - "   _U_ ← _U′_; _δ_ ← 0 \n", - "   __for each__ state _s_ in _S_ __do__ \n", - "     _U′_\\[_s_\\] ← _R_(_s_) + _γ_ max_a_ ∈ _A_(_s_) Σ _P_(_s′_ | _s_, _a_) _U_\\[_s′_\\] \n", - "     __if__ | _U′_\\[_s_\\] − _U_\\[_s_\\] | > _δ_ __then__ _δ_ ← | _U′_\\[_s_\\] − _U_\\[_s_\\] | \n", - " __until__ _δ_ < _ε_(1 − _γ_)/_γ_ \n", - " __return__ _U_ \n", - "\n", - "---\n", - "__Figure ??__ The value iteration algorithm for calculating utilities of states. The termination condition is from Equation (__??__)." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode(\"Value-Iteration\")" ] @@ -890,10 +355,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def value_iteration_instru(mdp, iterations=20):\n", @@ -918,10 +381,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "columns = 4\n", @@ -931,10 +392,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", @@ -945,38 +404,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAATcAAADuCAYAAABcZEBhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADYxJREFUeJzt211oW2eex/Hf2Xpb0onWrVkm1otL\nW2SmrNaVtzS2K8jCFhJPXsbtRWcTX4zbmUBINkMYw5jmYrYwhNJuMWTjaTCYDSW5cQK9iEOcpDad\nLAREVtBEF+OwoDEyWEdxirvjelw36cScubCi1PWLvK0lnfnP9wMGHz2P4dEf8fWRnDie5wkArPmb\nah8AAMqBuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMKnm/7N5bk78dwagjDYHnGofwf88\nb11D4s4NgEnEDYBJxA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2AScQNgEnE\nDYBJxA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2AScQN\ngEnEDYBJxA2AScQNgEm+jZvneerpOaJ4PKq2tueVTt9Ycd/Nm5+otbVJ8XhUPT1H5HnekvUTJ3oV\nCDianp6uxLErhvmUxoxW9zNJ35f0j6use5KOSIpKel7S1yd3WlJj4et0Gc/4Xfk2biMjlzU+nlE6\nnVFf34C6uw+tuK+7+5D6+gaUTmc0Pp7R6OiV4louN6mrV0fV0PBUpY5dMcynNGa0ujckXVlj/bKk\nTOFrQNKDyf2fpF9L+h9JqcL3fyjbKb8b38ZteHhInZ1dchxHLS1tmpmZ0dTU7SV7pqZua3Z2Vq2t\nL8lxHHV2dunixfPF9aNHu3Xs2HtyHKfSxy875lMaM1rdP0uqW2N9SFKXJEdSm6QZSbclfSRpe+Fn\nnyx8v1Ykq8m3ccvnXYXDDcXrcDiifN5dYU+keB0KPdwzPHxBoVBYTU3xyhy4wphPaczo23MlNXzt\nOlJ4bLXH/aim2gdYzTc/95C07Lfnanvm5+fV2/u2zp8fKdv5qo35lMaMvr3lU1m8i1vtcT/y1Z3b\nwMBJJRLNSiSaFQyG5LqTxTXXzSkYDC3ZHw5H5Lq54nU+v7gnmx3XxERWiURcsdjTct2ctm17QXfu\nTFXsuZQD8ymNGW2MiKTJr13nJIXWeNyPfBW3AwcOK5lMK5lMa8+eVzU4eEae5ymVuq7a2lrV1weX\n7K+vDyoQCCiVui7P8zQ4eEa7d7+iWKxJ2eynGhub0NjYhMLhiK5du6EtW+qr9Mw2BvMpjRltjA5J\nZ7R4p3ZdUq2koKR2SSNa/CPCHwrft1fpjKX49m1pe/sujYxcUjwe1aZNj6u//4PiWiLRrGQyLUk6\nfrxfBw++obt3v9T27Tu1Y8fOah25ophPacxodZ2S/lvStBbvxn4t6U+FtYOSdkm6pMV/CvK4pAeT\nq5P075K2Fq7f0tp/mKgmZ6XPHFYzN7fiW24AG2RzwK+fYPmI561rSL56WwoAG4W4ATCJuAEwibgB\nMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEw\nibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMKmm2gew\nZPP3vGofwffmvnCqfQRfc8RrqJT1Tog7NwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3\nACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcA\nJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAm+TZunuepp+eI4vGo2tqeVzp9Y8V9N29+\notbWJsXjUfX0HJHneUvWT5zoVSDgaHp6uhLHrpgrV67oB889p2hjo959991l6/fu3dPeffsUbWxU\na1ubJiYmimvvvPOOoo2N+sFzz+mjjz6q4Kkri9dQKf8r6SVJj0nqXWNfVlKrpEZJeyV9VXj8XuE6\nWlifKNdBvxXfxm1k5LLGxzNKpzPq6xtQd/ehFfd1dx9SX9+A0umMxsczGh29UlzL5SZ19eqoGhqe\nqtSxK2JhYUGHf/5zXb50SbfGxjR49qxu3bq1ZM+pU6f05BNP6PeZjLp/8Qu9efSoJOnWrVs6e+6c\nxn73O125fFn/dviwFhYWqvE0yo7XUCl1kvok/bLEvjcldUvKSHpS0qnC46cK178vrL9ZnmN+S76N\n2/DwkDo7u+Q4jlpa2jQzM6OpqdtL9kxN3dbs7KxaW1+S4zjq7OzSxYvni+tHj3br2LH35DhOpY9f\nVqlUStFoVM8++6weffRR7du7V0NDQ0v2DF24oNdff12S9Nprr+njjz+W53kaGhrSvr179dhjj+mZ\nZ55RNBpVKpWqxtMoO15DpXxf0lZJf7vGHk/SbyW9Vrh+XdKD+QwVrlVY/7iw3x98G7d83lU43FC8\nDocjyufdFfZEiteh0MM9w8MXFAqF1dQUr8yBK8h1XTVEHj7vSCQi13WX72lYnF9NTY1qa2v12Wef\nLXlckiLh8LKftYLX0Eb4TNITkmoK1xFJD2boSnow3xpJtYX9/lBTekt1fPNzD0nLfnuutmd+fl69\nvW/r/PmRsp2vmr7LbNbzs1bwGtoIK92JOetYqz5f3bkNDJxUItGsRKJZwWBIrjtZXHPdnILB0JL9\n4XBErpsrXufzi3uy2XFNTGSVSMQViz0t181p27YXdOfOVMWeSzlFIhFN5h4+71wup1AotHzP5OL8\n7t+/r88//1x1dXVLHpeknOsu+9m/ZLyGSjkpqbnwlV/H/r+XNCPpfuE6J+nBDCOSHsz3vqTPtfg5\nnj/4Km4HDhxWMplWMpnWnj2vanDwjDzPUyp1XbW1taqvDy7ZX18fVCAQUCp1XZ7naXDwjHbvfkWx\nWJOy2U81NjahsbEJhcMRXbt2Q1u21FfpmW2srVu3KpPJKJvN6quvvtLZc+fU0dGxZE/Hj36k06dP\nS5I+/PBDvfzyy3IcRx0dHTp77pzu3bunbDarTCajlpaWajyNsuA1VMphSenC13p+qTmS/kXSh4Xr\n05JeKXzfUbhWYf1l+enOzbdvS9vbd2lk5JLi8ag2bXpc/f0fFNcSiWYlk2lJ0vHj/Tp48A3dvful\ntm/fqR07dlbryBVTU1Oj93/zG7X/8IdaWFjQz376U8ViMb311lt68cUX1dHRof379+snXV2KNjaq\nrq5OZwcHJUmxWEz/+uMf6x9iMdXU1Ojk++/rkUceqfIzKg9eQ6VMSXpR0qwW73P+U9ItSX8naZek\n/9JiAP9D0j5Jv5L0T5L2F35+v6SfaPGfgtRJOlvBs5fmrPSZw2rm5nz0pxAf2vw9xlPK3Bf++c3u\nR4FAtU/gf563vttDX70tBYCNQtwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwA\nmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3ACY\nRNwAmETcAJhE3ACYRNwAmETcAJhE3ACYVFPtA1gy94VT7SPgL9wf/1jtE9jBnRsAk4gbAJOIGwCT\niBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOI\nGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gb\nAJN8GzfP89TTc0TxeFRtbc8rnb6x4r6bNz9Ra2uT4vGoenqOyPO8JesnTvQqEHA0PT1diWNXDPMp\njRmtzfp8fBu3kZHLGh/PKJ3OqK9vQN3dh1bc1919SH19A0qnMxofz2h09EpxLZeb1NWro2poeKpS\nx64Y5lMaM1qb9fn4Nm7Dw0Pq7OyS4zhqaWnTzMyMpqZuL9kzNXVbs7Ozam19SY7jqLOzSxcvni+u\nHz3arWPH3pPjOJU+ftkxn9KY0dqsz8e3ccvnXYXDDcXrcDiifN5dYU+keB0KPdwzPHxBoVBYTU3x\nyhy4wphPacxobdbnU1PtA6zmm+/rJS377bDanvn5efX2vq3z50fKdr5qYz6lMaO1WZ+Pr+7cBgZO\nKpFoViLRrGAwJNedLK65bk7BYGjJ/nA4ItfNFa/z+cU92ey4JiaySiTiisWeluvmtG3bC7pzZ6pi\nz6UcmE9pzGhtf03z8VXcDhw4rGQyrWQyrT17XtXg4Bl5nqdU6rpqa2tVXx9csr++PqhAIKBU6ro8\nz9Pg4Bnt3v2KYrEmZbOfamxsQmNjEwqHI7p27Ya2bKmv0jPbGMynNGa0tr+m+fj2bWl7+y6NjFxS\nPB7Vpk2Pq7//g+JaItGsZDItSTp+vF8HD76hu3e/1PbtO7Vjx85qHbmimE9pzGht1ufjrPSeejVz\nc1r/ZgAog82bta4/zfrqbSkAbBTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTi\nBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIG\nwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTH87xqnwEANhx3bgBMIm4ATCJuAEwibgBMIm4ATCJu\nAEwibgBMIm4ATCJuAEwibgBM+jPdN0cNjYpeKAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "The installed widget Javascript is the wrong version. It must satisfy the semver range ~2.1.4.\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "77e9849e074841e49d8b0ebc8191507c" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import ipywidgets as widgets\n", "from IPython.display import display\n", @@ -1003,9 +433,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# POLICY ITERATION\n", "\n", @@ -1030,237 +458,18 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def expected_utility(a, s, U, mdp):\n",
-       "    """The expected utility of doing a in state s, according to the MDP and U."""\n",
-       "    return sum([p * U[s1] for (p, s1) in mdp.T(s, a)])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(expected_utility)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def policy_iteration(mdp):\n",
-       "    """Solve an MDP by policy iteration [Figure 17.7]"""\n",
-       "    U = {s: 0 for s in mdp.states}\n",
-       "    pi = {s: random.choice(mdp.actions(s)) for s in mdp.states}\n",
-       "    while True:\n",
-       "        U = policy_evaluation(pi, U, mdp)\n",
-       "        unchanged = True\n",
-       "        for s in mdp.states:\n",
-       "            a = argmax(mdp.actions(s), key=lambda a: expected_utility(a, s, U, mdp))\n",
-       "            if a != pi[s]:\n",
-       "                pi[s] = a\n",
-       "                unchanged = False\n",
-       "        if unchanged:\n",
-       "            return pi\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(policy_iteration)" ] @@ -1280,118 +489,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def policy_evaluation(pi, U, mdp, k=20):\n",
-       "    """Return an updated utility mapping U from each state in the MDP to its\n",
-       "    utility, using an approximation (modified policy iteration)."""\n",
-       "    R, T, gamma = mdp.R, mdp.T, mdp.gamma\n",
-       "    for i in range(k):\n",
-       "        for s in mdp.states:\n",
-       "            U[s] = R(s) + gamma * sum([p * U[s1] for (p, s1) in T(s, pi[s])])\n",
-       "    return U\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(policy_evaluation)" ] @@ -1405,70 +505,18 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 0): (0, 1),\n", - " (0, 1): (0, 1),\n", - " (0, 2): (1, 0),\n", - " (1, 0): (1, 0),\n", - " (1, 2): (1, 0),\n", - " (2, 0): (0, 1),\n", - " (2, 1): (0, 1),\n", - " (2, 2): (1, 0),\n", - " (3, 0): (-1, 0),\n", - " (3, 1): None,\n", - " (3, 2): None}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "policy_iteration(sequential_decision_environment)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ POLICY-ITERATION(_mdp_) __returns__ a policy \n", - " __inputs__: _mdp_, an MDP with states _S_, actions _A_(_s_), transition model _P_(_s′_ | _s_, _a_) \n", - " __local variables__: _U_, a vector of utilities for states in _S_, initially zero \n", - "        _π_, a policy vector indexed by state, initially random \n", - "\n", - " __repeat__ \n", - "   _U_ ← POLICY\\-EVALUATION(_π_, _U_, _mdp_) \n", - "   _unchanged?_ ← true \n", - "   __for each__ state _s_ __in__ _S_ __do__ \n", - "     __if__ max_a_ ∈ _A_(_s_) Σ_s′_ _P_(_s′_ | _s_, _a_) _U_\\[_s′_\\] > Σ_s′_ _P_(_s′_ | _s_, _π_\\[_s_\\]) _U_\\[_s′_\\] __then do__ \n", - "       _π_\\[_s_\\] ← argmax_a_ ∈ _A_(_s_) Σ_s′_ _P_(_s′_ | _s_, _a_) _U_\\[_s′_\\] \n", - "       _unchanged?_ ← false \n", - " __until__ _unchanged?_ \n", - " __return__ _π_ \n", - "\n", - "---\n", - "__Figure ??__ The policy iteration algorithm for calculating an optimal policy." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode('Policy-Iteration')" ] @@ -1499,9 +547,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## Sequential Decision Problems\n", "\n", @@ -1533,115 +579,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def T(self, state, action):\n",
-       "        if action is None:\n",
-       "            return [(0.0, state)]\n",
-       "        else:\n",
-       "            return self.transitions[state][action]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.T)" ] @@ -1677,114 +617,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def to_arrows(self, policy):\n",
-       "        chars = {\n",
-       "            (1, 0): '>', (0, 1): '^', (-1, 0): '<', (0, -1): 'v', None: '.'}\n",
-       "        return self.to_grid({s: chars[a] for (s, a) in policy.items()})\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.to_arrows)" ] @@ -1799,115 +634,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def to_grid(self, mapping):\n",
-       "        """Convert a mapping from (x, y) to v into a [[..., v, ...]] grid."""\n",
-       "        return list(reversed([[mapping.get((x, y), None)\n",
-       "                               for x in range(self.cols)]\n",
-       "                              for y in range(self.rows)]))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GridMDP.to_grid)" ] @@ -1930,10 +659,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# Note that this environment is also initialized in mdp.py by default\n", @@ -1955,10 +682,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))" @@ -1973,19 +698,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None ^ .\n", - "^ > ^ <\n" - ] - } - ], + "outputs": [], "source": [ "from aima.utils import print_table\n", "print_table(sequential_decision_environment.to_arrows(pi))" @@ -2014,10 +729,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "sequential_decision_environment = GridMDP([[-0.4, -0.4, -0.4, +1],\n", @@ -2028,19 +741,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None ^ .\n", - "^ > ^ <\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", @@ -2074,10 +777,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "sequential_decision_environment = GridMDP([[-4, -4, -4, +1],\n", @@ -2088,19 +789,9 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > > .\n", - "^ None > .\n", - "> > > ^\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", @@ -2133,10 +824,8 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "sequential_decision_environment = GridMDP([[4, 4, 4, +1],\n", @@ -2147,19 +836,9 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> > < .\n", - "> None < .\n", - "> > > v\n" - ] - } - ], + "outputs": [], "source": [ "pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .001))\n", "from aima.utils import print_table\n", @@ -2222,9 +901,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "### POMDPs - a conceptual outline\n", "\n", @@ -2347,221 +1024,9 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class POMDP(MDP):\n",
-       "\n",
-       "    """A Partially Observable Markov Decision Process, defined by\n",
-       "    a transition model P(s'|s,a), actions A(s), a reward function R(s),\n",
-       "    and a sensor model P(e|s). We also keep track of a gamma value,\n",
-       "    for use by algorithms. The transition and the sensor models\n",
-       "    are defined as matrices. We also keep track of the possible states\n",
-       "    and actions for each state. [page 659]."""\n",
-       "\n",
-       "    def __init__(self, actions, transitions=None, evidences=None, rewards=None, states=None, gamma=0.95):\n",
-       "        """Initialize variables of the pomdp"""\n",
-       "\n",
-       "        if not (0 < gamma <= 1):\n",
-       "            raise ValueError('A POMDP must have 0 < gamma <= 1')\n",
-       "\n",
-       "        self.states = states\n",
-       "        self.actions = actions\n",
-       "\n",
-       "        # transition model cannot be undefined\n",
-       "        self.t_prob = transitions or {}\n",
-       "        if not self.t_prob:\n",
-       "            print('Warning: Transition model is undefined')\n",
-       "        \n",
-       "        # sensor model cannot be undefined\n",
-       "        self.e_prob = evidences or {}\n",
-       "        if not self.e_prob:\n",
-       "            print('Warning: Sensor model is undefined')\n",
-       "        \n",
-       "        self.gamma = gamma\n",
-       "        self.rewards = rewards\n",
-       "\n",
-       "    def remove_dominated_plans(self, input_values):\n",
-       "        """\n",
-       "        Remove dominated plans.\n",
-       "        This method finds all the lines contributing to the\n",
-       "        upper surface and removes those which don't.\n",
-       "        """\n",
-       "\n",
-       "        values = [val for action in input_values for val in input_values[action]]\n",
-       "        values.sort(key=lambda x: x[0], reverse=True)\n",
-       "\n",
-       "        best = [values[0]]\n",
-       "        y1_max = max(val[1] for val in values)\n",
-       "        tgt = values[0]\n",
-       "        prev_b = 0\n",
-       "        prev_ix = 0\n",
-       "        while tgt[1] != y1_max:\n",
-       "            min_b = 1\n",
-       "            min_ix = 0\n",
-       "            for i in range(prev_ix + 1, len(values)):\n",
-       "                if values[i][0] - tgt[0] + tgt[1] - values[i][1] != 0:\n",
-       "                    trans_b = (values[i][0] - tgt[0]) / (values[i][0] - tgt[0] + tgt[1] - values[i][1])\n",
-       "                    if 0 <= trans_b <= 1 and trans_b > prev_b and trans_b < min_b:\n",
-       "                        min_b = trans_b\n",
-       "                        min_ix = i\n",
-       "            prev_b = min_b\n",
-       "            prev_ix = min_ix\n",
-       "            tgt = values[min_ix]\n",
-       "            best.append(tgt)\n",
-       "\n",
-       "        return self.generate_mapping(best, input_values)\n",
-       "\n",
-       "    def remove_dominated_plans_fast(self, input_values):\n",
-       "        """\n",
-       "        Remove dominated plans using approximations.\n",
-       "        Resamples the upper boundary at intervals of 100 and\n",
-       "        finds the maximum values at these points.\n",
-       "        """\n",
-       "\n",
-       "        values = [val for action in input_values for val in input_values[action]]\n",
-       "        values.sort(key=lambda x: x[0], reverse=True)\n",
-       "\n",
-       "        best = []\n",
-       "        sr = 100\n",
-       "        for i in range(sr + 1):\n",
-       "            x = i / float(sr)\n",
-       "            maximum = (values[0][1] - values[0][0]) * x + values[0][0]\n",
-       "            tgt = values[0]\n",
-       "            for value in values:\n",
-       "                val = (value[1] - value[0]) * x + value[0]\n",
-       "                if val > maximum:\n",
-       "                    maximum = val\n",
-       "                    tgt = value\n",
-       "\n",
-       "            if all(any(tgt != v) for v in best):\n",
-       "                best.append(tgt)\n",
-       "\n",
-       "        return self.generate_mapping(best, input_values)\n",
-       "\n",
-       "    def generate_mapping(self, best, input_values):\n",
-       "        """Generate mappings after removing dominated plans"""\n",
-       "\n",
-       "        mapping = defaultdict(list)\n",
-       "        for value in best:\n",
-       "            for action in input_values:\n",
-       "                if any(all(value == v) for v in input_values[action]):\n",
-       "                    mapping[action].append(value)\n",
-       "\n",
-       "        return mapping\n",
-       "\n",
-       "    def max_difference(self, U1, U2):\n",
-       "        """Find maximum difference between two utility mappings"""\n",
-       "\n",
-       "        for k, v in U1.items():\n",
-       "            sum1 = 0\n",
-       "            for element in U1[k]:\n",
-       "                sum1 += sum(element)\n",
-       "            sum2 = 0\n",
-       "            for element in U2[k]:\n",
-       "                sum2 += sum(element)\n",
-       "        return abs(sum1 - sum2)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(POMDP)" ] @@ -2608,7 +1073,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2628,7 +1093,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2674,40 +1139,9 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ POMDP-VALUE-ITERATION(_pomdp_, _ε_) __returns__ a utility function \n", - " __inputs__: _pomdp_, a POMDP with states _S_, actions _A_(_s_), transition model _P_(_s′_ | _s_, _a_), \n", - "      sensor model _P_(_e_ | _s_), rewards _R_(_s_), discount _γ_ \n", - "     _ε_, the maximum error allowed in the utility of any state \n", - " __local variables__: _U_, _U′_, sets of plans _p_ with associated utility vectors _αp_ \n", - "\n", - " _U′_ ← a set containing just the empty plan \\[\\], with _α\\[\\]_(_s_) = _R_(_s_) \n", - " __repeat__ \n", - "   _U_ ← _U′_ \n", - "   _U′_ ← the set of all plans consisting of an action and, for each possible next percept, \n", - "     a plan in _U_ with utility vectors computed according to Equation(__??__) \n", - "   _U′_ ← REMOVE\\-DOMINATED\\-PLANS(_U′_) \n", - " __until__ MAX\\-DIFFERENCE(_U_, _U′_) < _ε_(1 − _γ_) ⁄ _γ_ \n", - " __return__ _U_ \n", - "\n", - "---\n", - "__Figure ??__ A high\\-level sketch of the value iteration algorithm for POMDPs. The REMOVE\\-DOMINATED\\-PLANS step and MAX\\-DIFFERENCE test are typically implemented as linear programs." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode('POMDP-Value-Iteration')" ] @@ -2721,137 +1155,9 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def pomdp_value_iteration(pomdp, epsilon=0.1):\n",
-       "    """Solving a POMDP by value iteration."""\n",
-       "\n",
-       "    U = {'':[[0]* len(pomdp.states)]}\n",
-       "    count = 0\n",
-       "    while True:\n",
-       "        count += 1\n",
-       "        prev_U = U\n",
-       "        values = [val for action in U for val in U[action]]\n",
-       "        value_matxs = []\n",
-       "        for i in values:\n",
-       "            for j in values:\n",
-       "                value_matxs.append([i, j])\n",
-       "\n",
-       "        U1 = defaultdict(list)\n",
-       "        for action in pomdp.actions:\n",
-       "            for u in value_matxs:\n",
-       "                u1 = Matrix.matmul(Matrix.matmul(pomdp.t_prob[int(action)], Matrix.multiply(pomdp.e_prob[int(action)], Matrix.transpose(u))), [[1], [1]])\n",
-       "                u1 = Matrix.add(Matrix.scalar_multiply(pomdp.gamma, Matrix.transpose(u1)), [pomdp.rewards[int(action)]])\n",
-       "                U1[action].append(u1[0])\n",
-       "\n",
-       "        U = pomdp.remove_dominated_plans_fast(U1)\n",
-       "        # replace with U = pomdp.remove_dominated_plans(U1) for accurate calculations\n",
-       "        \n",
-       "        if count > 10:\n",
-       "            if pomdp.max_difference(U, prev_U) < epsilon * (1 - pomdp.gamma) / pomdp.gamma:\n",
-       "                return U\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(pomdp_value_iteration)" ] @@ -2890,7 +1196,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2918,7 +1224,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2927,20 +1233,9 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "plot_pomdp_utility(utility)" @@ -2998,2493 +1293,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" - }, - "widgets": { - "state": { - "001e6c8ed3fc4eeeb6ab7901992314dd": { - "views": [] - }, - "00f29880456846a8854ab515146ec55b": { - "views": [] - }, - "010f52f7cde545cba25593839002049b": { - "views": [] - }, - "01473ad99aa94acbaca856a7d980f2b9": { - "views": [] - }, - "021a4a4f35da484db5c37c5c8d0dbcc2": { - "views": [] - }, - "02229be5d3bc401fad55a0378977324a": { - "views": [] - }, - "022a5fdfc8e44fb09b21c4bd5b67a0db": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "025c3b0250b94d4c8d9b33adfdba4c15": { - "views": [] - }, - "028f96abfed644b8b042be1e4b16014d": { - "views": [] - }, - "0303bad44d404a1b9ad2cc167e42fcb7": { - "views": [] - }, - "031d2d17f32347ec83c43798e05418fe": { - "views": [] - }, - "03de64f0c2fd43f1b3b5d84aa265aeb7": { - "views": [] - }, - "03fdd484675b42ad84448f64c459b0e0": { - "views": [] - }, - "044cf74f03fd44fd840e450e5ee0c161": { - "views": [] - }, - "054ae5ba0a014a758de446f1980f1ba5": { - "views": [] - }, - "0675230fb92f4539bc257b768fb4cd10": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "06c93b34e1f4424aba9a0b172c428260": { - "views": [] - }, - "077a5ea324be46c3ad0110671a0c6a12": { - "views": [] - }, - "0781138d150142a08775861a69beaec9": { - "views": [] - }, - "0783e74a8c2b40cc9b0f5706271192f4": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "07c7678b73634e728085f19d7b5b84f7": { - "views": [] - }, - "07febf1d15a140d8adb708847dd478ec": { - "views": [] - }, - "08299b681cd9477f9b19a125e186ce44": { - "views": [] - }, - "083af89d82e445aab4abddfece61d700": { - "views": [] - }, - "08a1129a8bd8486bbfe2c9e49226f618": { - "views": [] - }, - "08a2f800c0d540fdb24015156c7ffc15": { - "views": [] - }, - "097d8d0feccc4c76b87bbcb3f1ecece7": { - "views": [] - }, - "098f12158d844cdf89b29a4cd568fda0": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "09e96f9d5d32453290af60fbd29ca155": { - "views": [] - }, - "0a2ec7c49dcd4f768194483c4f2e8813": { - "views": [] - }, - "0b1d6ed8fe4144b8a24228e1befe2084": { - "views": [] - }, - "0b299f8157d24fa9830653a394ef806a": { - "views": [] - }, - "0b2a4ac81a244ff1a7b313290465f8f4": { - "views": [] - }, - "0b52cfc02d604bc2ae42f4ba8c7bca4f": { - "views": [] - }, - "0b65fb781274495ab498ad518bc274d4": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "0b865813de0841c49b41f6ad5fb85c6a": { - "views": [] - }, - "0c2070d20fb04864aeb2008a6f2b8b30": { - "views": [] - }, - "0cf5319bcde84f65a1a91c5f9be3aa28": { - "views": [] - }, - "0d721b5be85f4f8aafe26b3597242d60": { - "views": [] - }, - "0d9f29e197ad45d6a04bbb6864d3be6d": { - "views": [] - }, - "0e03c7e2c0414936b206ed055e19acba": { - "views": [] - }, - "0e2265aa506a4778bfc480d5e48c388b": { - "views": [] - }, - "0e4e3d0b6afc413e86970ec4250df678": { - "views": [] - }, - "0e6a5fe6423542e6a13e30f8929a8b02": { - "views": [] - }, - "0e7b2f39c94343c3b0d3b6611351886e": { - "views": [] - }, - "0eb5005fa34440988bcf3be231d31511": { - "views": [] - }, - "104703ad808e41bc9106829bb0396ece": { - "views": [] - }, - "109c376b28774a78bf90d3da4587d834": { - "views": [] - }, - "10b24041718843da976ac616e77ea522": { - "views": [] - }, - "11516bb6db8b45ef866bd9be8bb59312": { - "views": [] - }, - "1203903354fa467a8f38dbbad79cbc81": { - "views": [] - }, - "124ecbe68ada40f68d6a1807ad6bcdf9": { - "views": [] - }, - "1264becdbb63455183aa75f236a3413e": { - "views": [] - }, - "13061cc21693480a8380346277c1b877": { - "views": [] - }, - "130dd4d2c9f04ad28d9a6ac40045a329": { - "views": [] - }, - "1350a087b5a9422386c3c5f04dd5d1c9": { - "views": [] - }, - "139bd19be4a4427a9e08f0be6080188e": { - "views": [] - }, - "13f9f589d36c477f9b597dda459efd16": { - "views": [] - }, - "140917b5c77348ec82ea45da139a3045": { - "views": [] - }, - "145419657bb1401ba934e6cea43d5fd1": { - "views": [] - }, - "15d748f1629d4da1982cd62cfbcb1725": { - "views": [] - }, - "17ad015dbc744ac6952d2a6da89f0289": { - "views": [] - }, - "17b6508f32e4425e9f43e5407eb55ed3": { - "views": [] - }, - "185598d8e5fc4dffae293f270a6e7328": { - "views": [] - }, - "196473b25f384f3895ee245e8b7874e9": { - "views": [] - }, - "19c0f87663a0431285a62d4ad6748046": { - "views": [] - }, - "1a00a7b7446d4ad8b08c9a2a9ea9c852": { - "views": [] - }, - "1a97f5b88cdc4ae0871578c06bbb9965": { - "views": [] - }, - "1a9a07777b0c4a45b33e25a70ebdc290": { - "views": [] - }, - "1af711fe8e4f43f084cef6c89eec40ae": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "1aff6a6e15b34bb89d7579d445071230": { - "views": [] - }, - "1b1ea7e915d846aea9efeae4381b2c48": { - "views": [] - }, - "1ba02ae1967740b0a69e07dbe95635cb": { - "views": [] - }, - "1c5c913acbde4e87a163abb2e24e6e38": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "1cfca0b7ef754c459e1ad97c1f0ceb3b": { - "views": [] - }, - "1d8f6a4910e649589863b781aab4c4d4": { - "views": [] - }, - "1e64b8f5a1554a22992693c194f7b971": { - "views": [] - }, - "1e8f0a2bf7614443a380e53ed27b48c0": { - "views": [] - }, - "1f4e6fa4bacc479e8cd997b26a5af733": { - "views": [] - }, - "1fdf09158eb44415a946f07c6aaba620": { - "views": [] - }, - "200e3ebead3d4858a47e2f6d345ca395": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "2050d4b462474a059f9e6493ba06ac58": { - "views": [] - }, - "20b5c21a6e6a427ba3b9b55a0214f75e": { - "views": [] - }, - "20b99631feba4a9c98c9d5f74c620273": { - "views": [] - }, - "20bcff5082854ab89a7977ae56983e30": { - "views": [] - }, - "20d708bf9b7845fa946f5f37c7733fee": { - "views": [] - }, - "210b36ea9edf4ee49ae1ae3fe5005282": { - "views": [] - }, - "21415393cb2d4f72b5c3f5c058aeaf66": { - "views": [] - }, - "2186a18b6ed8405a8a720bae59de2ace": { - "views": [] - }, - "220dc13e9b6942a7b9ed9e37d5ede7ba": { - "views": [] - }, - "221a735fa6014a288543e6f8c7e4e2ef": { - "views": [] - }, - "2288929cec4d4c8faad411029f5e21fa": { - "views": [] - }, - "22b86e207ea6469d85d8333870851a86": { - "views": [] - }, - "23283ad662a140e3b5e8677499e91d64": { - "views": [] - }, - "23a7cc820b63454ca6be3dcfd2538ac1": { - "views": [] - }, - "240ed02d576546028af3edfab9ea8558": { - "views": [] - }, - "24678e52a0334cb9a9a56f92c29750be": { - "views": [] - }, - "247820f6d83f4dd9b68f5df77dbda4b7": { - "views": [] - }, - "24b6a837fbd942c9a68218fb8910dcd5": { - "views": [] - }, - "24ee3204f26348bca5e6a264973e5b56": { - "views": [] - }, - "262c7bb5bd7447f791509571fe74ae44": { - "views": [] - }, - "263595f22d0d45e2a850854bcefe4731": { - "views": [] - }, - "2640720aa6684c5da6d7870abcbc950b": { - "views": [] - }, - "265ca1ec7ad742f096bb8104d0cf1550": { - "views": [] - }, - "26bf66fba453464fac2f5cd362655083": { - "views": [] - }, - "29769879478f49e8b4afd5c0b4662e87": { - "views": [] - }, - "29a13bd6bc8d486ca648bf30c9e4c2a6": { - "views": [] - }, - "29c5df6267584654b76205fc5559c553": { - "views": [] - }, - "29ce25045e7248e5892e8aafc635c416": { - "views": [] - }, - "2a17207c43c9424394299a7b52461794": { - "views": [] - }, - "2a777941580945bc83ddb0c817ed4122": { - "views": [] - }, - "2ae1844e2afe416183658d7a602e5963": { - "views": [] - }, - "2afa2938b41944cf8c14e41a431e3969": { - "views": [] - }, - "2bdc5f9b161548e3aab8ea392b5af1a1": { - "views": [] - }, - "2c26b2bcfc96473584930a4b622d268e": { - "views": [] - }, - "2ca2a914a5f940b18df0b5cde2b79e4b": { - "views": [] - }, - "2ca2c532840548a9968d1c6b2f0acdd8": { - "views": [] - }, - "2d17c32bfea143babe2b114d8777b15d": { - "views": [] - }, - "2d3acd8872c342eab3484302cac2cb05": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "2dc514cc2f5547aeb97059a5070dc9e3": { - "views": [] - }, - "2e1351ad05384d058c90e594bc6143c1": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "2e9b80fa18984615933e41c1c1db2171": { - "views": [] - }, - "2ef17ee6b7c74a4bbbbbe9b1a93e4fb6": { - "views": [] - }, - "2f5438f1b34046a597a467effd43df11": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "2f8d22417f3e421f96027fca40e1554f": { - "views": [] - }, - "2fb0409cfb49469d89a32597dc3edba9": { - "views": [] - }, - "303ccef837984c97b7e71f2988c737a4": { - "views": [] - }, - "3058b0808dca48a0bba9a93682260491": { - "views": [] - }, - "306b65493c28411eb10ad786bbf85dc5": { - "views": [] - }, - "30f5d30cf2d84530b3199015c5ff00eb": { - "views": [] - }, - "310b1ac518bd4079bdb7ecaf523a6809": { - "views": [] - }, - "313eca81d9d24664bcc837db54d59618": { - "views": [] - }, - "31413caf78c14548baa61e3e3c9edc55": { - "views": [] - }, - "317fbd3cb6324b2fbdfd6aa46a8d1192": { - "views": [] - }, - "319425ba805346f5ba366c42e220f9c6": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "31fc8165275e473f8f75c6215b5184ff": { - "views": [] - }, - "329f12edaa0c44d2a619450f188e8777": { - "views": [] - }, - "32edf057582f4a6ca30ce3cb685bf971": { - "views": [] - }, - "330e74773ba148e18674cfa3e63cd6cc": { - "views": [] - }, - "332a89c03bfb49c2bb291051d172b735": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3347dfda0aca450f89dd9b39ca1bec7d": { - "views": [] - }, - "336e8bcfd7cc4a85956674b0c7bffff2": { - "views": [] - }, - "3376228b3b614d4ab2a10b2fd0f484fd": { - "views": [] - }, - "3380a22bc67c4be99c61050800f93395": { - "views": [] - }, - "34b5c16cbea448809c2ccbce56f8d5a5": { - "views": [] - }, - "34bb050223504afc8053ce931103f52c": { - "views": [] - }, - "34c28187175d49198b536a1ab13668c4": { - "views": [] - }, - "3521f32644514ecf9a96ddfa5d80fb9b": { - "views": [] - }, - "36511bd77ed74f668053df749cc735d4": { - "views": [] - }, - "36541c3490bd4268b64daf20d8c24124": { - "views": [] - }, - "37aa1dd4d76a4bac98857b519b7b523a": { - "views": [] - }, - "37aa3cfa3f8f48989091ec46ac17ae48": { - "views": [] - }, - "386991b0b1424a9c816dac6a29e1206b": { - "views": [] - }, - "386cf43742234dda994e35b41890b4d8": { - "views": [] - }, - "388571e8e0314dfab8e935b7578ba7f9": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3974e38e718547efaf0445da2be6a739": { - "views": [] - }, - "398490e0cc004d22ac9c4486abec61e1": { - "views": [] - }, - "399875994aba4c53afa8c49fae8d369e": { - "views": [] - }, - "39b64aa04b1d4a81953e43def0ef6e10": { - "views": [] - }, - "39ffc3dd42d94a27ba7240d10c11b565": { - "views": [] - }, - "3a21291c8e7249e3b04417d31b0447cf": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3a377d9f46704d749c6879383c89f5d3": { - "views": [] - }, - "3a44a6f1f62742849e96d957033a0039": { - "views": [] - }, - "3b22d68709b046e09fe70f381a3944cd": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3b329209c8f547acae1925dc3eb4af77": { - "views": [] - }, - "3c1b2ec10a9041be8a3fad9da78ff9f6": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3c2be3c85c6d41268bb4f9d63a43e196": { - "views": [] - }, - "3c6796eff7c54238a7b7776e88721b08": { - "views": [] - }, - "3cbca3e11edf439fb7f8ba41693b4824": { - "views": [] - }, - "3d4b6b7c0b0c48ff8c4b8d78f58e0f1c": { - "views": [] - }, - "3de1faf0d2514f49a99b3d60ea211495": { - "views": [] - }, - "3df60d9ac82b42d9b885d895629e372e": { - "views": [] - }, - "3e5b9fd779574270bf58101002c152ce": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3e80f34623c94659bfab5b3b56072d9a": { - "views": [] - }, - "3e8bb05434cb4a0291383144e4523840": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "3ea1c8e4f9b34161928260e1274ee048": { - "views": [] - }, - "3f32f0915bc6469aaaf7170eff1111e3": { - "views": [] - }, - "3fe69a26ae7a46fda78ae0cb519a0f8b": { - "views": [] - }, - "4000ecdd75d9467e9dffd457b35aa65f": { - "views": [] - }, - "402d346f8b68408faed2fd79395cf3fb": { - "views": [] - }, - "402f4116244242148fdc009bb399c3bd": { - "views": [] - }, - "4049e0d7c0d24668b7eae2bb7169376e": { - "views": [] - }, - "4088c9ed71b0467b9b9417d5b04eda0e": { - "views": [] - }, - "40d70faa07654b6cb13496c32ba274b3": { - "views": [] - }, - "4146be21b7614abe827976787ec570f1": { - "views": [] - }, - "4198c08edda440dd93d1f6ce3e4efa62": { - "views": [] - }, - "42023d7d3c264f9d933d4cee4362852b": { - "views": [] - }, - "421ad8c67f754ce2b24c4fa3a8e951cf": { - "views": [] - }, - "4263fe0cef42416f8d344c1672f591f9": { - "views": [] - }, - "428e42f04a1e4347a1f548379c68f91b": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "42a47243baf34773943a25df9cf23854": { - "views": [] - }, - "4343b72c91d04a7c9a6080f30fc63d7d": { - "views": [] - }, - "43488264fc924c01a30fa58604074b07": { - "views": [] - }, - "4379175239b34553bf45c8ef9443ac55": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "43859798809a4a289c58b4bd5e49d357": { - "views": [] - }, - "43ad406a61a34249b5622aba9450b23d": { - "views": [] - }, - "4421c121414d464bb3bf1b5f0e86c37b": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "445cc08b4da44c2386ac9379793e3506": { - "views": [] - }, - "447cff7e256c434e859bb7ce9e5d71c8": { - "views": [] - }, - "44af7da9d8304f07890ef7d11a9f95fe": { - "views": [] - }, - "45021b6f05db4c028a3b5572bc85217f": { - "views": [] - }, - "457768a474844556bf9b215439a2f2e9": { - "views": [] - }, - "45d5689de53646fe9042f3ce9e281acc": { - "views": [] - }, - "461aa21d57824526a6b61e3f9b5af523": { - "views": [] - }, - "472ca253aab34b098f53ed4854d35f23": { - "views": [] - }, - "4731208453424514b471f862804d9bb8": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "47dfef9eaf0e433cb4b3359575f39480": { - "views": [] - }, - "48220a877d494a3ea0cc9dae19783a13": { - "views": [] - }, - "4882c417949b4b6788a1c3ec208fb1ac": { - "views": [] - }, - "49f5c38281984e3bad67fe3ea3eb6470": { - "views": [] - }, - "4a0d39b43eee4e818d47d382d87d86d1": { - "views": [] - }, - "4a470bf3037047f48f4547b594ac65fa": { - "views": [] - }, - "4abab5bca8334dfbb0434be39eb550db": { - "views": [] - }, - "4b48e08fd383489faa72fc76921eac4e": { - "views": [] - }, - "4b9439e6445c4884bd1cde0e9fd2405e": { - "views": [] - }, - "4b9fa014f9904fcf9aceff00cc1ebf44": { - "views": [] - }, - "4bdc63256c3f4e31a8fa1d121f430518": { - "views": [] - }, - "4bebb097ddc64bbda2c475c3a0e92ab5": { - "views": [] - }, - "4c201df21ca34108a6e7b051aa58b7f6": { - "views": [] - }, - "4ced8c156fd941eca391016fc256ce40": { - "views": [] - }, - "4d281cda33fa489d86228370e627a5b0": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "4d85e68205d94965bdb437e5441b10a1": { - "views": [] - }, - "4e0e6dd34ba7487ba2072d352fe91bf5": { - "views": [] - }, - "4e82b1d731dd419480e865494f932f80": { - "views": [] - }, - "4e9f52dea051415a83c4597c4f7a6c00": { - "views": [] - }, - "4ec035cba73647358d416615cf4096ee": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "4f09442f99aa4a9e9f460f82a50317c4": { - "views": [] - }, - "4f80b4e6b074475698efbec6062e3548": { - "views": [] - }, - "4f905a287b4f4f0db64b9572432b0139": { - "views": [] - }, - "50a339306cd549de86fbe5fa2a0a3503": { - "views": [] - }, - "51068697643243e18621c888a6504434": { - "views": [] - }, - "51333b89f44b41aba813aef099bdbb42": { - "views": [] - }, - "5141ae07149b46909426208a30e2861e": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "515606cb3b3a4fccad5056d55b262db4": { - "views": [] - }, - "51aa6d9f5a90481db7e3dd00d77d4f09": { - "views": [] - }, - "524091ea717d427db2383b46c33ef204": { - "views": [] - }, - "524d1132c88f4d91b15344cc427a9565": { - "views": [] - }, - "52f70e249adc4edb8dca28b883a5d4f4": { - "views": [] - }, - "531c080221f64b8ca50d792bbaa6f31e": { - "views": [] - }, - "53349c544b54450f8e2af9b8ba176d78": { - "views": [] - }, - "53a8b8e7b7494d02852a0dc5ccca51a2": { - "views": [] - }, - "53c963469eee41b59479753201626f18": { - "views": [] - }, - "5436516c280a49828c1c2f4783d9cf0e": { - "views": [] - }, - "55a1b0b794f44ac796bc75616f65a2a1": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "55ebf735de4c4b5ba2f09bc51d3593fd": { - "views": [] - }, - "56007830e925480e94a12356ff4fb6a4": { - "views": [] - }, - "56def8b3867843f990439b33dab3da58": { - "views": [] - }, - "5719bb596a5649f6af38c11c3daae6e9": { - "views": [] - }, - "572245b145014b6e91a3b5fe55e4cf78": { - "views": [] - }, - "5728da2e2d5a4c5595e1f49723151dca": { - "views": [] - }, - "579673c076da4626bc34a34370702bd4": { - "views": [] - }, - "57c2148f18314c3789c3eb9122a85c86": { - "views": [] - }, - "58066439757048b98709d3b3f99efdf8": { - "views": [] - }, - "58108da85e9443ea8ba884e8adda699e": { - "views": [] - }, - "583f252174d9450196cdc7c1ebab744f": { - "views": [] - }, - "58b92095873e4d22895ee7dde1f8e09a": { - "views": [] - }, - "58be1833a5b344fb80ec86e08e8326da": { - "views": [] - }, - "58ee0f251d7c4aca82fdace15ff52414": { - "views": [] - }, - "590f2f9f8dc342b594dc9e79990e641f": { - "views": [] - }, - "593c6f6b541e49be95095be63970f335": { - "views": [] - }, - "593d3f780c1a4180b83389afdb9fecfe": { - "views": [] - }, - "5945f05889be40019f93a90ecd681125": { - "views": [] - }, - "595c537ed2514006ac823b4090cf3b4b": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "599cfb7471ec4fd29d835d2798145a54": { - "views": [] - }, - "5a8d17dc45d54463a6a49bad7a7d87ac": { - "views": [] - }, - "5bb323bde7e4454e85aa18fda291e038": { - "views": [] - }, - "5bc5e0429c1e4863adc6bd1ff2225b6d": { - "views": [] - }, - "5bd0fafc4ced48a5889bbcebc9275e40": { - "views": [] - }, - "5ccf965356804bc38c94b06698a2c254": { - "views": [] - }, - "5d1f96bedebf489cac8f820c783f7a14": { - "views": [] - }, - "5d3fc58b96804b57aad1d67feb26c70a": { - "views": [] - }, - "5d41872e720049198a319adc2f476276": { - "views": [] - }, - "5d7a630da5f14cd4969b520c77bc5bc5": { - "views": [] - }, - "5da153e0261e43af8fd1c3c5453cace0": { - "views": [] - }, - "5dde90afb01e44888d3c92c32641d4e2": { - "views": [] - }, - "5de2611543ff4475869ac16e9bf406fd": { - "views": [] - }, - "5e03db9b91124e79b082f7e3e031a7d3": { - "views": [] - }, - "5e576992ccfe4bb383c88f80d9746c1d": { - "views": [] - }, - "5e91029c26c642a9a8c90186f3acba8e": { - "views": [] - }, - "5ea2a6c21b9845d18f72757ca5af8340": { - "views": [] - }, - "5ef08dc24584438c8bc6c618763f0bc8": { - "views": [] - }, - "5f823979d2ce4c34ba18b4ca674724e4": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "5fc7b070fc1a4e809da4cda3a40fc6d9": { - "views": [] - }, - "601ca9a27da94a6489d62ac26f2805a9": { - "views": [] - }, - "605cbb1049a4462e9292961e62e55cee": { - "views": [] - }, - "60addd9bec3f4397b20464fdbcf66340": { - "views": [] - }, - "60e17d6811c64dc8a69b342abe20810a": { - "views": [] - }, - "611840434d9046488a028618769e4b86": { - "views": [] - }, - "627ab7014bbf404ba8190be17c22e79d": { - "views": [] - }, - "633aa1edce474560956be527039800e7": { - "views": [] - }, - "63b6e287d1aa48efad7c8154ddd8f9c4": { - "views": [] - }, - "63dcfdb9749345bab675db257bda4b81": { - "views": [] - }, - "640ba8cc905a4b47ad709398cc41c4e3": { - "views": [] - }, - "644dcff39d7c47b7b8b729d01f59bee5": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "6455faf9dbc6477f8692528e6eb90c9a": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "64ca99573d5b48d2ba4d5815a50e6ffe": { - "views": [] - }, - "65d7924ba8c44d3f98a1d2f02dc883f1": { - "views": [] - }, - "665ed2b201144d78a5a1f57894c2267c": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "66742844c1cd47ddbbe9aacf2e805f36": { - "views": [] - }, - "6678811915f14d0f86660fe90f63bd60": { - "views": [] - }, - "66a04a5cf76e429cadbebfc527592195": { - "views": [] - }, - "66e5c563ffe94e29bab82fdecbd1befa": { - "views": [] - }, - "673066e0bb0b40e288e6750452c52bf6": { - "views": [] - }, - "67ae0fb9621d488f879d0e3c458e88e9": { - "views": [] - }, - "687702eca5f74e458c8d43447b3b9ed5": { - "views": [] - }, - "68a4135d6f0a4bae95130539a2a44b3c": { - "views": [] - }, - "68c3a74e9ea74718b901c812ed179f47": { - "views": [] - }, - "694bd01e350449c2a40cd4ffc5d5a873": { - "views": [] - }, - "6981c38c44ad4b42bfb453b36d79a0e6": { - "views": [] - }, - "69e08ffffce9464589911cc4d2217df2": { - "views": [] - }, - "6a28f605a5d14589907dba7440ede2fc": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "6a74dc52c2a54837a64ad461e174d4e0": { - "views": [] - }, - "6ad1e0bf705141b3b6e6ab7bd6f842ea": { - "views": [] - }, - "6b37935db9f44e6087d1d262a61d54ac": { - "views": [] - }, - "6b402f0f3afb4d0dad0e2fa8b71aa890": { - "views": [] - }, - "6bc95be59a054979b142d2d4a8900cf2": { - "views": [] - }, - "6ce0ea52c2fc4a18b1cce33933df2be4": { - "views": [] - }, - "6d7effd6bc4c40a4b17bf9e136c5814c": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "6d9a639e949c4d1d8a7826bdb9e67bb5": { - "views": [] - }, - "6e18fafd95744f689c06c388368f1d21": { - "views": [] - }, - "6e2bc4a1e3424e2085d0363b7f937884": { - "views": [] - }, - "6e30c494930c439a996ba7c77bf0f721": { - "views": [] - }, - "6e682d58cc384145adb151652f0e3d15": { - "views": [] - }, - "6f08def65d27471b88fb14e9b63f9616": { - "views": [] - }, - "6f20c1dc00ef4a549cd9659a532046bf": { - "views": [] - }, - "6f605585550d4879b2f27e2fda0192be": { - "views": [] - }, - "706dd4e39f194fbbba6e34acd320d1c3": { - "views": [] - }, - "70f21ab685dc4c189f00a17a1810bbad": { - "views": [] - }, - "7101b67c47a546c881fdaf9c934c0264": { - "views": [] - }, - "71b0137b5ed741be979d1896762e5c75": { - "views": [] - }, - "7223df458fdf4178af0b9596e231c09c": { - "views": [] - }, - "7262519db6f94e2a9006c68c20b79d29": { - "views": [] - }, - "72dfe79a3e52429da1cf4382e78b2144": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "72e8d31709eb4e3ea28af5cb6d072ab2": { - "views": [] - }, - "73647a1287424ee28d2fb3c4471d720c": { - "views": [] - }, - "739c5dde541a41e1afae5ba38e4b8ee3": { - "views": [] - }, - "74187cc424a347a5aa73b8140772ec68": { - "views": [] - }, - "7418edf751a6486c9fae373cde30cb74": { - "views": [] - }, - "744302ec305b4405894ed1459b9d41d0": { - "views": [] - }, - "74dfbaa15be44021860f7ba407810255": { - "views": [] - }, - "750a30d80fd740aaabc562c0564f02a7": { - "views": [] - }, - "75e344508b0b45d1a9ae440549d95b1a": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "766efd1cfee542d3ba068dfa1705c4eb": { - "views": [] - }, - "7738084e8820466f9f763d49b4bf7466": { - "views": [] - }, - "781855043f1147679745947ff30308fa": { - "views": [] - }, - "78e2cfb79878452fa4f6e8baea88f822": { - "views": [] - }, - "796027b3dd6b4b888553590fecd69b29": { - "views": [] - }, - "7a302f58080c4420b138db1a9ed8103e": { - "views": [] - }, - "7a3c362499f54884b68e951a1bcfc505": { - "views": [] - }, - "7a4ee63f5f674454adf660bfcec97162": { - "views": [] - }, - "7ac2c18126414013a1b2096233c88675": { - "views": [] - }, - "7b1e3c457efa4f92ab8ff225a1a2c45e": { - "views": [] - }, - "7b8897b4f8094eef98284f5bb1ed5d51": { - "views": [] - }, - "7bbfd7b13dd242f0ac15b36bb437eb22": { - "views": [] - }, - "7d3c88bc5a0f4b428174ff33d5979cfd": { - "views": [] - }, - "7d4f53bd14d44f3f80342925f5b0b111": { - "views": [] - }, - "7d95ca693f624336a91c3069e586ef1b": { - "views": [] - }, - "7dcdc07b114e4ca69f75429ec042fabf": { - "views": [] - }, - "7e79b941d7264d27a82194c322f53b80": { - "views": [] - }, - "7f2f98bbffc0412dbb31c387407a9fed": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "7f4688756da74b369366c22fd99657f4": { - "views": [] - }, - "7f7ed281359f4a55bbe75ce841dd1453": { - "views": [] - }, - "7fdf429182a740a097331bddad58f075": { - "views": [] - }, - "81b312df679f4b0d8944bc680a0f517e": { - "views": [] - }, - "82036e8fa76544ae847f2c2fc3cf72c2": { - "views": [] - }, - "821f1041188a43a4be4bdaeb7fa2f201": { - "views": [] - }, - "827358a9b4ce49de802df37b7b673aea": { - "views": [] - }, - "82db288a0693422cbd846cc3cb5f0415": { - "views": [] - }, - "82e2820c147a4dff85a01bcddbad8645": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "82f795491023435e8429ea04ff4dc60a": { - "views": [] - }, - "8317620833b84ccebc4020d90382e134": { - "views": [] - }, - "8346e26975524082af27967748792444": { - "views": [] - }, - "83f8ed39d0c34dce87f53f402d6ee276": { - "views": [] - }, - "844ac22a0ebe46db84a6de7472fe9175": { - "views": [] - }, - "849948fe6e3144e1b05c8df882534d5a": { - "views": [] - }, - "85058c7c057043b185870da998e4be61": { - "views": [] - }, - "85443822f3714824bec4a56d4cfed631": { - "views": [] - }, - "8566379c7ff943b0bb0f9834ed4f0223": { - "views": [] - }, - "85a3c6f9a0464390be7309edd36c323c": { - "views": [] - }, - "85d7a90fbac640c9be576f338fa25c81": { - "views": [] - }, - "85f31444b4e44e11973fd36968bf9997": { - "views": [] - }, - "867875243ad24ff6ae39b311efb875d3": { - "views": [] - }, - "8698bede085142a29e9284777f039c93": { - "views": [] - }, - "86bf40f5107b4cb6942800f3930fdd41": { - "views": [] - }, - "874c486c4ebb445583bd97369be91d9b": { - "views": [] - }, - "87c469625bda412185f8a6c803408064": { - "views": [] - }, - "87d4bd76591f4a9f991232ffcff3f73b": { - "views": [] - }, - "87df3737c0fc4e848fe4100b97d193df": { - "views": [] - }, - "886b599c537b467ab49684d2c2f8fb78": { - "views": [] - }, - "889e19694e8043e289d8efc269eba934": { - "views": [] - }, - "88c628983ad1475ea3a9403f6fea891c": { - "views": [] - }, - "88c807c411d34103ba2e31b2df28b947": { - "views": [] - }, - "895ddca8886b4c06ad1d71326ca2f0af": { - "views": [] - }, - "899cc011a1bd4046ac798bc5838c2150": { - "views": [] - }, - "89d0e7a3090c47df9689d8ca28914612": { - "views": [] - }, - "89ea859f8bbd48bb94b8fa899ab69463": { - "views": [] - }, - "8a600988321e4e489450d26dedaa061f": { - "views": [] - }, - "8adcca252aff41a18cca5d856c17e42f": { - "views": [] - }, - "8b2fe9e4ea1a481089f73365c5e93d8b": { - "views": [] - }, - "8b5acd50710c4ca185037a73b7c9b25c": { - "views": [] - }, - "8bbdba73a1454cac954103a7b1789f75": { - "views": [] - }, - "8cffde5bdb3d4f7597131b048a013929": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "8db2abcad8bc44df812d6ccf2d2d713c": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "8dd5216b361c44359ba1233ee93683a4": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "8e13719438804be4a0b74f73e25998cd": { - "views": [] - }, - "8eb4ff3279fe4d43a9d8ee752c78a956": { - "views": [] - }, - "8f577d437d4743fd9399fefcd8efc8cb": { - "views": [] - }, - "8f8fbe8fd1914eae929069aeeac16b6d": { - "views": [] - }, - "8f9b8b5f7dd6425a9e8e923464ab9528": { - "views": [] - }, - "8f9e3422db114095a72948c37e98dd3e": { - "views": [] - }, - "8fd325068289448d990b045520bad521": { - "views": [] - }, - "9039bc40a5ad4a1c87272d82d74004e2": { - "views": [] - }, - "90bf5e50acbb4bccad380a6e33df7e40": { - "views": [] - }, - "91028fc3e4bc4f6c8ec752b89bcf3139": { - "views": [] - }, - "9274175be7fb47f4945e78f96d39a7a6": { - "views": [] - }, - "929245675b174fe5bfa102102b8db897": { - "views": [] - }, - "92be1f7fb2794c9fb25d7bbb5cbc313d": { - "views": [] - }, - "933904217b6045c1b654b7e5749203f5": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "936bc7eb12e244c196129358a16e14bb": { - "views": [] - }, - "936c09f4dde8440b91e9730a0212497c": { - "views": [] - }, - "9406b6ae7f944405a0e8a22f745a39b2": { - "views": [] - }, - "942a96eea03740719b28fcc1544284d4": { - "views": [] - }, - "94840e902ffe4bbba5b374ff4d26f19f": { - "views": [] - }, - "948d01f0901545d38e05f070ce4396e4": { - "views": [] - }, - "94e2a0bc2d724f7793bb5b6d25fc7088": { - "views": [] - }, - "94f2b877a79142839622a61a3a081c03": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "94f30801a94344129363c8266bf2e1f8": { - "views": [] - }, - "95b127e8aff34a76a813783a6a3c6369": { - "views": [] - }, - "95d44119bf714e42b163512d9a15bbc5": { - "views": [] - }, - "95f016e9ea9148a4a3e9f04cb8f5132d": { - "views": [] - }, - "968e9e9de47646409744df3723e87845": { - "views": [] - }, - "97207358fc65430aa196a7ed78b252f0": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "9768d539ee4044dc94c0bd5cfb827a18": { - "views": [] - }, - "98587702cc55456aa881daf879d2dc8d": { - "views": [] - }, - "986c6c4e92964759903d6eb7f153df8a": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "987d808edd63404f8d6f2ce42efff33a": { - "views": [] - }, - "9895c26dfb084d509adc8abc3178bad3": { - "views": [] - }, - "994bc7678f284a24a8700b2a69f09f8d": { - "views": [] - }, - "99eee4e3d9c34459b12fe14cee543c28": { - "views": [] - }, - "9a5c0b0805034141a1c96ddd57995a3c": { - "views": [] - }, - "9a7862bb66a84b4f897924278a809ef3": { - "views": [] - }, - "9b812f733f6a4b60ba4bf725959f7913": { - "views": [] - }, - "9bb5ae9ff9c94fe7beece9ce43f519af": { - "views": [] - }, - "9bfde7b437fb4e76a16a49574ea5b7ec": { - "views": [] - }, - "9c1d14484b6d4ab3b059731f17878d14": { - "views": [] - }, - "9c7a66ead55e48c8b92ef250a5a464b7": { - "views": [] - }, - "9ce50a53aafe439ebb19fff363c1bfe2": { - "views": [] - }, - "9d5e9658af264ad795f6a5f3d8c3c30f": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "9d7aa65511b6482d9587609ad7898f54": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "9d87f94baf454bd4b529e55e0792a696": { - "views": [] - }, - "9de4bd9c6a7b4f3dbd401df15f0b9984": { - "views": [] - }, - "9dfd6b08a2574ed89f0eb084dae93f73": { - "views": [] - }, - "9e1dffcb1d9d48aaafa031da2fb5fed9": { - "views": [] - }, - "9efb46d2bb0648f6b109189986f4f102": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "9f1439500d624f769dd5e5c353c46866": { - "views": [] - }, - "9f27ba31ccc947b598dc61aefca16a7f": { - "views": [] - }, - "9f31a58b6e8e4c79a92cf65c497ee000": { - "views": [] - }, - "9f43f85a0fb9464e9b7a25a85f6dba9c": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "9f4970dc472946d48c14e93e7f4d4b70": { - "views": [] - }, - "9f5dd25217a84799b72724b2a37281ea": { - "views": [] - }, - "9faa50b44e1842e0acac301f93a129c4": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "a0202917348d4c41a176d9871b65b168": { - "views": [] - }, - "a058f021f4ca4daf8ab830d8542bf90b": { - "views": [] - }, - "a0a2dded995543a6b68a67cd91baa252": { - "views": [] - }, - "a0e170b3ea484fd984985d2607f90ef3": { - "views": [] - }, - "a168e79f4cbb44c8ac7214db964de5f2": { - "views": [] - }, - "a182b774272b48238b55e3c4d40e6152": { - "views": [] - }, - "a1840ca22d834df2b145151baf6d8241": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "a1bb2982e88e4bb1a2729cc08862a859": { - "views": [] - }, - "a1d897a6094f483d8fc9a3638fbc179d": { - "views": [] - }, - "a231ee00d2b7404bb0ff4e303c6b04ee": { - "views": [] - }, - "a29fdc2987f44e69a0343a90d80c692c": { - "views": [] - }, - "a2de3ac1f4fe423997c5612b2b21c12f": { - "views": [] - }, - "a30ba623acec4b03923a2576bcfcbdf5": { - "views": [] - }, - "a3357d5460c5446196229eae087bb19e": { - "views": [] - }, - "a358d9ecd754457db178272315151fa3": { - "views": [] - }, - "a35aec268ac3406daa7fe4563f83f948": { - "views": [] - }, - "a38c5ed35b9945008341c2d3c0ef1470": { - "views": [] - }, - "a39cfb47679c4d2895cda12c6d9d2975": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "a55227f2fd5d42729fc4fd39a8c11914": { - "views": [] - }, - "a65af2c8506d47ec803c15815e2ab445": { - "views": [] - }, - "a6d2366540004eeaab760c8be196f10a": { - "views": [] - }, - "a709f15a981a468b9471a0f672f961a7": { - "views": [] - }, - "a7258472ad944d038cd227de28d9155f": { - "views": [] - }, - "a72eb43242c34ef19399c52a77da8830": { - "views": [] - }, - "a7568aed621548649e37cfa6423ca198": { - "views": [] - }, - "a83f7f5c09a845ecb3f5823c1d178a54": { - "views": [] - }, - "a87c651448f14ce4958d73c2f1e413e1": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "a8e78f5bc64e412ab44eb9c293a7e63b": { - "views": [] - }, - "a996d507452241e0b99aabe24eecbdd9": { - "views": [] - }, - "a9a4b7a2159e40f8aa93a50f11048342": { - "views": [] - }, - "a9cc48370b964a888f8414e1742d6ff2": { - "views": [] - }, - "a9dcbe9e9a4445bf9cf8961d4c1214a6": { - "views": [] - }, - "aab29dfddb98416ea815475d6c6a3eed": { - "views": [] - }, - "ab89783a86bc4939a5f78957f4019553": { - "views": [] - }, - "abaee5bb577d4a68b6898d637a4c7898": { - "views": [] - }, - "abecb04251e04260860074b8bdad088a": { - "views": [] - }, - "acc07b8cf2cf4d50ae1bceef2254637f": { - "views": [] - }, - "ae3ee1ee05a2443c8bf2f79cd9e86e56": { - "views": [] - }, - "ae4e85e2bceb4ec783dbfaaf3a174ea7": { - "views": [] - }, - "aec1a51db98f470cb0854466f3461fc1": { - "views": [] - }, - "afc5dccd3db64a1592ee0b2fd516b71d": { - "views": [] - }, - "afe28f5bae8941b19717e3d7285ddc61": { - "views": [] - }, - "b00516b171544bca9113adc99ed528a1": { - "views": [] - }, - "b005d7f2afbe479eb02678447a079a1a": { - "views": [] - }, - "b020ad1a7750461bb79fe4e74b9384f6": { - "views": [] - }, - "b07d0aab375142978e1261a6a4c94b10": { - "views": [] - }, - "b2c18df5c51649cdbdaf64092fc945b3": { - "views": [] - }, - "b410c14ee52d4af49c08da115db85ac7": { - "views": [] - }, - "b41220079b2b49c2ba6f59dcfe9e7757": { - "views": [] - }, - "b445a187ca6943bbb465782a67288ce5": { - "views": [] - }, - "b4dfb435038645dc9673ea4257fc26f3": { - "views": [] - }, - "b5633708bd8b4abdaec77a96aca519bb": { - "views": [] - }, - "b59b2622026d4ec582354d919e16f658": { - "views": [] - }, - "b635f31747e14f989c7dee2ba5d5caa5": { - "views": [] - }, - "b63dfdde813a4f019998e118b5168943": { - "views": [] - }, - "b6c3d440986d44ed88a9471a69b70e05": { - "views": [] - }, - "b6ee195c9bfd48ee8526b8cf0f3322b9": { - "views": [] - }, - "b7064dd21c9949d79f40c73fee431dff": { - "views": [] - }, - "b7537298609f4d64b8e36692b84f376c": { - "views": [] - }, - "b755013f41fa4dce8e2bab356d85d26d": { - "views": [] - }, - "b7cd4bfabc2e40fe9f30de702ae63716": { - "views": [] - }, - "b7e4c497ff5c4173961ffdc3bd3821a9": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "b821a13ce3e8453d85f07faccc95fee1": { - "views": [] - }, - "b86ea9c1f1ee45a380e35485ad4e2fac": { - "views": [] - }, - "b87f4d4805944698a0011c10d626726c": { - "views": [] - }, - "b8e173c7c8be41df9161cbbe2c4c6c86": { - "views": [] - }, - "b9322adcd8a241478e096aa1df086c78": { - "views": [] - }, - "b9ad471398784b6889ce7a1d2ef5c4c0": { - "views": [] - }, - "b9c138598fce460692cc12650375ee52": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "ba146eb955754db88ba6c720e14ea030": { - "views": [] - }, - "ba48cba009e8411ea85c7e566a47a934": { - "views": [] - }, - "bb2793de83a64688b61a2007573a8110": { - "views": [] - }, - "bb53891d7f514a17b497f699484c9aed": { - "views": [] - }, - "bbe5dea9d57d466ba4e964fce9af13cf": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "bbe88faf528d44a0a9083377d733d66a": { - "views": [] - }, - "bc0525d022404722a921132e61319e46": { - "views": [] - }, - "bc320fb35f5744cc82486b85f7a53b6f": { - "views": [] - }, - "bc900e9562c546f9ae3630d5110080ec": { - "views": [] - }, - "bcbf6b3ff19d4eb5aa1b8a57672d7f6f": { - "views": [] - }, - "bccf183ccb0041e380732005f2ca2d0a": { - "views": [] - }, - "bd0d18e3441340a7a56403c884c87a8e": { - "views": [] - }, - "bd21e4fe92614c22a76ae515077d2d11": { - "views": [] - }, - "bd5b05203cfd402596a6b7f076c4a8f8": { - "views": [] - }, - "beb0c9b29d8d4d69b3147af666fa298b": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "bf0d147a6a1346799c33807404fa1d46": { - "views": [] - }, - "c03d4477fa2a423dba6311b003203f62": { - "views": [] - }, - "c05697bcb0a247f78483e067a93f3468": { - "views": [] - }, - "c09c3d0e94ca4e71b43352ca91b1a88a": { - "views": [] - }, - "c0d015a0930e4ddf8f10bbace07c0b24": { - "views": [] - }, - "c15edd79a0fd4e24b06d1aae708a38c4": { - "views": [] - }, - "c20b6537360f4a70b923e6c5c2ba7d9b": { - "views": [] - }, - "c21fff9912924563b28470d32f62cd44": { - "views": [] - }, - "c2482621d28542268a2b0cbf4596da37": { - "views": [] - }, - "c25bd0d8054b4508a6b427447b7f4576": { - "views": [] - }, - "c301650ac4234491af84937a8633ad76": { - "views": [] - }, - "c333a0964b1e43d0817e73cb47cf0317": { - "views": [] - }, - "c36213b1566843ceb05b8545f7d3325c": { - "views": [] - }, - "c37d0add29fa4f41a47caf6538ec6685": { - "views": [] - }, - "c409a01effb945c187e08747e383463c": { - "views": [] - }, - "c4e104a7b731463688e0a8f25cf50246": { - "views": [] - }, - "c54f609af4e94e93b57304bc55e02eba": { - "views": [] - }, - "c576bf6d24184f3a9f31d4f40231ce87": { - "views": [] - }, - "c58ab80a895344008b5aadd8b8c628a4": { - "views": [] - }, - "c5d28bea41da447e88f4cec9cfaaf197": { - "views": [] - }, - "c74bbd55a8644defa3fcef473002a626": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "c856e77b213b400599b6e026baaa4c85": { - "views": [] - }, - "c894f9e350a1473abb28ff651443ae6f": { - "views": [] - }, - "c8e3827ae28b45bc9768a8c3e35cc8b1": { - "views": [] - }, - "c95bf1935b71400e98c63722b77caa08": { - "views": [] - }, - "c9e5129d30ea4b78b846e8e92651b0e9": { - "views": [] - }, - "ca2123c7b103485c851815cbcb4a6c17": { - "views": [] - }, - "ca34917db02148168daf0c30ceed7466": { - "views": [] - }, - "caa6adf7b0d243da8229c317c7482fe3": { - "views": [] - }, - "cb924475ebb64e76964f88e830979d38": { - "views": [] - }, - "cba1473ccaee4b2a89aba4d2b4b1e648": { - "views": [] - }, - "cbd735eb8eb446069ee912d795ccaf14": { - "views": [] - }, - "cc0ee37900ef40069515c79e99a9a875": { - "views": [] - }, - "cc564bca35c743b89697f5cfd4ecccc2": { - "views": [] - }, - "cc5a47588e2b4c8eb5deff560a0256c2": { - "views": [] - }, - "ccc64ac3a8a84ae9815ff9e8bdc3279d": { - "views": [] - }, - "cd02a06cec7342438f8585af6227db96": { - "views": [] - }, - "cd236465e91d4a90a2347e6baab6ab71": { - "views": [] - }, - "cd9a0aa1700a4407ab445053029dca18": { - "views": [] - }, - "cdd6c6a945a74c568d611b42e4ba8a1a": { - "views": [] - }, - "cdf0323ea1324c0b969f49176ecee1c2": { - "views": [] - }, - "ce3a0e82e80d48b9b2658e0c52196644": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "ce6ad0459f654b6785b3a71ccdf05063": { - "views": [] - }, - "ce8d3cd3535b459c823da2f49f3cc526": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "cf8c8f791d0541ffa4f635bb07389292": { - "views": [] - }, - "cfed29ab68f244e996b0d571c31020ec": { - "views": [] - }, - "d034cbd7b06a448f98b3f11b68520c08": { - "views": [] - }, - "d13135f5facc4c5996549a85974145a1": { - "views": [] - }, - "d18c7c17fa93493ebc622fe3d2c0d44e": { - "views": [] - }, - "d23b743d7d0342aca257780f2df758d6": { - "views": [] - }, - "d2fe43f4a2064078a6c8da47f8afb903": { - "views": [] - }, - "d34f626ca035456bb9e0c9ad2a9dced1": { - "views": [] - }, - "d359911be08f4342b20e86a954cd060f": { - "views": [] - }, - "d4d76a1c09a342e79cd6733886626459": { - "views": [] - }, - "d58d12f54e2b426fba4ca611b0ffc68f": { - "views": [] - }, - "d5e2a77d429d4ca0969e1edec5dc2690": { - "views": [] - }, - "d5f4bbe3242245f0a2c3b18a284e55f8": { - "views": [] - }, - "d6c325f3069a4186b3022619f4280c37": { - "views": [] - }, - "d6d46520bbcf495bad20bcd266fe1357": { - "views": [] - }, - "d72b7c8058324d1bb56b6574090ccda6": { - "views": [] - }, - "d73bbb49a33d49e187200fa7c8f23aaa": { - "views": [] - }, - "d80e4f8eb9a54aef8b746e38d8c3ef1b": { - "views": [] - }, - "d819255bc7104ee8b9466b149dba5bff": { - "views": [] - }, - "d819fcff913441d39a41982518127af5": { - "views": [] - }, - "d8295021db704345a63c9ff9d692b761": { - "views": [] - }, - "d83329fe36014f85bb5d0247d3ae4472": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "d88a0305cc224037a14e5040ed8e13af": { - "views": [] - }, - "d89b81d63c6048ff800d3380bf921ac0": { - "views": [] - }, - "d8d8667ab50944e4b066d648aa3c8e2a": { - "views": [] - }, - "d8fd2b5ef6e24628b2b5102d3cd375f3": { - "views": [] - }, - "d9579a126d5f44a3bc0a731e0ad55f24": { - "views": [] - }, - "da51bd4d4fd848699919e3973b2fabc2": { - "views": [] - }, - "dba5a5a8fec346b2bcdc88f4ce294550": { - "views": [] - }, - "dc201c38ac434cb8a424553f1fa5a791": { - "views": [] - }, - "dc631df85ae84ffc964acd7a76e399ce": { - "views": [] - }, - "dc7376a2272e44179f237e5a1c7f6a49": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "dc8a45203a0a457c927f582f9d576e5d": { - "views": [] - }, - "dcc0e1ea9e994fc0827d9d7f648e4ad9": { - "views": [] - }, - "dce6f4cb98094ee1b06c0dd0ff8f488a": { - "views": [] - }, - "dcfc688de41b4ed7a8f89ae84089d5c0": { - "views": [] - }, - "dd486b2cbda84c83ace5ceaee8a30ff8": { - "views": [] - }, - "ddcfbf7b97714357920ba9705e8d4ab0": { - "views": [] - }, - "ddd4485714564c65b70bd865783076af": { - "views": [] - }, - "de7738417f1040b1a06ad25e485eb91d": { - "views": [] - }, - "df4cada92e484fd4ae75026eaf1845e2": { - "views": [] - }, - "dfb3707b4a01441c8a0a1751425b8e1c": { - "views": [] - }, - "e03b701a52d948aab86117c928cbe275": { - "views": [] - }, - "e0a614fe085c4d3c835c78d6ada60a40": { - "views": [] - }, - "e138e0c7d5a4471d99bbdac50de00fe1": { - "views": [] - }, - "e154289ce1774450a9a51ac45a1d5725": { - "views": [] - }, - "e25c1d2c78c94c9a805920df36268508": { - "views": [] - }, - "e281172ebc7f48b5ae6545b16da79477": { - "views": [] - }, - "e2862bd7efac4bc0b23532705f5e46c4": { - "views": [] - }, - "e2cd9bb21f254e08885f43fd6e968879": { - "views": [] - }, - "e2f4acecaf194351b8e67439440a9966": { - "views": [] - }, - "e3198c124ac841a79db062efa81f6812": { - "views": [] - }, - "e36f3009f61a4f5ba047562e70330add": { - "views": [] - }, - "e3765274f28b4a55a82d9115ded151de": { - "views": [] - }, - "e37e3fba3b40413180cd30e594bf62bd": { - "views": [] - }, - "e3f9760867fa410fbdc4611aef1cee18": { - "views": [] - }, - "e4331c134ab24f9cae99d476dfa04c89": { - "views": [] - }, - "e46db59e121045169a1ea5313b1748b7": { - "views": [] - }, - "e475d1e00f9d48edadac886fb53c2a20": { - "views": [] - }, - "e48449d21c2d4360b851169468066470": { - "views": [] - }, - "e4c26b8a42b54e959b276a174f2c2795": { - "views": [] - }, - "e4e55dabd92f4c17b78ed4b6881842e8": { - "views": [] - }, - "e4e5dd3dc28d4aa3ab8f8f7c4a475115": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "e516fd8ebfc6478c95130d6edec77c88": { - "views": [] - }, - "e5afb8d0e8a94c4dac18f2bbf1d042ce": { - "views": [] - }, - "e5bcb13bf2e94afc857bcbb37f6d4d87": { - "views": [] - }, - "e64ab85e80184b70b69d01a9c6851943": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "e66b26fb788944ba83b7511d79b85dc5": { - "views": [] - }, - "e73434cfcc854429ac27ddc9c9b07f5e": { - "views": [] - }, - "e7a8244ea5a84493b3b5bdeaf92a50b4": { - "views": [] - }, - "e81ed2c281df4f06bc1d4e6b67c574b4": { - "views": [] - }, - "e85ff7ccdc034c268df9cb0e95e9b850": { - "views": [] - }, - "e8a198bff55a437eab56887563cd9a6e": { - "views": [] - }, - "e92ede4cfc96436b84e63809bcb22385": { - "views": [] - }, - "e949474f6aa64c5dada603476ea6cabd": { - "views": [] - }, - "e98e59c3156c49c1bb27be7a478c3654": { - "views": [] - }, - "e9ea6f88d1334fbcab7f9c9a11cf4a50": { - "views": [] - }, - "ea09e5da878c42f2b533856dc3149e3e": { - "views": [] - }, - "ea74036074054593b1cc31fec030d2a2": { - "views": [] - }, - "ea8d97fb8c0d499095cceb133e4d7d9c": { - "views": [] - }, - "eafbea5bce1f4ab4bcbb0aa08598af0f": { - "views": [] - }, - "ec01e6cdc5a54f068f1bb033415b4a06": { - "views": [] - }, - "ec2d1f18f2e841b184f5d4cd15979d46": { - "views": [] - }, - "ec923af478b94ad99bdfd3257f48cb06": { - "views": [] - }, - "ed02e2272e844678979bd6a3c00f5cb3": { - "views": [] - }, - "ed80296f5f5e42e694dfc5cc7fd3acee": { - "views": [] - }, - "ee4df451ca9d4ed48044b25b19dc3f3f": { - "views": [] - }, - "ee77219007884e089fc3c1479855c469": { - "views": [] - }, - "ef372681937b4e90a04b0d530b217edb": { - "views": [] - }, - "ef452efe39d34db6b4785cb816865ca3": { - "views": [] - }, - "efcb07343f244ff084ea49dbc7e3d811": { - "views": [] - }, - "f083a8e4c8574fe08f5eb0aac66c1e71": { - "views": [] - }, - "f09d7c07bec64811805db588515af7f6": { - "views": [] - }, - "f0ef654c93974add9410a6e243e0fbf2": { - "views": [] - }, - "f20d7c2fcf144f5da875c6af5ffd35cb": { - "views": [] - }, - "f234eb38076146b9a640f44b7ef30892": { - "views": [] - }, - "f24d087598434ed1bb7f5ae3b0b4647a": { - "views": [] - }, - "f262055f3f1b48029f9e2089f752b0b8": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "f2d40a380f884b1b95992ccc7c3df04e": { - "views": [] - }, - "f2e2e2e5177542aa9e5ca3d69508fb89": { - "views": [] - }, - "f31914f694384908bec466fc2945f1c7": { - "views": [] - }, - "f31cbea99df94f2281044c369ef1962d": { - "views": [] - }, - "f32c6c5551f540709f7c7cd9078f1aad": { - "views": [] - }, - "f337eb824d654f0fbd688e2db3c5bf7b": { - "views": [] - }, - "f36f776a7767495cbda2f649c2b3dd48": { - "views": [] - }, - "f3cef080253c46989413aad84b478199": { - "views": [] - }, - "f3df35ce53e0466e81a48234b36a1430": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "f3fa0f8a41ab4ede9c4e20f16e35237d": { - "views": [] - }, - "f42e4f996f254a1bb7fe6f4dfc49aba3": { - "views": [] - }, - "f437babcddc64a8aa238fc7013619fbb": { - "views": [] - }, - "f44a5661ed1f4b5d97849cf4bb5e862e": { - "views": [] - }, - "f44d24e28afa475da40628b4fd936922": { - "views": [] - }, - "f44d5e6e993745b8b12891d1f3af3dc3": { - "views": [] - }, - "f457cb5e76be46a29d9f49ba0dc135f1": { - "views": [] - }, - "f4691cbe84534ef6b7d3fca530cf1704": { - "views": [] - }, - "f4ca26fbbdbf49dda5d1b8affdecfa3e": { - "views": [] - }, - "f54998361fe84a8a95b2607fbe367d52": { - "views": [] - }, - "f54bdb1d3bfb47af9e7aaabb4ed12eff": { - "views": [] - }, - "f54c28b82f7d498b83bf6908e19b6d1b": { - "views": [] - }, - "f5cc05fcee4d4c3e80163c6e9c072b6e": { - "views": [] - }, - "f621b91a209e4997a47cf458f8a5027f": { - "views": [] - }, - "f665bf176eb443f6867cef8fdd79b4e5": { - "views": [] - }, - "f6e27824f5e84bd8b4671e9eb030b20f": { - "views": [] - }, - "f6f162ac0811434ea95875f6335bd484": { - "views": [] - }, - "f6f629e6fb164c97acdc50c25d1354ee": { - "views": [] - }, - "f71adee125f74ddd8302aa2796646d67": { - "views": [] - }, - "f731d66445aa4543800a6bb3e9267936": { - "views": [] - }, - "f8f8e8c27fff45afa309a849d1655e29": { - "views": [] - }, - "f913752b9e86487cb197f894d667d432": { - "views": [] - }, - "f92cde8d24064ae5afd4cd577eaa895a": { - "views": [] - }, - "f944674b7ca345a582de627055614499": { - "views": [] - }, - "f9458080ed534d25856c67ce8f93d5a1": { - "views": [ - { - "cell_index": 27 - } - ] - }, - "f986f98d05dd4b9fa8a3c1111c1cea9b": { - "views": [] - }, - "f9f7bc097f654e41b68f2d849c99a1a1": { - "views": [] - }, - "fa00693458bc45669e2ed4ee536e98d6": { - "views": [] - }, - "fa2f219e60ff453da3842df62a371813": { - "views": [] - }, - "fa6cbfe76fff48848dc08a9344de84ff": { - "views": [] - }, - "fb3b6d5e405d4e1b87e82bcc8ae3df0f": { - "views": [] - }, - "fbe27ee7dc93467292b67f68935ae6f0": { - "views": [] - }, - "fc494b2bcade4c3a890f08386dd8aab0": { - "views": [] - }, - "fd98ac9b76cc44f09bc3b684caf1882d": { - "views": [] - }, - "feb9bf5d951c40d4a87d57a4de5e819a": { - "views": [] - }, - "fedfd679505d409fa74ccaa52b87fcce": { - "views": [] - }, - "fef0278d4386407f96c44b4affe437b8": { - "views": [] - }, - "ff29b06d50b048d6bbcbdb5a8665dcde": { - "views": [] - }, - "ff3c868e31c0430dbf5b85415da9a24b": { - "views": [] - }, - "ff8a91a101044f4fba19cdfffc39e0d3": { - "views": [] - }, - "ffbca26ec77b492bbbda1be40b044d8e": { - "views": [] - }, - "fff5f5bc334942bd851ac24f782f4f3c": { - "views": [] - } - }, - "version": "1.1.1" } }, "nbformat": 4, diff --git a/notebooks/mdp_apps.ipynb b/notebooks/mdp_apps.ipynb index cefc9c7d2..17228d5f0 100644 --- a/notebooks/mdp_apps.ipynb +++ b/notebooks/mdp_apps.ipynb @@ -21,15 +21,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:47.018726Z", - "iopub.status.busy": "2026-06-27T00:34:47.018501Z", - "iopub.status.idle": "2026-06-27T00:34:48.282844Z", - "shell.execute_reply": "2026-06-27T00:34:48.281517Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.mdp import *\n", @@ -89,16 +82,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.286343Z", - "iopub.status.busy": "2026-06-27T00:34:48.285817Z", - "iopub.status.idle": "2026-06-27T00:34:48.293491Z", - "shell.execute_reply": "2026-06-27T00:34:48.292237Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "t = {\n", @@ -143,16 +128,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.296144Z", - "iopub.status.busy": "2026-06-27T00:34:48.295926Z", - "iopub.status.idle": "2026-06-27T00:34:48.301460Z", - "shell.execute_reply": "2026-06-27T00:34:48.298612Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "rewards = {\n", @@ -173,16 +150,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.305244Z", - "iopub.status.busy": "2026-06-27T00:34:48.304971Z", - "iopub.status.idle": "2026-06-27T00:34:48.308303Z", - "shell.execute_reply": "2026-06-27T00:34:48.307294Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "terminals = ['end']" @@ -197,16 +166,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.311226Z", - "iopub.status.busy": "2026-06-27T00:34:48.310927Z", - "iopub.status.idle": "2026-06-27T00:34:48.314698Z", - "shell.execute_reply": "2026-06-27T00:34:48.313408Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "init = 'class1'" @@ -222,16 +183,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.318997Z", - "iopub.status.busy": "2026-06-27T00:34:48.318668Z", - "iopub.status.idle": "2026-06-27T00:34:48.324594Z", - "shell.execute_reply": "2026-06-27T00:34:48.323677Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class CustomMDP(MDP):\n", @@ -267,25 +220,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.327128Z", - "iopub.status.busy": "2026-06-27T00:34:48.326923Z", - "iopub.status.idle": "2026-06-27T00:34:48.331043Z", - "shell.execute_reply": "2026-06-27T00:34:48.329731Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['pub', 'quit', 'study', 'facebook', 'sleep']\n", - "Warning: Transition table is empty.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "mdp = CustomMDP(t, rewards, terminals, init, gamma=.9)" ] @@ -299,31 +236,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.377142Z", - "iopub.status.busy": "2026-06-27T00:34:48.376927Z", - "iopub.status.idle": "2026-06-27T00:34:48.385292Z", - "shell.execute_reply": "2026-06-27T00:34:48.383915Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'end': 0.0,\n", - " 'class3': 19.10533144728953,\n", - " 'leisure': 13.946891353066082,\n", - " 'class2': 14.597383430869879,\n", - " 'class1': 16.90340650279542}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "value_iteration(mdp)" ] @@ -337,16 +252,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.387862Z", - "iopub.status.busy": "2026-06-27T00:34:48.387595Z", - "iopub.status.idle": "2026-06-27T00:34:48.391742Z", - "shell.execute_reply": "2026-06-27T00:34:48.390711Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "pi = best_policy(mdp, value_iteration(mdp, .01))" @@ -361,24 +268,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.394329Z", - "iopub.status.busy": "2026-06-27T00:34:48.394102Z", - "iopub.status.idle": "2026-06-27T00:34:48.397884Z", - "shell.execute_reply": "2026-06-27T00:34:48.396743Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'end': None, 'class3': 'pub', 'leisure': 'quit', 'class2': 'study', 'class1': 'study'}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(pi)" ] @@ -392,40 +284,16 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.400858Z", - "iopub.status.busy": "2026-06-27T00:34:48.400562Z", - "iopub.status.idle": "2026-06-27T00:34:48.406207Z", - "shell.execute_reply": "2026-06-27T00:34:48.405296Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'end': None,\n", - " 'class3': 'pub',\n", - " 'leisure': 'quit',\n", - " 'class2': 'study',\n", - " 'class1': 'study'}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "policy_iteration(mdp)" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "Everything looks perfect, but let us look at another possibility for an MDP.\n", "
\n", @@ -456,16 +324,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.408819Z", - "iopub.status.busy": "2026-06-27T00:34:48.408573Z", - "iopub.status.idle": "2026-06-27T00:34:48.416517Z", - "shell.execute_reply": "2026-06-27T00:34:48.415315Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class DMDP:\n", @@ -528,16 +388,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.419375Z", - "iopub.status.busy": "2026-06-27T00:34:48.419161Z", - "iopub.status.idle": "2026-06-27T00:34:48.423849Z", - "shell.execute_reply": "2026-06-27T00:34:48.422954Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "t = {\n", @@ -582,16 +434,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.426114Z", - "iopub.status.busy": "2026-06-27T00:34:48.425907Z", - "iopub.status.idle": "2026-06-27T00:34:48.430343Z", - "shell.execute_reply": "2026-06-27T00:34:48.429208Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "r = {\n", @@ -642,16 +486,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.433160Z", - "iopub.status.busy": "2026-06-27T00:34:48.432868Z", - "iopub.status.idle": "2026-06-27T00:34:48.436716Z", - "shell.execute_reply": "2026-06-27T00:34:48.435652Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "terminals = ['end']" @@ -666,16 +502,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.438934Z", - "iopub.status.busy": "2026-06-27T00:34:48.438739Z", - "iopub.status.idle": "2026-06-27T00:34:48.442072Z", - "shell.execute_reply": "2026-06-27T00:34:48.441060Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "init = 'class1'" @@ -691,16 +519,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.444914Z", - "iopub.status.busy": "2026-06-27T00:34:48.444639Z", - "iopub.status.idle": "2026-06-27T00:34:48.452578Z", - "shell.execute_reply": "2026-06-27T00:34:48.451422Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class CustomDMDP(DMDP):\n", @@ -756,16 +576,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.455151Z", - "iopub.status.busy": "2026-06-27T00:34:48.454876Z", - "iopub.status.idle": "2026-06-27T00:34:48.460510Z", - "shell.execute_reply": "2026-06-27T00:34:48.459510Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def value_iteration_dmdp(dmdp, epsilon=0.001):\n", @@ -791,24 +603,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.462879Z", - "iopub.status.busy": "2026-06-27T00:34:48.462663Z", - "iopub.status.idle": "2026-06-27T00:34:48.466680Z", - "shell.execute_reply": "2026-06-27T00:34:48.465858Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['pub', 'quit', 'study', 'facebook', 'sleep']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dmdp = CustomDMDP(t, r, terminals, init, gamma=.9)" ] @@ -822,31 +619,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.469244Z", - "iopub.status.busy": "2026-06-27T00:34:48.468995Z", - "iopub.status.idle": "2026-06-27T00:34:48.474369Z", - "shell.execute_reply": "2026-06-27T00:34:48.473398Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'end': 0.0,\n", - " 'class3': 12.827904448229472,\n", - " 'leisure': 1.8474896554396596,\n", - " 'class2': 5.772550326127298,\n", - " 'class1': 2.0756895004431364}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "value_iteration_dmdp(dmdp)" ] @@ -864,16 +639,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.476726Z", - "iopub.status.busy": "2026-06-27T00:34:48.476530Z", - "iopub.status.idle": "2026-06-27T00:34:48.479822Z", - "shell.execute_reply": "2026-06-27T00:34:48.478924Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def expected_utility_dmdp(a, s, U, dmdp):\n", @@ -889,16 +656,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.482742Z", - "iopub.status.busy": "2026-06-27T00:34:48.482379Z", - "iopub.status.idle": "2026-06-27T00:34:48.486866Z", - "shell.execute_reply": "2026-06-27T00:34:48.485753Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.utils import argmax_random_tie as argmax\n", @@ -918,24 +677,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.489138Z", - "iopub.status.busy": "2026-06-27T00:34:48.488913Z", - "iopub.status.idle": "2026-06-27T00:34:48.493344Z", - "shell.execute_reply": "2026-06-27T00:34:48.492222Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'end': None, 'class3': 'study', 'leisure': 'quit', 'class2': 'sleep', 'class1': 'facebook'}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pi = best_policy_dmdp(dmdp, value_iteration_dmdp(dmdp, .01))\n", "print(pi)" @@ -1040,16 +784,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.495628Z", - "iopub.status.busy": "2026-06-27T00:34:48.495418Z", - "iopub.status.idle": "2026-06-27T00:34:48.501471Z", - "shell.execute_reply": "2026-06-27T00:34:48.500308Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "t = {\n", @@ -1122,16 +858,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.504226Z", - "iopub.status.busy": "2026-06-27T00:34:48.503975Z", - "iopub.status.idle": "2026-06-27T00:34:48.508255Z", - "shell.execute_reply": "2026-06-27T00:34:48.507287Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "r = {\n", @@ -1155,9 +883,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "The Bellman update equation now is defined as follows\n", "\n", @@ -1181,16 +907,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.510994Z", - "iopub.status.busy": "2026-06-27T00:34:48.510770Z", - "iopub.status.idle": "2026-06-27T00:34:48.518562Z", - "shell.execute_reply": "2026-06-27T00:34:48.517319Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class DMDP2:\n", @@ -1266,16 +984,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.520781Z", - "iopub.status.busy": "2026-06-27T00:34:48.520588Z", - "iopub.status.idle": "2026-06-27T00:34:48.525998Z", - "shell.execute_reply": "2026-06-27T00:34:48.524877Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "class CustomDMDP2(DMDP2):\n", @@ -1316,16 +1026,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.528388Z", - "iopub.status.busy": "2026-06-27T00:34:48.528109Z", - "iopub.status.idle": "2026-06-27T00:34:48.534855Z", - "shell.execute_reply": "2026-06-27T00:34:48.533521Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def value_iteration_taxi_mdp(dmdp2, epsilon=0.001):\n", @@ -1355,16 +1057,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.537139Z", - "iopub.status.busy": "2026-06-27T00:34:48.536870Z", - "iopub.status.idle": "2026-06-27T00:34:48.540034Z", - "shell.execute_reply": "2026-06-27T00:34:48.539423Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "terminals = ['end']\n", @@ -1380,51 +1074,18 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.542568Z", - "iopub.status.busy": "2026-06-27T00:34:48.542300Z", - "iopub.status.idle": "2026-06-27T00:34:48.546233Z", - "shell.execute_reply": "2026-06-27T00:34:48.545202Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['dispatch', 'stand', 'cruise']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dmdp2 = CustomDMDP2(t, r, terminals, init, gamma=.9)" ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.549041Z", - "iopub.status.busy": "2026-06-27T00:34:48.548645Z", - "iopub.status.idle": "2026-06-27T00:34:48.556593Z", - "shell.execute_reply": "2026-06-27T00:34:48.555538Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'C': 129.08041190693112, 'A': 124.48815435737677, 'B': 137.70885410461636}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "value_iteration_taxi_mdp(dmdp2)" ] @@ -1439,16 +1100,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.559847Z", - "iopub.status.busy": "2026-06-27T00:34:48.559505Z", - "iopub.status.idle": "2026-06-27T00:34:48.564362Z", - "shell.execute_reply": "2026-06-27T00:34:48.563123Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def expected_utility_dmdp2(a, s, U, dmdp2):\n", @@ -1457,16 +1110,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.567858Z", - "iopub.status.busy": "2026-06-27T00:34:48.567540Z", - "iopub.status.idle": "2026-06-27T00:34:48.572163Z", - "shell.execute_reply": "2026-06-27T00:34:48.571142Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.utils import argmax_random_tie as argmax\n", @@ -1486,24 +1131,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.574665Z", - "iopub.status.busy": "2026-06-27T00:34:48.574470Z", - "iopub.status.idle": "2026-06-27T00:34:48.579707Z", - "shell.execute_reply": "2026-06-27T00:34:48.578614Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'C': 'cruise', 'A': 'stand', 'B': 'stand'}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pi = best_policy_dmdp2(dmdp2, value_iteration_taxi_mdp(dmdp2, .01))\n", "print(pi)" @@ -1541,16 +1171,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.583066Z", - "iopub.status.busy": "2026-06-27T00:34:48.582785Z", - "iopub.status.idle": "2026-06-27T00:34:48.589716Z", - "shell.execute_reply": "2026-06-27T00:34:48.588704Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "grid = [\n", @@ -1577,16 +1199,8 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.593043Z", - "iopub.status.busy": "2026-06-27T00:34:48.592589Z", - "iopub.status.idle": "2026-06-27T00:34:48.600578Z", - "shell.execute_reply": "2026-06-27T00:34:48.598448Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "terminals = [(9, 9)]" @@ -1601,15 +1215,8 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.604020Z", - "iopub.status.busy": "2026-06-27T00:34:48.603702Z", - "iopub.status.idle": "2026-06-27T00:34:48.609545Z", - "shell.execute_reply": "2026-06-27T00:34:48.608309Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "maze = GridMDP(grid, terminals)" @@ -1624,16 +1231,8 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true, - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.612997Z", - "iopub.status.busy": "2026-06-27T00:34:48.612671Z", - "iopub.status.idle": "2026-06-27T00:34:48.646184Z", - "shell.execute_reply": "2026-06-27T00:34:48.644567Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "pi = best_policy(maze, value_iteration(maze))" @@ -1652,34 +1251,9 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.650401Z", - "iopub.status.busy": "2026-06-27T00:34:48.650025Z", - "iopub.status.idle": "2026-06-27T00:34:48.655319Z", - "shell.execute_reply": "2026-06-27T00:34:48.654273Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None None None None None None None None None None None\n", - "None v < < < < < < None . None\n", - "None v None None None None None None None ^ None\n", - "None > > > > > > > > ^ None\n", - "None ^ None None None None None None None None None\n", - "None ^ None > > > > v < < None\n", - "None ^ None None None None None v None ^ None\n", - "None ^ < < < < < < None ^ None\n", - "None None None None None ^ None ^ None ^ None\n", - "None > > > > ^ None ^ None ^ None\n", - "None None None None None None None None None None None\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from aima.utils import print_table\n", "print_table(maze.to_arrows(pi))" @@ -1849,15 +1423,8 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.658091Z", - "iopub.status.busy": "2026-06-27T00:34:48.657780Z", - "iopub.status.idle": "2026-06-27T00:34:48.662257Z", - "shell.execute_reply": "2026-06-27T00:34:48.661179Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "t_prob = [[[0.5, 0.5], \n", @@ -1879,15 +1446,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.667322Z", - "iopub.status.busy": "2026-06-27T00:34:48.666674Z", - "iopub.status.idle": "2026-06-27T00:34:48.671624Z", - "shell.execute_reply": "2026-06-27T00:34:48.670467Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "e_prob = [[[0.5, 0.5], \n", @@ -1909,15 +1469,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.674960Z", - "iopub.status.busy": "2026-06-27T00:34:48.674706Z", - "iopub.status.idle": "2026-06-27T00:34:48.678669Z", - "shell.execute_reply": "2026-06-27T00:34:48.677532Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "rewards = [[-100, 10], \n", @@ -1937,15 +1490,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.684026Z", - "iopub.status.busy": "2026-06-27T00:34:48.683676Z", - "iopub.status.idle": "2026-06-27T00:34:48.688197Z", - "shell.execute_reply": "2026-06-27T00:34:48.686967Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# 0: open-left, 1: open-right, 2: listen\n", @@ -1965,15 +1511,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.691879Z", - "iopub.status.busy": "2026-06-27T00:34:48.691581Z", - "iopub.status.idle": "2026-06-27T00:34:48.696695Z", - "shell.execute_reply": "2026-06-27T00:34:48.694441Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "pomdp = POMDP(actions, t_prob, e_prob, rewards, states, gamma)" @@ -1988,56 +1527,9 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:34:48.700711Z", - "iopub.status.busy": "2026-06-27T00:34:48.700364Z", - "iopub.status.idle": "2026-06-27T00:35:07.379148Z", - "shell.execute_reply": "2026-06-27T00:35:07.378290Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "defaultdict(list,\n", - " {'1': [array([ 26.94830804, -83.05169196])],\n", - " '2': [array([23.55049363, -0.76359097]),\n", - " array([23.55049363, -0.76359097]),\n", - " array([23.55049363, -0.76359097]),\n", - " array([23.55049363, -0.76359097]),\n", - " array([23.24120177, 1.56028929]),\n", - " array([23.24120177, 1.56028929]),\n", - " array([23.24120177, 1.56028929]),\n", - " array([20.0874279 , 15.03900771]),\n", - " array([20.0874279 , 15.03900771]),\n", - " array([20.0874279 , 15.03900771]),\n", - " array([20.0874279 , 15.03900771]),\n", - " array([17.91696135, 17.91696135]),\n", - " array([17.91696135, 17.91696135]),\n", - " array([17.91696135, 17.91696135]),\n", - " array([17.91696135, 17.91696135]),\n", - " array([17.91696135, 17.91696135]),\n", - " array([15.03900771, 20.0874279 ]),\n", - " array([15.03900771, 20.0874279 ]),\n", - " array([15.03900771, 20.0874279 ]),\n", - " array([15.03900771, 20.0874279 ]),\n", - " array([ 1.56028929, 23.24120177]),\n", - " array([ 1.56028929, 23.24120177]),\n", - " array([ 1.56028929, 23.24120177]),\n", - " array([-0.76359097, 23.55049363]),\n", - " array([-0.76359097, 23.55049363]),\n", - " array([-0.76359097, 23.55049363]),\n", - " array([-0.76359097, 23.55049363])],\n", - " '0': [array([-83.05169196, 26.94830804])]})" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "utility = pomdp_value_iteration(pomdp, epsilon=3)\n", "utility" @@ -2045,15 +1537,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:35:07.382198Z", - "iopub.status.busy": "2026-06-27T00:35:07.381960Z", - "iopub.status.idle": "2026-06-27T00:35:07.407355Z", - "shell.execute_reply": "2026-06-27T00:35:07.406428Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", @@ -2082,27 +1567,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T00:35:07.410446Z", - "iopub.status.busy": "2026-06-27T00:35:07.410217Z", - "iopub.status.idle": "2026-06-27T00:35:07.595625Z", - "shell.execute_reply": "2026-06-27T00:35:07.594233Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjYAAAGiCAYAAAD0qYz9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAApV9JREFUeJzs3Xd4U+UXB/BvVtO9C52s0pY9yiwyC8iULSKiyAZlOBiCjLJly5AlisAPURmiqAjKXrItG1op0EKhLd07Sc/vj9hIaNKZ5Kbp+TxPH9Lcm/uehPTNyXvf+x4REREYY4wxxiyAWOgAGGOMMcYMhRMbxhhjjFkMTmwYY4wxZjE4sWGMMcaYxeDEhjHGGGMWgxMbxhhjjFkMTmwYY4wxZjE4sWGMMcaYxeDEhjHGGGMWw6iJTXJyMubMmYNGjRrB19cXoaGh+OWXX7T2Wb58OZydnbV+qlatasywGGOMMWahpMY8+KJFi1C5cmXs3LkTjo6O+O6779C7d28cOXIE7du3BwBkZ2cjICAAf/zxh+ZxIpHImGExxhhjzEIZNbFZunSp1u9TpkzB2rVrceLECU1iAwASiQTOzs7GDIUxxhhjFYDJ5tgQEX766SfEx8ejc+fOWttu3LgBPz8/BAQE4K233kJUVJSpwmKMMcaYBTHqiA0A3L59GyEhIcjMzIREIsFXX32FVq1aaba7uLhg2bJl6Nq1K5KTkzF79mw0a9YMN2/eROXKlXUeMycnBzk5OZrf8/LykJiYCDc3Nz6NxRhjjJUTRIS0tDR4e3tDLDbQWAsZmUqloqSkJIqKiqIlS5aQXC6nP/74Q+/+mZmZVKlSJQoLC9O7z5w5cwgA//AP//AP//AP/1jAT3R0tMHyDhEREUyoZ8+eEIlEOHDggN59QkND4enpiW+//Vbn9pdHbFJSUlClShVER0fD0dHR4DGzkstQqeB99iwA4EmrVrCTSASOiDFWEXFfZN5SU1Ph5+eH5ORkODk5GeSYRj8VVaBBqRTZ2dl6t6tUKkRGRqJBgwZ695HL5ZDL5QXud3R05MTGTEhUKsDODoD6/4U7E8aYELgvKh8MOY3EqJOHR4wYgRs3bkClUiEnJwdbt27FL7/8gsGDB2v2GTlyJK5duwaVSoWkpCS8//77ePbsGYYPH27M0BhjjDFmgYw6YtOvXz9NcpOXl4egoCB88803GDJkiNY+o0aNwo0bNwAAzZo1w/HjxwsdsWHmTyoSYei/k7+lPKGbMSYQ7osqHpPMsVEoFJBKpYUONSkUCshkslIdPzU1FU5OTkhJSeFTUYwxxlg5YYzPb5PMsSlOwlLapIYxxhhjLJ/JJw+zioGIkJmXBwCwFYt5fSHGmCC4L6p4uLo3M4rMvDzYnzoF+1OnNJ0KY4yZGvdFFQ8nNowxxhizGJzYMMYYY8xicGLDGGOMMYvBiQ1jjDHGLAYnNowxxhizGJzYMMYYY8xi8Do2zCgkAAZ4eGhuM8aYELgvqnhMUlLB2LikAmOMMVb+GOPzm09FMcYYY8xicGLDGGOMMYvBiQ0zigyVCqLjxyE6fhwZKpXQ4TDGKijuiyoeTmwYY4wxZjE4sWGMMcaYxeDEhjHGGGMWgxMbxhhjjFkMTmwYY4wxZjE4sWGMMcaYxeCSCswoJAC6u7pqbjPGmBC4L6p4uKQCY4wxxgTBJRUYY4wxxgrBiY0FefLkCZ4/f16qxyYkJCAyMhIKhcLAUbGKKjo6GsnJyXp/Z4yZxtOnTxEfH1+ix8TGxpb680RonNhYkHfeeQfLli0r0WPS0tLQsmVLBAUFoWvXroiOjkZkZCSysrLKFEuGSgW7kydhd/IkL2NeQb322mvYsmWL3t8LEx0djZSUFGOFxioQ7ouA8ePHY9asWSV6zLBhw7B48eJC93n69CkSEhLKEppRcGJTwX333XeIi4vDs2fPEBkZiRo1aiAgIABnzpwp87Ez8/KQmZdngCiZJahSpQpcXFyKtW+3bt2wdetWI0fEKoqK3hd5eXmhUqVKBj/u2LFjERYWZvDjlhVfFVVCKSkpSEtLg7e3N8Ri7bwwJiYGdnZ2cHFxQXJyMohIb0eelZWFxMREeHl5FXqclJQUiMViODg4lDpmfW3Fxsbi2rVr8PDwwIMHDyCXy6FUKgGoT2tFRkbCysoKVapUKXXbjOX74osvCryPlUol4uLiULlyZUgk6mtWHj9+jNzcXM3pUQDw9/eHSCQCAGRkZCAlJQVeXl6a+/I9evQIzs7OcHR0RGJiIuRyOezs7Ezw7FhFkZaWhuTkZHh7e2ves/liY2NhZWUFNzc3pKamQqFQwM3NTedxsrOzkZCQAC8vr0KPk5aWBpVKBWdn5yJje/Fx8fHxyM3NhY+PDz799NMCbQBAXFwc7OzsYGdnh7i4OADQmQDpiiE+Pl7zt5j/d1qlShVYWVkVGafRkQVISUkhAJSSkmK0NuLj46lbt24kk8nI1dWVKleuTLt27dLap0WLFjRo0CCqX78+ubu7k0QiocGDB1N2drZmn4yMDBo+fDjZ2tqSl5cX2dvb05w5cwoc580336Tg4GDy9PQkmUxGffv2pdzc3EJj7NixI02bNq3YbQ0bNoxcXFzI2tqa/P396bXXXqNmzZoRAPL29iZ/f38KDQ0t1euVrlQSjh0jHDtG6UplqY7ByreGDRvSsmXL9P4+d+5csrOzI29vb3JycqIZM2aQUqmkwYMHk5WVFbm7u5O/vz/5+/tTTk4OJSUl0cCBAzXvZycnJ1q5cqVWm/7+/jR8+HCqU6eO5m/n3Xffpby8PJM9b2ZeDNUXJScnU79+/Ugmk5Gbmxu5urrSl19+qbVPly5dqE+fPtS0aVPNZ0Dv3r0pPT1ds09OTg6NHz9e8963s7OjyZMnk/KF2Lp06UJ9+/alVq1aUeXKlcnKyoq6dOmidRxd8ttv1qwZVapUid544w0iIurfvz+NGTNGs19cXBy1bduWpFIpubm5Udu2balz5840dOjQYscwffp0srOzIycnJ83f6b1790r8uhrj85sTm2IaMGAANWvWjBISEoiIaOPGjSSVSunu3buafVq0aEESiYR+++03IiKKiIggHx8fWrhwoWaft99+m7p06aI5TmRkJPn4+NDXX3+tdRx7e3u6cOECERE9evSIXFxcaPPmzYXG+HJiU5y2Pv30U2rXrp3WcQDQH3/8UezXRhdObFhhiU14eDhJJBIKDw8nIqKsrCxavHgxJSUlERFR3bp1adWqVVrH69atGw0cOJBSU1OJiOjatWvk4uJCP//8s2Yff39/qlSpEt24cYOIiG7fvk3W1ta0b98+Yz1NZuYM1ReNHDmS6tatS0+ePCEiol27dpFYLKZLly5p9unSpQsBoO+//56IiKKjo8nf35+mTJmi2WfChAnUunVrevr0KRGp+/eAgACtJL1Lly4kl8vp+PHjRET09OlT8vHxoaVLlxYaY5cuXUgikdChQ4e07n85sRkyZAgFBwdrPhs2bNhAAAokNkXF0Lt3b3r//feLeOUKZ4zPb55jUwxxcXHYs2cPFi1apBlWHDNmDOrVq4dNmzZp7du9e3d069YNAFCzZk188MEH2Lhxo+Y4O3fuxIQJE5CWloaoqCiIRCL07t0be/bs0TrOW2+9hWbNmgEA/Pz8EBoaiitXrpQo5uK2xZipJScnQyaTwdPTEwBgbW2NTz75RO9w+507d3Dw4EF88MEHeP78OaKiomBnZ4euXbsWeD+PGjUKdevWBQDUqlULLVq0KNHfDmMvy8rKwtatWxEWFgYvLy8AwKBBg9C2bVusX79ea982bdpg4MCBAABfX1988sknms+JjIwMbNq0Ce+99x6ysrIQFRUFhUKB/v37F3gf9+nTB+3atQMAVK5cGV27di3W+7h79+549dVX9W7PyMjArl27EBYWpvk8Gzt2LGrXrl1g39LGIDSjzrHJysrCxo0b8dNPPyEhIQGBgYGYNGmS5oXKd/ToUXz22Wd4+PAhAgICEBYWhqZNmxoztBLJP39Yv359rfsbNWqEiIgIrfvq1aun9Xv9+vURExOD7Oxs3Lp1C3l5eZg4cWKBuQFBQUFav/v6+mr9bm9vj7S0NABAeno6nj59qtnm5eVVYB5BSdpizNReeeUVdO3aFQEBAejatStCQ0MxYMAAvfMRbty4AZFIhLfffrvAtpCQEK3fC/vbYaw0oqKioFKpdH4GXL58Wes+XZ8BqampiIuLw5MnT5Cbm4sZM2YUmPPi7e2t9buu93F+v5+ZmYknT55otlWqVEmzuJ2/v3+hz+XBgwdQqVSa5D/fy78XFYM5M2pi8+mnn8LOzg4LFy6Eo6MjvvvuO3Tq1AknT57UdEbnz59H165dMXPmTCxZsgTffPMN2rdvj6tXryIgIMCY4RWbjY0NACAnJ0fr/qysLNja2mrdl52dXeB3qVQKmUwGmUwGAPj999/L9NyOHDmCjz/+WPP7unXr0LVrV619DNVWaYkBtHNy0txm7EUSiQQ//vgjIiIicOTIEezevRvTp0/HhQsXULNmzQL7y2QyEBEuXrxY7CurGAMM0xeV9TMAUI9K5vfLP/zwg2ZEvjTOnz+PUaNGaX5fvHgxXn/9dQDQOUn4RdbW1gAKPpfs7GyLmWhv1M+cZcuWYf78+XjllVdQv359LFy4EJ6envjjjz80+yxatAjt27fH7Nmz0bhxY6xevRpVq1bFihUrjBlaiQQEBMDW1hbHjx/X3KdQKHDmzBk0bNhQa9+TJ09q/X7ixAnUq1cPEokEDRs2hJ2dHfbu3VugjfyrkYqjd+/eiIyM1Py8nNQAKFNbVlZWJYpHFxuJBMcbN8bxxo1hU8QfGqt48t9fAQEBGDt2LP788084ODjgt99+AwCtK/QAoHnz5pBKpWX+22EVjyH6ovylCl78DCAinDhxosBnwOnTp0EvVCo6ceIEqlevDkdHRwQFBcHNza3M7+MOHTpofQbkJzXFUbVqVTg5OWl9VuXm5uLixYvFPka+l/9OzYVRR2xezhxPnDiBuLg4tG7dWuu+lxcO6tq1K3799VdjhlYi9vb2mDp1KiZPngwbGxtUq1YNK1euhEKhwPvvv6+1799//40PPvgA77zzDs6fP4/169dj586dmuPMnz8fM2bMgEgkwquvvoqEhAT8/PPPqFSpUokXUCoq5tK2FRQUhJ9++gnVqlWDra0tX+7NDG7fvn3YvXs3hg4diurVq+Ovv/7Cs2fPNKegg4KCcPjwYXTr1g1yuRz+/v6YNm0aPvroI2RlZaFNmzZ4+vQpdu/ejcaNG2P8+PECPyNmySQSCebMmYM5c+bA1dUVtWrVwsaNGxEbG4uPPvpIa9/79+9j1KhRGDt2LK5fv46lS5di9erVAACpVIply5Zh7NixsLGxQc+ePZGSkoLffvsNIpGoxAusloZUKsWUKVMwc+ZMuLq6aj7PEhISCkxbKEpQUBB+/PFHXL16FQ4ODmZzubfR17G5d+8eXn31VWRkZCAjIwNfffUVQkNDAaivjU9JSdFMIMzn6emJx48f6z1mTk6O1jBaamqqcYJ/wezZs+Hi4oJVq1YhJSUFwcHBOHPmTIGiXVOnToVCocB7770HANi0aRP69++v2f7hhx/C398fmzdvxvbt2+Hr64s+ffpg5MiRmn38/Pzg+m812nyVK1eGqohVM318fODu7l6ittzc3ODj46N1nM2bNyMsLAx9+/aFt7c3jhw5UsxXibH/vLwg34u/Dxw4EBKJBJs2bcLDhw9RpUoV7N27F61atQIALFiwANOmTcMbb7yhmZ+2YMEC1KlTB9u2bcPGjRtRrVo1DBw4UGveTf630Rd5e3vDw8PDBM+YWbJJkybB1tYWmzZtQmJiIurVq4czZ86gcuXKWvuNGzcOTk5OmDhxIhQKBZYuXYoRI0Zotg8bNgy+vr744osv8MMPP8DLyws9evTQfGYA6vfsi305AHh4eCAzM7PQGHU9DlDPw3zxb3H69OkQi8VYtGgR7O3t0a1bN2RnZ2tOUxU3hkmTJiE6OhrvvvsuMjIycPDgQfOYQmKw66v0yM3NpaioKLp69SpNnz6dbG1t6fTp00SkXhcAAH333Xdaj1m1ahXZ2NjoPeacOXMIQIEfY17uXRwtWrSg+fPnCxqDuUhXKsn99GlyP32aL/dmjAnGlH1Rly5d6OOPPzZqG4agfOl1UCgUVK1aNVq9erXJYzHG5d5GH7GRyWSoVq0agP9mkC9btgyvvPIKHBwcIJfLCxTaSkhIKPQb1vTp07WG/1JTU+Hn52eU+FnpJXBBTcaYGeC+SNvx48dx4MABDBw4EESENWvWIC0tDYMGDRI6NIMw+QUr9vb2mqEssViMJk2a4OzZs1r7nD59utAZ43K5HI6Ojlo/5kDXKSTGGGMVg75TQeYmNDQUAQEB+PTTTzFp0iTY29vjypUrRqknJQSjjth89NFH+OijjzTXwv/444/45ZdfsGbNGs0+7733HkaNGoWTJ0+ibdu2+PHHH3Hq1CkcPnzYmKEZxe7du4UOgTHGmEC+/vproUMoFpFIhPfff7/AxS+WwqiJTdOmTdGxY0ckJCQgOzsbHh4eWLFiBcaMGaPZ56233sL9+/fRvXt3SCQSiEQirF27Fh07djRmaIwxxhizQCKiFy64N5L85dMLW/wnNzcXz58/h4eHB6TSkuVbqampcHJyQkpKitmclqroMlQq2J86BQBIb9MGdryWDWNMANwXmTdjfH4bffIwgGKVW7eystLU4GCMMcYYKw2TJDas4hEDaOrgoLnNGGNC4L6o4uHEhhmFjUSCi02aCB0GY6yC476o4uEEljHGGGMWgxMbxhhjjFkMTmyYUWSqVKh27hyqnTuHzCJqXDHGmLFwX1Tx8BwbZhQE4OG/hUqNvp4AY4zpwX1RxcMjNowxxhizGJzYMMYYY8xicGLDGGOMMYvBiQ1jjDHGLAYnNowxxhizGHxVFDMKEYA6traa24wxJgTuiyoeTmyYUdhKJLjZvLnQYTDGKjjuiyoePhXFGGOMMYvBiQ1jjDHGLAYnNswoMlUq1L1wAXUvXOBlzBljguG+qOLhOTbMKAjArcxMzW3GGBMC90Xm7Y9//jD4MXnEhjHGGGMmd/LhSQz4YYDBj2tRic1ffwkdAWOMMcaKQkSYfHiyUY5tUYnNzJkA8VgjY4wxZtZ+uPkDLj65CFuZrcGPbVGJzcWLwL59QkfBGGOMMX1ylDmYfmQ6AGBSy0kGP75FJTYA8MknQG6u0FEwxhhjTJcNlzYgKjkKnvaeGN98vMGPb1GJjYcHEBkJbN4sdCRMBKCqXI6qcjkvY84YEwz3ReYlOTsZ80/OBwDMaz8P9lb2Bm9DRFT+Z6WkpqbCyckJK1em4KOPHOHurk5wnJyEjowxxhhj+ab9MQ1Lzy5FbffauDbuGjLTM+Hk5ISUlBQ4OjoapA2LGrEZOhQICgISEoAlS4SOhjHGGGP5HiY/xOrzqwEASzsvhVRsnKX0LCqxkUr/S2hWrQJiYoSNhzHGGGNqs47NQo4qB+2rtUePgB5Ga8eiEhsA6NULaNMGyM4GZs0SOpqKK0ulQrPLl9Hs8mVk8TLmjDGBcF9kHq7GXsX/rv0PALCs8zKIRMab8WRxiY1IBCxbpr69bRtw7Zqw8VRUeQAupaXhUloa8oQOhjFWYXFfJDwiwpQ/poBAeLPem2jq3dSo7VlcYgMALVoAAweqF+ubOlXoaBhjjLGK69A/h3Ak6gisJFZYGLrQ6O0ZtQhmamoqNm3ahBMnTkChUKBZs2b48MMP4ebmptnn66+/xvr167Ue5+DggGPHjpWp7UWLgB9/BA4dAv74A+jcuUyHY4wxxlgJqfJUmPqHeoRhfLPxqO5S3ehtGjWxad++PTp37oyxY8dCIpFg0aJF2L17Ny5evKi5rOvJkyfIycnB1q1b/wtKWvaw/P2B994DVq9Wj9pcvgyILXJ8ijHGGDNP28O343rcdThbO+PTtp+apE2jJjanT5+Gre1/dSCaN28ODw8PHDx4EG+88Ybmfjs7OzRtavhzbrNmAd98A/z9N7BzJ/D22wZvgjHGGGM6ZCoyMeuY+iqeT9t8ClcbV5O0a9QxjBeTGgCwtraGRCKBQqHQuj8yMhIdOnRAt27dMGfOHKSmphqkfTc3YLq6HAU+/RTIyjLIYRljjDFWhM//+hyP0x6jqlNVo5RO0MekJ2cWL14Ma2trdH5hwotMJsPQoUMxY8YMDB8+HAcOHECTJk2Qnp6u9zg5OTlITU3V+tFn4kTAzw+IjgbWrjXo02FFcJfJ4C6TCR0GY6yC477I9OIz4vHZ6c8AAAtDF8Jaam2ytk1WUuH777/HW2+9hZ07d2qdhsrNzYWVlZXm9+fPn6NmzZqYMWMGpkyZovNYYWFhmDt3boH79S3JvH27elViJyfgn3/UIzmMMcYYM44Jv03AuovrEOwVjIujLkIs0j2Okl8SqdyVVNi3bx/eeecdbNiwQSupAaCV1ACAm5sbGjZsiGuFLEAzffp0pKSkaH6io6MLbX/IEKBhQyAlBZg/v/TPgzHGGGOFi3gegY2XNwJQL8anL6kxFqO3tn//frz55ptYu3YtRo0aVazHxMbGwt5ef8VPuVwOR0dHrZ/CiMX/Ldq3fr161IYxxhhjhjf9yHQo85ToVrMbQquHmrx9oyY2P//8MwYNGoS1a9di9OjROvdZuHChZo4MEeGzzz5DREQEBg0aZNBYOncGunQBFApgxgyDHprpkKVSof3Vq2h/9SovY84YEwz3RaZ1Nvos9t7eC7FIjKWdlwoSg1Ev9x4yZAgkEgk2b96MzZs3a+4fPXq0JtFxdnZGUFAQHB0dkZiYCGtra+zatQvt2rUzeDxLlwKHDwM//AB89JF6hWJmHHkATqSkaG4zxpgQuC8ynfzSCQAwrNEw1KtUT5A4jJrYHD9+HHl5Bd9K3t7emtvvv/8+xo0bh/v378PW1hZeXl5GK47VoIF6EvE33wBTpgAnTqhrSzHGGGOsbH688yPORp+FjdQGc9sXvMDHVIya2AQHBxdrP7FYjJo1axozFI3584HvvgNOnQIOHFBXA2eMMcZY6SlUCnzy5ycAgI9DPoaPo49gsVS4IgO+vsCHH6pvT5sGKJXCxsMYY4yVd5svb0ZEYgQ8bD0w5RXdS7WYSoVLbAB1QuPuDty5A3z1ldDRMMYYY+VXak4q5p5Qn3oKax8GR7lh1qMprQqZ2Dg5AbNnq2/PmQOkpQkbD2OMMVZeLT2zFPGZ8Qh0C8So4OIt62JMFTKxAYAxY4CaNYFnz4AVK4SOxjLZisWw5ZLqjDGBcV9kPI9TH2PluZUAgM86fgaZpPilK5RKJcaPN3wNKZOVVDCm/CWZraysMH78eKwoZqayZw/w+uuArS0QGQl4eRk5UMYYY8yCjPhpBL7++2u84vcKTg07Vayrmq9cuYK+ffvi0aNHmvvKXUkFU8nNzcXKlSshEokQFBSEu3fvFrp///5Ay5ZAZqb6lBRjjDHGiuf6s+v4JvwbAOrSCUUlNe+99x7kcjmaNGmildQYmkUlNi+6d+8eatWqBRsbG8zQs9SwSAQsX66+/dVXwK1bJgyQMcYYK8em/TkNeZSH/rX7I8QvROc+165dg7+/P0QiETZs2IDc3FzNNrlcDqnU8KvOWFxiIxaLIZFINL9nZ2dj8eLFEIlEqFOnDiIjI7X2f+UVoG9fIC9PfbUUM4xslQo9rl1Dj2vXkM3LmDPGBMJ9kXEcuX8EByMPQiqWYnHHxQW2f/DBB7C2tkbDhg1x//59zf0ikUjzGZ2TkwOlEdZcsbjEJi8vD6p/37zilyaL3b59GwEBAbC1tcXcuf+tirh4MSCRAL/8Ahw/bspoLZcKwG+JifgtMRHclTDGhMJ9keHlUZ6mdMK4puMQ4BYAALh79y4CAwMhEomwevVq5OTkaB6T/3lMRJrPaABwd3c3eHwWldhs374dNWvW1Jzn01XOAQCysrIQFhYGkUiEBg0awM4uBmPGqLdNmaIevWGMMcZYQd9e/xZXn16Fo9wRs9rOwrRp02BjY4NatWohIiJC52Ne/Dy2t7fH8OHDkZmZiX/++cfg8VlUYtO7d29ERERAoVDgs88+Q+XKlYt8zPXr1+Hn54etW+0gk32GS5fURTIZY4wxpi1bmY1Pj34KALC6YIVK9pWwdOlSZGdnF/o4KysrvPrqq7h//z7S0tLw1VdfwcbGxigxWlRik08ikWDatGl4+vQpMjMzMXLkSDg4OBT6mKysTCgU0wGI8c47wXj48KlpgmWMMcbKiV4Le+FRyiMgFUj4JaHQfcViMRo2bIgTJ04gJycHhw4dQvXq1Y0eo0UmNi+ysbHBl19+idTUVDx8+BBdunSBlZVVIY8gKBRXUa2aF+zt7fH555+bKlTGGGPM7MTExKB+/foQ2YrwR/Yf6juPAlDo3r9q1arYunUrVCoV/v77b7Rt29ZksQIVILF5UZUqVfD7778jJycHp0+fRqNGjQpMMH5RRkYGPvzwQ4jFYjRr1gwJCYVnp4wxxpilWLhwIezs7ODn54cbN24AbQFYA3gGIFx7X1dXV3zyySdQKpV48OAB3n33XdMH/K8Kldi86JVXXsHVq1ehUqmwdetWVKtWTe++RIRLly7Bw8MDjo6O2Lhxo+kCZYwxxkzk6dOnmi/9M2fORGZmpnqDM4Dm/+50GACpz4i88cYbSE5OxvPnz7F48WKt5VaEYlElFcq6JLNKpcLs2bOxdu0mpKU9L3RfkUiEli1b4rfffoOzs3Op22SMMcaEtmLFCsyZMwcZGRm6d+gPoD4gui/CK1GvYPOmzahdu3aZ2zXU5/eLOLHRgQho2zYFp0+Pg0TyE1SqzEL3d3R0xMqVKzFixIgyt80YY4yZQkJCArp164bLly+j0FTAB8AoQAQRLo++jMZejQ0WgzESmwp7KqowIhHw+edOAL6FSpWBffvuol27dnqXfk5NTcXIkSMhFovRtm1bpKenmzZgxhhjrJi++OILODg4wMPDA5cuXdKb1Hh7e2PlypVot6AdAGBIgyEGTWqMhRMbPZo0Ad56S3173bpAHDt2HAqFAr///jvq1q2rs9gXEeHUqVNwcHCAi4sLtm/fbuKozUe2SoXXb97E6zdv8jLmjDHBcF+klpycjJCQEIjFYowfP17vF3AnJyeMHz8eOTk5ePz4MQJ6BODEwxOQS+RYELrAxFGXDic2hViwALCyAo4eBX7/XX1fly5dcOPGDeTl5WHNmjXw8fHR+djk5GQMHToUEokEoaGhFW4URwVgT3w89sTH8zLmjDHBVPS+aPPmzXBycoKLiwv++usvnaMzcrkcvXv3RmxsLJKTk7F27VpYWVlBmafE1D+mAgA+aPkBqjhVMXX4pcKJTSGqVQMmTlTfnjoVeDnZnzBhAmJiYpCTk4OJEyfCycmpwDHy8vJw7NgxODg4wM3NDXv27DF+4Iwxxiqs9PR0tGnTBmKxGGPGjEFqamqBfSQSCZo3b45Lly4hOzsb+/fvh6enp9Y+X1/9GrcTbsPNxg2ftP7EVOGXGSc2RZgxA3BxAW7cALZt072PlZUVVq9ejeTkZMTFxaFPnz6wtrYusF9iYiJef/11iEQidO3atcglqBljjLHi2r59O5ydneHg4IDTp0/rHJ2pWbMmfvjhByiVSpw/fx5NmjTReaz03HTMOT4HADCr7Sw4WzsbM3SD4sSmCC4uwMyZ6tuzZgH6roTL5+HhgR9//BFZWVm4evUqWrZsqfO6/kOHDsHGxgaurq746aefjBA5Y4wxS5eeno7Q0FCIxWIMHToUKSkpBfapVKkS5s+fD6VSiYiICLz++utFHnfF2RV4mv4UNVxqYFyzccYI3Wg4sSmG999Xn5Z68gQoSYWFRo0a4dy5c1AqldizZw9q1qxZYJ+kpCT06dMHIpEI3bt3h1KpNFjcjDHGLNN3330HR0dHODg44NixYwVGZ6ytrTFs2DCkpaXh2bNnmDlzZrEXz3ua/hTLzi4DACzuuBhWksLKEJkfTmyKQS4HFi1S316yBIiLK/kx+vfvj4iICCiVSixatAiurq4F9jl48CBkMhns7e3xe/5sZcYYYwxAdnY22rRpA5FIhDfffBNpaWla28VisaaCdlZWFr7++mvY29uXuJ2w42HIUGSguU9zvF6n6NEdc8OJTTG98Yb6EvC0NGDevNIfRyKRYPr06Xj+/Lmm8rhMJtPaJyMjA926dYNIJEKbNm14FIcxxiqwb7/9FnK5HDY2Njh9+nSB7UFBQThx4gRUKlWZK2jfjr+NLVe2AACWdV6mc2kTc8crD5fA8eNAhw6AVArcvAkEBhru2I8ePcKbb76Js2fP6twuk8mwdetWvJW/uI6ZIyJk5uUBAGzF4nL5x8EYK//Ka1+UkZGBxo0bIyIiQud2e3t7fP755wZf8b73d73x892f0SuoF34aZPz5n7zysMDatwd69gSUSmD6dMMeu0qVKjhz5gyICCdOnICbm5vWdoVCgSFDhkAkEqF69epITk42bAAGJhKJYCeRwE4iKTcdCWPM8pS3vmjatGmQSCSwt7cvkNSIRCIMHz4cSqUSaWlpBk9qTj48iZ/v/gyJSIIlnZYY9NimxIlNCS1ZAojFwL59wJkzxmmjbdu2SEhIABFh1qxZEIu1/5sePHgAFxcXiMViDB8+HKoKvJomY4yVd+fPn4ezszNEIhGWLl2KvH9HmPIFBATg+fPnyMvLw1dffWWUCtpEhCl/TAEAjAweiVrutQzehqkYNbHJycnBl19+iSFDhuCNN97A8uXLdVYOvXv3Lt577z306NEDH3zwAaKjo40ZVpnUqQPkJ8lTpqgLZhrTvHnzoFKpkJ2djXr16mltIyJs3boVUqkUDg4O2Llzp3GDKYGcvDy8e/s23r19Gzkv/ZEyxpipmGtf9PTpU7Rs2RIikQgtW7YscJm2XC7Hvn37QES4d++ezgtODGn3rd248PgC7GR2CGsfZtS2jM2oiU2rVq1w6dIldO3aFX369MG3336LVq1aITPzv2rZ9+7dQ/PmzZGRkYF3330XUVFRaN68OZ4+fWrM0Mpk7lzA1hY4d049cmMKcrkc169fBxHh4MGDsLGx0dqenp6uOVVVu3ZtXLhwwTSB6aEkwrZnz7Dt2TMoy/80LsZYOWVOfVFubi7Gjh0LqVQKLy8vnD9/vsA+3bp1AxEhOzsbffv2NUlcOcocTD+inl8x9ZWp8LT3LOIRZo6M6Pnz51q/x8bGkkgkoj179mjue+utt6h58+aa33Nzc6lq1ao0efLkYreTkpJCACglJaXsQRfT7NlEAFHNmkQ5OSZrVotCoaAePXoQAJ0/YrGYevToQTExMSaPLV2pJBw7Rjh2jNKVSpO3zxhjRObRF61atYpcXFz09tUuLi504cIFQWIjIvr83OeEMJDnck9Ky0kzadvG+Pw26ojNy0NnTk5OkEgkWqejDh8+jN69e2t+l8lk6NmzJw4fPlyq9uzs7ODh4YGgoCC0a9cOw4cPxxdffIGbN2+W/onoMHkyUKkSEBkJbN5s0EMXm1QqxS+//AIiwpEjR+Ds7Ky1PS8vD7/++it8fX1hb2+P9957D7m5ucIEyxhjFcgvv/yCgIAAiEQifPjhh0hKStLaLhKJMHToUCgUCiQmJqJZs2aCxJmcnYx5J9VrmMxrPw/2ViVf90bvsZOTsW/fPkybNg2vvfYaGjVqBB8fHzg5OUEul0MikeissVhWUoMfsRCff/45pFIpOnbsCADIzMxEfHw8fH19tfbz9fXFgwcP9B4nJycHOTk5mt/zC3ypVCpkZmYiMzMTCQkJuHfvHk6ePImtW7cWOIZIJIJEIoFcLoetrS1cXFzg5eWFmjVromnTpujQoQOCgoL0xuDgoD4lNW6c+t+33waM8P9TbKGhoUhKSoJSqcSgQYOwd+9ere0ZGRnYsGEDNmzYAC8vL0yePBkfffSRQNEyxpjluX37NkaPHq1zrZl8Xl5e2Lt3L0JCQkwYmX6LTy1GYlYiarvXxrDGwwrdNz09HUeOHMHZs2dx584dREdHIy4uDmlpacjOzoZSqSww8VkQBhv7KcIvv/xCUqmUtmzZorkvKSmJANAPP/ygte/q1avJ2tpa77HmzJmjczjP1dWVbG1tSSqVkkgk0jvsV5ofkUhEUqmU7OzsyMPDgwIDA6l9+w7k5DSKgA00dmyE0V670jp48CC5ubkV+pyCgoLowIEDBm/bHIZ/GWPM2H3R8+fPaeDAgSSTyfT2tRKJhN566y1SKBQGb78sbj2+RbK5MkIYqOU7LSk4OJh8fX3JycmJ5HI5icVig36O4t8pEnK5nJycnMjX15caNGhg8FNRJlmg748//kCvXr2wYMECfPzxx5r7lUolbGxssG7dOowZM0Zz/5w5c/Dll1/iyZMnOo+na8TGz89P7wI/SqUS165dw8mTJ3HlyhVERUXh6dOnSEpKQmZmJnJzc5GXl6ezEmppiUQiSKVSWFlZwc7ODi4uLvD29kZQUBAaN26M0NBQnbWjjEGpVKJ///74+eef9e4jlUrRokULbNy4scDVV6WRoVLB/tQpAEB6mzawM8LliYwxVhRj9EUqlQozZszAli1bkJiYqHc/b29v7Nq1C23bti1zm8WRnp6O48eP49y5c7h9+zYePnyI+Ph4pKamakZUtJYH6QugIYAHAL4pXZtisRgymQxyuRwODg6oVKkS/Pz8ULduXbRo0QIdO3YstKyDMRboM/qpqD///BO9e/fGvHnztJIaQP1hWq9ePVy5ckXr/itXrqBRo0Z6jymXyyGXy4sdg1QqRXBwMIKDg4u1v1KpxNWrV3Hy5EmEh4fjn3/+wbNnz5CUlISsrKxiJUJEBIVCAYVCgYyMDMTFxeHu3bs4duyYzv1fToTc3Nzg7e2NwMBANGnSBB07dkS1atWK/ZxfJJVKNRXEf/rpJ4wcORIJCQkFnvOZM2dQv3592NjYoEePHti0aZPRLzFkjLHy4quvvsK8efPw6NEjvftIJBL07dsXu3btglRato/Y7OxsHD9+HGfPnsWtW7cQFRWFhIQEpKamIisrS3Pqp1Rfyj0BNPj39gtTWsViMaRSKaytreHg4AB3d3f4+fmhTp06aNGiBUJDQwvM5zQ3Rh2xOXr0KHr27Im5c+diypQpOvdZvXo15s6diwsXLqBmzZq4dOkSXnnlFezYsQMDBw4sVjumKqmgz5kzSrRufRXAcfToEY7ExPt49uwZkpOTi50IlVR+IiSXy7USoYCAADRv3hydOnUqMHfpRdnZ2ejXrx8OHTpU6DlRFxcXjBw5EosXLy7RolBEhASFAgDgLpOVixU/GWOWp6x90cmTJzFhwgTcuHGj0L6ycuXK2LFjBzp37qx3n+zsbJw6dQpnz57F9evX8fDhQ8TFxWlGVBQKhcE/K15MVOzt7eHu7g4fXx/cCr6Fh9KH6BvQF/sGm2jdEh2M8flt1MTGxcUFSqUSLVq00Lr/nXfewTvvvANAPaQ3fPhw7NmzB7Vq1cKtW7cwbtw4rFy5stjtCJ3YAOoimT/8AHTtChw8WPi+SqUSFy9exIkTJ3D9+nXNqbGUlBRkZmYa7c2dP1na3t4erq6u8PX1RWBgIIgIO3bs0EzC1sfPzw+zZs3CqFGjDBYXY4yZm6ioKIwePRonT54s9EpSiUSCFi1aoFOnTrh16xYePnyIZ8+emSRRyT/14+bmBj8/P9SqVQvNmjVDp06d4O7uXugxDkUeQtedXSETy3B3/F1Udyl90cyyKneJzbFjx3Qu91+jRg3UqFFD676HDx/i0aNH8Pf3h7e3d4naMYfE5p9/gNq1AYUC+OMPoFMnwx1bqVTir7/+wunTpxEeHo4HDx7g6dOnSE1NNVoiVJSgoCBs3LgR7du3N1mbjDFmLOnp6Rg/fjx++OEHZGVlmazd/C+d+SMq+YlKYGAgWrZsWaxEpSRUeSo03tQY1+Ou48OWH2Jll+IPIhhDuUtsTMUcEhsA+OADYPVqoFEj4PJldU0pISiVSpw9exanTp3CtWvX8ODBA8TFxSElJQVZWVlGSYRePDXm4OAAl8qVkTZkCFxcXPCRtTV6vPqqQf84GWOsKEqlEifPncOMmBg8T0yE886dSIiN1XwpzM7ONnibL4+Ou7u7w8fHB0FBQZo5Kp6ewq3s+83f32DYT8PgbO2Mfyb+A1cbYedRcmKjh7kkNgkJgL8/kJoKbN+uXtumPMjOzsbZs2dx5swZ3LhxA1FRUVqJ0ItXoBWbtfV/5+S6dQNe6kBeHE7N/+P39fVF7dq1iz2cyhirWF4cvb5+/Tru31fPZyz0NH4RfVFxiEQi2NnZaUZUfHx8UKtWLTRp0gShoaGFzmc0J5mKTASuDcTjtMdY1nkZJreaLHRInNjoYy6JDaCu/v3JJ4CfH3D3LvBSSady7auvvsLHH39coFibTgboTF6kawKcr68vatWqhZCQEHTq1MnsZ+ozxrTlzzc8ffo0/v77b0RFRRn+wotS9EVisRihoaE4cOAArK2tS9+2mVl8ajFmHJ2Bqk5VcWf8HVhLhX9unNjoYU6JTVYWEBQEREerk5ypUwUNxyiSk5PRo0cPnDt3Tn+H80Jn4jtqFN4ZOBASiUQzwS7/SoAyX7Kox8uJkIeHh2aCXUhISLm4ZJGx8ubFpTKuXr2quTDCFFeIWllZaS6M8PHxQUBAAGrWrIlf/vwTx/I74iISGxcXF6xbtw6DBw82WHzmIj4jHv5r/JGWm4b/9f0f3mrwltAhAeDERi9zSmwA9WmooUPVJRb++QdwcxM6IuPZuHEjpk2bVvCKKh3fkiQSCRo3bowvvvgCzZs313vM9PR0nD59GqdOndJaZCotLc0kiVD+2g1Vq1ZFrVq10KpVqyIXmWLMEuUvbnrs2DGEh4cjKioKsbGxSE5ONunipr6+vggICEDTpk2LXNMrNzcXH3/8MXbs2KEeXS7GafE2bdrgl19+sei/8Qm/TcC6i+sQ7BWMi6MuQiwSaBLoSzix0cPcEhuVCmjSBAgPV08oXrVK6IiMLyEhAd27d8elS5fUnVwRnYlcLkfnzp3x5Zdflnki3Yurbd66dQuPHj3SWm0z/7y7Ib242qajoyM8PDxQtWpV1K5du1irbTImBKVSiVu3buHo0aP4+++/8c8//2hGVDIyMqBQKKBSqQyeqLxYl8/V1RXe3t6aunyGWoX9888/x9KlSxEbG6u9QU9f5OzsjFWrVuHdd98tc9vmLuJ5BOqsrwNlnhJH3jmC0OqhQoekwYmNHuaW2ADqS75ffRWQyYDbt9WTiiuKzz//HDMXLEDGnj3qO4oY/nV0dMTbb7+NlStXwsrKyujx5RdyO3/+PG7evIno6GhNIpSTk2PURMja2lqTCFWpUgV16tRBSEgI2rdvz4kQK5WbN2/i6NGjuHr1KiIjIwuUizF2opJfQDgwMBDBwcFFFhA2pN9++w0ff/wx7t69W6zT4ujeHa2bNMGBAwcq1KnoAT8MwN7be9GtZjf89tZvQoejhRMbPcwxsQGALl2Aw4fVi/d9953Q0ZjWi/VZ0L27evJRMZhj5fHk5GQcPXoU58+fx507d/Dw4UMkJCQYraKtSCTSnBqzsbGBg4ODZkSoXr16aNWqFdq3b29RkxrZf27evInjx4/j8uXLmhGVxMREoycqL5768fT0REBAABo3boz27dujbt26BmuvrG7fvo0xY8bg3LlzUCqVRT/ghcSmItatOxd9Dq2+bgWxSIzwseGoV6nstQANiRMbPcw1sQkPBxo3BoiA8+eBQqaVWJw8Ijz6d5SmirU1li5ZggULFiAjI6PAvhKJpMBCjiKRCEFBQVi2bBl69uxpkpgNJT8ROnfuHO7cuYNHjx4hISEB6enpJkmEHB0dUalSJVStWhV16tRBmzZt0KZNG06EBJJfI+7SpUuIjIxEbGysZkQlJyfHqInKiyMq/v7+mgK85pSoFEdKSgrGjBmDn3/+WefieWKxuMDflEgkQrNmzXDgl1+Q+e9oaBVra4grUHkXIkLrra1xNvoshjcajq96fyV0SAVwYqNH/gtz9OhRsxvODwsDfvsNaNgQ2LwZqEB/UzrFxcXhgw8+QGRkZIkeV79+fcyYMQP+FnhOLzk5GZcuXcL169fx4MEDxMfHaz74srOzjbaidP5qp7a2tnBzc9P68GvYsKFJTguWR9HR0bh06RJu376tOY2ZP7HdWItfvpi4vrzoW3BwMGrUqFHmgovmRqVSYf369fjpp590lnuRyWRQ/FsD6kU2NjYYN24cBg0aZIowzdqxp8cw7co0yMVy7G2/F5WsKwkdUgHp6ekIDQ3lxOZl+YkNY4wxxgCIAbwPwA3ASQBHhQ2nKIZMbCwrxWfmQyoFRoxQ3/7qK6A458IZY8zQKmpf1ATqpCYDwBmBYzExixqxMcdTUQCQng707QukpKhXJe7XT+iIjC+LCO0yMwEAJ2xtYVPMc3BffPEF/ve//+ksnurt7Y3MzEwkJycX2Obh4YGRI0eib9++ZYqbqU8XXrx4UbOGUH55jYyMjNKV1ygmiUQCW1tb2NjYwN3dHd7e3ggMDESVKlWQlpaGu3fvai7lf7HumaHnqADal/M7ODhoraXSqFEj1K5d2+JO/ZjakydPsGjRIly5cqXAJGCpVAo/Pz/ExcXpnJcXEBCAFStWFGupiNL2ReVZuiId/U/0R1JuEqbUmYLXq70udEh68akoPcx18vCL1q4FJk4EKlcGIiIABwehIzKuF6+KKs2VCHfv3kWvXr1w7969AttcXFzQuHFjXLhwAenp6VrbxGIx6tWrh9WrV3PlcROJiYnB0aNHcfHiRdy7dw8xMTFITExEenq6ZnKsoS+fL4n8OSoymQy2trZwcnJC5cqVUaNGDdSvXx/t2rVDs2bNOFExgfT0dEycOBG7d+/W+bdbq1YtyOVyhIeHF3jP2NjYYPr06Zg1a1aJ2ixrX1QezTo6CwtOLUCgWyBujLsBmUQmdEh6GePz2zyWHqwAxowBatYEnj0DVqwQOhrzFxQUpFmbYvLkyZDL5ZptSUlJOHr0KLKyshAaGorOnTtrJrrm5eXh2rVr6NChA6ysrNCpUydERUUJ9TQqBKlUCqlUCrFYDJFIBJGZfiPOjys/xvyrhzihMS6VSoUFCxagcuXKcHBwwNatW7WSGj8/P4wcORLOzs64desWrl69qpXU1K1bF1FRUcjMzCxxUlMRPU59jBXn1B8yn3X8zKyTGmPhERsT2rMHeP11wNYWiIwEvLyEjsh4jPEt6ebNm+jTp4/OK6oqVaqEyZMnY+fOnbh+/XqBb3t2dnYYMGAA1q1bZ5anK81JQkICDh8+jAsXLuDevXuIjo7G8+fPkZaWZpQRmBdHVPIvV69cuTKqVauGBg0aoGbNmkhOTkZ4eDju3buHJ0+e4Pnz58jIyEBubi6USqVRrkKysrKCjY0NXFxcULlyZfj7+6Nhw4Zo27YtGjduzAlREXbv3o0ZM2bo/Ht1dXXFu+++ixs3buDPP/8s8H6ytrbGRx99hIULF5Y5joo2YjPy55H46upXeMXvFZwadspsv2jk48u99SgviQ0R0KoV8NdfwOjRwKZNQkdkPMbuTCZNmoSNGzciNzdX636JRII+ffqga9euWLBgAR4+fFjgsR4eHpgwYQJmzJgBiYV3coA6Ufnzzz8182ZiYmK0EhVjrauTv9Kyk5OTZl2dBg0a4JVXXkGrVq2Mtq5OZGSkZiXeu3fv4smTJ0hKSjJqIiSRSDSnuvIXuPP390ejRo3Qtm1bNGjQoEIkQpcvX8a4ceNw5cqVAvPkbGxs8Nprr6FXr1744IMPkJCQUODxQUFB+OWXXwxSYiFfRUpsbsTdQMONDZFHeTg7/CxC/EKEDqlInNjoUV4SGwA4fRpo0wYQi4Hr14E6dYSOyDhM1ZlcuXIF/fv3x4MHDwps8/T0xPbt23H06FFs3rwZiYmJBfbx9/fHwoUL8cYbbxglPmNITk7Gn3/+ifPnz+PWrVuIiYkxyQKAL5aEqFSpEqpVq6ZZCbk8LwCYv4DelStXEBkZicePH5t0AT1nZ2d4eXmhRo0aaNKkCdq1a4c6deqUm0To6dOnGDNmDA4dOlRgcrlUKkXLli2xdu1azJo1CwcPHiyQ8FhbW2P8+PFYtmyZUeKrSIlN953dcTDyIPrX7o89A/cIHU6xcGKjR3lKbAD1FVL79wOvvQb8/LPQ0RiHEJ3J6NGj8c033xRYtEsqlWpOQ73//vs6Vy8tbuVxY3h5peL8Rd9MuVKxu7s7qlevzisVF4O+lYTzR4RMuZJwkyZNBCl5UKCC9kvx5q8aLpVK8c477yA+Pr7AMQICAvDjjz8aPfaKktgcuX8EnXZ0glQsxa33biHALUDokIqFExs9yltic/cuULeuugr48eNAu3ZCR2R4eUS4/e8llrVtbU26jPnFixcxYMAAPHr0qMA2Hx8ffPfdd3Bzc9Nbb6aslcfzi2yePXtW8NpStWvXRps2bdC6dWueWySQl2s/vVhSwVS1n7y8vFCzZk00btwYnTp1KnWRyrVr1+Kzzz7DkydPCmzLr/M2ceJEDBw4ED///HOB0RkrKyuMHTsWq1evLlX7pSFkX2QqeZSHppub4urTqxjfbDzWdl8rdEjFxomNHuUtsQGA994DNmwAmjZV15ES8/VpBqdUKjFy5Eh8++23BUZxZDIZBg8ejC1btuDw4cN6KwQ7Ojri9ddfR7du3XD58mXN2i6mrAbu4OCASpUqcTXwCkCpVOLWrVs4ceIELl++jPv37wterVsqlWLlypW4c+eOzr+Pt99+GytXrsTp06fx1ltv4enTpwXaqF69Ovbv348GDRoYLG72n53XdmLIj0PgYOWAfyb+Aw87D6FDKjZObPQoj4nNs2fqy7/T04FduwAua2Jcp0+fxqBBg/D48eMC22QyGVxdXZGdnY2MjIziVQwuoRcXfHN0dISHhwf8/PxQt25dtGjRAh07duREhZWYUqnEtWvXcPLkSfz999+aauD5iZCxFjAUiUSQy+WwsbGBQqEosCYNoP67GjFiBDZs2GDQtpm2bGU2gtYF4VHKIywMXYgZbWYIHVKJcGKjR3lMbABgwQJg1iygWjXgzh3ghaVayr3cvDws+veKpBlVq8LKiENS2dnZOH78OM6ePYsbN25oTv2kpqYiKytLc+rH0G91qVQKW1tbODg4wN3dHVWrVkWtWrXQokULhIaGwtnZ2aDtMVZW+YnQsWPHEB4ejn/++QfPnj1DcnIy0tLSClxlaAgikQhSqVRzaszNzQ3e3t4ICAhA06ZN0bFjR1SrVs3g7eYzZV8khOVnl2PKH1Pg4+CDexPuwVZmK3RIJcKJjR7lNbHJyAACAoDYWGDlSuDDD4WOyHDKMmEvOzsbp06dwqlTp3Dr1i3Nsv6pqanIzs42SgXll8lkMoSEhKB58+aoXbs2vv/+e5w4cULvVR+bN29G7dq1jRYPY8agUqkwc+ZMvVcN1qhRA8OHD4eVlRUuX76Mo0eP6pwIbEj5iZBcLoednR1cXV3h4+ODgIAANG/eHJ06dYKvr2+xj2fJk4cTsxLhv8YfydnJ+LrX1xjWeJjQIZUYJzZ6lNfEBlDXZBs5EnBxAf75R/2vJXixM0lo1gzh58/j1KlTmhGVZ8+eGTVRyZ9Ma21tDXt7e7i5ucHPzw+1atXSzFFxd3cHoP4WO2jQIOzfv1/nZMfRo0dj7Vr1ZLzirNOxYcMGuLq6Guy5MGZo33zzDcLCwoq1ztO5c+fwxhtvIDo6usC+vr6++OGHHxASol4vRalU4uLFizh9+jT+/vtvREVF4enTp5raXrm5uUb5W8+fI2Rvbw9XV1f4+voiMDAQTZo0QavQUATdvw/A8hKbjw99jJV/rUT9SvVxdcxVSMTl77lxYqNHeU5sVCqgYUPg5k1gyhRg6VKhIyqaUqnE2bNnceLECdy4cQNRUVGaERVNYUIrK+C339QP6NYNyM4uU5v5nVd+ouLu7q7pvFq2bIlOnTppEpWy+P333zF06FDExcUV2FazZk3s379fc3lqUSurjhw5EosWLaoQiwAy83fy5ElMnDixWCtzK5VKjB07Ftu3b9e5fMLAgQOxbdu2Mq+1o1Qq8ddff+H06dMIDw/HgwcP8OzZM6SkpGjmCJU5EbK2Bg4eVN/u1g3i3FytRMjNzQ0+Pj6oVasWmjRpgldffbVUV0OaWlRSFGp9UQu5qlz8/tbv6FKzi9AhlQonNnqU58QGUH/+9+ihnmNz9y5Qtapp289PVPJHVO7fv6+p6JyfqJS4c3mpM3k5sXnxW5aDg4NW59K8eXOEhoYK2rkolUr0798fv/76a4GRGblcjgkTJmgWFFOpVFi8eDHWrl2rMyGqUqUKZs+ejREjRpgkdsbyPXr0CKNGjcLx48cLzJ+RyWRo27YtNm3aBH9/fwCFL3jp5eWF7777Dm3btjVF6DqVqq8qoi8qyssjQu7u7mbRVw3eOxi7buxCpxqdcHjIYbMvnaCPUT6/yQKkpKQQAEpJSRE6lFLJyyPq0IEIIBoypOzHUygUdOrUKVq8eDENGjSIWrZsSdWrVydXV1eytrYmiURCIpGIABjsRywWk0wmI3t7e/L09KTajRsTjh0jHDtGm7dvp+jo6LI/MYHs37+f3N3ddT7vwMBAioiI0OyblpZGw4YNI3t7e52vUYMGDejEiRMCPhtm6TIzM2n48OGFvgePHTum9Zjx48eTlZVVgf0lEgkNGDCAFAqFME+mjBQKBf1+/LimLwpu1YqqVq1KLi4uRu8LHRwcyMvLi+rXr0/dunWjSZMm0a5duyg+Pr7Mz+vi44uEMJAoTERXnlwxwCslHGN8fvOIjZm4fFm9pk3+7eDg/7aZ43nroibwWeKEvezsbPTr1w+HDh0qVtG+qKgojB49GidPnizwbdnKygpt27bF5s2bUb16dZPEzyxXUaOGfn5+mDVrFkaNGqW57+bNm+jduzf++eefAvtXrlwZO3bsQOfOnY0atymUpC/Kzs7WGhEyh/mAnTp10rrCkojQYVsHnHh4Am83eBvb+243WCxC4FNRepS3xEapVOLq1as4fvw4wsPDNYlKTEwycnOzAORCJDLsH09RVxq0b9/eoJdcWmJi86I9e/ZgzJgxOq8kqVOnDn799Vet17Ow+Q329vbo378/Vx5nJVbYPC8XFxeMHDkSixcv1prn9fHHH+OLL74ocIWfRCLBa6+9ht27d5ebOlXFYcy+KP8KzrNnz+L69esmuYJTFCQCvUmAEqj0fSV42niiSpUqmqUmXk6EzF25TGyePXuGr776CleuXMGkSZPQpk0bre179+7Frl27tO6zs7PDtm3bit2G0IlNYWtD5K8WavA3t8BrQxRFRYQraWkAgGAHB0jK6fnfomRnZ6Nnz544duxYgYTFxsYG06dPx6xZs7Tu/+qrrzBv3jydJR8qWuVxVnJ///03xowZg8uXL+u8Mq9Hjx7YtGmT1pV5d+/eRa9evXDv3r0Cx3N3d8eWLVvQu3dvo8cuBHPqi8q85pYYwDgAHgBOA/iz6DZfHBHKX3PLz88PderUMYs1t8pdYvO///0P06dPx1tvvYUlS5Zgx44dGDJkiNY+CxYswPbt27Fo0SLNfVZWVujVq1ex2zH0CyPEap75iQpgBYXCFlZWrmjVyhu1agWhcePGCA0NRc2aNQ3WHjO87du3Y9KkSUhOTta6XyQSoX79+vj111+1Tt+pVCrMmDEDW7ZssZjK48w4nj59irFjx+L333/XuZZSixYtsHHjRtSrV09r24wZM7Bq1Spk65i836VLF+zbt4+LnZqx9PR0HD9+HOfOncPt27dxmS7jUaNHEGWJINsggypDVSC5LStTr5Je7iYPR0dHU05ODv2bPNGOHTsK7DN//nxq0aJFmdopavKRQqGg8PBwWrNmDQ0dOpTatGlDAQEB5O7uTra2tiSVSg0+gUwkEpFUKiU7Ozvy8PCgwMBAateuHY0aNYo2bNhAd+7c0RlrYiKRi4t6IvFXX5XpZWECSUtLo7Zt2+p8T9nZ2dHSpUsLPOb58+c0cOBAsrGx0TmBs1mzZnTp0iUBng0TSk5ODo0fP56cnJx09i+1atWiAwcOFHhcREQE1a5dW2e/5OrqSrt37xbg2bCySstJI8/lnoQw0Kpzq3Tvk5ZGBw4coOnTp1OfPn2ocePG5OvrS05OTiSXy0ksFhv0cw7/TpaWy+Xk5OREvr6+FBwcTH369KEZM2bQgQMHKC0trdDnZYzJwya7KqqwxMbb25veffddGjt2LH399dekVCpLdOz8F8bV1dXoiYqtra1WojJixAhat24d3bhxw1AvFS1frk5svL2J0tMNdliTylGpaOnDh7T04UPKUamEDkcwW7Zs0fvBFBwcTLGxsQUec+vWLWrTpg1JpdICj5PL5dSrVy+dj2OWYc2aNeTt7a2zH/Ly8qLly5frfFxYWJjOxFgsFlOnTp0oKyvLxM/EPFhKXzT3+FxCGKjG6hqUo8wxyDGTkpJo//79NHXqVOrVqxc1btyYfHx8yNHRkaysrAyeCIlEIpJIJCSXy8nZ2Zn8/PyoYcOGlpfYLFiwgPr160ebN2+mpUuXkp+fH4WEhFBubq7eY2VnZ1NKSormJzo6ukyJiru7OwUEBFDbtm1p2LBhBk9USio7m6haNXVys2CBYGGUSbpSqbnEMr2EiaolSkpKopCQEJ0Jt729Pa1atUrn43799VeqVauWzsc5OjrS+++/rxkVZeXX77//TrVr19b7/zxu3DjKzMws8Ljo6GiqX7++zj7OxcWFdu7cKcCzMS+W0BfFpsWS3UI7Qhjou+vfCRZHUlIS7d27lyZPnkw9e/akhg0bkre3t0ESIYtKbBITE7V+f/jwIdna2tK6dev0HmvOnDk6XxiJRKKVqLRp04aGDh1Ka9asofDw8HK1FsO336oTGwcHomfPhI6m5CyhMzGWdevWkYODg85ku1mzZnrXuVixYgV5eXnp/SavLzli5unWrVvUtm1bvSNzPXv2pJiYGJ2PXbx4Mdna2uocnWnXrl2Rw/8ViSX0RWMPjCWEgZp/2Zzy8vKEDqfY4uPjaffu3TR58mTq3r07NWjQQG8iZFGJjS6tW7emoUOH6t2ub8SmvC7Qp4tKRdSkiTq5ef99oaMpOUvoTIwtPj6emjVrpvdb+oYNG3Q+rjhzL3799VcTPxtWHMnJyfTGG2/oTEokEgk1bdqUzp8/r/OxsbGx1LhxY53vFycnJ9qyZYuJn035UN77otvxt0kyV0IIA514YHmLexpjjo1Z1m9PSUkp9FLX/NnaL/5YGrEY+HfFfmzaBOi4SpOVc+7u7rhw4QLy8vKwatUqrSsNUlNTMW7cOIjFYrzyyitaV1pZWVlh7dq1SE5ORmxsLHr16gW5XA4AICLcuXMHPXr00CyZf/v2bVM/NfYClUqF6dOnw83NDc7Ozvj++++RmZmp2V6jRg3s3LlTsxBn8+bNtR7/+eefw97eHl5eXrh69armakyRSIRWrVohKSkJycnJXLLDQn3y5ydQkQq9gnqhbVXhylmUKwZLkYoAPSM227Zt05osvGvXLgJAP/30U7GPXd5LKhSmRw/1qE2/fkJHUjLl/VuSUGJjYyk4OFjvt/KtW7fqfeylS5eoWbNmJJFICjzWxsaGBg4cSM+fPzfdk6ngtm7dSlWrVtV56tDd3Z3CwsL0XigRHx9PTZs2LfFoHiuoPPdFJx+cJISBJHMldDv+ttDhGEW5uyrq2rVr1L9/f+rfvz8BoGbNmlH//v21/iinTZtGVatWpVdffZWCg4PJzs6OlixZUqJ2LDmxuXGDSCxWJzenTwsdTfGV587EXCxevJjs7Ox0nm5q27ZtofMovvvuO/L399f5oerq6kpTp04t8dWHrGinT5+mRo0a6ZxEaWdnR0OHDi30/23Dhg165181b97cIHWGKpry2hfl5eVR8y+bE8JAYw6METocoyl3taLi4uJw8uTJAvdXr14dTZo00fz+/PlzXL16Fba2tqhTp06JV0EUeuVhYxs1CtiyBQgJAc6cAcrDIr6WXlLBlGJiYtC9e3dcv369wDZnZ2d88cUXGDx4sM7HqlQqLFq0COvWrePK40ZS0graL0tOTkb37t3x119/FVj0097eHosWLcKECROMFr+lK6990Q83f8Abe96AncwOkRMj4Wlv+griplDuFugzFUsesSEievyYyNZWPWqzZ4/Q0RSPMi+PjiUm0rHERFKWo1n85q4sa5UUVXm8YcOGXHm8mIqqoF2/fn06cuRIocfYsmULOTo66hyd0bfGESu58tgXZSuyqcbqGoQwUNixMKHDMapydyrKVCw9sSEimjVLndjUrElUyBI/rIKIioqiOnXq6D3VVNTqsvfv36dOnTqRlZVVgcdbWVlRp06d6P79+yZ6NuWDUqmkRYsWUaVKlXS+7n5+frRx48ZCj5GWlkZt2rQp0arUrOL5/NznhDCQ53JPSsux7Ev3ObHRoyIkNqmpRJUqqZObtWuFjoaZk+nTp5O1tbXOkYNu3boVueLssWPHqEGDBjrnhdjb29OwYcMq9Looe/bsoZo1a+pMRlxcXGjKlClFzlfatm0bOTs76xydadCgAUVHR5vo2TBzl5SVRK5LXAlhoE2XNgkdjtFxYqNHRUhsiIjWr1cnNu7uROb+VHNVKloXE0PrYmIotxwvY16e3LlzhwIDA/VehbN///4ij7F582by8/PTeYxKlSrR/PnzK8Sk46tXr1LLli31XmE2YMCAIq8wS0tLow4dOuhMGG1sbGjevHkmejYVW3nri6b9MY0QBqq9rjYpVOVnUdnS4sRGj4qS2OTmEgUFqZObGTOEjqZw5fVKBEvx0UcfkVwuL/CBKpFIqFevXkWuwq1UKmnq1Knk6uqqM8mpWbMm/fDDDyZ6NqYRFxdHvXv31vm6SaVSeuWVV+j69etFHmf37t16X7e6detSVFSU8Z8M0yhPfdHD5Ickny8nhIF+vvOz0OGYBCc2elSUxIaIaP9+dWJjbU1kzqPX5akzsWQ3btzQe9l3pUqV6ODBg0Uew5Irj+fk5NDEiRP1ruIcFBRUrDW1srKyqEuXLjpHZ6ytrWmGuX8TsWDlqS9658d3CGGgdlvblavSCWXBiY0eFSmxycsjat1andwMGyZ0NPqVp86kohg/frzOycISiYQGDBhQrFpq169fp9atW5f7yuNr164lHx8fnQlfYRW0X7Z//35yd3fXeZzAwECKiIgw8jNhRSkvfdHV2KskChMRwkAXYi4IHY7JcGKjR0VKbIiI/vpLndiIRETh4UJHo1t56UwqosuXL1O1atX0fqgX95LvAwcO6K087uTkROPHjzeryuOlraD9MoVCQT179tQ5/0Yul9PkyZNN8GxYcZWXvqjz9s6EMNCgPYOEDsWkOLHRo6IlNkREr7+uTm66dhU6Et3KS2dS0Y0aNYpkMpnOOSWDBw8u1igOUeGVx729vQWrPH737t1CK2j36NFDbwXtlx08eJA8PDz0zjm6ceOGkZ8NK43y0Bf9HvE7IQwkmyej+4kVa5kFTmz0qIiJTWQkkUymTm7++EPoaAoqD50J+8+FCxeoSpUqOj+0fXx86NSpU8U6Tk5ODr3//vt6F54zReXx5ORkevPNN3VW0BaLxdSkSRM6d+5csY6lUCiob9++OkdnrKysaOLEiUZ9LqzszL0vUqqU1GBDA0IY6MPfPxQ6HJPjxEaPipjYEBFNnKhObBo1IjK3qxjNvTNhuikUCnr77bd1jnDIZDIaOnRosUdxYmNjqWfPnnqvMmrTpg3dunXLIHErlUqaMWMGubm56UzOatSoQTt37iz28Y4cOUKenp46j1W9enUKN9dzwKwAc++Ltl7dSggDOX/mTM8zK16RWk5s9KioiU18PJGjozq52b5d6Gi0KVQq+iUhgX5JSCCFuWVdrFhOnTpF3t7eOj/cq1SpQhcuFH+C4/nz56lp06Z614V54403KDk5ucQxlqWC9ssUCgUNGjRIb1I3atSoEsfHhGfOfVFmbib5rPAhhIGWnq6Yq05zYqNHRU1siIgWL1YnNn5+REUsMMtYqRT1gT927NgSHa+slceLqqD9zjvvlGilZEMmcIyVxKKTiwhhoCqrqlCWomJ24JzY6FGRE5vMTCJfX3Vys2SJ0NEwS2fIUzRKpZLmzZund0JulSpVaMuWLURE9PDhQ+rSpYvOy9VlMhmFhoZSZGRksds25Ck3xkojLj2OHBY5EMJAO8J3CB2OYDix0aMiJzZERN98o05snJyIEhKEjkYtV6WirU+e0NYnT8rFMuasZBQKBfXv399gk2rT0tJo6NChZGdnpzPJ0TUJuDgVtF924cIFvSUjSjJJmpUf5toXTfhtAiEM1HhjY1LlmU9cpsaJjR4VPbFRKokaNlQnNx98IHQ0auY+YY8ZjiEvg1YqlTR58mSdl6Dn/9SuXZsePnxYohgNdVk7K3/MsS+6l3CPpPOkhDDQn//8KXQ4gjLG57cYrNyTSIClS9W3v/gC+OcfYeNhFUvXrl0RFxcHhUKBnj17QiKRaLZFRkaiXr16sLa2xpQpU/QeY+/evQgICIBMJsPy5cuhUCg028Ri7W7q9u3bqFq1KhwcHDBixAhkZWXpPOaVK1dQvXp1iEQifPnll1rH9PLywpEjR6BQKLBz505IpdLSPn3GSmzG0RlQ5inRrWY3dKzRUehwLA4nNhbi1VfVPwoF8OmnQkfDKiKpVIoDBw5AqVRi//79cHd312zLycnB8uXLIRKJEBQUhMjISPz9998ICQmBVCrFgAEDEBkZCSICANjY2KB///54/vw5VCoViAibN2+Gn5+f5pjp6en4+uuvYWtri8qVK2PBggVQqVSYMGEC5HI5mjRpggcPHmj2l0gk6N+/PxQKBZ48eYLQ0FCTvTaM5TsXfQ57bu2BWCTG0s5LhQ7HIokovycpx1JTU+Hk5ISUlBQ4OjoKHY5gwsOBxo0BIuD8eaB5c+FiyVCpYH/qFAAgvU0b2L3wLZ5VHNnZ2ejTpw/++OMP5OXlFbqvVCpFixYtsHHjRtSrV0/vfiqVCtOnT8eWLVuQlJRUZAyVKlXCtm3b0LVr1xLHz8o/c+qLiAhttrbBmegzGN5oOL7q/ZVgsZgLY3x+84iNBWnYEHjnHfXtKVPUCQ5jQrK2tsbPP/+M8ePHw9bWVu9+fn5+iIiIwOnTpwtNagD1yMvSpUuRmJiI9957r8CpqhcFBwfj0KFDnNQws7D/zn6ciT4DG6kN5nWYJ3Q4FosTGwszfz5gbQ2cPAkcOCB0NKwiW7duHXx9fSGXy7FmzRpkZmZqtslkMq19o6OjUb16ddja2mL+/PmFHvfu3bsICgqCSCTC+vXrtUaCXp4rc+XKFTRu3BjW1tbo06cPnj59aoBnxljJKVQKfHLkEwDARyEfwcfRR+CILBcnNhbGzw/44AP17WnTAKVS0HBYBfPHH3+gXr16EIvFmDBhAh4/fqzZ5ujoiDFjxiAzMxO5ubkgImzbtg3Ozs6afbKysjB79myIxWI0bNgQMTExmm2ffvopbGxsUKtWLdy7d09zv1gsRrdu3ZCVlQWFQgEiwoEDB1CrVi2IRCIA6jk+P/30E7y8vODs7IwJEyYgNzfX+C8IY//68sqXuPf8HjxsPTD1lalCh2PZDHZ9lYAq+uXeL0tOJnJzU1/+vXGjMDEoVCr64dkz+uHZM7NbxpwZ1t27d6ldu3ZlqqCdlpZGbdq0IZFIVOAYuu7Dv6sU7969u8j4li9fXmjl8TVr1hjqpWBmyBz6otTsVPJY6kEIA607v06QGMwVr2OjByc2Ba1erU5sKlcmKsHq8owViyEraL9sy5Ytha5j07p1a8oqRf2QnJwcGjdunN7K47Vr16bff/+9VDEzVpiZR2YSwkABawIoV5krdDhmhdexYcU2dizg7w88ewYsXy50NMwSqFQqfPrpp3B3d4ezszN27dqlNW+mevXq2LFjB1QqFS5duoSWLVuW6PgxMTFo0KABRo4cqbXmzMtOnz4NDw8PfP755yU6vpWVFdavX4+UlBTExMSgZ8+ekMvlANRXq9y+fRtdu3aFTCZDu3btcPv27RIdnzFdnqQ9wYpzKwAAn3X6DDKJrIhHsDIzWIokIB6x0e2HH9SjNnZ2RE+emLZtcxj+ZYaxbds2qlatms7RE3d3d5o9e3axK2jrsnjxYp0jPyKRiNq2bUtpaWm0bt06cnBw0LlP8+bNKT4+vtTtF1Z53NbWttSVx5l5ELovGvHTCEIYqNVXrSgvL8/k7Zs7PhWlByc2uuXlEbVooU5uRo82bdvmuIw5K77Tp09T48aNDVZB+2WxsbHUuHFjnfNnnJycNMUvXxYfH0/NmjXT+ThHR0fasGFDqWMiItq5cyfVqFFD75yeTz75pExJHDM9Ifui68+uk3iumBAGOvPojEnbLi84sdGDExv9Tp1SJzZiMdHNm6ZrlxOb8sfQFbR1WbVqFdnb2+sceWnVqhUlJSUV+1jLly/XWTSzNMd6mVKppLCwMHJ3d9eZ5FStWpW2bt1a6uMz0xGyL+q+szshDNT/+/4mbbc84cRGD05sCtenjzq5ee0107XJiU35kJmZSSNHjtR5mkcsFlO9evVKXEH7ZYWNsjg4ONC6dWW7SqSo0Z+yJiCFVR4Xi8XUsGFDOnHiRJnaYMYjVF905P4RQhhIOk9K9xLumazd8oYTGz04sSncnTtEEok6uTl+3DRtcmJjvpRKJX322WdUuXJlnaMRvr6+tH79+jK3s2HDBr3zYpo1a1ameTH6FGe+TllERkZSx44ddV61ZWVlRa+++mqJK48z4xKiL1LlqSh4UzAhDDT+1/EmabO8KpeJTUpKCn3xxRc0YsQIvZd/xsfH05IlS+i9996jVatWUWpqaonb4MSmcOPGqRObpk2JTDF/jhMb87Nv3z4KCAjQObLh4uJCH374IeXk5JSpjaSkJAoJCdHZhr29Pa1atcowT6YI0dHRVL9+fZ2Jm7OzM+3cubPMbRw5coTq16+vcx6Svb09DR8+nDIzMw3wbFhZCNEX/S/8f4QwkMMiB4pLjzNJm+VVuUtsdu/eTV5eXjRmzBgCQDt27Ciwz+PHj8nHx4dCQ0Np6dKl1Lx5c6pVq1aJniQnNkV7+pTI3l6d3OzaZfz2OLExD1evXqWWLVvqvOLH2tqa+vfvT3FxZe94t2zZond9mODgYIqNjTXAsymdsLAwsrGx0XkaqVOnTqVaE+dlGzduJD8/P52JVKVKlWjRokU86Vggpu6LshRZVHVVVUIYaOHJhUZvr7wrd4lNZGSkZuhXX2IzduxYqlu3LuXmqhctSk1NpcqVK9PcuXOL3Q4nNsUzb546salenSg727htcWIjnLi4OOrTpw9ZW1sX+JCVSqXUqlUrCg8PL3M7aWlp1LZtW52jM3Z2drR48WIDPBvDiYiIoNq1a+u94mnv3r1lbkOpVNKUKVPIxcVFZ5JXs2ZN+uGHHwzwbFhxmbovWnZmGSEM5LPChzJyM4zeXnlX7hIbrYb0JDY+Pj40e/ZsrftGjhxJTZs2LfaxObEpnvR0Ii8vdXKzcqVx28pVqWjrkye09ckTyuV1bIwuJyeHJk2aRM7Ozjo/UIOCguinn34ySFs7d+7U206DBg0oOjraIO0Y0/Tp03UmfmKxmLp162aQUZznz5/TgAEDdI4WSSQSat68OV29erXsT4YVypR90fPM5+T8mTMhDPT1la+N2palsLjEJisriwDQ119rvwEWLlxIzs7Oeo+VnZ1NKSkpmp/o6GhObIrpyy/ViY2LC1FiotDRsLJau3Yt+fj46ByF8PT0pOXLlxuknaysLOrYsaPO+SQ2NjYUFhZmkHZM7c6dOxQYGKjz9XN3d6cDBw4YpJ3r16/TK6+8oreeVu/evQ1ySpAJ66PfPyKEgeqvr09KFY9UF4fFJTaJiYkEoEAhuzVr1pBcLtd7rDlz5ujsiDixKZpCQVS3rjq5mTJF6GhYaRw+fJjq1q2rd5G6MWPGGGzS6u7du8nV1VXn31udOnUoKirKIO2Yg48++ojkcrnO0ZVevXqRQqEwSDsHDhygWrVq6b08feLEiWWexM1M737ifbKab0UIAx2MOCh0OOWGxSU2ubm5JBaLafPmzVr3h4WFkYeHh95j8YhN2fzyizqxkcuJHjwwThsKlYp+SUigXxISuKSCARRWQdvKyoq6d+9eZAXt4srKyqIuXbroHJ2xtram6dOnG6Qdc3Xjxg3y9/fXmcxVrlyZDh8+bLC2Cqs87uPjw5XHDcBUfdGbe94khIE6be/EpRNKwOISGyKiWrVq0QcffKB13+uvv04dOnQo9rF5jk3J5OURdeigTm6GDDFOGzx5uOySk5Np8ODBRqmgrcv+/fv1rrQbGBhId+7cMVhb5cW4ceN0rsQskUhowIABBhvFyczM5MrjRmKKvuji44uEMJAoTERXnlwxShuWyiITm7lz55KXl5fm/HJkZCTZ2dkVGMUpDCc2JXfpkjqxAYguXzb88TmxKR2lUkkzZ84kNzc3nQlG9erVdf4dlZZCoaBevXrpvBxcLpfT5MmTDdZWeXb58mWqWrWqzv8TLy8vg648HBMTQz169NB5WkwqlVLbtm3p7t27BmvP0hm7L8rLy6P237QnhIHe3ve2wY9v6cpdYnPr1i0aMWIEjRgxggBQ+/btacSIEfTNN99o9snMzKT27duTj48P9evXjzw8PKhfv34lWvOBE5vSGTxYndiEhqpHcQyJE5uSMXYF7ZcdPHiQKlWqpLO9mjVr0o0bNwzWliVRKBQ0YsQInSsPS6VSGjx4sMFGcYiKrjz+5ptvcuXxIhi7Lzpw9wAhDCSfL6cHSUY6t2/BjPH5LSIigpE8efIEv/32W4H7a9WqhdatW2t+z8vLw6lTp/Do0SMEBASgZcuWJWonNTUVTk5OSElJgaOjY5njrigePACCgoDcXOC334Bu3Qx37AyVCvanTgEA0tu0gZ1EYriDW4gzZ85gwoQJCA8PR15entY2W1tb9OvXD+vWrYOTk5NB2lMqlRg0aBD2798PlUqltc3Kygpjx47F6tWrDdJWRXDu3Dm88cYbiI6OLrDNx8cHu3fvRkhIiMHa+/bbbzFr1izcv3+/wDY3NzeMGTMG8+bNg4T/1rQYsy9S5inRcGND3Iq/hamtpmJJ5yUGO3ZFYZTPb4OlSALiEZvS+/hj9ahNvXpEhvwywyM2uj18+JC6du2qt4J2hw4dDH6a4ciRI+Tp6alzdKZatWp02RjnIisQhUJBb7/9ts6J3TKZjIYOHWrQURyuPF4yxuyLNl/aTAgDuS5xpaSsJIMeu6Iod6eiTIUTm9JLTFSvaQMQffWV4Y7Lic1/MjMzadSoUUatoP0yhUJBgwYN0vthO2rUKIO2x9ROnTpF3t7eOhOOKlWq0IULFwzaXlpaGr3zzjt6K483atSITp8+bdA2yxtj9UXpOenkudyTEAZadW6VwY5b0Rjj81tsmHEfVl65uACffqq+PWsWkJkpbDyWQqVSYcmSJfD09IStrS2+/PJLpKWlabb7+vpi/fr1UKlUuH79OkJDQw3S7unTp+Hr6wuZTIbvvvsOSqVSs61KlSq4cOECcnNzsXnzZoO0x7S1bt0ajx8/hkKhwMCBA7VOCz169AjNmzeHlZUVxo0bZ5D27O3tsW3bNqSnpyMyMhIdO3aETCYDoD7F//fff6N169aQy+Xo2rUrHj16ZJB2GbDi3Ao8TX+KGi418F6z94QOh73IYCmSgHjEpmyys4mqVVOP2ixYYJhj5qpUtC4mhtbFxFSokgqFVdB2dnY2SAXtlykUCho6dKjOCa3GOBXCSubw4cN6TwVWr17dIHW7XlZY5XEHBwcaOXJkhak8boy+6GnaU7JbaEcIA313/TuDHLOi4lNRenBiU3Y7d6oTGwcHomfPhI6mfAkPD6eQkBC9FbT79etnlOXyL1y4QFWqVNH5genj40OnTp0yeJus9BQKBfXt21fn+8TKyoomTpxolHa58rjhjT0wlhAGara5GS/GV0ac2OjBiU3ZqVRETZqok5v33xc6GvNnqgrauowaNcpklxsz4zh48CB5eHiY9HJ7pVJJH3/8caGVx/fs2WPwdi3N7fjbJJkrIYSBTjww3PpFFRUnNnpwYmMYR4+qExuplKisF+Yo8/LoWGIiHUtMJKWFfKMpqoJ2YGAg7du3zyhth4eH613nxtPT0+CTj5lpKBQK6tmzp97RvqlTpxql3efPn1P//v31Vh5v2bKlxVQeN3Rf1HtXb0IYqNeuXgaIjnFiowcnNobTo4c6uenXr2zHsaSrotavX6+3gnblypVpyZIlRhvKHz9+vN4l/fv378+jMxaksJIWQUFBFBERYZR2Lb3yuCH7opMPThLCQJK5EroVd8tAEVZsnNjowYmN4dy4QSQWq5ObM2dKf5zyntgcPnyY6tWrp3MSsIODA40aNcpoky9v3LhBNWvW1Dsn4uBBrhxsybKysujVV1/VW4R01qxZRmv7p59+oqCgIIuqPG6ovigvL49afNmCEAYac2CMASOs2Dix0YMTG8MaOVKd2ISElL7UQnlMbPIraOuav2LoCtq6TJ48WWd9IIlEQr169eLRmQpo165d5OrqqjPJrVu3LkVFRRmt7eXLl+u9msvHx4fWrl1rtLYNyVB90fc3vieEgewW2lFsWqwBI6zYOLHRgxMbw3r8mMjWVp3clHYuYXlJbIqqoB0cHGzQCtovi4iIoMDAQJ0fHu7u7rR//36jtc3Kj7S0NOrQoYPOURwbGxuaN2+e0drOzMykMWPG6K08XrduXbOuPG6IvihHmUM1VtcghIHCjoUZOMKKjRMbPTixMbxZs9SJTc2aRLm5JX+8OSc2RVXQrlatmkEraOsyY8YMnVdUicVi6tatG2VlZRm1fVZ+bdu2Te8E9gYNGlB0dLTR2i6PlccN0Rd9fu5zQhjIc7knpeWkGTjCio0TGz04sTG81FSiSpXUyU1pRpzNMbHZsWOHSStovywqKorq1Kmjs31XV1favXu30dpmlictLY3atGmjcz6MnZ0dLV261Kjtnzt3jpo0aaJzFMmcKo+XtS9KykoityVuhDDQpkubjBBhxcaJjR6c2BjH+vXqxMbdnaikL625JDbnzp2j4OBgvZ3vkCFDjN75zps3T+dltWKxmDp27MijM6zMNm3apPdUUXBwMMXHxxu1/Z07d1KNGjV0Ju1ubm40Y8YMwRYBLGtfNO2PaYQwUO11tUmh4nluhsaJjR6c2BhHbi5RUJA6uZkxo2SPzVGpaOnDh7T04UPKMXFJhZiYGJNX0H5ZdHQ0NWjQQG9phW3bthm1fVYxJSUlUcuWLXW+7+zt7WnNmjVGbb+oyuPVqlUz+Xu/LH3Rw+SHJJ8vJ4SBfr7zs5EirNg4sdGDExvj+fFHdWJjbU1kxFP3ZVZYBW2RSET16tWjw4cPGz2OpUuX6qy0LBKJqG3btpSWxufnmWmsW7eO7O3tdb4XmzdvTklJSUZt3xIqj7/z4zuEMFC7re24dIKRcGKjByc2xpOXR9S6tTq5GTZM6Gi0KZVKWrJkCVWuXFnnt0NfX19av3690eOIjY2l4OBgvWt/bNmyxegxMKZPfHw8NW3aVOf709HRkTZtMv68kcjISAoNDdW7lEKXLl3o4cOHRo+jJK7GXiVRmIgQBroQc0HocCwWJzZ6cGJjXOfOqRMbkYjo2rXiPUaZl0cXUlLoQkqKwUsq/PTTTxQYGGjSCtq6rFq1Su834pCQEKN/I2aspJYvX653RLF169Ymec8eOXKE6tWrZ7LK46Xtizpv70wIAw3aM8hgsbCCOLHRgxMb43v9dXVy07Vr8fY39ORhoSpovyw+Pp6aNWumd0XidevWGT0GxsoqNjaWGjdurPfLwdatW00SR2GVxytXrkyfffZZmScdl6YvOhR5iBAGks2T0T+J/5SpfVY4Tmz04MTG+CIiiGQydXLzxx9F72+IxCYuLo769eunc70XiURCISEhRqug/bINGzboveqkWbNmRr/qhDFjWbBggd4FKtu1a2eSeWFFVR4PCAgodYHZkvZFSpWSGmxoQAgDffj7h6VqkxUfJzZ6cGJjGhMnqhObxo2Jirq4oLSJTU5ODn344YeCVNB+WVJSErVq1UrvFSarVq0ySRyMmUJUVBTVq1dP5+iJi4sL7dq1yyRx5Fce1/eFpqSVx0vaF31z9RtCGMhpsRMlZCSU4Zmw4uDERg9ObEwjPp7I0VGd3GzfXvi+Je1M1q9fT76+vnqHpI1ZQftlW7duJScnJ52JVXBwMMXGcp0YZtlmzZqld+2lTp06mWztpfDwcGrVqpXOyuPW1tbUp0+fIk9Bl6QvyszNJN+VvoQw0NLTxl3gkKlxYqMHJzams3ixOrHx8yMqrG8rTmeSX0Fb3yRCY1bQfllaWhq1bdtW7yquixcvNkkcjJmTiIgIql27ts4vHK6urrR3716TxVJY5XFnZ2eaNGmSzosGSpLYLDq5iBAGqrKqCmUpeOFMU+DERg9ObEwnM5PI11ed3CxZon8/fZ1JZGQkdejQQe9ln127djXpZZ87d+7UedoLANWvX9+odXcYK0+mTp2q9/RQ9+7dTbqCdkkqjxc3sYlLjyOHRQ6EMNCOcOPWimP/4cRGD05sTOubb9SJjZMTUYKeU9AvdiZPk5NpyJAheicoNm7c2KQLdWVlZVGnTp30VkoOC+PqvYzpc+fOHb0V6T08POjAgQMmi6U4lcd/Ony4WInNhN8mEMJAjTc2JlWeaVdLr8g4sdGDExvTUiqJGjZUJzcffKB7n8zcXGrz1VdkM24cQcf5cSGWVt+9eze5urrq7JDr1KlDUVFRJo2HsfJu0qRJOit9SyQS6tOnDykUpqutFBMTQ927dy9YSkUqJdGwYVR1zhy6fueOzsdGPI8g6TwpIQz05z9/mixmxomNXpzYmN6hQ+rERiYj+ueFZR4Kq6Dt5uZGM2fONGkxvKysLOrWrZvO0Rlra2uaPn26yWJhzFLduHGD/P399U7+N0U5kxcVVXl88ODBWsVvB/wwgBAG6va/biaNk3FioxcnNsJ49VV1ctOxY+EVtF/uRExh//79egvxBQYG0h0939wYY2Uzbtw4nQVoJRIJDRgwwKSjOETqL1vVq1fX+2Vr6KdDCWEg8VwxXXtazKXVmcEY4/NbDMZK4fHjx8jI6AFAjiNHQnDlyhXk5eUBAKRSKdq2b49fbtzAhbg47Pjf/+Dk5GT0mJRKJXr37g2pVIo+ffogISFBs00ul+Ojjz4CEeHu3bsICgoyejyMVUTr169HTk4OLl++jKpVq2ruV6lU2LNnD2QyGXx8fHDy5EmTxDP4rbdw4Pp1hKekYNbs2XB3d9dse/78ObbFbgMA2N61xdVDV00SEzMuTmxYsWVlZWH06NFwdHSEr68vzpz5DUDuv1tFqFu3Hg4fPgyFQoHf/vwTPePjUe/iRWT9m/AYy++//47KlStDJpPh559/hkql0mzz9/fHjRs3kJ2djRUrVhg1DsbYf4KDg/HgwQMoFAqMGDECMplMs+3Jkydo164dZDIZhgwZAqVSabQ4svLyUO/iRTS8cgXTZs9GfHw8kpOTMWTIEFg1sAKqAFAA6QfSMXToUEgkEgQHB+PMmTNGi4kZl4iISMgAjh07hkOHDmndZ2Njgzlz5hT7GKmpqXByckJKSgocHR0NHWKFplKpsGLFCqxcuRLPnj0rsN3T0wcJCZ9AqRyPn38GXntNfX+GSgX7U6cAAOlt2sBOIjFoXEqlEm+++SZ+/PFHrUQGAKysrDB69GisXbvWoG0yxsrm3LlzeOONNxAdHV1gm6+vL3744QeEhIQYtE19fZFCpUC9DfVw7/k9VH1YFU/+9wQKhULrsVZWVggNDcWmTZtQpUoVg8bF1Izx+S34iM2ZM2fw7bffwtnZWfNjitMWrHA///wzgoKCIJPJMG3aNK2kxtnZGZMmTUJOTg5iY2MwefJ4AMDUqYARv3gBAE6ePAlvb2/IZDLs2bNHK6mpVq0aLl++jJycHE5qGDNDISEhePToERQKBd5++21IpVLNtpiYGLRq1QpWVlYYPny4UUdxAGDLlS249/wePGw9cG3DNeTm5uLIkSOoV68exGL1R2Nubi5+//13VK1aFY6Ojhg1ahSysrKMGhczAIPN1iml+fPnU4sWLcp0DJ48bBhFLV+ur4J2cjKRm5t6IvHGjer7DFndW6FQ0ODBg3XGJZPJaNSoUWU6PmNMOCdOnCBvb2+dk3urVKlCly9fLtPxdfVFqdmpVGlZJUIYaN35dTofV1SZF0NUHmcWPHk4Pj4eCxcuxIoVK3Dq3yFDZhrx8fHo378/bGxs0LBhQ5w9e1bzTUkikSAkJARXr15FVlYW9u7dCw8PjwLHcHICZs9W354zB0hPN0xsp0+fhq+vL2QyGb799lutb3BVqlTBhQsXkJubi82bNxumQcaYybVt2xaPHz+GQqHAwIEDIXnhtPWjR4/QpEkTWFlZYdy4cQZrc9nZZYjLiEOAawBGNxmtc59x48YhOjoaOTk5+PDDD+Hi4qLZ9uzZM3zyySeQyWQIDAzEjz/+aLDYWNmZRWLj6OiI1NRU3Lt3D926dcPgwYNBhUz9ycnJQWpqqtYPK77c3Fx89NFHcHFxQaVKlbBv3z5kZ2cDAEQiEQICArBv3z4olUqcPXsWjRo1KvKYY8cC/v7As2fA8uWlj02pVOLdd9+FlZUV2rRpg8ePH2u2SaVSvP3221AoFHj48CGaNWtW+oYYY2ZFKpXi+++/h1KpxOHDh+Hp6anZplAosHHjRohEIvj7++PatWulbudJ2hOsOKe+kOCzTp9BJpEVur+VlRVWrlyJxMRExMXFoX///rC2tgYAEBEiIiLQr18/SKVStGrVqkyxMQMx2NhPKf3zzz+Ul5en+f3q1askk8loxw79tTrmzJmjc3iQT0UVbuPGjUYdWv3hB/XpKDs7osiYkp2KunDhAlWpUkVnbN7e3nTq1KlSx8UYK58UCgX17duXJBJJgX5BLpfTpEmTijzGy6eiRvw0ghAGavVVK63PnpIyROVxVoEW6GvRokWh8yays7MpJSVF8xMdHc2JjR5HjhwxWQXtvDyiFi3Uyc2IsSqaHBlJkyMjKUelv+7K2LFjdRbElEqlNGjQIJMv5sUYM08HDhwgDw8PnV9+AgIC9C66maP6ry+68vQaieeKCWGgM4/OGCy2ffv2UWBgYIkrj7MKlNg0bdqU3n777WLvz5OHtUVGRlJoaKggFbRPnVInNmIx0a1buvcJDw/XuxKop6cnHTlyxCixMcbKv6ysLOrZs6fOURxra2uaOnWq3sd239mdEAbq/31/o8SmVCppyZIlhVYeX79+vVHaLq8sMrF5+RTDmTNnSCKR0DfffFPsY3BiQ5SWlmY2FbT79FEnN6+9pn3/xIkT9S613r9/fx6dYYyVyN69e8nNzU1nEhEUFEQRERGafY/cP0IIA0nnSelewj2jx1ZU5fF69eqZvIaWObLIxOb111+nkJAQeu+992jgwIEkl8tp1KhRpCrk9MXLKmpio1Qqafbs2XprIglRQZuI6M4dIrE0j1A5k5btCCf/gACd8Xl4eNDBgwdNHh9jzLJkZWXRq6++qvOUu9zGhsYvXEB1v+pICBPR+F/Hmzw+vZXH/12yol27dnT37l2Tx2UOjPH5LfjKwwBw9epVnD9/Hra2tmjatCnq1KlTosdXtJWHv/32W8ycORNRUVEFtrm5uWHcuHEICwvTumzS1Oo3+wQ3lnVV/9KtG/DvVVcSiQTdunXDjz/+qLU4F2OMGcJ3332H999/H4mJieo7rK2BgwcBAKKjPXD17bNoGNBQsPj++usvvP/++/j777819fXy2draok+fPli/fn2FWajWKJ/fBkuRBFQRRmzOnz9PTZo0MasK2i+LiIigwMBAdVzW1porEWBtTe7u7rR//35B42OMVRxpaWnUoUMHgoPNf31RqLWmz1ywYIHQIdKOHTuoWrVqOke03dzcaObMmRa/CKDFLtDHdHv8+DF69OgBuVyOFi1a4PLly1oVtNu1a4e7d+8iIyMDO3fuFCzDnz17NmxsbBAQEIB79+4V2O7jk4CYmHj07t1bgOgYYxWRvb09jh49ioUHF/5350X1P5mZmZg5cybEYjEaNWqEp0+fChLjkCFDEBUVBaVSidk6Ko8vWLAAUqkU1atXx//+9z9BYiyPOLExM1lZWRg7diycnJzg6+uL3377Dbm56graIpEIdevWxe+//w6FQoHjx48jMDBQkDgfPHiAevXqQSQSYf78+ZoF/gDA1dUVW7/5RvP748fWWL9egCAZYxVaYlYilp5dovn9afRTtGnTBiKRCIB6gb3w8HB4eXnB3t4eK1asECROiUSCuXPnalUet7W11Wx/8OAB3n77bUgkEjRp0gR//fWXIHGWF5zYmIkVK1bAy8sLtra22LRpk9Zqyj4+Pli7di3y8vJw48YNdOnSRbA458+fD1tbW1SvXh03b97U3C8Wi9GxY0ekpaXh+fPneH3AgJceByQlmTpaxlhFtujUIqRkp2h+t7e3x8mTJ5GXl4dNmzZpzenIyMjA5MmTIRaL0aRJEyQkJAgRMpycnLBjxw5kZGTg7t276NChA2Qy9erIeXl5uHLlCkJCQiCXy9GtWzet1dmZGic2AsqvoC0WizF58mSt4dAXK2jHxMRg/PjxgsUZExODhg0bQiwWY/bs2VrVbZ2dnbFt2zaoVCr8+eefsLe3L/D4WrXUSc3ixaaMmjFWkUUlRWHthbV6t48ePRopKSlISkpCy5YttUZxrly5Ag8PDzg4OGDtWv3HMLbAwEAcPXoUubm5OHz4sGaUHPiv8rivry8cHR0xevRorjz+L05sTOzatWt45ZVXIJPJ0Lt3b9y7d09TF8va2hp9+vRBXFwckpKS8Pnnn8PKykqwWJctWwZ7e3v4+fnh2rVrmjhFIhHatGmDtLQ0JCUl4Z133in0OAsWqP9dswZ4+NDYUTPGGPDp0U+Rq8pFh+odCt3P2dkZ586dQ15eHtasWaP15Sw9PR0TJ06EWCxGSEgIkpOTjRy1fp07d8b169eRl5eH9evXw9fXV7MtLS0NX375JWxtbeHp6YklS5ZApVIJFqvgDDYNWUDmflXU8+fPqX///mRtba1zcbqWLVvS1atXhQ6TiIhiY2MpODhY59Lgjo6OtGXLlmIdJ1ulovfu3qX37t6lLKWK2rdXL9o3ZIiRnwBjrMK7+PgiIQwkChPRXzGXNX1RdjHXR4uPj6emTZvq7Qc3bdpk5GdQPDk5OfThhx+Ss7OzzkUAAwICaN++fUKHWSiLXKDPEMwxsVEqlfTxxx+Ti4uLzjdczZo1ac+ePUKHqbFmzRqyt7fXGWtISAglJSWV6fiXLqkTG4DoyhXDxMwYYy/Ly8uj9t+0J4SB3t5X/NI8+ixfvpzs7Ox09o2tW7emtLQ0A0RddnFxcdSvXz+9X6BDQkIoPDxc6DAL4MRGD3NKbIxdQduQ4uPjqXnz5jq/lTg4ONC6desM2t7gwerEpmNHdcFMxhgztF/u/kIIA8nny+lB0gODHTc2NpYaNmyot9Dl1q1bDdZWWYWHh1NISIjeelr9+vUzm8rjnNjoIXRiU1QF7ZEjRxqsgrYhbNiwQW/9kmbNmlF8fHyZ28jLy6O4nByKy8mhvH+zmKgoIisrdXLDlRQYY4amUCmozhd1CGGgqYfVxTB19UVltWDBAr11+dq1a2c2ozhE5l95nBMbPYRIbIqqoN2lSxejVdAujaSkJGrVqpXON7ednR0tX77coO2lK5Wa1T7TXxih+vhjdWJTrx6RmQxcMcYsxJeXvySEgVyXuFJSVhIR6e+LDCEqKorq1aunc4Te1dWVdu3aZdD2yiK/8njlypV1xitU5XFObPQwVWKTlpZG77zzjs7zraauoF1cW7duJScnJ52jM40bN6bY2FijtKuvM3n+nMjZWZ3cfP21UZpmjFVA6Tnp5LXcixAGWnVu1X/3GzGxedGsWbPIxsZG52fDq6++SllZWUZru6QyMzNp1KhR5ODgoPOzwZSVxzmx0cOYiY25VtAuTFpaGrVt21bn6IytrS0tXrzY6DEU1pksX65ObLy9iTIyjB4KY6wCmHd8HiEMVP3z6pStyNbcb6rEJl9ERATVrl1b5+eFm5sb7d271+gxlERRlcc7dOhAkZGRRmufExs9jPHC7Ny5k6pXr673zTljxgyzmQScb+fOnTqvwgJA9evXp+joaJPFUlhnkpVFVLWqOrkxgzp0jLFy7mnaU7JfZE8IA313/TutbaZObF40depUvVcpde/e3axGcYiIzp07R8HBwXqLLQ8ZMsTg84c4sdHDUC9MURW033zzTcEraL8sKyuLOnXqpDNmGxsbCgsLEySuojqTnTvViY2DA9GzZwIEyBizGON+GUcIAzXb3KzABGEhE5t8d+7coYCAAJ1fOj08POjAgQOCxFUYU1Ue58RGj7K8MDExMdSjRw+Sy+UF/vOkUim1a9eO7t69a4Soy2bv3r3k6uqq801Xu3ZtioiIEDS+ojoTlYooOFid3Lz/vgABMsYswu342ySZKyGEgU48OFFguzkkNi+aNGmSzs8biURCffr0IYVCIXSIWpRKJc2cOZPc3Nz0TsfYsWNHqY/PiY0eJX1hMjMzacyYMXovea5bty79/vvvRo665LKysqhbt246R2esra1p+vTpQoeoUZzO5OhRdWIjlRKZYe7IGCsH+nzXhxAG6rWrl87t5pbY5AsPD6caNWroTBY8PT3pyJEjQodYQHJyMg0ePFjvpe7BwcF07ty5Eh2TExs9ivvCLF++nDw9PXW+kXx8fGjNmjUmirhkDhw4oHfycmBgIN25c0foEAvIVqlo6K1bNPTWrUKXMe/eXZ3c9OtnwuAYYxbh5IOThDCQZK6EbsXd0rlPcfsiIY0bN07n5F2JREIDBw40u1EcIqK7d+9Shw4d9C550r17d4qJiSnyOJzY6FHYC3PgwAEKCgrSeYWQk5MTTZw4UdDFifRRKBTUq1cvnStHyuVy+uijj4QO0SCuXycSi9XJzZkzQkfDGCsv8vLyqMWXLQhhoDEHxggdjkFcvnyZqlatqvNLrLe3N504UfBUmzk4fPgw1atXT+8q9qNGjdK7SC0nNnq8/MJcv36dXnnlFZJKpTpP2fTp08dslpN+2eHDh/UuoOTv7083btwQOkSDGzFCndiEhHCpBcZY8fxw4wdCGMhuoR3FphlnPS6hKBQKGjZsmM7REKlUSm+99ZZZjuIQEa1du5Z8fHx0foZVrlyZlixZojXpmBMbPfJfmN69e+tcIMncKmi/TKFQ0IABA3SOzlhZWdG4ceOEDrHE8vLyKF2ppHSlsshlzB8/JrK1VSc3ZrbEA2PMDOUoc8h/tT8hDBR2rPArP0vSF5mjs2fP6q0/6OvrS2fPnhU6RJ1ycnJo0qRJeiuPBwYG0k8//cSJjT75L8zLP+ZWQftlJ06cIC8vL52xV61alS5fvix0iKVW0gl7s2apE5uAAKLcXBMEyBgrt1b/tZoQBvJc7klpOYWvq2Kuk4dLSqFQ0FtvvaXzTIRMJqNhw4aZ7ShOUZXHDZ3YiGFhKlWqhEWLFkGpVCIiIgL9+/cXOiQtSqUSb731FmQyGdq1a4fY2FjNNplMhhEjRkChUODBgwcIDg4WMFLTmjIFqFQJiIgANm8WOhrGmLlKzk7GvBPzAABz28+FvZW9wBGZhlQqxf/+9z8oFAqcOHEC3t7emm0KhQJbt26FTCZDtWrVcOXKFQEjLcjDwwN79+5FVlYWrl69ipCQEEgkEgCASqUyeHsWldg8ffoUz549w/Tp0zUvmrk4d+4cfH19IZPJ8O2330KpVGq2+fn54ezZs8jNzcWWLVsglUoFjFQYDg5AWJj69ty5QGqqoOEwxszUktNL8DzrOWq718bwxsOFDkcQbdu2xePHj6FQKDBw4ECtz7uHDx+iSZMmkMvleO+99wSMUrdGjRrh7NmzUCqV2LdvH2rUqGHwNiwqsbGxsRE6BC1KpRLvvvsurKys0KpVKzx+/FizTSqV4u2334ZCocCjR48QEhIiYKTmYeRIIDAQiI8Hli4VOhrGmLmJTonG5+c/BwAs6bQEUnHF+xL4IqlUiu+//x5KpRKHDx+Gp6enZltubi42bNgAkUgEf39/XLt2TcBIdevbty+uXr1q8ONaVGJjLi5evIiqVatCJpNh27ZtUCgUmm3e3t44deoUFAoFtm/fXiFHZ/SRyYAlS9S3V64EXsgDGWMMs47NQrYyG22rtkXPwJ5Ch2NWOnfujNjYWCgUCvTp00drFOf+/fto2LAhrK2t8cEHHwgXpIlwYmNA48aNg5WVFZo3b45Hjx5p7pdIJBg4cCAUCgUeP36M1q1bCxileevdG3jlFSArC5g1S+hoGGPmIvxpOLaHbwcALO+8HCKRSOCIzJNUKsWPP/4IpVKJAwcOwMPDQ7MtJycHq1evhkgkQmBgIO7evStgpMbDiU0ZXbt2DTVq1IBIJMLGjRu1Rmc8PT1x+PBhKJVKfP/99zw6UwwiEbB8ufr2N98A168LGg5jzExM/XMqCIRB9QahmU8zocMpF3r27Im4uDhkZWWhe/fuWqM4ERERqFWrFmxsbDBt2jQBozQ8TmxKadKkSZDL5WjYsCGioqI090skEvTt2xcKhQKxsbHo3LmzgFEKRwJggIcHBnh4oKTTuFu2BAYMAIiAqVONER1jrDw5/M9hHP7nMGRiGRaGLizRY8vSF1kKa2tr/Prrr1Aqldi7dy/c3Nw027Kzs7F06VKIRCLUqVMHkZGRAkZqGCIiIqGDKKvU1FQ4OTkhJSUFjo6ORmvn5s2b6NOnj87/eA8PD2zfvh1du3Y1WvsVSWQkULs2oFQCf/wBdOokdESMMSGo8lRosrkJwp+F48OWH2Jll5VCh2QRsrOz0bt3b/z555/Iy8vT2pY/ijNnzhyjx2GMz2+zGLHJzc3Fvn37sGrVKvzyyy9Gua69LKZNmwYbGxvUq1dPK6mRSCTo2bMnFAoF4uLiOKkxoJo1gXHj1LenTgVe+rtjjFUQ/7v2P4Q/C4eT3AmftvlU6HAshrW1NQ4dOgSVSoWdO3fCxcVFsy0rKwthYWEQiUSoX78+YmJiBIy05ARPbFJTU9GyZUt8+umnuHPnDsaPH4/OnTsjJydH0LgiIyNRq1YtiEQiLF26FNnZ2Zpt7u7u2L9/v2ZyFs+dMY5ZswBHR+DqVeDbb4WOhjFmalmKLMw8NhMA8GmbT+Fm61bEI1hpDB48GImJiUhLS0O7du0gFv+XGty4cQN+fn6ws7PDwoUlOw0oFMETm8WLFyMxMRHnz5/Hpk2bcPbsWVy5cgWbNm0SJJ7Zs2fDxsYGAQEBWjPGxWIxXn31VWRlZSE+Ph69e/cWJL7yIkOlguj4cYiOH0dGKUfgPDyATz5R3/70U+CF3JIxVgGsPr8aMakxqOJUBRNaTCjVMQzRF1UU9vb2OH78OFQqFbZu3QpnZ2fNtszMTMycORNisRiNGjXC06dPhQu0CIInNrt378bAgQM159a8vb3Rs2dP7N6922QxPHjwAPXq1YNIJML8+fO1RmdcXV2xa9cuqFQqHDp0CNbW1iaLiwEffAD4+gKPHgFr1wodDWPMVOIz4rH49GIAwMLQhbCWct9rSu+++y6SkpKQlJSE1q1bay6vJyKEh4fDy8sL9vb2WLFihcCRFiRoYpObm4v79+8jKChI6/6goCDcvn1b7+NycnKQmpqq9VMa8+fPh62tLapXr46bN29q7heLxejQoQPS0tLw/PlzDBo0qFTHZ2VnYwMsWKC+vXAh8Py5sPEwxkxjwckFSM1JRWPPxhhcf7DQ4VRYzs7OOHXqFPLy8rBp0yatCb4ZGRmYPHkyxGIxmjVrhoSEBAEj/Y+giU1GRgaICE5OTlr3Ozs7Iz09Xe/jFi9eDCcnJ82Pn59fsduMiYlBw4YNIRaLMXv2bGRlZWm1u23bNqhUKhw9ehT29hWjuJq5GzIEaNAASElRJzeMMcsWmRiJ9ZfWAwCWdV4GsUjwkwsMwOjRo5GSkoKkpCS0bNlSaxTn0qVL8PDwgIODA7744gtB4xT03WJrawsABUZcUlJSYGdnp/dx06dPR0pKiuYnOjq6yLaWLVsGe3t7+Pn54dq1a8i/yl0kEqFNmzZIS0tDUlIS3nnnnTI8I2YMEgmwbJn69rp1wP37wsbDGDOuGUdmQJmnRNeaXdGxRkehw2EvcXZ2xrlz55CXl4c1a9ZoDQKkp6dj/PjxEIvFCAkJQXJyssnjEzSxkcvlqFq1aoF1YSIjIxEYGFjo4xwdHbV+dElISECTJk0gFosxdepUZGRkaLY5Ojpi06ZNyMvLw8mTJ3l0xsy9+irQuTOgUAAzZggdDWPMWP6K+Qu7b+2GWCTG0k5cDdfcTZgwAWlpaYiPj0dwcLDWKM5ff/0FFxcXODk5YfPmzSaLSfDxvb59+2L37t2aU0LPnz/HgQMH0K9fv1Ifc+3atXBwcICHhweuXLmiNTrTsmVLJCUlISUlBaNHjzbIc2CmsXSpuuTC998DFy4IHQ1jzNCICFP+mAIAeLfhu6hfub7AEbHicnd3x+XLl5GXl4elS5dqnXVJTU3FmDFjIBaL0aZNm0KnmhiC4CsPP3/+HK1atYKDgwM6duyIAwcOaC45yz9VVZT8lQubNGmilcjks7e3x2effYb333/fGE+B6ZCtUqH/vxOy99atC2uJYRYzHzoU2L4daNsWOH5cnegwxizD/jv70ff7vrCR2iBiQgR8HH3KfExj9UWsaDExMejZs6fW9I98zs7OWL16Nfr06WPwlYcFT2wA9Tm577//Ho8ePUJAQABef/11yOXyYj8+P7F5kUgkQpMmTXDw4EG4u7sbOmQmkOhoICAAyMkBfv4ZeO01oSNijBmCQqVAvQ31cO/5PXza5lMsCF0gdEjMgBYuXIhFixYhMzNT636RSAQisrzEpqxeTGzs7Owwd+5cfPzxxwJHxYzlk0+AJUuAWrXU1b954WfGyr8NFzfgvd/eg4etByInRsJRbry6f0w4Dx48QM+ePbWWWAFgebWiDOXevXtIT0/npMbCTZ8OuLkBd+4AX38tdDSMsbJKy0lD2IkwAMCcdnM4qbFg1apVw40bN0BEmDFjRonOzhSXRSU2lStXFjoE9q8MlQp2J0/C7uRJgy9j7uSkriMFALNnA0aeh8YYM7JlZ5chLiMOAa4BGN3EsBd1GLMvYmWzcOFCxMXFGfy4FpXYMPOSmZeHTCOV5R43DvD3B549A8xwRW/GWDE9SXuCFefUf8SfdfoMMonM4G0Ysy9i5ocTG1YuWVkBi9VlZLBsGWDG9dgYY4WYc2wOMhWZaOXXCn1r9RU6HGYBOLFh5daAAUCLFkBGBhAWJnQ0jLGSuhl3E1//rZ4ot6zzMs3iboyVBSc2rNwSif4rtbBlC1BI3VTGmBma9uc05FEe+tXuh1Z+rYQOh1kITmxYudamDdC7N6BSAdOmCR0NY6y4jkUdw68Rv0IqluKzjp8JHQ6zIJzYsHLvs8/UhTIPHABOnBA6GsZYUfIoT1M6YWyTsQhwCxA4ImZJOLFhRiEG0M7JCe2cnIz+JqtVCxg1Sn17yhSAL35gzLx9d+M7XI69DAcrB8xuN9uobZmyL2LmwaJWHjbkyoWsfHn2TH35d0YG8N13wBtvCB0RY0yXHGUOgtYF4WHKQywMXYgZbWYIHRITkDE+vzmBZRahcmVg6lT17enT1bWkGGPmZ92FdXiY8hA+Dj74oOUHQofDLBAnNsxifPwx4OkJREUBGzYIHQ1j7GWJWYlYcEpd3HJ+h/mwldkKHBGzRJzYMKPIUKngceYMPM6cMdky5nZ2wLx56tvz5wPJySZpljFWTItOLUJydjLqV6qPdxq+Y5I2heiLmLA4sWFGk6BQIEGhMGmbw4YBdeoAiYn/rUzMGBNeVFIU1l5YCwBY2nkpJGKJydoWoi9iwuHEhlkUqRRYskR9e/Vq4OFDYeNhjKnNPDYTuapcdKzeEV38uwgdDrNgnNgwi9OjB9C+vXoCcX4VcMaYcC49uYRvr38LgEsnMOPjxIZZnBdLLfzvf8DVq8LGw1hFRkSaxfiGNBiCxl6NBY6IWTpObJhFatoUePNNgEi9aF/5X62JsfLpt4jfcPzBccglcizosEDocFgFwIkNs1gLFwJWVsCRI8ChQ0JHw1jFo8xTYuqf6gWmJraYiKrOVQWOiFUEnNgwoxADaOrggKYODoK9yapXB8aPV9+eMkVdKJMxZjrf/P0NbsXfgquNq2ArDJtDX8RMi0sqMIuWmKgutZCcDHz9tfpycMaY8WXkZiBgbQBi02OxqssqXmWY6cQlFRgrIVdX4NNP1bdnzgQyM4WNh7GKYuW5lYhNj0V15+oY13Sc0OGwCoQTG2bxxo8HqlYFnjwBPv9c6GgYs3zP0p9h6dmlAIDFHRdDLpULHBGrSDixYUaRqVKh2rlzqHbuHDIFntxiba2eSAwAn30GxMUJGg5jFm/uiblIz01HM+9mGFh3oKCxmFNfxEyDExtmFATgYU4OHubkwBwmcb35JhAcDKSlqetIMcaM427CXWy+vBmAeSzGZ259ETM+TmxYhSAW/7do38aNwL17wsbDmKX65MgnUJEKrwW+hnbV2gkdDquAOLFhFUZoKNC9O6BUAjOEufKUMYt26uEp7L+zH2KRGEs6LRE6HFZBcWLDKpQlS9SjN3v3AmfPCh0NY5bjxdIJIxuPRG2P2gJHxCoqTmxYhVKv3n9r2XCpBcYMZ8+tPTj/+DzsZHaY22Gu0OGwCkwqdABXrlzBhQsXtO6Ty+UYxiupMSOZNw/49lv1iM2PPwL9+gkdEWPlW64qF9OPTAcATG41GZ72ngJHxCoywROb3377DWvXrkXfvn0199na2goYETMEEYA6//4/CntNREHe3sDHHwMLFgCffAK89hogkwkdFWPl18ZLG/FP0j/wtPfE5FaThQ5Hizn3Rcw4BE9sAKB69erYuHGj0GEwA7KVSHCzeXOhw9Br6lRg0yYgIgLYvBl4/32hI2KsfErJTsG8E/MAAHPbz4W9lb3AEWkz976IGZ5ZzLFJTU3Fzp07sXfvXkRFRQkdDqsAHByAsDD17blzgdRUQcNhrNz67PRneJ71HLXda2N44+FCh8OYeSQ2iYmJ+Pnnn7F582bUqlULM4q4FjcnJwepqalaP4yV1KhRQGAgEB8PLF0qdDSMlT/RKdH4/PznAIAlnZZAKjaLkwCsgjN4de+LFy/i8uXLhe7Tq1cveHt7A1BPHq5duzZsbGwAAIcOHUK3bt3w008/4bXXXtP5+LCwMMydW3DWPVf3Nh+ZKhWa/fs+uNikCWwlEoEj0i1/8rCNjfq0lI+P0BH9v717j4uyyv8A/mG4DEjKTQxJREQFNDDCy29NNDHAy2qkGe7+3LWXbtu6aCl5yUtimrq7tq+0UsoMtzQZTVfSxPXCeoufsgQEo2KpiaixgASDI3Kd8/vjWadm5SozPMPM5/16+XoNZ54zfJyD5/k6PM85RJ3Hiykv4pPcTzDKdxROzjwp+yrDjeksc5G1MsXu3kYvr4uKivDNN980e0xERIT+8ZNPPmnwXHR0NEJDQ/GPf/yjycJm6dKliI+P139dWVkJHx+fhw9NRicAXPzPVtrmfEd1TAzw1FNAejqwciXw8cdyJyLqHHL/nYtPcz8FYB5bJzSls8xFZDxGL2wmT56MyZMnt+s1HB0dUV5e3uTzSqUSSiV3i6X2s7GRtloYMQLYvh2YPx8IDpY7FZH5W3x8MQQEYgfFYthjvDiXzIfs19hcvXrV4OvvvvsOWVlZGDFihEyJyNr84hfA889Li/UtWSJ3GiLzd/TqURy9ehT2CnusG7tO7jhEBmS/0mvWrFl47LHHEBoaitu3b2Pbtm0YPXo0fve738kdjazIunVASgpw+DCQlgaMHSt3IiLz1KBrwOJjiwEAcUPj0Netr8yJiAzJ/onNiRMnMG3aNJSVlcHZ2RmfffYZjhw5AkdHR7mjkRXp3x+YM0d6vGgRoNPJm4fIXO3M24nc4ly4KF2wYtQKueMQPUD2T2wUCgWee+45g5WHieTwxhvAJ58AOTnSlgszZsidiMi83Ku7hxUnpGJmWfgyeHTxkDkR0YNk/8SGLJMNAF+lEr5KZadZxtzTU9piAQCWLweqq+XNQ2RuNmVsws3Km+jt0huvDH9F7jit0hnnImofo69jIwdT3AdP1unePWnRvps3pUX7Fi2SOxGRebhddRv+7/qjsqYSO57bgRkh/EiT2s8U529+YkP0M05OwJo10uO1a4GyMnnzEJmLNafWoLKmEqFeofh18K/ljkPUJBY2RP/lN78BQkIAjUYqbois3ZUfr2DL11sASIvxKWx46iDzxZ9OMol7/1nGfGhWFu41NMgdp01sbX/aO+r994Hvv5c3D5HclqUtQ72uHuP6jcPYvp1rLYTOPBfRw2FhQyahA/D1nTv4+s4ddMY7p6OjgchIoK5OupCYyFpl3MzA5xc/hw1s8JdnOt9usZ19LqK2Y2FD1IS//EXackGlAjIz5U5D1PGEEFh4bCEA4MUnXkTwo9xvhMwfCxuiJjzxhHS9DSDdHdX57x8kapsD3x7AV4VfwcnOCavHrJY7DlGrsLAhasaaNYBSCZw6BXz5pdxpiDpOXUMdlhyXNk9b8D8L0KtbL5kTEbUOCxuiZvTuLe34DUgbZNbXyxqHqMNsy96Gb8u+Rfcu3bFkJHeHpc6DhQ1RC5YuBTw8gPx8IClJ7jREpnen5g5WnVoFAEgYnYBuSi58Sp0HCxsyme729uhuby93jHZzcZH2kQKAlSsBrVbePESmtuH/NqDkbgn6u/fHy2Evyx2n3SxlLqLW4ZYKRK1QWwsEBUlr2qxaBSQkyJ2IyDR+uPMD+r/XH1V1Vdj3wj5MCZoidySyYNxSgUgmDg7A+vXS4w0bgH//W948RKaScCIBVXVVGOEzAs8FPid3HKI2Y2FD1ErTpgHDhgF370qf2hBZmgslF5D0jXQh2YbIDbCx4X7Y1PmwsCGTuNfQgKdzcvB0To7FLGNuYwO8/bb0eNs26WJiIkuy5PgS6IQOU4KmYITPCLnjGIUlzkXUPBY2ZBI6AKc0GpzSaCxqGfPwcODZZ4GGBuD11+VOQ2Q8J66dwKHLh2CnsMP6sevljmM0ljoXUdNY2BC10Z/+JG2UeeAAcPq03GmI2k8ndFh0bBEA4OWwlzHAY4DMiYgeHgsbojYKDAReekl6vHAht1qgzm/3+d3IKspCV4euWDl6pdxxiNqFhQ3RQ0hIAJydpc0x9+yROw3Rw6upr8Gyfy4DACx5agl6OPeQORFR+7CwIXoIXl7A4sXS46VLgZoaefMQPazNmZtRUFEA767eWPCLBXLHIWo3FjZEDyk+Xipwrl0DEhPlTkPUduX3yvHW6bcAAGvGrEEX+y4yJyJqPxY2ZDJdFAp0UVjuj9gjjwCrV0uP16wBKipkjUPUZmvPrEV5dTmCewRj5uCZcscxGUufi8gQt1Qgaof6emDwYODiRelXU3/+s9yJiFqnoKIAAe8HoLahFof/9zDG9RsndySyQtxSgcjM2Nn9VMxs2gRcvy5vHqLWWv7P5ahtqMVYv7GI9o+WOw6R0bCwIWqniROBp5+WLiC+vws4kTnL+iELu9S7AHDrBLI8LGzIJKobGjAxLw8T8/JQbeHLmNvYSBtjAsDOnUBOjrx5iJojhNAvxjcjZAZCe4bKnMi0rGkuIgkLGzKJBgCpP/6I1B9/hDVMJUOGAL/6lbRY36JFXLSPzNfhK4dxouAElLZKvDXmLbnjmJy1zUXEwobIaNauBRwcgLQ04MgRudMQPaheV4/Fx6QFmF4Z/gp8XX1lTkRkfB1S2Fy5cgV79+5FYWFhk8fk5eXh4MGDuHTpUkdEIjI6Pz9g7lzp8eLF0kaZRObkk28+wYXSC3B3csey8GVyxyEyCZMWNtnZ2YiOjsa4ceMwbdo0nG5kx8Da2lrExMRgzJgx2LhxI4YNG4bZs2fDAu5CJyu0fDng6gqo1cCnn8qdhugnd2vv4o0T0tXtK8JXwNXRVd5ARCZi0sKmrKwMCxYswOXLl5s8ZuPGjUhPT0dubi7S0tJw9uxZ7Nq1Czt37jRlNCKTcHeXihtAukOqqkrePET3vXPuHRRpi+Dn6oc/Dv2j3HGITMakhU1kZCTGjRvX7K2EO3bsQGxsLHr16gUAGDRoEMaPH48dO3aYMhqRycydC/j6ArduARs3yp2GCCjWFuPP6dKCS+vGroPSTilzIiLTsZPzm9fX1yM/Px/z5s0zaA8JCcEHH3zQZL+amhrU/GzXQY1GA0BawZDMw92GBuDuXQDSuDTY2sqcqGMtXw78/vfA+vVAbCzg6Sl3IrJmK46sgLZSiyd7PolxPuOsaq609rnI3N3/WTTm5SdtKmwuXLiA/Pz8Zo8ZPXo0PFs5i2u1WjQ0NMDNzc2g3cPDAxXNbLyzfv16vPnmmw+0+/j4tOr7UsfyljuAjLRaoF8/uVMQSbKRDbdX3Vo+0EJZ81xk7srKyuDi4mKU12pTYaNWq7F3795mjwkKCmp1YaNUSh+HVv3XhQharRaOjo5N9lu6dCni4+P1X1dUVMDX1xeFhYVGe2Po4VRWVsLHxwc3btzgvl0y41iYD46FeeF4mA+NRoPevXvD3d3daK/ZpsJm+vTpmD59utG+uZOTE7y8vB64DbywsBB9+/Ztsp9SqdQXRT/n4uLCH1Iz0a1bN46FmeBYmA+OhXnheJgPhRF3X5d9gb7x48fj73//O3Q6HQCguroaBw8exPjx42VORkRERJ2NSS8eLikpMVi7JjMzE46OjvDz80NYWBgAYOXKlRg6dCimTp2KCRMmQKVSwc7OzuBXTUREREStYdJPbIqLi6FSqaBSqTB16lTcunULKpUKmZmZ+mP69OmD7OxsBAYG4uTJkwgPD0dmZiY8PDxa/X2USiUSEhIa/fUUdSyOhfngWJgPjoV54XiYD1OMhY3gEr9ERERkIWS/xoaIiIjIWFjYEBERkcVgYUNEREQWQ9YtFVqrpqYG6enp0Gq1GDZsGLy8vEzSh1omhMC//vUvFBUVYeDAgRgwYECLfcrLy5GdnQ0bGxsMHjy4TReGU/Py8/Nx6dIl+Pj4ICwsrNl92X6utrYW+/fvh5ubG6Kiokyc0jrcunULX3/9NVxcXPDUU0/B3t6+xT5CCGRlZaGoqAhDhgxBz549OyCp5auoqEB6ejpsbW0xcuRIPPLIIy32uXHjBs6fPw+FQoHg4GB4e3OdYmMQQuDMmTP44YcfMGXKFDg4OLTYp93nb2HmLl++LPr06SMCAgLEqFGjRJcuXcTHH39s9D7UssrKShEeHi569uwpIiMjhbOzs5g/f36zfebNmye8vb3FM888I8LDw4Wzs7NITEzsoMSWS6fTiZdeekl07dpVREVFCU9PTxEZGSmqqqpa1X/+/PnCwcFBhIWFmTipdXjvvfeEk5OTGDNmjPD39xcDBgwQ169fb7bP1atXxeDBg0Xv3r1FTEyMCAwMFFu3bu2gxJbryJEjwsXFRQwfPlyEhoYKDw8P8dVXXzXbJz4+Xjg5OYno6GgxduxY4ejoKFatWtVBiS3X3/72NxEQECD69esnAIjS0tIW+xjj/G32hc3o0aNFVFSUqK+vF0IIkZiYKBwcHJqdNB6mD7XstddeE35+fqKsrEwIIURGRoZQKBTiyy+/bLJPYmKiqK6u1n+dlJQkFAqF+O6770ye15IlJycLpVIp1Gq1EEKIoqIi4eXl1arJ+NChQyIoKEjMmjWLhY0R5OfnC1tbW5GcnCyEEKKmpkaMGDFC/PKXv2yyT01NjQgMDBTPPvusqKmpEUIIUVtbK1JTUzsks6W6e/eu8PT0FEuWLNG3zZ49W/Tp00fU1dU12icvL08AMHjvd+zYIQCIwsJCk2e2ZElJSeLSpUvi8OHDrS5sjHH+NuvC5saNGwKAOHTokL6ttrZWuLq6irfffttofah1Hn30UfHmm28atI0aNUpMnz691a+h0WgEALFv3z5jx7MqEydOFJMmTTJoi4+PF/369Wu2361bt4S3t7fIzs4WcXFxLGyMICEhQXh7ewudTqdv27Vrl1AoFPr/BPy35ORkYWNjIwoKCjoqplXYv3+/sLGxEUVFRfq2ixcvCgDi5MmTjfbJzMwUAMTFixf1benp6QKAuHz5sskzW4PWFjbGOn+b9cXDarUaAPD444/r2+zt7REQEKB/zhh9qGWlpaUoLi42eF8BIDg4uE3v6/HjxwEAgwYNMmo+a6NWqxsdiytXruDevXuN9tHpdJgxYwZeffVVhIaGdkRMq6BWqzFo0CCD65uCg4Oh0+lw8eLFRvucPn0aAQEB8PLywrFjx3D06FGUlJR0VGSLpVar0b17d4NrMoKCgmBvb9/kPDVkyBDMnTsXv/3tb/Hhhx9iy5Yt+MMf/oA33ngD/fr166joBOOdv8364mGNRgMAD+z66eHhgYqKCqP1oZYZ4329efMm4uLiMGvWLAQEBBg7olXRaDSNjsX955ycnB7os3btWgghsHDhwg7JaC00Gg26d+9u0HZ/LJr6t1FSUgI7OzsMGzYMPXr0QG1tLTIzM/HXv/4Vc+bMMXVki9XYvwsAcHNza3aeGjp0KFJTU7Fv3z7U19ejuroaTzzxhOmCUqOMdf4268Lm/hLLWq3W4Kp2rVbb5N0DD9OHWvbz9/XntFotHB0dW+xfXFyMyMhIhISEYMuWLSbJaE2USmWjYwGg0fEoKCjA6tWrsW7dOuzZswcAcPnyZZSXl0OlUiEiIgI9evQwfXAL1NaxuN9+/vx5fPHFF5g8eTIAYOvWrYiLi8OECRPg6+tr2tAWqrGxAJqfp06fPo2ZM2fi9OnTCA8PBwAcPHgQMTExyMnJQUhIiEkz00+Mdf42619F+fv7AwAKCwsN2gsLC9G3b1+j9aGWeXt7w9HR8YH39fr16y2+ryUlJYiIiECvXr2QkpLC/VmMwN/fv9GxcHNzg6ur6wPH29jYYOrUqcjKykJKSgpSUlJw7do1lJeXIyUlBbdv3+6g5JanqbEA0Ow85eDggEmTJunbpk6divr6euTm5pourIXz9/dHaWkpqqur9W23b99GVVVVk2Nx6tQpeHl56YsaAJg0aRIcHBwMNnEm0zPW+dusC5vg4GD4+Pjg888/17dlZGSgoKAAEydO1LcdP34cZ8+ebVMfahtbW1tER0cbvK8VFRU4evSowfuanZ2NQ4cO6b8uLS1FREQEvL29ceDAgUZ/RUJtN2HCBKSmpqKqqgqAdP3M3r17Dcbi2rVrUKlUqKurg6+vr35D2vt/oqKi0LdvX6hUKgwcOFCuv0qnN2HCBKjValy6dEnftnv3bgQGBuonY41GA5VKheLiYgDSibO2thbff/+9vk9+fj4AwMfHpwPTW5aoqCjodDp88cUX+rbdu3fDyckJERER+rY9e/bg22+/BSC932VlZSgtLdU/f+3aNVRXV6NXr14dF95KmeT8/bBXOXeUvXv3Cjs7O7Fw4ULxzjvvCB8fHxEbG2twzPDhww3aWtOH2u78+fOia9euYvr06WLz5s1i6NCh4vHHHzdYOyUuLk74+/sLIYSoq6sTISEhwsPDQyQlJYnk5GT9H97u3T4ajUb0799fjBw5UmzZskXExMQId3d3ceXKFf0x27dvFwBEeXl5o6/Bu6KMZ+LEicLf319s2rRJzJs3T9jZ2YnDhw/rn1er1QKAOHbsmL5t9uzZIiAgQLz//vucp4xo2bJlwsXFRaxfv16sXr1aODk5iQ0bNhgcY2trq2/TarUiMDBQBAcHi82bN4t3331XDBgwQISFhelvxaeHk5OTI5KTk8Xrr78uAIitW7eK5ORkcePGDf0xpjh/m/U1NoD08eyZM2fw2WefITc3F6tWrcLMmTMNjomMjISnp2eb+lDbDRo0CDk5Ofjoo4+QkZGB559/HnPmzDH4FCYsLAx2dtKPVUNDA4KCghAUFIQjR44YvJa7uzv69+/fofktSbdu3ZCRkYHExEScO3cOAwcOxKZNm9C7d2/9MX5+foiNjW1ypc+wsDC4uLh0VGSLtn//fiQlJeHs2bNwcXHBuXPnEBYWpn/e1dUVsbGxBnfrfPTRR1CpVEhLS4OjoyM2bNiAF154QY74FmXt2rUYMmQIUlNToVAosG/fPowfP97gmNjYWAQGBgIAnJ2dkZWVhe3btyMvLw8KhQKvvfYaZs6c2apVcqlpFy5cwMGDBwFI73laWhoAaW66/2mYKc7fNkIIYaS/AxEREZGszPoaGyIiIqK2YGFDREREFoOFDREREVkMFjZERERkMVjYEBERkcVgYUNEREQWg4UNERERWQwWNkRERGQxWNgQERGRxWBhQ0RERBaDhQ0RERFZDBY2REREZDH+HwhKX6htX/sdAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plot_utility(utility)" ] diff --git a/notebooks/neural_nets.ipynb b/notebooks/neural_nets.ipynb index 67be5ca7b..af080b612 100644 --- a/notebooks/neural_nets.ipynb +++ b/notebooks/neural_nets.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -72,148 +72,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def NeuralNetLearner(dataset, hidden_layer_sizes=None,\n",
-       "                     learning_rate=0.01, epochs=100, activation = sigmoid):\n",
-       "    """Layered feed-forward network.\n",
-       "    hidden_layer_sizes: List of number of hidden units per hidden layer\n",
-       "    learning_rate: Learning rate of gradient descent\n",
-       "    epochs: Number of passes over the dataset\n",
-       "    """\n",
-       "\n",
-       "    hidden_layer_sizes = hidden_layer_sizes or [3]  # default value\n",
-       "    i_units = len(dataset.inputs)\n",
-       "    o_units = len(dataset.values[dataset.target])\n",
-       "\n",
-       "    # construct a network\n",
-       "    raw_net = network(i_units, hidden_layer_sizes, o_units, activation)\n",
-       "    learned_net = BackPropagationLearner(dataset, raw_net,\n",
-       "                                         learning_rate, epochs, activation)\n",
-       "\n",
-       "    def predict(example):\n",
-       "        # Input nodes\n",
-       "        i_nodes = learned_net[0]\n",
-       "\n",
-       "        # Activate input layer\n",
-       "        for v, n in zip(example, i_nodes):\n",
-       "            n.value = v\n",
-       "\n",
-       "        # Forward pass\n",
-       "        for layer in learned_net[1:]:\n",
-       "            for node in layer:\n",
-       "                inc = [n.value for n in node.inputs]\n",
-       "                in_val = dotproduct(inc, node.weights)\n",
-       "                node.value = node.activation(in_val)\n",
-       "\n",
-       "        # Hypothesis\n",
-       "        o_nodes = learned_net[-1]\n",
-       "        prediction = find_max_node(o_nodes)\n",
-       "        return prediction\n",
-       "\n",
-       "    return predict\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(NeuralNetLearner)" ] @@ -258,53 +119,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ BACK-PROP-LEARNING(_examples_, _network_) __returns__ a neural network \n", - " __inputs__ _examples_, a set of examples, each with input vector __x__ and output vector __y__ \n", - "    _network_, a multilayer network with _L_ layers, weights _wi,j_, activation function _g_ \n", - " __local variables__: Δ, a vector of errors, indexed by network node \n", - "\n", - " __repeat__ \n", - "   __for each__ weight _wi,j_ in _network_ __do__ \n", - "     _wi,j_ ← a small random number \n", - "   __for each__ example (__x__, __y__) __in__ _examples_ __do__ \n", - "     /\\* _Propagate the inputs forward to compute the outputs_ \\*/ \n", - "     __for each__ node _i_ in the input layer __do__ \n", - "       _ai_ ← _xi_ \n", - "     __for__ _l_ = 2 __to__ _L_ __do__ \n", - "       __for each__ node _j_ in layer _l_ __do__ \n", - "         _inj_ ← Σ_i_ _wi,j_ _ai_ \n", - "         _aj_ ← _g_(_inj_) \n", - "     /\\* _Propagate deltas backward from output layer to input layer_ \\*/ \n", - "     __for each__ node _j_ in the output layer __do__ \n", - "       Δ\\[_j_\\] ← _g_′(_inj_) × (_yi_ − _aj_) \n", - "     __for__ _l_ = _L_ − 1 __to__ 1 __do__ \n", - "       __for each__ node _i_ in layer _l_ __do__ \n", - "         Δ\\[_i_\\] ← _g_′(_ini_) Σ_j_ _wi,j_ Δ\\[_j_\\] \n", - "     /\\* _Update every weight in network using deltas_ \\*/ \n", - "     __for each__ weight _wi,j_ in _network_ __do__ \n", - "       _wi,j_ ← _wi,j_ + _α_ × _ai_ × Δ\\[_j_\\] \n", - "  __until__ some stopping criterion is satisfied \n", - "  __return__ _network_ \n", - "\n", - "---\n", - "__Figure ??__ The back\\-propagation algorithm for learning in multilayer networks." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pseudocode('Back-Prop-Learning')" ] @@ -320,209 +137,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def BackPropagationLearner(dataset, net, learning_rate, epochs, activation=sigmoid):\n",
-       "    """[Figure 18.23] The back-propagation algorithm for multilayer networks"""\n",
-       "    # Initialise weights\n",
-       "    for layer in net:\n",
-       "        for node in layer:\n",
-       "            node.weights = random_weights(min_value=-0.5, max_value=0.5,\n",
-       "                                          num_weights=len(node.weights))\n",
-       "\n",
-       "    examples = dataset.examples\n",
-       "    '''\n",
-       "    As of now dataset.target gives an int instead of list,\n",
-       "    Changing dataset class will have effect on all the learners.\n",
-       "    Will be taken care of later.\n",
-       "    '''\n",
-       "    o_nodes = net[-1]\n",
-       "    i_nodes = net[0]\n",
-       "    o_units = len(o_nodes)\n",
-       "    idx_t = dataset.target\n",
-       "    idx_i = dataset.inputs\n",
-       "    n_layers = len(net)\n",
-       "\n",
-       "    inputs, targets = init_examples(examples, idx_i, idx_t, o_units)\n",
-       "\n",
-       "    for epoch in range(epochs):\n",
-       "        # Iterate over each example\n",
-       "        for e in range(len(examples)):\n",
-       "            i_val = inputs[e]\n",
-       "            t_val = targets[e]\n",
-       "\n",
-       "            # Activate input layer\n",
-       "            for v, n in zip(i_val, i_nodes):\n",
-       "                n.value = v\n",
-       "\n",
-       "            # Forward pass\n",
-       "            for layer in net[1:]:\n",
-       "                for node in layer:\n",
-       "                    inc = [n.value for n in node.inputs]\n",
-       "                    in_val = dotproduct(inc, node.weights)\n",
-       "                    node.value = node.activation(in_val)\n",
-       "\n",
-       "            # Initialize delta\n",
-       "            delta = [[] for _ in range(n_layers)]\n",
-       "\n",
-       "            # Compute outer layer delta\n",
-       "\n",
-       "            # Error for the MSE cost function\n",
-       "            err = [t_val[i] - o_nodes[i].value for i in range(o_units)]\n",
-       "\n",
-       "            # The activation function used is relu or sigmoid function\n",
-       "            if node.activation == sigmoid:\n",
-       "                delta[-1] = [sigmoid_derivative(o_nodes[i].value) * err[i] for i in range(o_units)]\n",
-       "            else:\n",
-       "                delta[-1] = [relu_derivative(o_nodes[i].value) * err[i] for i in range(o_units)]\n",
-       "\n",
-       "            # Backward pass\n",
-       "            h_layers = n_layers - 2\n",
-       "            for i in range(h_layers, 0, -1):\n",
-       "                layer = net[i]\n",
-       "                h_units = len(layer)\n",
-       "                nx_layer = net[i+1]\n",
-       "\n",
-       "                # weights from each ith layer node to each i + 1th layer node\n",
-       "                w = [[node.weights[k] for node in nx_layer] for k in range(h_units)]\n",
-       "\n",
-       "                if activation == sigmoid:\n",
-       "                    delta[i] = [sigmoid_derivative(layer[j].value) * dotproduct(w[j], delta[i+1])\n",
-       "                            for j in range(h_units)]\n",
-       "                else:\n",
-       "                    delta[i] = [relu_derivative(layer[j].value) * dotproduct(w[j], delta[i+1])\n",
-       "                            for j in range(h_units)]\n",
-       "\n",
-       "            #  Update weights\n",
-       "            for i in range(1, n_layers):\n",
-       "                layer = net[i]\n",
-       "                inc = [node.value for node in net[i-1]]\n",
-       "                units = len(layer)\n",
-       "                for j in range(units):\n",
-       "                    layer[j].weights = vector_add(layer[j].weights,\n",
-       "                                                  scalar_vector_product(\n",
-       "                                                  learning_rate * delta[i][j], inc))\n",
-       "\n",
-       "    return net\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(BackPropagationLearner)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], + "outputs": [], "source": [ "iris = DataSet(name=\"iris\")\n", "iris.classes_to_numbers()\n", @@ -567,10 +193,10 @@ "pycharm": { "stem_cell": { "cell_type": "raw", - "source": [], "metadata": { "collapsed": false - } + }, + "source": [] } } }, diff --git a/notebooks/nlp.ipynb b/notebooks/nlp.ipynb index c517ac28b..fb216e1c1 100644 --- a/notebooks/nlp.ipynb +++ b/notebooks/nlp.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -36,9 +36,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## CONTENTS\n", "\n", @@ -218,19 +216,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lexicon {'Adverb': ['here', 'lightly', 'now'], 'Verb': ['is', 'say', 'are'], 'Digit': ['1', '2', '0'], 'RelPro': ['that', 'who', 'which'], 'Conjunction': ['and', 'or', 'but'], 'Name': ['john', 'mary', 'peter'], 'Pronoun': ['me', 'you', 'he'], 'Article': ['the', 'a', 'an'], 'Noun': ['robot', 'sheep', 'fence'], 'Adjective': ['good', 'new', 'sad'], 'Preposition': ['to', 'in', 'at']}\n", - "\n", - "Rules: {'RelClause': [['RelPro', 'VP']], 'Adjs': [['Adjective'], ['Adjective', 'Adjs']], 'NP': [['Pronoun'], ['Name'], ['Noun'], ['Article', 'Noun'], ['Article', 'Adjs', 'Noun'], ['Digit'], ['NP', 'PP'], ['NP', 'RelClause']], 'S': [['NP', 'VP'], ['S', 'Conjunction', 'S']], 'VP': [['Verb'], ['VP', 'NP'], ['VP', 'Adjective'], ['VP', 'PP'], ['VP', 'Adverb']], 'PP': [['Preposition', 'NP']]}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "lexicon = Lexicon(\n", " Verb = \"is | say | are\",\n", @@ -272,19 +260,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "How can we rewrite 'VP'? [['Verb'], ['VP', 'NP'], ['VP', 'Adjective'], ['VP', 'PP'], ['VP', 'Adverb']]\n", - "Is 'the' an article? True\n", - "Is 'here' a noun? False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "grammar = Grammar(\"A Simple Grammar\", rules, lexicon)\n", "\n", @@ -302,10 +280,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "E_Chomsky = Grammar(\"E_Prob_Chomsky\", # A Grammar in Chomsky Normal Form\n", @@ -324,17 +300,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('S', 'NP', 'VP'), ('VP', 'Verb', 'NP'), ('VP', 'Verb', 'Adjective'), ('NP', 'Article', 'Noun'), ('NP', 'Adjective', 'Noun')]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(E_Chomsky.cnf_rules())" ] @@ -348,20 +316,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'sheep that say here mary are the sheep at 2'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "grammar.generate_random('S')" ] @@ -395,19 +352,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lexicon {'Noun': [('robot', 0.4), ('sheep', 0.4), ('fence', 0.2)], 'Name': [('john', 0.4), ('mary', 0.4), ('peter', 0.2)], 'Adverb': [('here', 0.6), ('lightly', 0.1), ('now', 0.3)], 'Digit': [('0', 0.35), ('1', 0.35), ('2', 0.3)], 'Adjective': [('good', 0.5), ('new', 0.2), ('sad', 0.3)], 'Pronoun': [('me', 0.3), ('you', 0.4), ('he', 0.3)], 'Article': [('the', 0.5), ('a', 0.25), ('an', 0.25)], 'Preposition': [('to', 0.4), ('in', 0.3), ('at', 0.3)], 'Verb': [('is', 0.5), ('say', 0.3), ('are', 0.2)], 'Conjunction': [('and', 0.5), ('or', 0.2), ('but', 0.3)], 'RelPro': [('that', 0.5), ('who', 0.3), ('which', 0.2)]}\n", - "\n", - "Rules: {'S': [(['NP', 'VP'], 0.6), (['S', 'Conjunction', 'S'], 0.4)], 'RelClause': [(['RelPro', 'VP'], 1.0)], 'VP': [(['Verb'], 0.3), (['VP', 'NP'], 0.2), (['VP', 'Adjective'], 0.25), (['VP', 'PP'], 0.15), (['VP', 'Adverb'], 0.1)], 'Adjs': [(['Adjective'], 0.5), (['Adjective', 'Adjs'], 0.5)], 'PP': [(['Preposition', 'NP'], 1.0)], 'NP': [(['Pronoun'], 0.2), (['Name'], 0.05), (['Noun'], 0.2), (['Article', 'Noun'], 0.15), (['Article', 'Adjs', 'Noun'], 0.1), (['Digit'], 0.05), (['NP', 'PP'], 0.15), (['NP', 'RelClause'], 0.1)]}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "lexicon = ProbLexicon(\n", " Verb = \"is [0.5] | say [0.3] | are [0.2]\",\n", @@ -447,19 +394,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "How can we rewrite 'VP'? [(['Verb'], 0.3), (['VP', 'NP'], 0.2), (['VP', 'Adjective'], 0.25), (['VP', 'PP'], 0.15), (['VP', 'Adverb'], 0.1)]\n", - "Is 'the' an article? True\n", - "Is 'here' a noun? False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "grammar = ProbGrammar(\"A Simple Probabilistic Grammar\", rules, lexicon)\n", "\n", @@ -477,7 +414,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -497,17 +434,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('S', 'NP', 'VP', 1.0), ('VP', 'Verb', 'NP', 0.5), ('VP', 'Verb', 'Adjective', 0.5), ('NP', 'Article', 'Noun', 0.6), ('NP', 'Adjective', 'Noun', 0.4)]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(E_Prob_Chomsky.cnf_rules())" ] @@ -521,18 +450,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "an good sad sheep to 1 is\n", - "3.54375e-08\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sentence, prob = grammar.generate_random('S')\n", "print(sentence)\n", @@ -569,9 +489,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "### Implementation\n", "\n", @@ -608,9 +526,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "### Example\n", "\n", @@ -621,10 +537,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "testHTML = \"\"\"Like most other male mammals, a man inherits an\n", @@ -657,10 +571,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "HITS('mammals')\n", @@ -678,22 +590,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "A: total=0.7696163397038682, auth=0.5583254178509696, hub=0.2112909218528986\n", - "B: total=0.7795962360479536, auth=0.23657856688600404, hub=0.5430176691619495\n", - "C: total=0.8204496913590655, auth=0.4211098490570872, hub=0.3993398423019784\n", - "D: total=0.6316647735856309, auth=0.6316647735856309, hub=0.0\n", - "E: total=0.7078245882072104, auth=0.0, hub=0.7078245882072104\n", - "F: total=0.23657856688600404, auth=0.23657856688600404, hub=0.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "for i in range(6):\n", " p = page_list[i]\n", @@ -705,9 +604,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "The top score is 0.82 by \"C\". This is the most relevant page according to the algorithm. You can see that the pages it links to, \"A\" and \"D\", have the two highest authority scores (therefore \"C\" has a high hub score) and the pages it is linked from, \"B\" and \"E\", have the highest hub scores (so \"C\" has a high authority score). By combining these two facts, we get that \"C\" is the most relevant page. It is worth noting that it does not matter if the given page contains the query words, just that it links and is linked from high-quality pages." ] @@ -780,10 +677,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "E_Prob_Chomsky = ProbGrammar(\"E_Prob_Chomsky\", # A Probabilistic Grammar in CNF\n", @@ -809,17 +704,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "defaultdict(, {('Adjective', 1, 1): 0.0, ('NP', 0, 3): 0.0, ('Verb', 1, 1): 0.0, ('NP', 0, 2): 0.12, ('S', 1, 2): 0.0, ('Article', 2, 1): 0.0, ('NP', 3, 1): 0.0, ('S', 1, 3): 0.0, ('Adjective', 1, 3): 0.0, ('VP', 0, 4): 0.0, ('Article', 0, 3): 0.0, ('Adjective', 1, 2): 0.0, ('Verb', 1, 2): 0.0, ('Adjective', 0, 2): 0.0, ('Article', 0, 1): 0.5, ('VP', 1, 1): 0.0, ('Verb', 0, 2): 0.0, ('Adjective', 0, 3): 0.0, ('VP', 1, 2): 0.0, ('Verb', 0, 3): 0.0, ('NP', 2, 2): 0.0, ('S', 2, 2): 0.0, ('NP', 1, 3): 0.0, ('VP', 1, 3): 0.0, ('Adjective', 3, 1): 0.5, ('Adjective', 0, 1): 0.0, ('NP', 1, 2): 0.0, ('Verb', 0, 1): 0.0, ('S', 0, 3): 0.0, ('NP', 1, 1): 0.0, ('NP', 2, 1): 0.0, ('S', 0, 2): 0.0, ('Noun', 1, 2): 0.0, ('S', 0, 4): 0.015, ('Noun', 1, 3): 0.0, ('Noun', 3, 1): 0.0, ('Noun', 2, 2): 0.0, ('NP', 0, 4): 0.0, ('VP', 2, 2): 0.125, ('Noun', 2, 1): 0.0, ('Noun', 1, 1): 0.4, ('VP', 0, 3): 0.0, ('Article', 1, 2): 0.0, ('Article', 1, 1): 0.0, ('VP', 2, 1): 0.0, ('Adjective', 2, 1): 0.0, ('Verb', 2, 1): 0.5, ('Adjective', 2, 2): 0.0, ('VP', 3, 1): 0.0, ('NP', 0, 1): 0.0, ('VP', 0, 2): 0.0, ('Article', 0, 2): 0.0})\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "words = ['the', 'robot', 'is', 'good']\n", "grammar = E_Prob_Chomsky\n", @@ -837,17 +724,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{('Noun', 1, 1): 0.4, ('VP', 2, 2): 0.125, ('Adjective', 3, 1): 0.5, ('S', 0, 4): 0.015, ('Article', 0, 1): 0.5, ('NP', 0, 2): 0.12, ('Verb', 2, 1): 0.5}\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "parses = {k: p for k, p in P.items() if p >0}\n", "\n", @@ -894,9 +773,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "* `parses`: Returns a list of parses for a given sentence. If the sentence can't be parsed, it will return an empty list. Initializes the process by calling `parse` from the starting symbol.\n", "\n", @@ -945,10 +822,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "chart = Chart(nlp.E0)" @@ -963,17 +838,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0, 6, 'S', [[0, 2, 'NP', [('Article', 'the'), ('Noun', 'stench')], []], [2, 6, 'VP', [[2, 3, 'VP', [('Verb', 'is')], []], [3, 6, 'PP', [('Preposition', 'in'), [4, 6, 'NP', [('Digit', '2'), ('Digit', '2')], []]], []]], []]], []]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(chart.parses('the stench is in 2 2'))" ] @@ -1004,17 +871,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(chart.parses('the stench 2 2'))" ] diff --git a/notebooks/nlp_apps.ipynb b/notebooks/nlp_apps.ipynb index 7e3a68508..799ff7916 100644 --- a/notebooks/nlp_apps.ipynb +++ b/notebooks/nlp_apps.ipynb @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -126,108 +126,36 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'i'), ('i', 'c'), ('c', 'h'), (' ', 'b'), ('b', 'i'), ('i', 'n'), ('i', 'n'), (' ', 'e'), ('e', 'i'), (' ', 'p'), ('p', 'l'), ('l', 'a'), ('a', 't'), ('t', 'z')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Ich bin ein platz\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 't'), ('t', 'u'), ('u', 'r'), ('r', 't'), ('t', 'l'), ('l', 'e'), ('e', 's'), (' ', 'f'), ('f', 'l'), ('l', 'y'), (' ', 'h'), ('h', 'i'), ('i', 'g'), ('g', 'h')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Turtles fly high\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'd'), ('d', 'e'), ('e', 'r'), ('e', 'r'), (' ', 'p'), ('p', 'e'), ('e', 'l'), ('l', 'i'), ('i', 'k'), ('k', 'a'), ('a', 'n'), (' ', 'i'), ('i', 's'), ('s', 't'), (' ', 'h'), ('h', 'i'), ('i', 'e')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"Der pelikan ist hier\", nBS, 2)" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(' ', 'a'), ('a', 'n'), ('n', 'd'), (' ', 't'), (' ', 't'), ('t', 'h'), ('t', 'h'), ('h', 'u'), ('u', 's'), ('h', 'e'), (' ', 'w'), ('w', 'i'), ('i', 'z'), ('z', 'a'), ('a', 'r'), ('r', 'd'), (' ', 's'), ('s', 'p'), ('p', 'o'), ('o', 'k'), ('k', 'e')]\n" - ] - }, - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"And thus the wizard spoke\", nBS, 2)" ] @@ -258,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -287,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -307,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -327,20 +255,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Abbott'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"the square is mad\", nBS)" ] @@ -356,20 +273,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Austen'" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "recognize(\"a most peculiar acquaintance\", nBS)" ] @@ -400,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -419,20 +325,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The Project Gutenberg EBook of The Federalist Papers, by \\nAlexander Hamilton and John Jay and James Madison\\n\\nThis eBook is for the use of anyone anywhere at no cost and with\\nalmost no restrictions whatsoever. You may copy it, give it away or\\nre-use it under the terms of the Project Gutenberg License included\\nwith this eBook or online at www.gutenberg.net\\n\\n\\nTitle: The Federalist Papers\\n\\nAuthor: Alexander Hamilton\\n John Jay\\n James Madison\\n\\nPosting Date: December 12, 2011 [EBook #18]'" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "federalist[:500]" ] @@ -446,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -463,20 +358,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'federalist no 1 general introduction for the independent journal hamilton to the people of the state of new york after an unequivocal experience of the inefficacy of the subsisting federal government you are called upon to deliberate on a new constitution for the united states of america the subject speaks its own importance comprehending in its consequences nothing less than the existence of the union the safety and welfare of the parts of which it is composed the fate of an empire in many respects the most interesting in the world it has been frequently remarked that it seems to'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "' '.join(wordseq[:100])" ] @@ -494,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -514,20 +398,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(4, 16, 52)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import re\n", "\n", @@ -560,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -593,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -675,7 +548,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -693,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -710,50 +583,9 @@ }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Straightforward Naive Bayes Learner\n", - "\n", - "Paper No. 49: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 50: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 51: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 52: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 53: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 54: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 55: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 56: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 57: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 58: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 18: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 19: Hamilton: 0.0000 Madison: 0.0000 Jay: 1.0000\n", - "Paper No. 20: Hamilton: 0.0000 Madison: 1.0000 Jay: 0.0000\n", - "Paper No. 64: Hamilton: 1.0000 Madison: 0.0000 Jay: 0.0000\n", - "\n", - "Logarithmic Naive Bayes Learner\n", - "\n", - "Paper No. 49: Hamilton: -0.330591 Madison: -0.327717 Jay: -0.341692\n", - "Paper No. 50: Hamilton: -0.333119 Madison: -0.328454 Jay: -0.338427\n", - "Paper No. 51: Hamilton: -0.330246 Madison: -0.325758 Jay: -0.343996\n", - "Paper No. 52: Hamilton: -0.331094 Madison: -0.327491 Jay: -0.341415\n", - "Paper No. 53: Hamilton: -0.330942 Madison: -0.328364 Jay: -0.340693\n", - "Paper No. 54: Hamilton: -0.329566 Madison: -0.327157 Jay: -0.343277\n", - "Paper No. 55: Hamilton: -0.330821 Madison: -0.328143 Jay: -0.341036\n", - "Paper No. 56: Hamilton: -0.330333 Madison: -0.327496 Jay: -0.342171\n", - "Paper No. 57: Hamilton: -0.330625 Madison: -0.328602 Jay: -0.340772\n", - "Paper No. 58: Hamilton: -0.330271 Madison: -0.327215 Jay: -0.342515\n", - "Paper No. 18: Hamilton: -0.337781 Madison: -0.330932 Jay: -0.331287\n", - "Paper No. 19: Hamilton: -0.335635 Madison: -0.331774 Jay: -0.332590\n", - "Paper No. 20: Hamilton: -0.334911 Madison: -0.331866 Jay: -0.333223\n", - "Paper No. 64: Hamilton: -0.331004 Madison: -0.332968 Jay: -0.336028\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print('\\nStraightforward Naive Bayes Learner\\n')\n", "for d in disputed:\n", @@ -782,9 +614,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## Text Classification" ] @@ -833,7 +663,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -877,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -897,18 +727,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of words in `company` class: 49\n", - "Number of words in `fruit` class: 49\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "words_0 = []\n", "words_1 = []\n", @@ -945,7 +766,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -962,7 +783,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -984,7 +805,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -995,18 +816,9 @@ }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Apple Inc. supplier Foxconn demos its own iPhone-compatible smartwatch\t-company\n", - "I now know how to make a delicious apple pie thanks to the best teachers ever\t-fruit\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# predicting the class of sentences in the test set\n", "for i in test_data:\n", diff --git a/notebooks/planning.ipynb b/notebooks/planning.ipynb index f83b48bda..83ccc583d 100644 --- a/notebooks/planning.ipynb +++ b/notebooks/planning.ipynb @@ -11,9 +11,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Planning\n", "#### Chapters 10-11\n", @@ -37,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -95,159 +93,9 @@ }, { "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class PlanningProblem:\n",
-       "    """\n",
-       "    Planning Domain Definition Language (PlanningProblem) used to define a search problem.\n",
-       "    It stores states in a knowledge base consisting of first order logic statements.\n",
-       "    The conjunction of these logical statements completely defines a state.\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, init, goals, actions):\n",
-       "        self.init = self.convert(init)\n",
-       "        self.goals = self.convert(goals)\n",
-       "        self.actions = actions\n",
-       "\n",
-       "    def convert(self, clauses):\n",
-       "        """Converts strings into exprs"""\n",
-       "        if not isinstance(clauses, Expr):\n",
-       "            if len(clauses) > 0:\n",
-       "                clauses = expr(clauses)\n",
-       "            else:\n",
-       "                clauses = []\n",
-       "        try:\n",
-       "            clauses = conjuncts(clauses)\n",
-       "        except AttributeError:\n",
-       "            clauses = clauses\n",
-       "\n",
-       "        new_clauses = []\n",
-       "        for clause in clauses:\n",
-       "            if clause.op == '~':\n",
-       "                new_clauses.append(expr('Not' + str(clause.args[0])))\n",
-       "            else:\n",
-       "                new_clauses.append(clause)\n",
-       "        return new_clauses\n",
-       "\n",
-       "    def goal_test(self):\n",
-       "        """Checks if the goals have been reached"""\n",
-       "        return all(goal in self.init for goal in self.goals)\n",
-       "\n",
-       "    def act(self, action):\n",
-       "        """\n",
-       "        Performs the action given as argument.\n",
-       "        Note that action is an Expr like expr('Remove(Glass, Table)') or expr('Eat(Sandwich)')\n",
-       "        """       \n",
-       "        action_name = action.op\n",
-       "        args = action.args\n",
-       "        list_action = first(a for a in self.actions if a.name == action_name)\n",
-       "        if list_action is None:\n",
-       "            raise Exception("Action '{}' not found".format(action_name))\n",
-       "        if not list_action.check_precond(self.init, args):\n",
-       "            raise Exception("Action '{}' pre-conditions not satisfied".format(action))\n",
-       "        self.init = list_action(self.init, args).clauses\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PlanningProblem)" ] @@ -289,199 +137,9 @@ }, { "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Action:\n",
-       "    """\n",
-       "    Defines an action schema using preconditions and effects.\n",
-       "    Use this to describe actions in PlanningProblem.\n",
-       "    action is an Expr where variables are given as arguments(args).\n",
-       "    Precondition and effect are both lists with positive and negative literals.\n",
-       "    Negative preconditions and effects are defined by adding a 'Not' before the name of the clause\n",
-       "    Example:\n",
-       "    precond = [expr("Human(person)"), expr("Hungry(Person)"), expr("NotEaten(food)")]\n",
-       "    effect = [expr("Eaten(food)"), expr("Hungry(person)")]\n",
-       "    eat = Action(expr("Eat(person, food)"), precond, effect)\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, action, precond, effect):\n",
-       "        if isinstance(action, str):\n",
-       "            action = expr(action)\n",
-       "        self.name = action.op\n",
-       "        self.args = action.args\n",
-       "        self.precond = self.convert(precond)\n",
-       "        self.effect = self.convert(effect)\n",
-       "\n",
-       "    def __call__(self, kb, args):\n",
-       "        return self.act(kb, args)\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return '{}({})'.format(self.__class__.__name__, Expr(self.name, *self.args))\n",
-       "\n",
-       "    def convert(self, clauses):\n",
-       "        """Converts strings into Exprs"""\n",
-       "        if isinstance(clauses, Expr):\n",
-       "            clauses = conjuncts(clauses)\n",
-       "            for i in range(len(clauses)):\n",
-       "                if clauses[i].op == '~':\n",
-       "                    clauses[i] = expr('Not' + str(clauses[i].args[0]))\n",
-       "\n",
-       "        elif isinstance(clauses, str):\n",
-       "            clauses = clauses.replace('~', 'Not')\n",
-       "            if len(clauses) > 0:\n",
-       "                clauses = expr(clauses)\n",
-       "\n",
-       "            try:\n",
-       "                clauses = conjuncts(clauses)\n",
-       "            except AttributeError:\n",
-       "                pass\n",
-       "\n",
-       "        return clauses\n",
-       "\n",
-       "    def substitute(self, e, args):\n",
-       "        """Replaces variables in expression with their respective Propositional symbol"""\n",
-       "\n",
-       "        new_args = list(e.args)\n",
-       "        for num, x in enumerate(e.args):\n",
-       "            for i, _ in enumerate(self.args):\n",
-       "                if self.args[i] == x:\n",
-       "                    new_args[num] = args[i]\n",
-       "        return Expr(e.op, *new_args)\n",
-       "\n",
-       "    def check_precond(self, kb, args):\n",
-       "        """Checks if the precondition is satisfied in the current state"""\n",
-       "\n",
-       "        if isinstance(kb, list):\n",
-       "            kb = FolKB(kb)\n",
-       "        for clause in self.precond:\n",
-       "            if self.substitute(clause, args) not in kb.clauses:\n",
-       "                return False\n",
-       "        return True\n",
-       "\n",
-       "    def act(self, kb, args):\n",
-       "        """Executes the action on the state's knowledge base"""\n",
-       "\n",
-       "        if isinstance(kb, list):\n",
-       "            kb = FolKB(kb)\n",
-       "\n",
-       "        if not self.check_precond(kb, args):\n",
-       "            raise Exception('Action pre-conditions not satisfied')\n",
-       "        for clause in self.effect:\n",
-       "            kb.tell(self.substitute(clause, args))\n",
-       "            if clause.op[:3] == 'Not':\n",
-       "                new_clause = Expr(clause.op[3:], *clause.args)\n",
-       "\n",
-       "                if kb.ask(self.substitute(new_clause, args)) is not False:\n",
-       "                    kb.retract(self.substitute(new_clause, args))\n",
-       "            else:\n",
-       "                new_clause = Expr('Not' + clause.op, *clause.args)\n",
-       "\n",
-       "                if kb.ask(self.substitute(new_clause, args)) is not False:    \n",
-       "                    kb.retract(self.substitute(new_clause, args))\n",
-       "\n",
-       "        return kb\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(Action)" ] @@ -512,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -541,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -561,29 +219,9 @@ }, { "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Connected(Bucharest, Pitesti),\n", - " Connected(Pitesti, Rimnicu),\n", - " Connected(Rimnicu, Sibiu),\n", - " Connected(Sibiu, Fagaras),\n", - " Connected(Fagaras, Bucharest),\n", - " Connected(Pitesti, Craiova),\n", - " Connected(Craiova, Rimnicu),\n", - " (Connected(x, y) ==> Connected(y, x)),\n", - " ((Connected(x, y) & Connected(y, z)) ==> Connected(x, z)),\n", - " At(Sibiu)]" - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "knowledge_base" ] @@ -599,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -643,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -662,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -678,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -695,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -723,146 +361,9 @@ }, { "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def air_cargo():\n",
-       "    """\n",
-       "    [Figure 10.1] AIR-CARGO-PROBLEM\n",
-       "\n",
-       "    An air-cargo shipment problem for delivering cargo to different locations,\n",
-       "    given the starting location and airplanes.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> ac = air_cargo()\n",
-       "    >>> ac.goal_test()\n",
-       "    False\n",
-       "    >>> ac.act(expr('Load(C2, P2, JFK)'))\n",
-       "    >>> ac.act(expr('Load(C1, P1, SFO)'))\n",
-       "    >>> ac.act(expr('Fly(P1, SFO, JFK)'))\n",
-       "    >>> ac.act(expr('Fly(P2, JFK, SFO)'))\n",
-       "    >>> ac.act(expr('Unload(C2, P2, SFO)'))\n",
-       "    >>> ac.goal_test()\n",
-       "    False\n",
-       "    >>> ac.act(expr('Unload(C1, P1, JFK)'))\n",
-       "    >>> ac.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='At(C1, SFO) & At(C2, JFK) & At(P1, SFO) & At(P2, JFK) & Cargo(C1) & Cargo(C2) & Plane(P1) & Plane(P2) & Airport(SFO) & Airport(JFK)', \n",
-       "                goals='At(C1, JFK) & At(C2, SFO)',\n",
-       "                actions=[Action('Load(c, p, a)', \n",
-       "                                precond='At(c, a) & At(p, a) & Cargo(c) & Plane(p) & Airport(a)',\n",
-       "                                effect='In(c, p) & ~At(c, a)'),\n",
-       "                         Action('Unload(c, p, a)',\n",
-       "                                precond='In(c, p) & At(p, a) & Cargo(c) & Plane(p) & Airport(a)',\n",
-       "                                effect='At(c, a) & ~In(c, p)'),\n",
-       "                         Action('Fly(p, f, to)',\n",
-       "                                precond='At(p, f) & Plane(p) & Airport(f) & Airport(to)',\n",
-       "                                effect='At(p, to) & ~At(p, f)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(air_cargo)" ] @@ -893,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -909,17 +410,9 @@ }, { "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(airCargo.goal_test())" ] @@ -945,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -969,17 +462,9 @@ }, { "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(airCargo.goal_test())" ] @@ -1008,143 +493,9 @@ }, { "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def spare_tire():\n",
-       "    """[Figure 10.2] SPARE-TIRE-PROBLEM\n",
-       "\n",
-       "    A problem involving changing the flat tire of a car\n",
-       "    with a spare tire from the trunk.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> st = spare_tire()\n",
-       "    >>> st.goal_test()\n",
-       "    False\n",
-       "    >>> st.act(expr('Remove(Spare, Trunk)'))\n",
-       "    >>> st.act(expr('Remove(Flat, Axle)'))\n",
-       "    >>> st.goal_test()\n",
-       "    False\n",
-       "    >>> st.act(expr('PutOn(Spare, Axle)'))\n",
-       "    >>> st.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='Tire(Flat) & Tire(Spare) & At(Flat, Axle) & At(Spare, Trunk)',\n",
-       "                goals='At(Spare, Axle) & At(Flat, Ground)',\n",
-       "                actions=[Action('Remove(obj, loc)',\n",
-       "                                precond='At(obj, loc)',\n",
-       "                                effect='At(obj, Ground) & ~At(obj, loc)'),\n",
-       "                         Action('PutOn(t, Axle)',\n",
-       "                                precond='Tire(t) & At(t, Ground) & ~At(Flat, Axle)',\n",
-       "                                effect='At(t, Axle) & ~At(t, Ground)'),\n",
-       "                         Action('LeaveOvernight',\n",
-       "                                precond='',\n",
-       "                                effect='~At(Spare, Ground) & ~At(Spare, Axle) & ~At(Spare, Trunk) & \\\n",
-       "                                        ~At(Flat, Ground) & ~At(Flat, Axle) & ~At(Flat, Trunk)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(spare_tire)" ] @@ -1164,7 +515,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1180,17 +531,9 @@ }, { "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(spareTire.goal_test())" ] @@ -1215,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1229,17 +572,9 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(spareTire.goal_test())" ] @@ -1255,7 +590,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1271,17 +606,9 @@ }, { "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(spareTire.goal_test())" ] @@ -1329,140 +656,9 @@ }, { "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def three_block_tower():\n",
-       "    """\n",
-       "    [Figure 10.3] THREE-BLOCK-TOWER\n",
-       "\n",
-       "    A blocks-world problem of stacking three blocks in a certain configuration,\n",
-       "    also known as the Sussman Anomaly.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> tbt = three_block_tower()\n",
-       "    >>> tbt.goal_test()\n",
-       "    False\n",
-       "    >>> tbt.act(expr('MoveToTable(C, A)'))\n",
-       "    >>> tbt.act(expr('Move(B, Table, C)'))\n",
-       "    >>> tbt.goal_test()\n",
-       "    False\n",
-       "    >>> tbt.act(expr('Move(A, Table, B)'))\n",
-       "    >>> tbt.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='On(A, Table) & On(B, Table) & On(C, A) & Block(A) & Block(B) & Block(C) & Clear(B) & Clear(C)',\n",
-       "                goals='On(A, B) & On(B, C)',\n",
-       "                actions=[Action('Move(b, x, y)',\n",
-       "                                precond='On(b, x) & Clear(b) & Clear(y) & Block(b) & Block(y)',\n",
-       "                                effect='On(b, y) & Clear(x) & ~On(b, x) & ~Clear(y)'),\n",
-       "                         Action('MoveToTable(b, x)',\n",
-       "                                precond='On(b, x) & Clear(b) & Block(b)',\n",
-       "                                effect='On(b, Table) & Clear(x) & ~On(b, x)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(three_block_tower)" ] @@ -1486,7 +682,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1502,17 +698,9 @@ }, { "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(threeBlockTower.goal_test())" ] @@ -1534,7 +722,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1555,17 +743,9 @@ }, { "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(threeBlockTower.goal_test())" ] @@ -1588,139 +768,9 @@ }, { "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def simple_blocks_world():\n",
-       "    """\n",
-       "    SIMPLE-BLOCKS-WORLD\n",
-       "\n",
-       "    A simplified definition of the Sussman Anomaly problem.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> sbw = simple_blocks_world()\n",
-       "    >>> sbw.goal_test()\n",
-       "    False\n",
-       "    >>> sbw.act(expr('ToTable(A, B)'))\n",
-       "    >>> sbw.act(expr('FromTable(B, A)'))\n",
-       "    >>> sbw.goal_test()\n",
-       "    False\n",
-       "    >>> sbw.act(expr('FromTable(C, B)'))\n",
-       "    >>> sbw.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='On(A, B) & Clear(A) & OnTable(B) & OnTable(C) & Clear(C)',\n",
-       "                goals='On(B, A) & On(C, B)',\n",
-       "                actions=[Action('ToTable(x, y)',\n",
-       "                                precond='On(x, y) & Clear(x)',\n",
-       "                                effect='~On(x, y) & Clear(y) & OnTable(x)'),\n",
-       "                         Action('FromTable(y, x)',\n",
-       "                                precond='OnTable(y) & Clear(y) & Clear(x)',\n",
-       "                                effect='~OnTable(y) & ~Clear(x) & On(y, x)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(simple_blocks_world)" ] @@ -1746,7 +796,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1762,20 +812,9 @@ }, { "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 109, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "simpleBlocksWorld.goal_test()" ] @@ -1797,7 +836,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1818,17 +857,9 @@ }, { "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(simpleBlocksWorld.goal_test())" ] @@ -1858,141 +889,9 @@ }, { "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def shopping_problem():\n",
-       "    """\n",
-       "    SHOPPING-PROBLEM\n",
-       "\n",
-       "    A problem of acquiring some items given their availability at certain stores.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> sp = shopping_problem()\n",
-       "    >>> sp.goal_test()\n",
-       "    False\n",
-       "    >>> sp.act(expr('Go(Home, HW)'))\n",
-       "    >>> sp.act(expr('Buy(Drill, HW)'))\n",
-       "    >>> sp.act(expr('Go(HW, SM)'))\n",
-       "    >>> sp.act(expr('Buy(Banana, SM)'))\n",
-       "    >>> sp.goal_test()\n",
-       "    False\n",
-       "    >>> sp.act(expr('Buy(Milk, SM)'))\n",
-       "    >>> sp.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='At(Home) & Sells(SM, Milk) & Sells(SM, Banana) & Sells(HW, Drill)',\n",
-       "                goals='Have(Milk) & Have(Banana) & Have(Drill)', \n",
-       "                actions=[Action('Buy(x, store)',\n",
-       "                                precond='At(store) & Sells(store, x)',\n",
-       "                                effect='Have(x)'),\n",
-       "                         Action('Go(x, y)',\n",
-       "                                precond='At(x)',\n",
-       "                                effect='At(y) & ~At(x)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(shopping_problem)" ] @@ -2012,7 +911,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2028,17 +927,9 @@ }, { "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(shoppingProblem.goal_test())" ] @@ -2064,7 +955,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2088,20 +979,9 @@ }, { "cell_type": "code", - "execution_count": 116, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "shoppingProblem.goal_test()" ] @@ -2130,146 +1010,9 @@ }, { "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def socks_and_shoes():\n",
-       "    """\n",
-       "    SOCKS-AND-SHOES-PROBLEM\n",
-       "\n",
-       "    A task of wearing socks and shoes on both feet\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> ss = socks_and_shoes()\n",
-       "    >>> ss.goal_test()\n",
-       "    False\n",
-       "    >>> ss.act(expr('RightSock'))\n",
-       "    >>> ss.act(expr('RightShoe'))\n",
-       "    >>> ss.act(expr('LeftSock'))\n",
-       "    >>> ss.goal_test()\n",
-       "    False\n",
-       "    >>> ss.act(expr('LeftShoe'))\n",
-       "    >>> ss.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='',\n",
-       "                goals='RightShoeOn & LeftShoeOn',\n",
-       "                actions=[Action('RightShoe',\n",
-       "                                precond='RightSockOn',\n",
-       "                                effect='RightShoeOn'),\n",
-       "                        Action('RightSock',\n",
-       "                                precond='',\n",
-       "                                effect='RightSockOn'),\n",
-       "                        Action('LeftShoe',\n",
-       "                                precond='LeftSockOn',\n",
-       "                                effect='LeftShoeOn'),\n",
-       "                        Action('LeftSock',\n",
-       "                                precond='',\n",
-       "                                effect='LeftSockOn')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(socks_and_shoes)" ] @@ -2289,7 +1032,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2305,20 +1048,9 @@ }, { "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "socksShoes.goal_test()" ] @@ -2333,7 +1065,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2345,20 +1077,9 @@ }, { "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "for action in solution:\n", " socksShoes.act(action)\n", @@ -2390,140 +1111,9 @@ }, { "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def have_cake_and_eat_cake_too():\n",
-       "    """\n",
-       "    [Figure 10.7] CAKE-PROBLEM\n",
-       "\n",
-       "    A problem where we begin with a cake and want to \n",
-       "    reach the state of having a cake and having eaten a cake.\n",
-       "    The possible actions include baking a cake and eating a cake.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> cp = have_cake_and_eat_cake_too()\n",
-       "    >>> cp.goal_test()\n",
-       "    False\n",
-       "    >>> cp.act(expr('Eat(Cake)'))\n",
-       "    >>> cp.goal_test()\n",
-       "    False\n",
-       "    >>> cp.act(expr('Bake(Cake)'))\n",
-       "    >>> cp.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='Have(Cake)',\n",
-       "                goals='Have(Cake) & Eaten(Cake)',\n",
-       "                actions=[Action('Eat(Cake)',\n",
-       "                                precond='Have(Cake)',\n",
-       "                                effect='Eaten(Cake) & ~Have(Cake)'),\n",
-       "                         Action('Bake(Cake)',\n",
-       "                                precond='~Have(Cake)',\n",
-       "                                effect='Have(Cake)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(have_cake_and_eat_cake_too)" ] @@ -2541,7 +1131,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2557,17 +1147,9 @@ }, { "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(cakeProblem.goal_test())" ] @@ -2593,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2613,17 +1195,9 @@ }, { "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(cakeProblem.goal_test())" ] @@ -2645,22 +1219,9 @@ }, { "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "ename": "Exception", - "evalue": "Action 'Bake(Cake)' pre-conditions not satisfied", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\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[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mcakeProblem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mact\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/aima-python/planning.py\u001b[0m in \u001b[0;36mact\u001b[0;34m(self, action)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Action '{}' not found\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mlist_action\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_precond\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Action '{}' pre-conditions not satisfied\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maction\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 61\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist_action\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclauses\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: Action 'Bake(Cake)' pre-conditions not satisfied" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "cakeProblem = have_cake_and_eat_cake_too()\n", "\n", @@ -2702,373 +1263,9 @@ }, { "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Problem(PlanningProblem):\n",
-       "    """\n",
-       "    Define real-world problems by aggregating resources as numerical quantities instead of\n",
-       "    named entities.\n",
-       "\n",
-       "    This class is identical to PDLL, except that it overloads the act function to handle\n",
-       "    resource and ordering conditions imposed by HLA as opposed to Action.\n",
-       "    """\n",
-       "    def __init__(self, init, goals, actions, jobs=None, resources=None):\n",
-       "        super().__init__(init, goals, actions)\n",
-       "        self.jobs = jobs\n",
-       "        self.resources = resources or {}\n",
-       "\n",
-       "    def act(self, action):\n",
-       "        """\n",
-       "        Performs the HLA given as argument.\n",
-       "\n",
-       "        Note that this is different from the superclass action - where the parameter was an\n",
-       "        Expression. For real world problems, an Expr object isn't enough to capture all the\n",
-       "        detail required for executing the action - resources, preconditions, etc need to be\n",
-       "        checked for too.\n",
-       "        """\n",
-       "        args = action.args\n",
-       "        list_action = first(a for a in self.actions if a.name == action.name)\n",
-       "        if list_action is None:\n",
-       "            raise Exception("Action '{}' not found".format(action.name))\n",
-       "        self.init = list_action.do_action(self.jobs, self.resources, self.init, args).clauses\n",
-       "\n",
-       "    def refinements(hla, state, library):  # refinements may be (multiple) HLA themselves ...\n",
-       "        """\n",
-       "        state is a Problem, containing the current state kb\n",
-       "        library is a dictionary containing details for every possible refinement. eg:\n",
-       "        {\n",
-       "        'HLA': [\n",
-       "            'Go(Home, SFO)',\n",
-       "            'Go(Home, SFO)',\n",
-       "            'Drive(Home, SFOLongTermParking)',\n",
-       "            'Shuttle(SFOLongTermParking, SFO)',\n",
-       "            'Taxi(Home, SFO)'\n",
-       "            ],\n",
-       "        'steps': [\n",
-       "            ['Drive(Home, SFOLongTermParking)', 'Shuttle(SFOLongTermParking, SFO)'],\n",
-       "            ['Taxi(Home, SFO)'],\n",
-       "            [],\n",
-       "            [],\n",
-       "            []\n",
-       "            ],\n",
-       "        # empty refinements indicate a primitive action\n",
-       "        'precond': [\n",
-       "            ['At(Home) & Have(Car)'],\n",
-       "            ['At(Home)'],\n",
-       "            ['At(Home) & Have(Car)'],\n",
-       "            ['At(SFOLongTermParking)'],\n",
-       "            ['At(Home)']\n",
-       "            ],\n",
-       "        'effect': [\n",
-       "            ['At(SFO) & ~At(Home)'],\n",
-       "            ['At(SFO) & ~At(Home)'],\n",
-       "            ['At(SFOLongTermParking) & ~At(Home)'],\n",
-       "            ['At(SFO) & ~At(SFOLongTermParking)'],\n",
-       "            ['At(SFO) & ~At(Home)']\n",
-       "            ]\n",
-       "        }\n",
-       "        """\n",
-       "        e = Expr(hla.name, hla.args)\n",
-       "        indices = [i for i, x in enumerate(library['HLA']) if expr(x).op == hla.name]\n",
-       "        for i in indices:\n",
-       "            actions = []\n",
-       "            for j in range(len(library['steps'][i])):\n",
-       "                # find the index of the step [j]  of the HLA \n",
-       "                index_step = [k for k,x in enumerate(library['HLA']) if x == library['steps'][i][j]][0]\n",
-       "                precond = library['precond'][index_step][0] # preconditions of step [j]\n",
-       "                effect = library['effect'][index_step][0] # effect of step [j]\n",
-       "                actions.append(HLA(library['steps'][i][j], precond, effect))\n",
-       "            yield actions\n",
-       "\n",
-       "    def hierarchical_search(problem, hierarchy):\n",
-       "        """\n",
-       "        [Figure 11.5] 'Hierarchical Search, a Breadth First Search implementation of Hierarchical\n",
-       "        Forward Planning Search'\n",
-       "        The problem is a real-world problem defined by the problem class, and the hierarchy is\n",
-       "        a dictionary of HLA - refinements (see refinements generator for details)\n",
-       "        """\n",
-       "        act = Node(problem.actions[0])\n",
-       "        frontier = deque()\n",
-       "        frontier.append(act)\n",
-       "        while True:\n",
-       "            if not frontier:\n",
-       "                return None\n",
-       "            plan = frontier.popleft()\n",
-       "            print(plan.state.name)\n",
-       "            hla = plan.state  # first_or_null(plan)\n",
-       "            prefix = None\n",
-       "            if plan.parent:\n",
-       "                prefix = plan.parent.state.action  # prefix, suffix = subseq(plan.state, hla)\n",
-       "            outcome = Problem.result(problem, prefix)\n",
-       "            if hla is None:\n",
-       "                if outcome.goal_test():\n",
-       "                    return plan.path()\n",
-       "            else:\n",
-       "                print("else")\n",
-       "                for sequence in Problem.refinements(hla, outcome, hierarchy):\n",
-       "                    print("...")\n",
-       "                    frontier.append(Node(plan.state, plan.parent, sequence))\n",
-       "\n",
-       "    def result(state, actions):\n",
-       "        """The outcome of applying an action to the current problem"""\n",
-       "        for a in actions: \n",
-       "            if a.check_precond(state, a.args):\n",
-       "                state = a(state, a.args).clauses\n",
-       "        return state\n",
-       "    \n",
-       "\n",
-       "    def angelic_search(problem, hierarchy, initial_plan):\n",
-       "        """\n",
-       "\t[Figure 11.8] A hierarchical planning algorithm that uses angelic semantics to identify and\n",
-       "\tcommit to high-level plans that work while avoiding high-level plans that don’t. \n",
-       "\tThe predicate MAKING-PROGRESS checks to make sure that we aren’t stuck in an infinite regression\n",
-       "\tof refinements. \n",
-       "\tAt top level, call ANGELIC -SEARCH with [Act ] as the initial_plan .\n",
-       "\n",
-       "        initial_plan contains a sequence of HLA's with angelic semantics \n",
-       "\n",
-       "        The possible effects of an angelic HLA in initial_plan are : \n",
-       "        ~ : effect remove\n",
-       "        $+: effect possibly add\n",
-       "        $-: effect possibly remove\n",
-       "        $$: possibly add or remove\n",
-       "\t"""\n",
-       "        frontier = deque(initial_plan)\n",
-       "        while True: \n",
-       "            if not frontier:\n",
-       "                return None\n",
-       "            plan = frontier.popleft() # sequence of HLA/Angelic HLA's \n",
-       "            opt_reachable_set = Problem.reach_opt(problem.init, plan)\n",
-       "            pes_reachable_set = Problem.reach_pes(problem.init, plan)\n",
-       "            if problem.intersects_goal(opt_reachable_set): \n",
-       "                if Problem.is_primitive( plan, hierarchy ): \n",
-       "                    return ([x for x in plan.action])\n",
-       "                guaranteed = problem.intersects_goal(pes_reachable_set) \n",
-       "                if guaranteed and Problem.making_progress(plan, plan):\n",
-       "                    final_state = guaranteed[0] # any element of guaranteed \n",
-       "                    #print('decompose')\n",
-       "                    return Problem.decompose(hierarchy, problem, plan, final_state, pes_reachable_set)\n",
-       "                (hla, index) = Problem.find_hla(plan, hierarchy) # there should be at least one HLA/Angelic_HLA, otherwise plan would be primitive.\n",
-       "                prefix = plan.action[:index-1]\n",
-       "                suffix = plan.action[index+1:]\n",
-       "                outcome = Problem(Problem.result(problem.init, prefix), problem.goals , problem.actions )\n",
-       "                for sequence in Problem.refinements(hla, outcome, hierarchy): # find refinements\n",
-       "                    frontier.append(Angelic_Node(outcome.init, plan, prefix + sequence+ suffix, prefix+sequence+suffix))\n",
-       "\n",
-       "\n",
-       "    def intersects_goal(problem, reachable_set):\n",
-       "        """\n",
-       "        Find the intersection of the reachable states and the goal\n",
-       "        """\n",
-       "        return [y for x in list(reachable_set.keys()) for y in reachable_set[x] if all(goal in y for goal in problem.goals)] \n",
-       "\n",
-       "\n",
-       "    def is_primitive(plan,  library):\n",
-       "        """\n",
-       "        checks if the hla is primitive action \n",
-       "        """\n",
-       "        for hla in plan.action: \n",
-       "            indices = [i for i, x in enumerate(library['HLA']) if expr(x).op == hla.name]\n",
-       "            for i in indices:\n",
-       "                if library["steps"][i]: \n",
-       "                    return False\n",
-       "        return True\n",
-       "             \n",
-       "\n",
-       "\n",
-       "    def reach_opt(init, plan): \n",
-       "        """\n",
-       "        Finds the optimistic reachable set of the sequence of actions in plan \n",
-       "        """\n",
-       "        reachable_set = {0: [init]}\n",
-       "        optimistic_description = plan.action #list of angelic actions with optimistic description\n",
-       "        return Problem.find_reachable_set(reachable_set, optimistic_description)\n",
-       " \n",
-       "\n",
-       "    def reach_pes(init, plan): \n",
-       "        """ \n",
-       "        Finds the pessimistic reachable set of the sequence of actions in plan\n",
-       "        """\n",
-       "        reachable_set = {0: [init]}\n",
-       "        pessimistic_description = plan.action_pes # list of angelic actions with pessimistic description\n",
-       "        return Problem.find_reachable_set(reachable_set, pessimistic_description)\n",
-       "\n",
-       "    def find_reachable_set(reachable_set, action_description):\n",
-       "        """\n",
-       "\tFinds the reachable states of the action_description when applied in each state of reachable set.\n",
-       "\t"""\n",
-       "        for i in range(len(action_description)):\n",
-       "            reachable_set[i+1]=[]\n",
-       "            if type(action_description[i]) is Angelic_HLA:\n",
-       "                possible_actions = action_description[i].angelic_action()\n",
-       "            else: \n",
-       "                possible_actions = action_description\n",
-       "            for action in possible_actions:\n",
-       "                for state in reachable_set[i]:\n",
-       "                    if action.check_precond(state , action.args) :\n",
-       "                        if action.effect[0] :\n",
-       "                            new_state = action(state, action.args).clauses\n",
-       "                            reachable_set[i+1].append(new_state)\n",
-       "                        else: \n",
-       "                            reachable_set[i+1].append(state)\n",
-       "        return reachable_set\n",
-       "\n",
-       "    def find_hla(plan, hierarchy):\n",
-       "        """\n",
-       "        Finds the the first HLA action in plan.action, which is not primitive\n",
-       "        and its corresponding index in plan.action\n",
-       "        """\n",
-       "        hla = None\n",
-       "        index = len(plan.action)\n",
-       "        for i in range(len(plan.action)): # find the first HLA in plan, that is not primitive\n",
-       "            if not Problem.is_primitive(Node(plan.state, plan.parent, [plan.action[i]]), hierarchy):\n",
-       "                hla = plan.action[i] \n",
-       "                index = i\n",
-       "                break\n",
-       "        return (hla, index)\n",
-       "\t\n",
-       "    def making_progress(plan, initial_plan):\n",
-       "        """ \n",
-       "        Not correct\n",
-       "\n",
-       "        Normally should from infinite regression of refinements \n",
-       "        \n",
-       "        Only case covered: when plan contains one action (then there is no regression to be done)  \n",
-       "        """\n",
-       "        if (len(plan.action)==1):\n",
-       "            return False\n",
-       "        return True \n",
-       "\n",
-       "    def decompose(hierarchy, s_0, plan, s_f, reachable_set):\n",
-       "        solution = [] \n",
-       "        while plan.action_pes: \n",
-       "            action = plan.action_pes.pop()\n",
-       "            i = max(reachable_set.keys())\n",
-       "            if (i==0): \n",
-       "                return solution\n",
-       "            s_i = Problem.find_previous_state(s_f, reachable_set,i, action) \n",
-       "            problem = Problem(s_i, s_f , plan.action)\n",
-       "            j=0\n",
-       "            for x in Problem.angelic_search(problem, hierarchy, [Angelic_Node(s_i, Node(None), [action],[action])]):\n",
-       "                solution.insert(j,x)\n",
-       "                j+=1\n",
-       "            s_f = s_i\n",
-       "        return solution\n",
-       "\n",
-       "\n",
-       "    def find_previous_state(s_f, reachable_set, i, action):\n",
-       "        """\n",
-       "        Given a final state s_f and an action finds a state s_i in reachable_set \n",
-       "        such that when action is applied to state s_i returns s_f.  \n",
-       "        """\n",
-       "        s_i = reachable_set[i-1][0]\n",
-       "        for state in reachable_set[i-1]:\n",
-       "            if s_f in [x for x in Problem.reach_pes(state, Angelic_Node(state, None, [action],[action]))[1]]:\n",
-       "                s_i =state\n",
-       "                break\n",
-       "        return s_i\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PlanningProblem)" ] @@ -3083,189 +1280,9 @@ }, { "cell_type": "code", - "execution_count": 130, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class HLA(Action):\n",
-       "    """\n",
-       "    Define Actions for the real-world (that may be refined further), and satisfy resource\n",
-       "    constraints.\n",
-       "    """\n",
-       "    unique_group = 1\n",
-       "\n",
-       "    def __init__(self, action, precond=None, effect=None, duration=0,\n",
-       "                 consume=None, use=None):\n",
-       "        """\n",
-       "        As opposed to actions, to define HLA, we have added constraints.\n",
-       "        duration holds the amount of time required to execute the task\n",
-       "        consumes holds a dictionary representing the resources the task consumes\n",
-       "        uses holds a dictionary representing the resources the task uses\n",
-       "        """\n",
-       "        precond = precond or [None]\n",
-       "        effect = effect or [None]\n",
-       "        super().__init__(action, precond, effect)\n",
-       "        self.duration = duration\n",
-       "        self.consumes = consume or {}\n",
-       "        self.uses = use or {}\n",
-       "        self.completed = False\n",
-       "        # self.priority = -1 #  must be assigned in relation to other HLAs\n",
-       "        # self.job_group = -1 #  must be assigned in relation to other HLAs\n",
-       "\n",
-       "    def do_action(self, job_order, available_resources, kb, args):\n",
-       "        """\n",
-       "        An HLA based version of act - along with knowledge base updation, it handles\n",
-       "        resource checks, and ensures the actions are executed in the correct order.\n",
-       "        """\n",
-       "        # print(self.name)\n",
-       "        if not self.has_usable_resource(available_resources):\n",
-       "            raise Exception('Not enough usable resources to execute {}'.format(self.name))\n",
-       "        if not self.has_consumable_resource(available_resources):\n",
-       "            raise Exception('Not enough consumable resources to execute {}'.format(self.name))\n",
-       "        if not self.inorder(job_order):\n",
-       "            raise Exception("Can't execute {} - execute prerequisite actions first".\n",
-       "                            format(self.name))\n",
-       "        kb = super().act(kb, args)  # update knowledge base\n",
-       "        for resource in self.consumes:  # remove consumed resources\n",
-       "            available_resources[resource] -= self.consumes[resource]\n",
-       "        self.completed = True  # set the task status to complete\n",
-       "        return kb\n",
-       "\n",
-       "    def has_consumable_resource(self, available_resources):\n",
-       "        """\n",
-       "        Ensure there are enough consumable resources for this action to execute.\n",
-       "        """\n",
-       "        for resource in self.consumes:\n",
-       "            if available_resources.get(resource) is None:\n",
-       "                return False\n",
-       "            if available_resources[resource] < self.consumes[resource]:\n",
-       "                return False\n",
-       "        return True\n",
-       "\n",
-       "    def has_usable_resource(self, available_resources):\n",
-       "        """\n",
-       "        Ensure there are enough usable resources for this action to execute.\n",
-       "        """\n",
-       "        for resource in self.uses:\n",
-       "            if available_resources.get(resource) is None:\n",
-       "                return False\n",
-       "            if available_resources[resource] < self.uses[resource]:\n",
-       "                return False\n",
-       "        return True\n",
-       "\n",
-       "    def inorder(self, job_order):\n",
-       "        """\n",
-       "        Ensure that all the jobs that had to be executed before the current one have been\n",
-       "        successfully executed.\n",
-       "        """\n",
-       "        for jobs in job_order:\n",
-       "            if self in jobs:\n",
-       "                for job in jobs:\n",
-       "                    if job is self:\n",
-       "                        return True\n",
-       "                    if not job.completed:\n",
-       "                        return False\n",
-       "        return True\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(HLA)" ] @@ -3302,153 +1319,9 @@ }, { "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def job_shop_problem():\n",
-       "    """\n",
-       "    [Figure 11.1] JOB-SHOP-PROBLEM\n",
-       "\n",
-       "    A job-shop scheduling problem for assembling two cars,\n",
-       "    with resource and ordering constraints.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> p = job_shop_problem()\n",
-       "    >>> p.goal_test()\n",
-       "    False\n",
-       "    >>> p.act(p.jobs[1][0])\n",
-       "    >>> p.act(p.jobs[1][1])\n",
-       "    >>> p.act(p.jobs[1][2])\n",
-       "    >>> p.act(p.jobs[0][0])\n",
-       "    >>> p.act(p.jobs[0][1])\n",
-       "    >>> p.goal_test()\n",
-       "    False\n",
-       "    >>> p.act(p.jobs[0][2])\n",
-       "    >>> p.goal_test()\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "    resources = {'EngineHoists': 1, 'WheelStations': 2, 'Inspectors': 2, 'LugNuts': 500}\n",
-       "\n",
-       "    add_engine1 = HLA('AddEngine1', precond='~Has(C1, E1)', effect='Has(C1, E1)', duration=30, use={'EngineHoists': 1})\n",
-       "    add_engine2 = HLA('AddEngine2', precond='~Has(C2, E2)', effect='Has(C2, E2)', duration=60, use={'EngineHoists': 1})\n",
-       "    add_wheels1 = HLA('AddWheels1', precond='~Has(C1, W1)', effect='Has(C1, W1)', duration=30, use={'WheelStations': 1}, consume={'LugNuts': 20})\n",
-       "    add_wheels2 = HLA('AddWheels2', precond='~Has(C2, W2)', effect='Has(C2, W2)', duration=15, use={'WheelStations': 1}, consume={'LugNuts': 20})\n",
-       "    inspect1 = HLA('Inspect1', precond='~Inspected(C1)', effect='Inspected(C1)', duration=10, use={'Inspectors': 1})\n",
-       "    inspect2 = HLA('Inspect2', precond='~Inspected(C2)', effect='Inspected(C2)', duration=10, use={'Inspectors': 1})\n",
-       "\n",
-       "    actions = [add_engine1, add_engine2, add_wheels1, add_wheels2, inspect1, inspect2]\n",
-       "\n",
-       "    job_group1 = [add_engine1, add_wheels1, inspect1]\n",
-       "    job_group2 = [add_engine2, add_wheels2, inspect2]\n",
-       "\n",
-       "    return Problem(init='Car(C1) & Car(C2) & Wheels(W1) & Wheels(W2) & Engine(E2) & Engine(E2) & ~Has(C1, E1) & ~Has(C2, E2) & ~Has(C1, W1) & ~Has(C2, W2) & ~Inspected(C1) & ~Inspected(C2)',\n",
-       "                   goals='Has(C1, W1) & Has(C1, E1) & Inspected(C1) & Has(C2, W2) & Has(C2, E2) & Inspected(C2)',\n",
-       "                   actions=actions,\n",
-       "                   jobs=[job_group1, job_group2],\n",
-       "                   resources=resources)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(job_shop_problem)" ] @@ -3479,7 +1352,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3495,17 +1368,9 @@ }, { "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(jobShopProblem.goal_test())" ] @@ -3539,7 +1404,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3556,17 +1421,9 @@ }, { "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(jobShopProblem.goal_test())" ] @@ -3596,140 +1453,9 @@ }, { "cell_type": "code", - "execution_count": 172, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def double_tennis_problem():\n",
-       "    """\n",
-       "    [Figure 11.10] DOUBLE-TENNIS-PROBLEM\n",
-       "\n",
-       "    A multiagent planning problem involving two partner tennis players\n",
-       "    trying to return an approaching ball and repositioning around in the court.\n",
-       "\n",
-       "    Example:\n",
-       "    >>> from aima.planning import *\n",
-       "    >>> dtp = double_tennis_problem()\n",
-       "    >>> goal_test(dtp.goals, dtp.init)\n",
-       "    False\n",
-       "    >>> dtp.act(expr('Go(A, RightBaseLine, LeftBaseLine)'))\n",
-       "    >>> dtp.act(expr('Hit(A, Ball, RightBaseLine)'))\n",
-       "    >>> goal_test(dtp.goals, dtp.init)\n",
-       "    False\n",
-       "    >>> dtp.act(expr('Go(A, LeftNet, RightBaseLine)'))\n",
-       "    >>> goal_test(dtp.goals, dtp.init)\n",
-       "    True\n",
-       "    >>>\n",
-       "    """\n",
-       "\n",
-       "    return PlanningProblem(init='At(A, LeftBaseLine) & At(B, RightNet) & Approaching(Ball, RightBaseLine) & Partner(A, B) & Partner(B, A)',\n",
-       "                             goals='Returned(Ball) & At(a, LeftNet) & At(a, RightNet)',\n",
-       "                             actions=[Action('Hit(actor, Ball, loc)',\n",
-       "                                             precond='Approaching(Ball, loc) & At(actor, loc)',\n",
-       "                                             effect='Returned(Ball)'),\n",
-       "                                      Action('Go(actor, to, loc)', \n",
-       "                                             precond='At(actor, loc)',\n",
-       "                                             effect='At(actor, to) & ~At(actor, loc)')])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(double_tennis_problem)" ] @@ -3753,7 +1479,7 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3769,17 +1495,9 @@ }, { "cell_type": "code", - "execution_count": 174, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(doubleTennisProblem.goal_test())" ] @@ -3812,7 +1530,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3826,20 +1544,9 @@ }, { "cell_type": "code", - "execution_count": 178, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 178, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "doubleTennisProblem.goal_test()" ] diff --git a/notebooks/planning_angelic_search.ipynb b/notebooks/planning_angelic_search.ipynb index afae6a932..c9bc62b04 100644 --- a/notebooks/planning_angelic_search.ipynb +++ b/notebooks/planning_angelic_search.ipynb @@ -25,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -58,147 +58,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def angelic_search(problem, hierarchy, initial_plan):\n",
-       "        """\n",
-       "\t[Figure 11.8] A hierarchical planning algorithm that uses angelic semantics to identify and\n",
-       "\tcommit to high-level plans that work while avoiding high-level plans that don’t. \n",
-       "\tThe predicate MAKING-PROGRESS checks to make sure that we aren’t stuck in an infinite regression\n",
-       "\tof refinements. \n",
-       "\tAt top level, call ANGELIC -SEARCH with [Act ] as the initial_plan .\n",
-       "\n",
-       "        initial_plan contains a sequence of HLA's with angelic semantics \n",
-       "\n",
-       "        The possible effects of an angelic HLA in initial_plan are : \n",
-       "        ~ : effect remove\n",
-       "        $+: effect possibly add\n",
-       "        $-: effect possibly remove\n",
-       "        $$: possibly add or remove\n",
-       "\t"""\n",
-       "        frontier = deque(initial_plan)\n",
-       "        while True: \n",
-       "            if not frontier:\n",
-       "                return None\n",
-       "            plan = frontier.popleft() # sequence of HLA/Angelic HLA's \n",
-       "            opt_reachable_set = Problem.reach_opt(problem.init, plan)\n",
-       "            pes_reachable_set = Problem.reach_pes(problem.init, plan)\n",
-       "            if problem.intersects_goal(opt_reachable_set): \n",
-       "                if Problem.is_primitive( plan, hierarchy ): \n",
-       "                    return ([x for x in plan.action])\n",
-       "                guaranteed = problem.intersects_goal(pes_reachable_set) \n",
-       "                if guaranteed and Problem.making_progress(plan, initial_plan):\n",
-       "                    final_state = guaranteed[0] # any element of guaranteed \n",
-       "                    #print('decompose')\n",
-       "                    return Problem.decompose(hierarchy, problem, plan, final_state, pes_reachable_set)\n",
-       "                (hla, index) = Problem.find_hla(plan, hierarchy) # there should be at least one HLA/Angelic_HLA, otherwise plan would be primitive.\n",
-       "                prefix = plan.action[:index]\n",
-       "                suffix = plan.action[index+1:]\n",
-       "                outcome = Problem(Problem.result(problem.init, prefix), problem.goals , problem.actions )\n",
-       "                for sequence in Problem.refinements(hla, outcome, hierarchy): # find refinements\n",
-       "                    frontier.append(Angelic_Node(outcome.init, plan, prefix + sequence+ suffix, prefix+sequence+suffix))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(RealWorldPlanningProblem.angelic_search)" ] @@ -217,128 +79,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def decompose(hierarchy, s_0, plan, s_f, reachable_set):\n",
-       "        solution = [] \n",
-       "        i = max(reachable_set.keys())\n",
-       "        while plan.action_pes: \n",
-       "            action = plan.action_pes.pop()\n",
-       "            if (i==0): \n",
-       "                return solution\n",
-       "            s_i = Problem.find_previous_state(s_f, reachable_set,i, action) \n",
-       "            problem = Problem(s_i, s_f , plan.action)\n",
-       "            angelic_call = Problem.angelic_search(problem, hierarchy, [Angelic_Node(s_i, Node(None), [action],[action])])\n",
-       "            if angelic_call:\n",
-       "                for x in angelic_call: \n",
-       "                    solution.insert(0,x)\n",
-       "            else: \n",
-       "                return None\n",
-       "            s_f = s_i\n",
-       "            i-=1\n",
-       "        return solution\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(RealWorldPlanningProblem.decompose)" ] @@ -360,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -382,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -402,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -424,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -444,19 +187,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[At(Home), Have(Cash), Have(Car)], [Have(Cash), Have(Car), At(SFO), NotAt(Home)], [Have(Cash), Have(Car), NotAt(Home)], [At(Home), Have(Cash), Have(Car), At(SFO)], [At(Home), Have(Cash), Have(Car)]] \n", - "\n", - "[[At(Home), Have(Cash), Have(Car)], [Have(Cash), Have(Car), At(SFO), NotAt(Home)], [Have(Cash), Have(Car), NotAt(Home)]]\n" - ] - } - ], + "outputs": [], "source": [ "opt_reachable_set = RealWorldPlanningProblem.reach_opt(prob.initial, initial_plan[0])\n", "pes_reachable_set = RealWorldPlanningProblem.reach_pes(prob.initial, initial_plan[0])\n", @@ -473,22 +206,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Drive(Home, SFOLongTermParking)), HLA(Shuttle(SFOLongTermParking, SFO))]\n", - "[{'duration': 0, 'effect': [At(SFOLongTermParking), NotAt(Home)], 'args': (Home, SFOLongTermParking), 'uses': {}, 'consumes': {}, 'name': 'Drive', 'completed': False, 'precond': [At(Home), Have(Car)]}, {'duration': 0, 'effect': [At(SFO), NotAt(LongTermParking)], 'args': (SFOLongTermParking, SFO), 'uses': {}, 'consumes': {}, 'name': 'Shuttle', 'completed': False, 'precond': [At(SFOLongTermParking)]}] \n", - "\n", - "[HLA(Taxi(Home, SFO))]\n", - "[{'duration': 0, 'effect': [At(SFO), NotAt(Home), NotHave(Cash)], 'args': (Home, SFO), 'uses': {}, 'consumes': {}, 'name': 'Taxi', 'completed': False, 'precond': [At(Home)]}] \n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for sequence in RealWorldPlanningProblem.refinements(go_SFO, library):\n", " print (sequence)\n", @@ -505,19 +225,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Drive(Home, SFOLongTermParking)), HLA(Shuttle(SFOLongTermParking, SFO))] \n", - "\n", - "[{'duration': 0, 'effect': [At(SFOLongTermParking), NotAt(Home)], 'args': (Home, SFOLongTermParking), 'uses': {}, 'consumes': {}, 'name': 'Drive', 'completed': False, 'precond': [At(Home), Have(Car)]}, {'duration': 0, 'effect': [At(SFO), NotAt(LongTermParking)], 'args': (SFOLongTermParking, SFO), 'uses': {}, 'consumes': {}, 'name': 'Shuttle', 'completed': False, 'precond': [At(SFOLongTermParking)]}]\n" - ] - } - ], + "outputs": [], "source": [ "plan= RealWorldPlanningProblem.angelic_search(prob, library, initial_plan)\n", "print (plan, '\\n')\n", @@ -533,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -547,19 +257,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Bus(Home, MetroStop)), HLA(Metro1(MetroStop, SFO))] \n", - "\n", - "[{'duration': 0, 'effect': [At(MetroStop), NotAt(Home)], 'args': (Home, MetroStop), 'uses': {}, 'consumes': {}, 'name': 'Bus', 'completed': False, 'precond': [At(Home)]}, {'duration': 0, 'effect': [At(SFO), NotAt(MetroStop)], 'args': (MetroStop, SFO), 'uses': {}, 'consumes': {}, 'name': 'Metro1', 'completed': False, 'precond': [At(MetroStop)]}]\n" - ] - } - ], + "outputs": [], "source": [ "plan_2 = RealWorldPlanningProblem.angelic_search(prob, library_2, initial_plan)\n", "print(plan_2, '\\n')\n", @@ -577,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -591,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -606,17 +306,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], + "outputs": [], "source": [ "plan_3 = prob_3.angelic_search(library_3, initialPlan_3)\n", "print(plan_3)" diff --git a/notebooks/planning_graph_plan.ipynb b/notebooks/planning_graph_plan.ipynb index 5e369f10e..4f5077733 100644 --- a/notebooks/planning_graph_plan.ipynb +++ b/notebooks/planning_graph_plan.ipynb @@ -68,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -78,239 +78,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Level:\n",
-       "    """\n",
-       "    Contains the state of the planning problem\n",
-       "    and exhaustive list of actions which use the\n",
-       "    states as pre-condition.\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, kb):\n",
-       "        """Initializes variables to hold state and action details of a level"""\n",
-       "\n",
-       "        self.kb = kb\n",
-       "        # current state\n",
-       "        self.current_state = kb.clauses\n",
-       "        # current action to state link\n",
-       "        self.current_action_links = {}\n",
-       "        # current state to action link\n",
-       "        self.current_state_links = {}\n",
-       "        # current action to next state link\n",
-       "        self.next_action_links = {}\n",
-       "        # next state to current action link\n",
-       "        self.next_state_links = {}\n",
-       "        # mutually exclusive actions\n",
-       "        self.mutex = []\n",
-       "\n",
-       "    def __call__(self, actions, objects):\n",
-       "        self.build(actions, objects)\n",
-       "        self.find_mutex()\n",
-       "\n",
-       "    def separate(self, e):\n",
-       "        """Separates an iterable of elements into positive and negative parts"""\n",
-       "\n",
-       "        positive = []\n",
-       "        negative = []\n",
-       "        for clause in e:\n",
-       "            if clause.op[:3] == 'Not':\n",
-       "                negative.append(clause)\n",
-       "            else:\n",
-       "                positive.append(clause)\n",
-       "        return positive, negative\n",
-       "\n",
-       "    def find_mutex(self):\n",
-       "        """Finds mutually exclusive actions"""\n",
-       "\n",
-       "        # Inconsistent effects\n",
-       "        pos_nsl, neg_nsl = self.separate(self.next_state_links)\n",
-       "\n",
-       "        for negeff in neg_nsl:\n",
-       "            new_negeff = Expr(negeff.op[3:], *negeff.args)\n",
-       "            for poseff in pos_nsl:\n",
-       "                if new_negeff == poseff:\n",
-       "                    for a in self.next_state_links[poseff]:\n",
-       "                        for b in self.next_state_links[negeff]:\n",
-       "                            if {a, b} not in self.mutex:\n",
-       "                                self.mutex.append({a, b})\n",
-       "\n",
-       "        # Interference will be calculated with the last step\n",
-       "        pos_csl, neg_csl = self.separate(self.current_state_links)\n",
-       "\n",
-       "        # Competing needs\n",
-       "        for posprecond in pos_csl:\n",
-       "            for negprecond in neg_csl:\n",
-       "                new_negprecond = Expr(negprecond.op[3:], *negprecond.args)\n",
-       "                if new_negprecond == posprecond:\n",
-       "                    for a in self.current_state_links[posprecond]:\n",
-       "                        for b in self.current_state_links[negprecond]:\n",
-       "                            if {a, b} not in self.mutex:\n",
-       "                                self.mutex.append({a, b})\n",
-       "\n",
-       "        # Inconsistent support\n",
-       "        state_mutex = []\n",
-       "        for pair in self.mutex:\n",
-       "            next_state_0 = self.next_action_links[list(pair)[0]]\n",
-       "            if len(pair) == 2:\n",
-       "                next_state_1 = self.next_action_links[list(pair)[1]]\n",
-       "            else:\n",
-       "                next_state_1 = self.next_action_links[list(pair)[0]]\n",
-       "            if (len(next_state_0) == 1) and (len(next_state_1) == 1):\n",
-       "                state_mutex.append({next_state_0[0], next_state_1[0]})\n",
-       "        \n",
-       "        self.mutex = self.mutex + state_mutex\n",
-       "\n",
-       "    def build(self, actions, objects):\n",
-       "        """Populates the lists and dictionaries containing the state action dependencies"""\n",
-       "\n",
-       "        for clause in self.current_state:\n",
-       "            p_expr = Expr('P' + clause.op, *clause.args)\n",
-       "            self.current_action_links[p_expr] = [clause]\n",
-       "            self.next_action_links[p_expr] = [clause]\n",
-       "            self.current_state_links[clause] = [p_expr]\n",
-       "            self.next_state_links[clause] = [p_expr]\n",
-       "\n",
-       "        for a in actions:\n",
-       "            num_args = len(a.args)\n",
-       "            possible_args = tuple(itertools.permutations(objects, num_args))\n",
-       "\n",
-       "            for arg in possible_args:\n",
-       "                if a.check_precond(self.kb, arg):\n",
-       "                    for num, symbol in enumerate(a.args):\n",
-       "                        if not symbol.op.islower():\n",
-       "                            arg = list(arg)\n",
-       "                            arg[num] = symbol\n",
-       "                            arg = tuple(arg)\n",
-       "\n",
-       "                    new_action = a.substitute(Expr(a.name, *a.args), arg)\n",
-       "                    self.current_action_links[new_action] = []\n",
-       "\n",
-       "                    for clause in a.precond:\n",
-       "                        new_clause = a.substitute(clause, arg)\n",
-       "                        self.current_action_links[new_action].append(new_clause)\n",
-       "                        if new_clause in self.current_state_links:\n",
-       "                            self.current_state_links[new_clause].append(new_action)\n",
-       "                        else:\n",
-       "                            self.current_state_links[new_clause] = [new_action]\n",
-       "                   \n",
-       "                    self.next_action_links[new_action] = []\n",
-       "                    for clause in a.effect:\n",
-       "                        new_clause = a.substitute(clause, arg)\n",
-       "\n",
-       "                        self.next_action_links[new_action].append(new_clause)\n",
-       "                        if new_clause in self.next_state_links:\n",
-       "                            self.next_state_links[new_clause].append(new_action)\n",
-       "                        else:\n",
-       "                            self.next_state_links[new_clause] = [new_action]\n",
-       "\n",
-       "    def perform_actions(self):\n",
-       "        """Performs the necessary actions and returns a new Level"""\n",
-       "\n",
-       "        new_kb = FolKB(list(set(self.next_state_links.keys())))\n",
-       "        return Level(new_kb)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(Level)" ] @@ -344,140 +114,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Graph:\n",
-       "    """\n",
-       "    Contains levels of state and actions\n",
-       "    Used in graph planning algorithm to extract a solution\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, planningproblem):\n",
-       "        self.planningproblem = planningproblem\n",
-       "        self.kb = FolKB(planningproblem.init)\n",
-       "        self.levels = [Level(self.kb)]\n",
-       "        self.objects = set(arg for clause in self.kb.clauses for arg in clause.args)\n",
-       "\n",
-       "    def __call__(self):\n",
-       "        self.expand_graph()\n",
-       "\n",
-       "    def expand_graph(self):\n",
-       "        """Expands the graph by a level"""\n",
-       "\n",
-       "        last_level = self.levels[-1]\n",
-       "        last_level(self.planningproblem.actions, self.objects)\n",
-       "        self.levels.append(last_level.perform_actions())\n",
-       "\n",
-       "    def non_mutex_goals(self, goals, index):\n",
-       "        """Checks whether the goals are mutually exclusive"""\n",
-       "\n",
-       "        goal_perm = itertools.combinations(goals, 2)\n",
-       "        for g in goal_perm:\n",
-       "            if set(g) in self.levels[index].mutex:\n",
-       "                return False\n",
-       "        return True\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(Graph)" ] @@ -503,205 +142,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class GraphPlan:\n",
-       "    """\n",
-       "    Class for formulation GraphPlan algorithm\n",
-       "    Constructs a graph of state and action space\n",
-       "    Returns solution for the planning problem\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, planningproblem):\n",
-       "        self.graph = Graph(planningproblem)\n",
-       "        self.nogoods = []\n",
-       "        self.solution = []\n",
-       "\n",
-       "    def check_leveloff(self):\n",
-       "        """Checks if the graph has levelled off"""\n",
-       "\n",
-       "        check = (set(self.graph.levels[-1].current_state) == set(self.graph.levels[-2].current_state))\n",
-       "\n",
-       "        if check:\n",
-       "            return True\n",
-       "\n",
-       "    def extract_solution(self, goals, index):\n",
-       "        """Extracts the solution"""\n",
-       "\n",
-       "        level = self.graph.levels[index]    \n",
-       "        if not self.graph.non_mutex_goals(goals, index):\n",
-       "            self.nogoods.append((level, goals))\n",
-       "            return\n",
-       "\n",
-       "        level = self.graph.levels[index - 1]    \n",
-       "\n",
-       "        # Create all combinations of actions that satisfy the goal    \n",
-       "        actions = []\n",
-       "        for goal in goals:\n",
-       "            actions.append(level.next_state_links[goal])    \n",
-       "\n",
-       "        all_actions = list(itertools.product(*actions))    \n",
-       "\n",
-       "        # Filter out non-mutex actions\n",
-       "        non_mutex_actions = []    \n",
-       "        for action_tuple in all_actions:\n",
-       "            action_pairs = itertools.combinations(list(set(action_tuple)), 2)        \n",
-       "            non_mutex_actions.append(list(set(action_tuple)))        \n",
-       "            for pair in action_pairs:            \n",
-       "                if set(pair) in level.mutex:\n",
-       "                    non_mutex_actions.pop(-1)\n",
-       "                    break\n",
-       "    \n",
-       "\n",
-       "        # Recursion\n",
-       "        for action_list in non_mutex_actions:        \n",
-       "            if [action_list, index] not in self.solution:\n",
-       "                self.solution.append([action_list, index])\n",
-       "\n",
-       "                new_goals = []\n",
-       "                for act in set(action_list):                \n",
-       "                    if act in level.current_action_links:\n",
-       "                        new_goals = new_goals + level.current_action_links[act]\n",
-       "\n",
-       "                if abs(index) + 1 == len(self.graph.levels):\n",
-       "                    return\n",
-       "                elif (level, new_goals) in self.nogoods:\n",
-       "                    return\n",
-       "                else:\n",
-       "                    self.extract_solution(new_goals, index - 1)\n",
-       "\n",
-       "        # Level-Order multiple solutions\n",
-       "        solution = []\n",
-       "        for item in self.solution:\n",
-       "            if item[1] == -1:\n",
-       "                solution.append([])\n",
-       "                solution[-1].append(item[0])\n",
-       "            else:\n",
-       "                solution[-1].append(item[0])\n",
-       "\n",
-       "        for num, item in enumerate(solution):\n",
-       "            item.reverse()\n",
-       "            solution[num] = item\n",
-       "\n",
-       "        return solution\n",
-       "\n",
-       "    def goal_test(self, kb):\n",
-       "        return all(kb.ask(q) is not False for q in self.graph.planningproblem.goals)\n",
-       "\n",
-       "    def execute(self):\n",
-       "        """Executes the GraphPlan algorithm for the given problem"""\n",
-       "\n",
-       "        while True:\n",
-       "            self.graph.expand_graph()\n",
-       "            if (self.goal_test(self.graph.levels[-1].kb) and self.graph.non_mutex_goals(self.graph.planningproblem.goals, -1)):\n",
-       "                solution = self.extract_solution(self.graph.planningproblem.goals, -1)\n",
-       "                if solution:\n",
-       "                    return solution\n",
-       "            \n",
-       "            if len(self.graph.levels) >= 2 and self.check_leveloff():\n",
-       "                return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(GraphPlan)" ] @@ -749,113 +192,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def air_cargo_graphplan():\n",
-       "    """Solves the air cargo problem using GraphPlan"""\n",
-       "    return GraphPlan(air_cargo()).execute()\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(air_cargo_graph_plan)" ] @@ -869,30 +208,9 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[[Load(C2, P2, JFK),\n", - " PAirport(SFO),\n", - " PAirport(JFK),\n", - " PPlane(P2),\n", - " PPlane(P1),\n", - " Fly(P2, JFK, SFO),\n", - " PCargo(C2),\n", - " Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " PCargo(C1)],\n", - " [Unload(C2, P2, SFO), Unload(C1, P1, JFK)]]]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "airCargoG = air_cargo_graph_plan()\n", "airCargoG" @@ -911,25 +229,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Unload(C2, P2, SFO),\n", - " Unload(C1, P1, JFK)]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "linearize(airCargoG)" ] @@ -947,20 +249,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "spareTireG = spare_tire_graph_plan()\n", "linearize(spareTireG)" @@ -975,20 +266,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Eat(Cake), Bake(Cake)]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cakeProblemG = have_cake_and_eat_cake_too_graph_plan()\n", "linearize(cakeProblemG)" @@ -1003,20 +283,9 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "sussmanAnomalyG = three_block_tower_graph_plan()\n", "linearize(sussmanAnomalyG)" @@ -1031,20 +300,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[RightSock, LeftSock, RightShoe, LeftShoe]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "socksShoesG = socks_and_shoes_graph_plan()\n", "linearize(socksShoesG)" diff --git a/notebooks/planning_hierarchical_search.ipynb b/notebooks/planning_hierarchical_search.ipynb index 8edfb84dc..33e23c87d 100644 --- a/notebooks/planning_hierarchical_search.ipynb +++ b/notebooks/planning_hierarchical_search.ipynb @@ -53,157 +53,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def refinements(hla, state, library):  # refinements may be (multiple) HLA themselves ...\n",
-       "        """\n",
-       "        state is a Problem, containing the current state kb\n",
-       "        library is a dictionary containing details for every possible refinement. eg:\n",
-       "        {\n",
-       "        'HLA': [\n",
-       "            'Go(Home, SFO)',\n",
-       "            'Go(Home, SFO)',\n",
-       "            'Drive(Home, SFOLongTermParking)',\n",
-       "            'Shuttle(SFOLongTermParking, SFO)',\n",
-       "            'Taxi(Home, SFO)'\n",
-       "            ],\n",
-       "        'steps': [\n",
-       "            ['Drive(Home, SFOLongTermParking)', 'Shuttle(SFOLongTermParking, SFO)'],\n",
-       "            ['Taxi(Home, SFO)'],\n",
-       "            [],\n",
-       "            [],\n",
-       "            []\n",
-       "            ],\n",
-       "        # empty refinements indicate a primitive action\n",
-       "        'precond': [\n",
-       "            ['At(Home) & Have(Car)'],\n",
-       "            ['At(Home)'],\n",
-       "            ['At(Home) & Have(Car)'],\n",
-       "            ['At(SFOLongTermParking)'],\n",
-       "            ['At(Home)']\n",
-       "            ],\n",
-       "        'effect': [\n",
-       "            ['At(SFO) & ~At(Home)'],\n",
-       "            ['At(SFO) & ~At(Home)'],\n",
-       "            ['At(SFOLongTermParking) & ~At(Home)'],\n",
-       "            ['At(SFO) & ~At(SFOLongTermParking)'],\n",
-       "            ['At(SFO) & ~At(Home)']\n",
-       "            ]\n",
-       "        }\n",
-       "        """\n",
-       "        e = Expr(hla.name, hla.args)\n",
-       "        indices = [i for i, x in enumerate(library['HLA']) if expr(x).op == hla.name]\n",
-       "        for i in indices:\n",
-       "            actions = []\n",
-       "            for j in range(len(library['steps'][i])):\n",
-       "                # find the index of the step [j]  of the HLA \n",
-       "                index_step = [k for k,x in enumerate(library['HLA']) if x == library['steps'][i][j]][0]\n",
-       "                precond = library['precond'][index_step][0] # preconditions of step [j]\n",
-       "                effect = library['effect'][index_step][0] # effect of step [j]\n",
-       "                actions.append(HLA(library['steps'][i][j], precond, effect))\n",
-       "            yield actions\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(RealWorldPlanningProblem.refinements)" ] @@ -227,134 +79,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def hierarchical_search(problem, hierarchy):\n",
-       "        """\n",
-       "        [Figure 11.5] 'Hierarchical Search, a Breadth First Search implementation of Hierarchical\n",
-       "        Forward Planning Search'\n",
-       "        The problem is a real-world problem defined by the problem class, and the hierarchy is\n",
-       "        a dictionary of HLA - refinements (see refinements generator for details)\n",
-       "        """\n",
-       "        act = Node(problem.init, None, [problem.actions[0]])\n",
-       "        frontier = deque()\n",
-       "        frontier.append(act)\n",
-       "        while True:\n",
-       "            if not frontier:\n",
-       "                return None\n",
-       "            plan = frontier.popleft()\n",
-       "            (hla, index) = Problem.find_hla(plan, hierarchy) # finds the first non primitive hla in plan actions\n",
-       "            prefix = plan.action[:index]\n",
-       "            outcome = Problem(Problem.result(problem.init, prefix), problem.goals , problem.actions )\n",
-       "            suffix = plan.action[index+1:]\n",
-       "            if not hla: # hla is None and plan is primitive\n",
-       "                if outcome.goal_test():\n",
-       "                    return plan.action\n",
-       "            else:\n",
-       "                for sequence in Problem.refinements(hla, outcome, hierarchy): # find refinements\n",
-       "                    frontier.append(Node(outcome.init, plan, prefix + sequence+ suffix))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(RealWorldPlanningProblem.hierarchical_search)" ] @@ -376,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -398,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -418,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -437,22 +164,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Drive(Home, SFOLongTermParking)), HLA(Shuttle(SFOLongTermParking, SFO))]\n", - "[{'completed': False, 'args': (Home, SFOLongTermParking), 'name': 'Drive', 'uses': {}, 'duration': 0, 'effect': [At(SFOLongTermParking), NotAt(Home)], 'consumes': {}, 'precond': [At(Home), Have(Car)]}, {'completed': False, 'args': (SFOLongTermParking, SFO), 'name': 'Shuttle', 'uses': {}, 'duration': 0, 'effect': [At(SFO), NotAt(LongTermParking)], 'consumes': {}, 'precond': [At(SFOLongTermParking)]}] \n", - "\n", - "[HLA(Taxi(Home, SFO))]\n", - "[{'completed': False, 'args': (Home, SFO), 'name': 'Taxi', 'uses': {}, 'duration': 0, 'effect': [At(SFO), NotAt(Home), NotHave(Cash)], 'consumes': {}, 'precond': [At(Home)]}] \n", - "\n" - ] - } - ], + "outputs": [], "source": [ "for sequence in RealWorldPlanningProblem.refinements(go_SFO, library):\n", " print (sequence)\n", @@ -469,19 +183,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Drive(Home, SFOLongTermParking)), HLA(Shuttle(SFOLongTermParking, SFO))] \n", - "\n", - "[{'completed': False, 'args': (Home, SFOLongTermParking), 'name': 'Drive', 'uses': {}, 'duration': 0, 'effect': [At(SFOLongTermParking), NotAt(Home)], 'consumes': {}, 'precond': [At(Home), Have(Car)]}, {'completed': False, 'args': (SFOLongTermParking, SFO), 'name': 'Shuttle', 'uses': {}, 'duration': 0, 'effect': [At(SFO), NotAt(LongTermParking)], 'consumes': {}, 'precond': [At(SFOLongTermParking)]}]\n" - ] - } - ], + "outputs": [], "source": [ "plan= RealWorldPlanningProblem.hierarchical_search(prob, library)\n", "print (plan, '\\n')\n", @@ -497,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -511,19 +215,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[HLA(Bus(Home, MetroStop)), HLA(Metro1(MetroStop, SFO))] \n", - "\n", - "[{'completed': False, 'args': (Home, MetroStop), 'name': 'Bus', 'uses': {}, 'duration': 0, 'effect': [At(MetroStop), NotAt(Home)], 'consumes': {}, 'precond': [At(Home)]}, {'completed': False, 'args': (MetroStop, SFO), 'name': 'Metro1', 'uses': {}, 'duration': 0, 'effect': [At(SFO), NotAt(MetroStop)], 'consumes': {}, 'precond': [At(MetroStop)]}]\n" - ] - } - ], + "outputs": [], "source": [ "plan_2 = RealWorldPlanningProblem.hierarchical_search(prob, library_2)\n", "print(plan_2, '\\n')\n", diff --git a/notebooks/planning_partial_order_planner.ipynb b/notebooks/planning_partial_order_planner.ipynb index 7c8578604..b873d3c87 100644 --- a/notebooks/planning_partial_order_planner.ipynb +++ b/notebooks/planning_partial_order_planner.ipynb @@ -30,15 +30,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:40.235651Z", - "iopub.status.busy": "2026-06-27T10:32:40.235010Z", - "iopub.status.idle": "2026-06-27T10:32:48.601297Z", - "shell.execute_reply": "2026-06-27T10:32:48.586503Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.planning import *\n", @@ -47,505 +40,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:48.621379Z", - "iopub.status.busy": "2026-06-27T10:32:48.615980Z", - "iopub.status.idle": "2026-06-27T10:32:49.681388Z", - "shell.execute_reply": "2026-06-27T10:32:49.670955Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class PartialOrderPlanner:\n",
-       "    """\n",
-       "    [Section 10.13] PARTIAL-ORDER-PLANNER\n",
-       "\n",
-       "    Partially ordered plans are created by a search through the space of plans\n",
-       "    rather than a search through the state space. It views planning as a refinement of partially ordered plans.\n",
-       "    A partially ordered plan is defined by a set of actions and a set of constraints of the form A < B,\n",
-       "    which denotes that action A has to be performed before action B.\n",
-       "    To summarize the working of a partial order planner,\n",
-       "    1. An open precondition is selected (a sub-goal that we want to achieve).\n",
-       "    2. An action that fulfils the open precondition is chosen.\n",
-       "    3. Temporal constraints are updated.\n",
-       "    4. Existing causal links are protected. Protection is a method that checks if the causal links conflict\n",
-       "       and if they do, temporal constraints are added to fix the threats.\n",
-       "    5. The set of open preconditions is updated.\n",
-       "    6. Temporal constraints of the selected action and the next action are established.\n",
-       "    7. A new causal link is added between the selected action and the owner of the open precondition.\n",
-       "    8. The set of new causal links is checked for threats and if found, the threat is removed by either promotion or\n",
-       "       demotion. If promotion or demotion is unable to solve the problem, the planning problem cannot be solved with\n",
-       "       the current sequence of actions or it may not be solvable at all.\n",
-       "    9. These steps are repeated until the set of open preconditions is empty.\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, planning_problem):\n",
-       "        self.tries = 1\n",
-       "        # safety bounds for the backtracking search in execute(): the maximum\n",
-       "        # number of actions a plan may contain (iterative-deepening target) and\n",
-       "        # the maximum number of node expansions per deepening level\n",
-       "        self._max_plan_actions = 12\n",
-       "        self._max_expansions = 20000\n",
-       "        self.planning_problem = planning_problem\n",
-       "        self.causal_links = []\n",
-       "        self.start = Action('Start', [], self.planning_problem.initial)\n",
-       "        self.finish = Action('Finish', self.planning_problem.goals, [])\n",
-       "        self.actions = set()\n",
-       "        self.actions.add(self.start)\n",
-       "        self.actions.add(self.finish)\n",
-       "        self.constraints = set()\n",
-       "        self.constraints.add((self.start, self.finish))\n",
-       "        self.agenda = set()\n",
-       "        for precond in self.finish.precond:\n",
-       "            self.agenda.add((precond, self.finish))\n",
-       "        self.expanded_actions = planning_problem.expand_actions()\n",
-       "\n",
-       "    def find_open_precondition(self):\n",
-       "        """\n",
-       "        Find the open precondition with the least number of achieving actions\n",
-       "        (a most-constrained-variable heuristic). Returns the triple\n",
-       "        (precondition, action_that_needs_it, [achieving_actions]). Iteration is\n",
-       "        ordered deterministically so the search does not depend on set/hash\n",
-       "        ordering. Returns (None, None, None) when some open precondition has no\n",
-       "        achiever at all, which is a dead end for the current partial plan.\n",
-       "        """\n",
-       "        possible_actions = list(self.actions) + self.expanded_actions\n",
-       "        number_of_ways = dict()\n",
-       "        actions_for_precondition = dict()\n",
-       "        for open_precondition, act in sorted(self.agenda, key=str):\n",
-       "            if open_precondition in number_of_ways:\n",
-       "                continue\n",
-       "            achievers = [action for action in possible_actions\n",
-       "                         if any(effect == open_precondition for effect in action.effect)]\n",
-       "            if not achievers:\n",
-       "                return None, None, None\n",
-       "            number_of_ways[open_precondition] = len(achievers)\n",
-       "            actions_for_precondition[open_precondition] = achievers\n",
-       "\n",
-       "        if not number_of_ways:\n",
-       "            return None, None, None\n",
-       "\n",
-       "        chosen = min(number_of_ways, key=lambda p: (number_of_ways[p], str(p)))\n",
-       "        act1 = next(act for precond, act in sorted(self.agenda, key=str) if precond == chosen)\n",
-       "        return chosen, act1, actions_for_precondition[chosen]\n",
-       "\n",
-       "    def find_action_for_precondition(self, oprec):\n",
-       "        """Find action for a given precondition"""\n",
-       "\n",
-       "        # either\n",
-       "        #   choose act0 E Actions such that act0 achieves G\n",
-       "        for action in self.actions:\n",
-       "            for effect in action.effect:\n",
-       "                if effect == oprec:\n",
-       "                    return action, 0\n",
-       "\n",
-       "        # or\n",
-       "        #   choose act0 E Actions such that act0 achieves G\n",
-       "        for action in self.planning_problem.actions:\n",
-       "            for effect in action.effect:\n",
-       "                if effect.op == oprec.op:\n",
-       "                    bindings = unify_mm(effect, oprec)\n",
-       "                    if bindings is None:\n",
-       "                        break\n",
-       "                    return action, bindings\n",
-       "\n",
-       "    def generate_expr(self, clause, bindings):\n",
-       "        """Generate atomic expression from generic expression given variable bindings"""\n",
-       "\n",
-       "        new_args = []\n",
-       "        for arg in clause.args:\n",
-       "            if arg in bindings:\n",
-       "                new_args.append(bindings[arg])\n",
-       "            else:\n",
-       "                new_args.append(arg)\n",
-       "\n",
-       "        try:\n",
-       "            return Expr(str(clause.name), *new_args)\n",
-       "        except:\n",
-       "            return Expr(str(clause.op), *new_args)\n",
-       "\n",
-       "    def generate_action_object(self, action, bindings):\n",
-       "        """Generate action object given a generic action and variable bindings"""\n",
-       "\n",
-       "        # if bindings is 0, it means the action already exists in self.actions\n",
-       "        if bindings == 0:\n",
-       "            return action\n",
-       "\n",
-       "        # bindings cannot be None\n",
-       "        else:\n",
-       "            new_expr = self.generate_expr(action, bindings)\n",
-       "            new_preconds = []\n",
-       "            for precond in action.precond:\n",
-       "                new_precond = self.generate_expr(precond, bindings)\n",
-       "                new_preconds.append(new_precond)\n",
-       "            new_effects = []\n",
-       "            for effect in action.effect:\n",
-       "                new_effect = self.generate_expr(effect, bindings)\n",
-       "                new_effects.append(new_effect)\n",
-       "            return Action(new_expr, new_preconds, new_effects)\n",
-       "\n",
-       "    def cyclic(self, graph):\n",
-       "        """Check cyclicity of a directed graph"""\n",
-       "\n",
-       "        new_graph = dict()\n",
-       "        for element in graph:\n",
-       "            if element[0] in new_graph:\n",
-       "                new_graph[element[0]].append(element[1])\n",
-       "            else:\n",
-       "                new_graph[element[0]] = [element[1]]\n",
-       "\n",
-       "        path = set()\n",
-       "\n",
-       "        def visit(vertex):\n",
-       "            path.add(vertex)\n",
-       "            for neighbor in new_graph.get(vertex, ()):\n",
-       "                if neighbor in path or visit(neighbor):\n",
-       "                    return True\n",
-       "            path.remove(vertex)\n",
-       "            return False\n",
-       "\n",
-       "        value = any(visit(v) for v in new_graph)\n",
-       "        return value\n",
-       "\n",
-       "    def add_const(self, constraint, constraints):\n",
-       "        """Add the constraint to constraints if the resulting graph is acyclic"""\n",
-       "\n",
-       "        if constraint[0] == self.finish or constraint[1] == self.start:\n",
-       "            return constraints\n",
-       "\n",
-       "        new_constraints = set(constraints)\n",
-       "        new_constraints.add(constraint)\n",
-       "\n",
-       "        if self.cyclic(new_constraints):\n",
-       "            return constraints\n",
-       "        return new_constraints\n",
-       "\n",
-       "    def is_a_threat(self, precondition, effect):\n",
-       "        """Check if effect is a threat to precondition"""\n",
-       "\n",
-       "        if (str(effect.op) == 'Not' + str(precondition.op)) or ('Not' + str(effect.op) == str(precondition.op)):\n",
-       "            if effect.args == precondition.args:\n",
-       "                return True\n",
-       "        return False\n",
-       "\n",
-       "    def protect(self, causal_link, action, constraints):\n",
-       "        """Check and resolve threats by promotion or demotion"""\n",
-       "\n",
-       "        threat = False\n",
-       "        for effect in action.effect:\n",
-       "            if self.is_a_threat(causal_link[1], effect):\n",
-       "                threat = True\n",
-       "                break\n",
-       "\n",
-       "        if action != causal_link[0] and action != causal_link[2] and threat:\n",
-       "            # try promotion\n",
-       "            new_constraints = set(constraints)\n",
-       "            new_constraints.add((action, causal_link[0]))\n",
-       "            if not self.cyclic(new_constraints):\n",
-       "                constraints = self.add_const((action, causal_link[0]), constraints)\n",
-       "            else:\n",
-       "                # try demotion\n",
-       "                new_constraints = set(constraints)\n",
-       "                new_constraints.add((causal_link[2], action))\n",
-       "                if not self.cyclic(new_constraints):\n",
-       "                    constraints = self.add_const((causal_link[2], action), constraints)\n",
-       "                else:\n",
-       "                    # both promotion and demotion fail\n",
-       "                    print('Unable to resolve a threat caused by', action, 'onto', causal_link)\n",
-       "                    return\n",
-       "        return constraints\n",
-       "\n",
-       "    def convert(self, constraints):\n",
-       "        """Convert constraints into a dict of Action to set orderings"""\n",
-       "\n",
-       "        graph = dict()\n",
-       "        for constraint in constraints:\n",
-       "            if constraint[0] in graph:\n",
-       "                graph[constraint[0]].add(constraint[1])\n",
-       "            else:\n",
-       "                graph[constraint[0]] = set()\n",
-       "                graph[constraint[0]].add(constraint[1])\n",
-       "        return graph\n",
-       "\n",
-       "    def toposort(self, graph):\n",
-       "        """Generate topological ordering of constraints"""\n",
-       "\n",
-       "        if len(graph) == 0:\n",
-       "            return\n",
-       "\n",
-       "        graph = graph.copy()\n",
-       "\n",
-       "        for k, v in graph.items():\n",
-       "            v.discard(k)\n",
-       "\n",
-       "        extra_elements_in_dependencies = _reduce(set.union, graph.values()) - set(graph.keys())\n",
-       "\n",
-       "        graph.update({element: set() for element in extra_elements_in_dependencies})\n",
-       "        while True:\n",
-       "            ordered = set(element for element, dependency in graph.items() if len(dependency) == 0)\n",
-       "            if not ordered:\n",
-       "                break\n",
-       "            yield ordered\n",
-       "            graph = {element: (dependency - ordered)\n",
-       "                     for element, dependency in graph.items()\n",
-       "                     if element not in ordered}\n",
-       "        if len(graph) != 0:\n",
-       "            raise ValueError('The graph is not acyclic and cannot be linearly ordered')\n",
-       "\n",
-       "    def display_plan(self):\n",
-       "        """Display causal links, constraints and the plan"""\n",
-       "\n",
-       "        print('Causal Links')\n",
-       "        for causal_link in self.causal_links:\n",
-       "            print(causal_link)\n",
-       "\n",
-       "        print('\\n_constraints')\n",
-       "        for constraint in self.constraints:\n",
-       "            print(constraint[0], '<', constraint[1])\n",
-       "\n",
-       "        print('\\n_partial Order Plan')\n",
-       "        print(list(reversed(list(self.toposort(self.convert(self.constraints))))))\n",
-       "\n",
-       "    def execute(self, display=True):\n",
-       "        """\n",
-       "        Execute the algorithm with backtracking, using iterative deepening on the\n",
-       "        number of actions in the plan. The original greedy version committed to\n",
-       "        the first achiever it happened to iterate over and could not recover when\n",
-       "        that action's own preconditions turned out to be unsatisfiable, so it\n",
-       "        depended on hash ordering and often printed 'Probably Wrong' / "Couldn't\n",
-       "        find a solution". Backtracking over both action choices and threat\n",
-       "        resolution (promotion vs demotion), together with the deterministic\n",
-       "        selection in find_open_precondition and a smallest-plan-first deepening\n",
-       "        bound, makes the planner solve the standard problems reproducibly and\n",
-       "        return a short, valid plan.\n",
-       "        """\n",
-       "        pristine = self._snapshot()\n",
-       "        for limit in range(1, self._max_plan_actions + 1):\n",
-       "            self._restore(pristine)\n",
-       "            if self._search([self._max_expansions], limit):\n",
-       "                if display:\n",
-       "                    self.display_plan()\n",
-       "                else:\n",
-       "                    return self.constraints, self.causal_links\n",
-       "                return\n",
-       "        print("Couldn't find a solution")\n",
-       "        if not display:\n",
-       "            return None, None\n",
-       "\n",
-       "    def _reachable(self, source, target):\n",
-       "        """True if target is forced to come after source by the ordering constraints"""\n",
-       "\n",
-       "        stack, seen = [source], set()\n",
-       "        while stack:\n",
-       "            node = stack.pop()\n",
-       "            if node == target:\n",
-       "                return True\n",
-       "            if node in seen:\n",
-       "                continue\n",
-       "            seen.add(node)\n",
-       "            stack.extend(b for a, b in self.constraints if a == node)\n",
-       "        return False\n",
-       "\n",
-       "    def _open_threat(self):\n",
-       "        """\n",
-       "        Return an (action, causal_link) threat that is not yet resolved by the\n",
-       "        ordering constraints, or None if every causal link is protected. A\n",
-       "        causal link (a0, p, a1) is threatened by an action whose effect negates p\n",
-       "        unless the action is already ordered before a0 (promotion) or after a1\n",
-       "        (demotion).\n",
-       "        """\n",
-       "        for a0, p, a1 in self.causal_links:\n",
-       "            for action in self.actions:\n",
-       "                if action == a0 or action == a1:\n",
-       "                    continue\n",
-       "                if any(self.is_a_threat(p, effect) for effect in action.effect):\n",
-       "                    if not (self._reachable(action, a0) or self._reachable(a1, action)):\n",
-       "                        return action, (a0, p, a1)\n",
-       "        return None\n",
-       "\n",
-       "    def _snapshot(self):\n",
-       "        return set(self.actions), set(self.constraints), list(self.causal_links), set(self.agenda)\n",
-       "\n",
-       "    def _restore(self, snapshot):\n",
-       "        self.actions, self.constraints, self.causal_links, self.agenda = (\n",
-       "            set(snapshot[0]), set(snapshot[1]), list(snapshot[2]), set(snapshot[3]))\n",
-       "\n",
-       "    def _search(self, budget, limit):\n",
-       "        """\n",
-       "        Recursively complete the partial plan, backtracking on failure. Three\n",
-       "        kinds of choice points are explored: which action satisfies an open\n",
-       "        precondition, how each threat is resolved (promotion vs demotion), and -\n",
-       "        bounded by 'limit' - whether to introduce a new action at all. Returns\n",
-       "        True and leaves the solution in self.* on success.\n",
-       "        """\n",
-       "        if budget[0] <= 0:\n",
-       "            return False\n",
-       "        budget[0] -= 1\n",
-       "\n",
-       "        # first, resolve any outstanding threat to a causal link (choice point)\n",
-       "        threat = self._open_threat()\n",
-       "        if threat is not None:\n",
-       "            action, (a0, p, a1) = threat\n",
-       "            snapshot = self._snapshot()\n",
-       "            for ordering in ((action, a0), (a1, action)):  # promotion, then demotion\n",
-       "                new_constraints = self.add_const(ordering, self.constraints)\n",
-       "                if ordering in new_constraints:  # ordering was consistent (acyclic and allowed)\n",
-       "                    self.constraints = new_constraints\n",
-       "                    if self._search(budget, limit):\n",
-       "                        return True\n",
-       "                self._restore(snapshot)\n",
-       "            return False\n",
-       "\n",
-       "        # no open threats: a plan with an empty agenda is a complete solution\n",
-       "        if not self.agenda:\n",
-       "            return True\n",
-       "\n",
-       "        # select <G, act1> from the agenda (most-constrained precondition first)\n",
-       "        G, act1, possible_actions = self.find_open_precondition()\n",
-       "        if G is None:  # an open precondition has no achiever -> dead end\n",
-       "            return False\n",
-       "\n",
-       "        # number of actions already introduced, excluding the dummy Start/Finish\n",
-       "        introduced = len(self.actions) - 2\n",
-       "        snapshot = self._snapshot()\n",
-       "        # try each achiever deterministically, reusing existing actions first\n",
-       "        for act0 in sorted(set(possible_actions), key=lambda a: (a not in self.actions, str(a))):\n",
-       "            is_new = act0 not in self.actions\n",
-       "            if is_new and introduced >= limit:  # deepening bound on plan size\n",
-       "                continue\n",
-       "            self.agenda.discard((G, act1))\n",
-       "            self.actions.add(act0)\n",
-       "            self.constraints = self.add_const((self.start, act0), self.constraints)\n",
-       "            self.constraints = self.add_const((act0, act1), self.constraints)\n",
-       "            # the causal link act0 --G--> act1 requires act0 strictly before act1\n",
-       "            # (and after start); add_const drops an ordering that would create a\n",
-       "            # cycle, so reject the choice when the required ordering is not enforced\n",
-       "            if ((act0 == act1 or self._reachable(act0, act1)) and\n",
-       "                    (act0 == self.start or self._reachable(self.start, act0))):\n",
-       "                if (act0, G, act1) not in self.causal_links:\n",
-       "                    self.causal_links.append((act0, G, act1))\n",
-       "                if is_new:  # a freshly introduced action contributes its own preconditions\n",
-       "                    for precondition in act0.precond:\n",
-       "                        self.agenda.add((precondition, act0))\n",
-       "                if self._search(budget, limit):\n",
-       "                    return True\n",
-       "            # undo and try the next achiever\n",
-       "            self._restore(snapshot)\n",
-       "        return False\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(PartialOrderPlanner)" ] @@ -666,46 +163,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:50.028987Z", - "iopub.status.busy": "2026-06-27T10:32:50.028030Z", - "iopub.status.idle": "2026-06-27T10:32:50.093174Z", - "shell.execute_reply": "2026-06-27T10:32:50.087372Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Causal Links\n", - "(PutOn(Spare, Axle), At(Spare, Axle), Finish)\n", - "(Start, Tire(Spare), PutOn(Spare, Axle))\n", - "(Remove(Flat, Axle), NotAt(Flat, Axle), PutOn(Spare, Axle))\n", - "(Start, Tire(Flat), Remove(Flat, Axle))\n", - "(Start, At(Flat, Axle), Remove(Flat, Axle))\n", - "(Remove(Spare, Trunk), At(Spare, Ground), PutOn(Spare, Axle))\n", - "(Start, At(Spare, Trunk), Remove(Spare, Trunk))\n", - "(Start, Tire(Spare), Remove(Spare, Trunk))\n", - "(Remove(Flat, Axle), At(Flat, Ground), Finish)\n", - "\n", - "_constraints\n", - "Start < Remove(Flat, Axle)\n", - "PutOn(Spare, Axle) < Finish\n", - "Remove(Flat, Axle) < Finish\n", - "Remove(Flat, Axle) < PutOn(Spare, Axle)\n", - "Start < PutOn(Spare, Axle)\n", - "Remove(Spare, Trunk) < PutOn(Spare, Axle)\n", - "Start < Remove(Spare, Trunk)\n", - "Start < Finish\n", - "\n", - "_partial Order Plan\n", - "[{Start}, {Remove(Flat, Axle), Remove(Spare, Trunk)}, {PutOn(Spare, Axle)}, {Finish}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "st = spare_tire()\n", "pop = PartialOrderPlanner(st)\n", @@ -723,48 +183,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:50.102953Z", - "iopub.status.busy": "2026-06-27T10:32:50.102022Z", - "iopub.status.idle": "2026-06-27T10:32:50.144839Z", - "shell.execute_reply": "2026-06-27T10:32:50.140058Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Causal Links\n", - "(FromTable(B, A), On(B, A), Finish)\n", - "(FromTable(C, B), On(C, B), Finish)\n", - "(ToTable(A, B), Clear(B), FromTable(B, A))\n", - "(Start, On(A, B), ToTable(A, B))\n", - "(Start, Clear(A), FromTable(B, A))\n", - "(Start, Clear(A), ToTable(A, B))\n", - "(ToTable(A, B), Clear(B), FromTable(C, B))\n", - "(Start, Clear(C), FromTable(C, B))\n", - "(Start, OnTable(B), FromTable(B, A))\n", - "(Start, OnTable(C), FromTable(C, B))\n", - "\n", - "_constraints\n", - "Start < FromTable(B, A)\n", - "Start < FromTable(C, B)\n", - "Start < ToTable(A, B)\n", - "ToTable(A, B) < FromTable(B, A)\n", - "Start < Finish\n", - "FromTable(B, A) < FromTable(C, B)\n", - "FromTable(C, B) < Finish\n", - "ToTable(A, B) < FromTable(C, B)\n", - "FromTable(B, A) < Finish\n", - "\n", - "_partial Order Plan\n", - "[{Start}, {ToTable(A, B)}, {FromTable(B, A)}, {FromTable(C, B)}, {Finish}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "sbw = simple_blocks_world()\n", "pop = PartialOrderPlanner(sbw)\n", @@ -773,51 +194,16 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "We see that this plan does not have flexibility in selecting actions, ie, actions should be performed in this order and this order only, to successfully reach the goal state." ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:50.154083Z", - "iopub.status.busy": "2026-06-27T10:32:50.153332Z", - "iopub.status.idle": "2026-06-27T10:32:50.178378Z", - "shell.execute_reply": "2026-06-27T10:32:50.173844Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Causal Links\n", - "(LeftShoe, LeftShoeOn, Finish)\n", - "(LeftSock, LeftSockOn, LeftShoe)\n", - "(RightShoe, RightShoeOn, Finish)\n", - "(RightSock, RightSockOn, RightShoe)\n", - "\n", - "_constraints\n", - "LeftSock < LeftShoe\n", - "Start < LeftSock\n", - "Start < RightSock\n", - "Start < RightShoe\n", - "RightSock < RightShoe\n", - "Start < Finish\n", - "LeftShoe < Finish\n", - "Start < LeftShoe\n", - "RightShoe < Finish\n", - "\n", - "_partial Order Plan\n", - "[{Start}, {LeftSock, RightSock}, {RightShoe, LeftShoe}, {Finish}]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ss = socks_and_shoes()\n", "pop = PartialOrderPlanner(ss)\n", @@ -826,9 +212,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "This plan again doesn't have constraints in selecting socks or shoes.\n", "As long as both socks are worn before both shoes, we are fine.\n", @@ -849,15 +233,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:50.186142Z", - "iopub.status.busy": "2026-06-27T10:32:50.185311Z", - "iopub.status.idle": "2026-06-27T10:32:50.209152Z", - "shell.execute_reply": "2026-06-27T10:32:50.205378Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "ss = socks_and_shoes()" @@ -865,24 +242,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:50.217506Z", - "iopub.status.busy": "2026-06-27T10:32:50.216519Z", - "iopub.status.idle": "2026-06-27T10:32:54.755675Z", - "shell.execute_reply": "2026-06-27T10:32:54.754693Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "529 μs ± 70.2 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "GraphPlan(ss).execute()" @@ -890,24 +252,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:32:54.758067Z", - "iopub.status.busy": "2026-06-27T10:32:54.757858Z", - "iopub.status.idle": "2026-06-27T10:33:04.568670Z", - "shell.execute_reply": "2026-06-27T10:33:04.566335Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.17 ms ± 123 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "Linearize(ss).execute()" @@ -915,24 +262,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-27T10:33:04.572932Z", - "iopub.status.busy": "2026-06-27T10:33:04.572557Z", - "iopub.status.idle": "2026-06-27T10:33:15.534624Z", - "shell.execute_reply": "2026-06-27T10:33:15.532043Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.24 ms ± 186 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "PartialOrderPlanner(ss).execute(display=False)" diff --git a/notebooks/planning_total_order_planner.ipynb b/notebooks/planning_total_order_planner.ipynb index 2e69046db..c8f77534d 100644 --- a/notebooks/planning_total_order_planner.ipynb +++ b/notebooks/planning_total_order_planner.ipynb @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -45,158 +45,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Linearize:\n",
-       "\n",
-       "    def __init__(self, planningproblem):\n",
-       "        self.planningproblem = planningproblem\n",
-       "\n",
-       "    def filter(self, solution):\n",
-       "        """Filter out persistence actions from a solution"""\n",
-       "\n",
-       "        new_solution = []\n",
-       "        for section in solution[0]:\n",
-       "            new_section = []\n",
-       "            for operation in section:\n",
-       "                if not (operation.op[0] == 'P' and operation.op[1].isupper()):\n",
-       "                    new_section.append(operation)\n",
-       "            new_solution.append(new_section)\n",
-       "        return new_solution\n",
-       "\n",
-       "    def orderlevel(self, level, planningproblem):\n",
-       "        """Return valid linear order of actions for a given level"""\n",
-       "\n",
-       "        for permutation in itertools.permutations(level):\n",
-       "            temp = copy.deepcopy(planningproblem)\n",
-       "            count = 0\n",
-       "            for action in permutation:\n",
-       "                try:\n",
-       "                    temp.act(action)\n",
-       "                    count += 1\n",
-       "                except:\n",
-       "                    count = 0\n",
-       "                    temp = copy.deepcopy(planningproblem)\n",
-       "                    break\n",
-       "            if count == len(permutation):\n",
-       "                return list(permutation), temp\n",
-       "        return None\n",
-       "\n",
-       "    def execute(self):\n",
-       "        """Finds total-order solution for a planning graph"""\n",
-       "\n",
-       "        graphplan_solution = GraphPlan(self.planningproblem).execute()\n",
-       "        filtered_solution = self.filter(graphplan_solution)\n",
-       "        ordered_solution = []\n",
-       "        planningproblem = self.planningproblem\n",
-       "        for level in filtered_solution:\n",
-       "            level_solution, planningproblem = self.orderlevel(level, planningproblem)\n",
-       "            for element in level_solution:\n",
-       "                ordered_solution.append(element)\n",
-       "\n",
-       "        return ordered_solution\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "psource(Linearize)" ] @@ -217,25 +68,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Load(C1, P1, SFO),\n", - " Fly(P1, SFO, JFK),\n", - " Load(C2, P2, JFK),\n", - " Fly(P2, JFK, SFO),\n", - " Unload(C2, P2, SFO),\n", - " Unload(C1, P1, JFK)]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# total-order solution for air_cargo problem\n", "Linearize(air_cargo()).execute()" @@ -243,20 +78,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Remove(Spare, Trunk), Remove(Flat, Axle), PutOn(Spare, Axle)]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# total-order solution for spare_tire problem\n", "Linearize(spare_tire()).execute()" @@ -264,20 +88,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[MoveToTable(C, A), Move(B, Table, C), Move(A, Table, B)]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# total-order solution for three_block_tower problem\n", "Linearize(three_block_tower()).execute()" @@ -285,20 +98,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[ToTable(A, B), FromTable(B, A), FromTable(C, B)]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# total-order solution for simple_blocks_world problem\n", "Linearize(simple_blocks_world()).execute()" @@ -306,20 +108,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[RightSock, LeftSock, RightShoe, LeftShoe]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# total-order solution for socks_and_shoes problem\n", "Linearize(socks_and_shoes()).execute()" diff --git a/notebooks/probability.ipynb b/notebooks/probability.ipynb index 4afca7196..e4dcd03d2 100644 --- a/notebooks/probability.ipynb +++ b/notebooks/probability.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -73,181 +73,18 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class ProbDist:\n",
-       "    """A discrete probability distribution. You name the random variable\n",
-       "    in the constructor, then assign and query probability of values.\n",
-       "    >>> P = ProbDist('Flip'); P['H'], P['T'] = 0.25, 0.75; P['H']\n",
-       "    0.25\n",
-       "    >>> P = ProbDist('X', {'lo': 125, 'med': 375, 'hi': 500})\n",
-       "    >>> P['lo'], P['med'], P['hi']\n",
-       "    (0.125, 0.375, 0.5)\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, varname='?', freqs=None):\n",
-       "        """If freqs is given, it is a dictionary of values - frequency pairs,\n",
-       "        then ProbDist is normalized."""\n",
-       "        self.prob = {}\n",
-       "        self.varname = varname\n",
-       "        self.values = []\n",
-       "        if freqs:\n",
-       "            for (v, p) in freqs.items():\n",
-       "                self[v] = p\n",
-       "            self.normalize()\n",
-       "\n",
-       "    def __getitem__(self, val):\n",
-       "        """Given a value, return P(value)."""\n",
-       "        try:\n",
-       "            return self.prob[val]\n",
-       "        except KeyError:\n",
-       "            return 0\n",
-       "\n",
-       "    def __setitem__(self, val, p):\n",
-       "        """Set P(val) = p."""\n",
-       "        if val not in self.values:\n",
-       "            self.values.append(val)\n",
-       "        self.prob[val] = p\n",
-       "\n",
-       "    def normalize(self):\n",
-       "        """Make sure the probabilities of all values sum to 1.\n",
-       "        Returns the normalized distribution.\n",
-       "        Raises a ZeroDivisionError if the sum of the values is 0."""\n",
-       "        total = sum(self.prob.values())\n",
-       "        if not isclose(total, 1.0):\n",
-       "            for val in self.prob:\n",
-       "                self.prob[val] /= total\n",
-       "        return self\n",
-       "\n",
-       "    def show_approx(self, numfmt='{:.3g}'):\n",
-       "        """Show the probabilities rounded and sorted by key, for the\n",
-       "        sake of portable doctests."""\n",
-       "        return ', '.join([('{}: ' + numfmt).format(v, p)\n",
-       "                          for (v, p) in sorted(self.prob.items())])\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return "P({})".format(self.varname)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(ProbDist)" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.75" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p = ProbDist('Flip')\n", "p['H'], p['T'] = 0.25, 0.75\n", @@ -273,20 +110,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.125, 0.375, 0.5)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "(p['low'], p['medium'], p['high'])" ] @@ -300,20 +126,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['low', 'medium', 'high']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p.values" ] @@ -327,20 +142,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(50, 114, 64)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p = ProbDist('Y')\n", "p['Cat'] = 50\n", @@ -351,20 +155,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.21929824561403508, 0.5, 0.2807017543859649)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p.normalize()\n", "(p['Cat'], p['Dog'], p['Mice'])" @@ -379,20 +172,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Cat: 0.219, Dog: 0.5, Mice: 0.281'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p.show_approx()" ] @@ -411,20 +193,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(8, 10)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "event = {'A': 10, 'B': 9, 'C': 8}\n", "variables = ['C', 'A']\n", @@ -440,144 +211,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class JointProbDist(ProbDist):\n",
-       "    """A discrete probability distribute over a set of variables.\n",
-       "    >>> P = JointProbDist(['X', 'Y']); P[1, 1] = 0.25\n",
-       "    >>> P[1, 1]\n",
-       "    0.25\n",
-       "    >>> P[dict(X=0, Y=1)] = 0.5\n",
-       "    >>> P[dict(X=0, Y=1)]\n",
-       "    0.5"""\n",
-       "\n",
-       "    def __init__(self, variables):\n",
-       "        self.prob = {}\n",
-       "        self.variables = variables\n",
-       "        self.vals = defaultdict(list)\n",
-       "\n",
-       "    def __getitem__(self, values):\n",
-       "        """Given a tuple or dict of values, return P(values)."""\n",
-       "        values = event_values(values, self.variables)\n",
-       "        return ProbDist.__getitem__(self, values)\n",
-       "\n",
-       "    def __setitem__(self, values, p):\n",
-       "        """Set P(values) = p.  Values can be a tuple or a dict; it must\n",
-       "        have a value for each of the variables in the joint. Also keep track\n",
-       "        of the values we have seen so far for each variable."""\n",
-       "        values = event_values(values, self.variables)\n",
-       "        self.prob[values] = p\n",
-       "        for var, val in zip(self.variables, values):\n",
-       "            if val not in self.vals[var]:\n",
-       "                self.vals[var].append(val)\n",
-       "\n",
-       "    def values(self, var):\n",
-       "        """Return the set of possible values for a variable."""\n",
-       "        return self.vals[var]\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return "P({})".format(self.variables)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(JointProbDist)" ] @@ -593,20 +229,9 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "P(['X', 'Y'])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "variables = ['X', 'Y']\n", "j = JointProbDist(variables)\n", @@ -623,20 +248,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.2, 0.5)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "j[1,1] = 0.2\n", "j[dict(X=0, Y=1)] = 0.5\n", @@ -653,20 +267,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 0]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "j.values('X')" ] @@ -690,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -714,117 +317,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def enumerate_joint(variables, e, P):\n",
-       "    """Return the sum of those entries in P consistent with e,\n",
-       "    provided variables is P's remaining variables (the ones not in e)."""\n",
-       "    if not variables:\n",
-       "        return P[e]\n",
-       "    Y, rest = variables[0], variables[1:]\n",
-       "    return sum([enumerate_joint(rest, extend(e, Y, y), P)\n",
-       "                for y in P.values(Y)])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(enumerate_joint)" ] @@ -838,20 +333,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.19999999999999998" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "evidence = dict(Toothache=True)\n", "variables = ['Cavity', 'Catch'] # variables not part of evidence\n", @@ -868,20 +352,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.12" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "evidence = dict(Cavity=True, Toothache=True)\n", "variables = ['Catch'] # variables not part of evidence\n", @@ -900,20 +373,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.6" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ans2/ans1" ] @@ -927,123 +389,9 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def enumerate_joint_ask(X, e, P):\n",
-       "    """Return a probability distribution over the values of the variable X,\n",
-       "    given the {var:val} observations e, in the JointProbDist P. [Section 13.3]\n",
-       "    >>> P = JointProbDist(['X', 'Y'])\n",
-       "    >>> P[0,0] = 0.25; P[0,1] = 0.5; P[1,1] = P[2,1] = 0.125\n",
-       "    >>> enumerate_joint_ask('X', dict(Y=1), P).show_approx()\n",
-       "    '0: 0.667, 1: 0.167, 2: 0.167'\n",
-       "    """\n",
-       "    assert X not in e, "Query variable must be distinct from evidence"\n",
-       "    Q = ProbDist(X)  # probability distribution for X, initially empty\n",
-       "    Y = [v for v in P.variables if v != X and v not in e]  # hidden variables.\n",
-       "    for xi in P.values(X):\n",
-       "        Q[xi] = enumerate_joint(Y, extend(e, X, xi), P)\n",
-       "    return Q.normalize()\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(enumerate_joint_ask)" ] @@ -1057,20 +405,9 @@ }, { "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.6, 0.39999999999999997)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "query_variable = 'Cavity'\n", "evidence = dict(Toothache=True)\n", @@ -1100,180 +437,9 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class BayesNode:\n",
-       "    """A conditional probability distribution for a boolean variable,\n",
-       "    P(X | parents). Part of a BayesNet."""\n",
-       "\n",
-       "    def __init__(self, X, parents, cpt):\n",
-       "        """X is a variable name, and parents a sequence of variable\n",
-       "        names or a space-separated string.  cpt, the conditional\n",
-       "        probability table, takes one of these forms:\n",
-       "\n",
-       "        * A number, the unconditional probability P(X=true). You can\n",
-       "          use this form when there are no parents.\n",
-       "\n",
-       "        * A dict {v: p, ...}, the conditional probability distribution\n",
-       "          P(X=true | parent=v) = p. When there's just one parent.\n",
-       "\n",
-       "        * A dict {(v1, v2, ...): p, ...}, the distribution P(X=true |\n",
-       "          parent1=v1, parent2=v2, ...) = p. Each key must have as many\n",
-       "          values as there are parents. You can use this form always;\n",
-       "          the first two are just conveniences.\n",
-       "\n",
-       "        In all cases the probability of X being false is left implicit,\n",
-       "        since it follows from P(X=true).\n",
-       "\n",
-       "        >>> X = BayesNode('X', '', 0.2)\n",
-       "        >>> Y = BayesNode('Y', 'P', {T: 0.2, F: 0.7})\n",
-       "        >>> Z = BayesNode('Z', 'P Q',\n",
-       "        ...    {(T, T): 0.2, (T, F): 0.3, (F, T): 0.5, (F, F): 0.7})\n",
-       "        """\n",
-       "        if isinstance(parents, str):\n",
-       "            parents = parents.split()\n",
-       "\n",
-       "        # We store the table always in the third form above.\n",
-       "        if isinstance(cpt, (float, int)):  # no parents, 0-tuple\n",
-       "            cpt = {(): cpt}\n",
-       "        elif isinstance(cpt, dict):\n",
-       "            # one parent, 1-tuple\n",
-       "            if cpt and isinstance(list(cpt.keys())[0], bool):\n",
-       "                cpt = {(v,): p for v, p in cpt.items()}\n",
-       "\n",
-       "        assert isinstance(cpt, dict)\n",
-       "        for vs, p in cpt.items():\n",
-       "            assert isinstance(vs, tuple) and len(vs) == len(parents)\n",
-       "            assert all(isinstance(v, bool) for v in vs)\n",
-       "            assert 0 <= p <= 1\n",
-       "\n",
-       "        self.variable = X\n",
-       "        self.parents = parents\n",
-       "        self.cpt = cpt\n",
-       "        self.children = []\n",
-       "\n",
-       "    def p(self, value, event):\n",
-       "        """Return the conditional probability\n",
-       "        P(X=value | parents=parent_values), where parent_values\n",
-       "        are the values of parents in event. (event must assign each\n",
-       "        parent a value.)\n",
-       "        >>> bn = BayesNode('X', 'Burglary', {T: 0.2, F: 0.625})\n",
-       "        >>> bn.p(False, {'Burglary': False, 'Earthquake': True})\n",
-       "        0.375"""\n",
-       "        assert isinstance(value, bool)\n",
-       "        ptrue = self.cpt[event_values(event, self.parents)]\n",
-       "        return ptrue if value else 1 - ptrue\n",
-       "\n",
-       "    def sample(self, event):\n",
-       "        """Sample from the distribution for this variable conditioned\n",
-       "        on event's values for parent_variables. That is, return True/False\n",
-       "        at random according with the conditional probability given the\n",
-       "        parents."""\n",
-       "        return probability(self.p(True, event))\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return repr((self.variable, ' '.join(self.parents)))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(BayesNode)" ] @@ -1293,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1310,7 +476,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1328,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1345,20 +511,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.09999999999999998" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "john_node.p(False, {'Alarm': True, 'Burglary': True}) # P(JohnCalls=False | Alarm=True)" ] @@ -1372,146 +527,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class BayesNet:\n",
-       "    """Bayesian network containing only boolean-variable nodes."""\n",
-       "\n",
-       "    def __init__(self, node_specs=None):\n",
-       "        """Nodes must be ordered with parents before children."""\n",
-       "        self.nodes = []\n",
-       "        self.variables = []\n",
-       "        node_specs = node_specs or []\n",
-       "        for node_spec in node_specs:\n",
-       "            self.add(node_spec)\n",
-       "\n",
-       "    def add(self, node_spec):\n",
-       "        """Add a node to the net. Its parents must already be in the\n",
-       "        net, and its variable must not."""\n",
-       "        node = BayesNode(*node_spec)\n",
-       "        assert node.variable not in self.variables\n",
-       "        assert all((parent in self.variables) for parent in node.parents)\n",
-       "        self.nodes.append(node)\n",
-       "        self.variables.append(node.variable)\n",
-       "        for parent in node.parents:\n",
-       "            self.variable_node(parent).children.append(node)\n",
-       "\n",
-       "    def variable_node(self, var):\n",
-       "        """Return the node for the variable named var.\n",
-       "        >>> burglary.variable_node('Burglary').variable\n",
-       "        'Burglary'"""\n",
-       "        for n in self.nodes:\n",
-       "            if n.variable == var:\n",
-       "                return n\n",
-       "        raise Exception("No such variable: {}".format(var))\n",
-       "\n",
-       "    def variable_values(self, var):\n",
-       "        """Return the domain of var."""\n",
-       "        return [True, False]\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return 'BayesNet({0!r})'.format(self.nodes)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(BayesNet)" ] @@ -1538,20 +556,9 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "BayesNet([('Burglary', ''), ('Earthquake', ''), ('Alarm', 'Burglary Earthquake'), ('JohnCalls', 'Alarm'), ('MaryCalls', 'Alarm')])" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "burglary" ] @@ -1565,43 +572,18 @@ }, { "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "probability.BayesNode" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "type(burglary.variable_node('Alarm'))" ] }, { "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(True, True): 0.95,\n", - " (True, False): 0.94,\n", - " (False, True): 0.29,\n", - " (False, False): 0.001}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "burglary.variable_node('Alarm').cpt" ] @@ -1623,123 +605,9 @@ }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def enumerate_all(variables, e, bn):\n",
-       "    """Return the sum of those entries in P(variables | e{others})\n",
-       "    consistent with e, where P is the joint distribution represented\n",
-       "    by bn, and e{others} means e restricted to bn's other variables\n",
-       "    (the ones other than variables). Parents must precede children in variables."""\n",
-       "    if not variables:\n",
-       "        return 1.0\n",
-       "    Y, rest = variables[0], variables[1:]\n",
-       "    Ynode = bn.variable_node(Y)\n",
-       "    if Y in e:\n",
-       "        return Ynode.p(e[Y], e) * enumerate_all(rest, e, bn)\n",
-       "    else:\n",
-       "        return sum(Ynode.p(y, e) * enumerate_all(rest, extend(e, Y, y), bn)\n",
-       "                   for y in bn.variable_values(Y))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(enumerate_all)" ] @@ -1759,120 +627,9 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def enumeration_ask(X, e, bn):\n",
-       "    """Return the conditional probability distribution of variable X\n",
-       "    given evidence e, from BayesNet bn. [Figure 14.9]\n",
-       "    >>> enumeration_ask('Burglary', dict(JohnCalls=T, MaryCalls=T), burglary\n",
-       "    ...  ).show_approx()\n",
-       "    'False: 0.716, True: 0.284'"""\n",
-       "    assert X not in e, "Query variable must be distinct from evidence"\n",
-       "    Q = ProbDist(X)\n",
-       "    for xi in bn.variable_values(X):\n",
-       "        Q[xi] = enumerate_all(bn.variables, extend(e, X, xi), bn)\n",
-       "    return Q.normalize()\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(enumeration_ask)" ] @@ -1886,20 +643,9 @@ }, { "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2841718353643929" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ans_dist = enumeration_ask('Burglary', {'JohnCalls': True, 'MaryCalls': True}, burglary)\n", "ans_dist[True]" @@ -1925,118 +671,9 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def make_factor(var, e, bn):\n",
-       "    """Return the factor for var in bn's joint distribution given e.\n",
-       "    That is, bn's full joint distribution, projected to accord with e,\n",
-       "    is the pointwise product of these factors for bn's variables."""\n",
-       "    node = bn.variable_node(var)\n",
-       "    variables = [X for X in [var] + node.parents if X not in e]\n",
-       "    cpt = {event_values(e1, variables): node.p(e1[var], e1)\n",
-       "           for e1 in all_events(variables, bn, e)}\n",
-       "    return Factor(variables, cpt)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(make_factor)" ] @@ -2054,118 +691,9 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def all_events(variables, bn, e):\n",
-       "    """Yield every way of extending e with values for all variables."""\n",
-       "    if not variables:\n",
-       "        yield e\n",
-       "    else:\n",
-       "        X, rest = variables[0], variables[1:]\n",
-       "        for e1 in all_events(rest, bn, e):\n",
-       "            for x in bn.variable_values(X):\n",
-       "                yield extend(e1, X, x)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(all_events)" ] @@ -2181,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2190,60 +718,27 @@ }, { "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "f5" ] }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(True,): 0.7, (False,): 0.01}" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "f5.cpt" ] }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Alarm']" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "f5.variables" ] @@ -2257,7 +752,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2266,20 +761,9 @@ }, { "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(True,): 0.7, (False,): 0.30000000000000004}" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "new_factor.cpt" ] @@ -2297,115 +781,9 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def pointwise_product(self, other, bn):\n",
-       "        """Multiply two factors, combining their variables."""\n",
-       "        variables = list(set(self.variables) | set(other.variables))\n",
-       "        cpt = {event_values(e, variables): self.p(e) * other.p(e)\n",
-       "               for e in all_events(variables, bn, {})}\n",
-       "        return Factor(variables, cpt)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(Factor.pointwise_product)" ] @@ -2419,111 +797,9 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def pointwise_product(factors, bn):\n",
-       "    return reduce(lambda f, g: f.pointwise_product(g, bn), factors)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(pointwise_product)" ] @@ -2537,116 +813,9 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def sum_out(self, var, bn):\n",
-       "        """Make a factor eliminating var by summing over its values."""\n",
-       "        variables = [X for X in self.variables if X != var]\n",
-       "        cpt = {event_values(e, variables): sum(self.p(extend(e, var, val))\n",
-       "                                               for val in bn.variable_values(var))\n",
-       "               for e in all_events(variables, bn, {})}\n",
-       "        return Factor(variables, cpt)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(Factor.sum_out)" ] @@ -2660,116 +829,9 @@ }, { "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def sum_out(var, factors, bn):\n",
-       "    """Eliminate var from all factors by summing over its values."""\n",
-       "    result, var_factors = [], []\n",
-       "    for f in factors:\n",
-       "        (var_factors if var in f.variables else result).append(f)\n",
-       "    result.append(pointwise_product(var_factors, bn).sum_out(var, bn))\n",
-       "    return result\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(sum_out)" ] @@ -2796,141 +858,18 @@ }, { "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def elimination_ask(X, e, bn):\n",
-       "    """Compute bn's P(X|e) by variable elimination. [Figure 14.11]\n",
-       "    >>> elimination_ask('Burglary', dict(JohnCalls=T, MaryCalls=T), burglary\n",
-       "    ...  ).show_approx()\n",
-       "    'False: 0.716, True: 0.284'"""\n",
-       "    assert X not in e, "Query variable must be distinct from evidence"\n",
-       "    factors = []\n",
-       "    for var in reversed(bn.variables):\n",
-       "        factors.append(make_factor(var, e, bn))\n",
-       "        if is_hidden(var, X, e):\n",
-       "            factors = sum_out(var, factors, bn)\n",
-       "    return pointwise_product(factors, bn).normalize()\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(elimination_ask)" ] }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.716, True: 0.284'" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "elimination_ask('Burglary', dict(JohnCalls=True, MaryCalls=True), burglary).show_approx()" ] @@ -2973,17 +912,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "105 µs ± 11.9 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "enumeration_ask('Burglary', dict(JohnCalls=True, MaryCalls=True), burglary).show_approx()" @@ -2991,17 +922,9 @@ }, { "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "262 µs ± 54.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "elimination_ask('Burglary', dict(JohnCalls=True, MaryCalls=True), burglary).show_approx()" @@ -3029,20 +952,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'heavy: 0.308, light: 0.462, none: 0.231'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rain_net = DiscreteBayesNet([\n", " ('Rain', '', ['none', 'light', 'heavy'], {(): [0.6, 0.3, 0.1]}),\n", @@ -3064,28 +976,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(27,\n", - " ['Age',\n", - " 'SocioEcon',\n", - " 'GoodStudent',\n", - " 'RiskAversion',\n", - " 'VehicleYear',\n", - " 'MakeModel',\n", - " 'Antilock',\n", - " 'Mileage'])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "insurance_net = insurance()\n", "len(insurance_net.variables), insurance_net.variables[:8]" @@ -3100,21 +993,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(['Adolescent', 'Adult', 'Senior'],\n", - " ['Thousand', 'TenThou', 'HundredThou', 'Million'])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "insurance_net.variable_values('Age'), insurance_net.variable_values('MedCost')" ] @@ -3128,20 +1009,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Adolescent: 0.2, Adult: 0.6, Senior: 0.2'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "elimination_ask('Age', dict(), insurance_net).show_approx()" ] @@ -3155,20 +1025,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.6, True: 0.4'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "elimination_ask('GoodStudent', dict(Age='Adolescent', SocioEcon='Wealthy'), insurance_net).show_approx()" ] @@ -3184,115 +1043,9 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def sample(self, event):\n",
-       "        """Sample from the distribution for this variable conditioned\n",
-       "        on event's values for parent_variables. That is, return True/False\n",
-       "        at random according with the conditional probability given the\n",
-       "        parents."""\n",
-       "        return probability(self.p(True, event))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(BayesNode.sample)" ] @@ -3310,116 +1063,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def prior_sample(bn):\n",
-       "    """Randomly sample from bn's full joint distribution. The result\n",
-       "    is a {variable: value} dict. [Figure 14.13]"""\n",
-       "    event = {}\n",
-       "    for node in bn.nodes:\n",
-       "        event[node.variable] = node.sample(event)\n",
-       "    return event\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(prior_sample)" ] @@ -3449,7 +1095,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3466,7 +1112,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3482,17 +1128,9 @@ }, { "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.503\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "answer = len(rain_true) / N\n", "print(answer)" @@ -3507,17 +1145,9 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.519\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "N = 1000\n", "all_observations = [prior_sample(sprinkler) for x in range(N)]\n", @@ -3535,17 +1165,9 @@ }, { "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.8265895953757225\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "rain_and_cloudy = [observation for observation in rain_true if observation['Cloudy'] == True]\n", "answer = len(rain_and_cloudy) / len(rain_true)\n", @@ -3587,125 +1209,9 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def rejection_sampling(X, e, bn, N=10000):\n",
-       "    """Estimate the probability distribution of variable X given\n",
-       "    evidence e in BayesNet bn, using N samples.  [Figure 14.14]\n",
-       "    Raises a ZeroDivisionError if all the N samples are rejected,\n",
-       "    i.e., inconsistent with e.\n",
-       "    >>> random.seed(47)\n",
-       "    >>> rejection_sampling('Burglary', dict(JohnCalls=T, MaryCalls=T),\n",
-       "    ...   burglary, 10000).show_approx()\n",
-       "    'False: 0.7, True: 0.3'\n",
-       "    """\n",
-       "    counts = {x: 0 for x in bn.variable_values(X)}  # bold N in [Figure 14.14]\n",
-       "    for j in range(N):\n",
-       "        sample = prior_sample(bn)  # boldface x in [Figure 14.14]\n",
-       "        if consistent_with(sample, e):\n",
-       "            counts[sample[X]] += 1\n",
-       "    return ProbDist(X, counts)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(rejection_sampling)" ] @@ -3721,113 +1227,9 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def consistent_with(event, evidence):\n",
-       "    """Is event consistent with the given evidence?"""\n",
-       "    return all(evidence.get(k, v) == v\n",
-       "               for k, v in event.items())\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(consistent_with)" ] @@ -3841,20 +1243,9 @@ }, { "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8035019455252919" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "p = rejection_sampling('Cloudy', dict(Rain=True), sprinkler, 1000)\n", "p[True]" @@ -3874,122 +1265,9 @@ }, { "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def weighted_sample(bn, e):\n",
-       "    """Sample an event from bn that's consistent with the evidence e;\n",
-       "    return the event and its weight, the likelihood that the event\n",
-       "    accords to the evidence."""\n",
-       "    w = 1\n",
-       "    event = dict(e)  # boldface x in [Figure 14.15]\n",
-       "    for node in bn.nodes:\n",
-       "        Xi = node.variable\n",
-       "        if Xi in e:\n",
-       "            w *= node.p(e[Xi], event)\n",
-       "        else:\n",
-       "            event[Xi] = node.sample(event)\n",
-       "    return event, w\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(weighted_sample)" ] @@ -4006,142 +1284,18 @@ }, { "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "({'Rain': True, 'Cloudy': False, 'Sprinkler': True, 'WetGrass': True}, 0.2)" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "weighted_sample(sprinkler, dict(Rain=True))" ] }, { "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def likelihood_weighting(X, e, bn, N=10000):\n",
-       "    """Estimate the probability distribution of variable X given\n",
-       "    evidence e in BayesNet bn.  [Figure 14.15]\n",
-       "    >>> random.seed(1017)\n",
-       "    >>> likelihood_weighting('Burglary', dict(JohnCalls=T, MaryCalls=T),\n",
-       "    ...   burglary, 10000).show_approx()\n",
-       "    'False: 0.702, True: 0.298'\n",
-       "    """\n",
-       "    W = {x: 0 for x in bn.variable_values(X)}\n",
-       "    for j in range(N):\n",
-       "        sample, weight = weighted_sample(bn, e)  # boldface x, w in [Figure 14.15]\n",
-       "        W[sample[X]] += weight\n",
-       "    return ProbDist(X, W)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(likelihood_weighting)" ] @@ -4155,20 +1309,9 @@ }, { "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.2, True: 0.8'" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "likelihood_weighting('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" ] @@ -4186,122 +1329,9 @@ }, { "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def gibbs_ask(X, e, bn, N=1000):\n",
-       "    """[Figure 14.16]"""\n",
-       "    assert X not in e, "Query variable must be distinct from evidence"\n",
-       "    counts = {x: 0 for x in bn.variable_values(X)}  # bold N in [Figure 14.16]\n",
-       "    Z = [var for var in bn.variables if var not in e]\n",
-       "    state = dict(e)  # boldface x in [Figure 14.16]\n",
-       "    for Zi in Z:\n",
-       "        state[Zi] = random.choice(bn.variable_values(Zi))\n",
-       "    for j in range(N):\n",
-       "        for Zi in Z:\n",
-       "            state[Zi] = markov_blanket_sample(Zi, state, bn)\n",
-       "            counts[state[X]] += 1\n",
-       "    return ProbDist(X, counts)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(gibbs_ask)" ] @@ -4315,20 +1345,9 @@ }, { "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.215, True: 0.785'" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" ] @@ -4343,17 +1362,9 @@ }, { "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.2 ms ± 3.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "all_observations = [prior_sample(sprinkler) for x in range(1000)]\n", @@ -4363,17 +1374,9 @@ }, { "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "11 ms ± 687 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "rejection_sampling('Cloudy', dict(Rain=True), sprinkler, 1000)" @@ -4381,17 +1384,9 @@ }, { "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.12 ms ± 554 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "likelihood_weighting('Cloudy', dict(Rain=True), sprinkler, 200)" @@ -4399,17 +1394,9 @@ }, { "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "14.4 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "%%timeit\n", "gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200)" @@ -4483,122 +1470,9 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class HiddenMarkovModel:\n",
-       "    """A Hidden markov model which takes Transition model and Sensor model as inputs"""\n",
-       "\n",
-       "    def __init__(self, transition_model, sensor_model, prior=None):\n",
-       "        self.transition_model = transition_model\n",
-       "        self.sensor_model = sensor_model\n",
-       "        self.prior = prior or [0.5, 0.5]\n",
-       "\n",
-       "    def sensor_dist(self, ev):\n",
-       "        if ev is True:\n",
-       "            return self.sensor_model[0]\n",
-       "        else:\n",
-       "            return self.sensor_model[1]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(HiddenMarkovModel)" ] @@ -4612,7 +1486,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4630,20 +1504,9 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.9, 0.2]" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "hmm.sensor_dist(ev=True)" ] @@ -4695,132 +1558,18 @@ }, { "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def forward(HMM, fv, ev):\n",
-       "    prediction = vector_add(scalar_vector_product(fv[0], HMM.transition_model[0]),\n",
-       "                            scalar_vector_product(fv[1], HMM.transition_model[1]))\n",
-       "    sensor_dist = HMM.sensor_dist(ev)\n",
-       "\n",
-       "    return normalize(element_wise_product(sensor_dist, prediction))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(forward)" ] }, { "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The probability of raining on day 1 is 0.82\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "umbrella_prior = [0.5, 0.5]\n", "belief_day_1 = forward(hmm, umbrella_prior, ev=True)\n", @@ -4837,17 +1586,9 @@ }, { "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The probability of raining in day 2 is 0.88\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "belief_day_2 = forward(hmm, belief_day_1, ev=True)\n", "print ('The probability of raining in day 2 is {:.2f}'.format(belief_day_2[0]))" @@ -4866,135 +1607,18 @@ }, { "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def backward(HMM, b, ev):\n",
-       "    sensor_dist = HMM.sensor_dist(ev)\n",
-       "    prediction = element_wise_product(sensor_dist, b)\n",
-       "\n",
-       "    return normalize(vector_add(scalar_vector_product(prediction[0], HMM.transition_model[0]),\n",
-       "                                scalar_vector_product(prediction[1], HMM.transition_model[1])))\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(backward)" ] }, { "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.6272727272727272, 0.37272727272727274]" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "b = [1, 1]\n", "backward(hmm, b, ev=True)" @@ -5011,57 +1635,18 @@ }, { "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "### AIMA3e\n", - "__function__ FORWARD-BACKWARD(__ev__, _prior_) __returns__ a vector of probability distributions \n", - " __inputs__: __ev__, a vector of evidence values for steps 1,…,_t_ \n", - "     _prior_, the prior distribution on the initial state, __P__(__X__0) \n", - " __local variables__: __fv__, a vector of forward messages for steps 0,…,_t_ \n", - "        __b__, a representation of the backward message, initially all 1s \n", - "        __sv__, a vector of smoothed estimates for steps 1,…,_t_ \n", - "\n", - " __fv__\\[0\\] ← _prior_ \n", - " __for__ _i_ = 1 __to__ _t_ __do__ \n", - "   __fv__\\[_i_\\] ← FORWARD(__fv__\\[_i_ − 1\\], __ev__\\[_i_\\]) \n", - " __for__ _i_ = _t_ __downto__ 1 __do__ \n", - "   __sv__\\[_i_\\] ← NORMALIZE(__fv__\\[_i_\\] × __b__) \n", - "   __b__ ← BACKWARD(__b__, __ev__\\[_i_\\]) \n", - " __return__ __sv__\n", - "\n", - "---\n", - "__Figure ??__ The forward\\-backward algorithm for smoothing: computing posterior probabilities of a sequence of states given a sequence of observations. The FORWARD and BACKWARD operators are defined by Equations (__??__) and (__??__), respectively." - ], - "text/plain": [ - "" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pseudocode('Forward-Backward')" ] }, { "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The probability of raining in Day 0 is 0.65 and in Day 1 is 0.88\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "umbrella_prior = [0.5, 0.5]\n", "prob = forward_backward(hmm, ev=[T, T])\n", @@ -5125,136 +1710,9 @@ }, { "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def fixed_lag_smoothing(e_t, HMM, d, ev, t):\n",
-       "    """[Figure 15.6]\n",
-       "    Smoothing algorithm with a fixed time lag of 'd' steps.\n",
-       "    Online algorithm that outputs the new smoothed estimate if observation\n",
-       "    for new time step is given."""\n",
-       "    ev.insert(0, None)\n",
-       "\n",
-       "    T_model = HMM.transition_model\n",
-       "    f = HMM.prior\n",
-       "    B = [[1, 0], [0, 1]]\n",
-       "    evidence = []\n",
-       "\n",
-       "    evidence.append(e_t)\n",
-       "    O_t = vector_to_diagonal(HMM.sensor_dist(e_t))\n",
-       "    if t > d:\n",
-       "        f = forward(HMM, f, e_t)\n",
-       "        O_tmd = vector_to_diagonal(HMM.sensor_dist(ev[t - d]))\n",
-       "        B = matrix_multiplication(inverse_matrix(O_tmd), inverse_matrix(T_model), B, T_model, O_t)\n",
-       "    else:\n",
-       "        B = matrix_multiplication(B, T_model, O_t)\n",
-       "    t += 1\n",
-       "\n",
-       "    if t > d:\n",
-       "        # always returns a 1x2 matrix\n",
-       "        return [normalize(i) for i in matrix_multiplication([f], B)][0]\n",
-       "    else:\n",
-       "        return None\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(fixed_lag_smoothing)" ] @@ -5280,7 +1738,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5300,20 +1758,9 @@ }, { "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.1111111111111111, 0.8888888888888888]" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "e_t = F\n", "evidence = [T, F, T, F, T]\n", @@ -5322,20 +1769,9 @@ }, { "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.9938650306748466, 0.006134969325153394]" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "e_t = T\n", "evidence = [T, T, F, T, T]\n", @@ -5351,7 +1787,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5422,145 +1858,9 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def particle_filtering(e, N, HMM):\n",
-       "    """Particle filtering considering two states variables."""\n",
-       "    dist = [0.5, 0.5]\n",
-       "    # Weight Initialization\n",
-       "    w = [0 for _ in range(N)]\n",
-       "    # STEP 1\n",
-       "    # Propagate one step using transition model given prior state\n",
-       "    dist = vector_add(scalar_vector_product(dist[0], HMM.transition_model[0]),\n",
-       "                      scalar_vector_product(dist[1], HMM.transition_model[1]))\n",
-       "    # Assign state according to probability\n",
-       "    s = ['A' if probability(dist[0]) else 'B' for _ in range(N)]\n",
-       "    w_tot = 0\n",
-       "    # Calculate importance weight given evidence e\n",
-       "    for i in range(N):\n",
-       "        if s[i] == 'A':\n",
-       "            # P(U|A)*P(A)\n",
-       "            w_i = HMM.sensor_dist(e)[0] * dist[0]\n",
-       "        if s[i] == 'B':\n",
-       "            # P(U|B)*P(B)\n",
-       "            w_i = HMM.sensor_dist(e)[1] * dist[1]\n",
-       "        w[i] = w_i\n",
-       "        w_tot += w_i\n",
-       "\n",
-       "    # Normalize all the weights\n",
-       "    for i in range(N):\n",
-       "        w[i] = w[i] / w_tot\n",
-       "\n",
-       "    # Limit weights to 4 digits\n",
-       "    for i in range(N):\n",
-       "        w[i] = float("{0:.4f}".format(w[i]))\n",
-       "\n",
-       "    # STEP 2\n",
-       "\n",
-       "    s = weighted_sample_with_replacement(N, s, w)\n",
-       "\n",
-       "    return s\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(particle_filtering)" ] @@ -5584,7 +1884,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5595,22 +1895,9 @@ }, { "cell_type": "code", - "execution_count": 87, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A']" - ] - }, - "execution_count": 87, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "particle_filtering(T, 10, hmm)" ] @@ -5624,20 +1911,9 @@ }, { "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['A', 'B', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B']" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "particle_filtering([F, T, F, F, T], 10, hmm)" ] @@ -5701,134 +1977,9 @@ }, { "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def monte_carlo_localization(a, z, N, P_motion_sample, P_sensor, m, S=None):\n",
-       "    """Monte Carlo localization algorithm from Fig 25.9"""\n",
-       "\n",
-       "    def ray_cast(sensor_num, kin_state, m):\n",
-       "        return m.ray_cast(sensor_num, kin_state)\n",
-       "\n",
-       "    M = len(z)\n",
-       "    W = [0]*N\n",
-       "    S_ = [0]*N\n",
-       "    W_ = [0]*N\n",
-       "    v = a['v']\n",
-       "    w = a['w']\n",
-       "\n",
-       "    if S is None:\n",
-       "        S = [m.sample() for _ in range(N)]\n",
-       "\n",
-       "    for i in range(N):\n",
-       "        S_[i] = P_motion_sample(S[i], v, w)\n",
-       "        W_[i] = 1\n",
-       "        for j in range(M):\n",
-       "            z_ = ray_cast(j, S_[i], m)\n",
-       "            W_[i] = W_[i] * P_sensor(z[j], z_)\n",
-       "\n",
-       "    S = weighted_sample_with_replacement(N, S_, W_)\n",
-       "    return S\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(monte_carlo_localization)" ] @@ -5865,24 +2016,9 @@ }, { "cell_type": "code", - "execution_count": 90, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "m = MCLmap([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0],\n", @@ -5908,7 +2044,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5935,7 +2071,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5959,7 +2095,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5976,7 +2112,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5992,40 +2128,9 @@ }, { "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GRID:\n", - " 0 0 12 0 143 14 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 17 52 201 6 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 3 5 19 9 3 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 6 166 0 21 0 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 1 11 75 0 0 0 0 0 0 0 0 0 0 0\n", - " 73 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0\n", - "124 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 0\n", - " 0 0 0 14 4 15 1 0 0 0 0 0 0 0 0 0 0\n", - " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "grid = [[0]*17 for _ in range(11)]\n", "for x, y, _ in S:\n", @@ -6052,40 +2157,9 @@ }, { "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GRID:\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "a = {'v': (0, 1), 'w': 0}\n", "z = (2, 3, 5, 7)\n", @@ -6135,118 +2209,9 @@ }, { "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def DTAgentProgram(belief_state):\n",
-       "    """A decision-theoretic agent. [Figure 13.1]"""\n",
-       "    def program(percept):\n",
-       "        belief_state.observe(program.action, percept)\n",
-       "        program.action = argmax(belief_state.actions(),\n",
-       "                                key=belief_state.expected_outcome_utility)\n",
-       "        return program.action\n",
-       "    program.action = None\n",
-       "    return program\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(DTAgentProgram)" ] @@ -6284,137 +2249,9 @@ }, { "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class DecisionNetwork(BayesNet):\n",
-       "    """An abstract class for a decision network as a wrapper for a BayesNet.\n",
-       "    Represents an agent's current state, its possible actions, reachable states\n",
-       "    and utilities of those states."""\n",
-       "\n",
-       "    def __init__(self, action, infer):\n",
-       "        """action: a single action node\n",
-       "        infer: the preferred method to carry out inference on the given BayesNet"""\n",
-       "        super(DecisionNetwork, self).__init__()\n",
-       "        self.action = action\n",
-       "        self.infer = infer\n",
-       "\n",
-       "    def best_action(self):\n",
-       "        """Return the best action in the network"""\n",
-       "        return self.action\n",
-       "\n",
-       "    def get_utility(self, action, state):\n",
-       "        """Return the utility for a particular action and state in the network"""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def get_expected_utility(self, action, evidence):\n",
-       "        """Compute the expected utility given an action and evidence"""\n",
-       "        u = 0.0\n",
-       "        prob_dist = self.infer(action, evidence, self).prob\n",
-       "        for item, _ in prob_dist.items():\n",
-       "            u += prob_dist[item] * self.get_utility(action, item)\n",
-       "\n",
-       "        return u\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(DecisionNetwork)" ] @@ -6472,167 +2309,9 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class InformationGatheringAgent(Agent):\n",
-       "    """A simple information gathering agent. The agent works by repeatedly selecting\n",
-       "    the observation with the highest information value, until the cost of the next\n",
-       "    observation is greater than its expected benefit. [Figure 16.9]"""\n",
-       "\n",
-       "    def __init__(self, decnet, infer, initial_evidence=None):\n",
-       "        """decnet: a decision network\n",
-       "        infer: the preferred method to carry out inference on the given decision network\n",
-       "        initial_evidence: initial evidence"""\n",
-       "        self.decnet = decnet\n",
-       "        self.infer = infer\n",
-       "        self.observation = initial_evidence or []\n",
-       "        self.variables = self.decnet.nodes\n",
-       "\n",
-       "    def integrate_percept(self, percept):\n",
-       "        """Integrate the given percept into the decision network"""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def execute(self, percept):\n",
-       "        """Execute the information gathering algorithm"""\n",
-       "        self.observation = self.integrate_percept(percept)\n",
-       "        vpis = self.vpi_cost_ratio(self.variables)\n",
-       "        j = argmax(vpis)\n",
-       "        variable = self.variables[j]\n",
-       "\n",
-       "        if self.vpi(variable) > self.cost(variable):\n",
-       "            return self.request(variable)\n",
-       "\n",
-       "        return self.decnet.best_action()\n",
-       "\n",
-       "    def request(self, variable):\n",
-       "        """Return the value of the given random variable as the next percept"""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def cost(self, var):\n",
-       "        """Return the cost of obtaining evidence through tests, consultants or questions"""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def vpi_cost_ratio(self, variables):\n",
-       "        """Return the VPI to cost ratio for the given variables"""\n",
-       "        v_by_c = []\n",
-       "        for var in variables:\n",
-       "            v_by_c.append(self.vpi(var) / self.cost(var))\n",
-       "        return v_by_c\n",
-       "\n",
-       "    def vpi(self, variable):\n",
-       "        """Return VPI for a given variable"""\n",
-       "        vpi = 0.0\n",
-       "        prob_dist = self.infer(variable, self.observation, self.decnet).prob\n",
-       "        for item, _ in prob_dist.items():\n",
-       "            post_prob = prob_dist[item]\n",
-       "            new_observation = list(self.observation)\n",
-       "            new_observation.append(item)\n",
-       "            expected_utility = self.decnet.get_expected_utility(variable, new_observation)\n",
-       "            vpi += post_prob * expected_utility\n",
-       "\n",
-       "        vpi -= self.decnet.get_expected_utility(variable, self.observation)\n",
-       "        return vpi\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(InformationGatheringAgent)" ] diff --git a/notebooks/reinforcement_learning.ipynb b/notebooks/reinforcement_learning.ipynb index afb6a6a9b..1593dd84f 100644 --- a/notebooks/reinforcement_learning.ipynb +++ b/notebooks/reinforcement_learning.ipynb @@ -21,9 +21,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from aima.reinforcement_learning import *" @@ -46,9 +44,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## OVERVIEW\n", "\n", @@ -125,9 +121,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from aima.mdp import sequential_decision_environment" @@ -143,9 +137,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Action Directions\n", @@ -173,9 +165,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%psource PassiveDUEAgent" @@ -184,9 +174,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "DUEagent = PassiveDUEAgent(policy, sequential_decision_environment)\n", @@ -224,9 +212,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%psource PassiveADPAgent" @@ -242,9 +228,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [], "source": [ "ADPagent = PassiveADPAgent(policy, sequential_decision_environment)\n", @@ -262,9 +246,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [], "source": [ "print('\\n'.join([str(k)+':'+str(v) for k, v in ADPagent.U.items()]))" @@ -282,9 +264,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%psource PassiveTDAgent" @@ -300,9 +280,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "TDagent = PassiveTDAgent(policy, sequential_decision_environment, alpha = lambda n: 60./(59+n))" @@ -318,9 +296,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "for i in range(200):\n", @@ -357,9 +333,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from aima.mdp import value_iteration" @@ -394,9 +368,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", @@ -452,9 +424,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## ACTIVE REINFORCEMENT LEARNING\n", "\n", @@ -473,9 +443,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "%psource QLearningAgent" @@ -500,9 +468,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "q_agent = QLearningAgent(sequential_decision_environment, Ne=5, Rplus=2, \n", @@ -519,9 +485,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "for i in range(200):\n", @@ -564,9 +528,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "U = defaultdict(lambda: -1000.) # Very Large Negative Value for Comparison see below.\n", @@ -604,18 +566,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] } @@ -641,10 +599,10 @@ "pycharm": { "stem_cell": { "cell_type": "raw", - "source": [], "metadata": { "collapsed": false - } + }, + "source": [] } } }, diff --git a/notebooks/sarsa.ipynb b/notebooks/sarsa.ipynb index aa416c66a..1e988cef6 100644 --- a/notebooks/sarsa.ipynb +++ b/notebooks/sarsa.ipynb @@ -3,6 +3,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -11,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "df8c6d04", + "id": "1", "metadata": {}, "source": [ "# SARSA: on-policy temporal-difference control (Section 21.3)\n", @@ -21,16 +22,9 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "e09d067c", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:12.314587Z", - "iopub.status.busy": "2026-06-23T10:42:12.314299Z", - "iopub.status.idle": "2026-06-23T10:42:12.476638Z", - "shell.execute_reply": "2026-06-23T10:42:12.475299Z" - } - }, + "execution_count": null, + "id": "2", + "metadata": {}, "outputs": [], "source": [ "from aima.reinforcement_learning import SARSALearningAgent, QLearningAgent, run_single_trial\n", @@ -39,34 +33,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "c6d05046", - "metadata": { - "execution": { - "iopub.execute_input": "2026-06-23T10:42:12.482836Z", - "iopub.status.busy": "2026-06-23T10:42:12.482453Z", - "iopub.status.idle": "2026-06-23T10:42:12.522062Z", - "shell.execute_reply": "2026-06-23T10:42:12.520759Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Learned SARSA utilities U(s) = max_a Q(s, a):\n", - " (0, 0) -> -0.347\n", - " (0, 1) -> -0.305\n", - " (0, 2) -> -0.289\n", - " (1, 0) -> -0.255\n", - " (1, 2) -> -0.27\n", - " (2, 0) -> -0.372\n", - " (2, 1) -> 0.349\n", - " (2, 2) -> -0.06\n", - " (3, 0) -> -0.393\n" - ] - } - ], + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], "source": [ "sarsa = SARSALearningAgent(env, Ne=5, Rplus=2, alpha=lambda n: 60. / (59 + n))\n", "for _ in range(200):\n", diff --git a/notebooks/search.ipynb b/notebooks/search.ipynb index 55f6cb6ce..096105eba 100644 --- a/notebooks/search.ipynb +++ b/notebooks/search.ipynb @@ -11,9 +11,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "# Solving problems by Searching\n", "\n", @@ -22,10 +20,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.search import *\n", @@ -98,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -124,159 +120,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Problem(object):\n",
-       "\n",
-       "    """The abstract class for a formal problem. You should subclass\n",
-       "    this and implement the methods actions and result, and possibly\n",
-       "    __init__, goal_test, and path_cost. Then you will create instances\n",
-       "    of your subclass and solve them with the various search functions."""\n",
-       "\n",
-       "    def __init__(self, initial, goal=None):\n",
-       "        """The constructor specifies the initial state, and possibly a goal\n",
-       "        state, if there is a unique goal. Your subclass's constructor can add\n",
-       "        other arguments."""\n",
-       "        self.initial = initial\n",
-       "        self.goal = goal\n",
-       "\n",
-       "    def actions(self, state):\n",
-       "        """Return the actions that can be executed in the given\n",
-       "        state. The result would typically be a list, but if there are\n",
-       "        many actions, consider yielding them one at a time in an\n",
-       "        iterator, rather than building them all at once."""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def result(self, state, action):\n",
-       "        """Return the state that results from executing the given\n",
-       "        action in the given state. The action must be one of\n",
-       "        self.actions(state)."""\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def goal_test(self, state):\n",
-       "        """Return True if the state is a goal. The default method compares the\n",
-       "        state to self.goal or checks for state in self.goal if it is a\n",
-       "        list, as specified in the constructor. Override this method if\n",
-       "        checking against a single self.goal is not enough."""\n",
-       "        if isinstance(self.goal, list):\n",
-       "            return is_in(state, self.goal)\n",
-       "        else:\n",
-       "            return state == self.goal\n",
-       "\n",
-       "    def path_cost(self, c, state1, action, state2):\n",
-       "        """Return the cost of a solution path that arrives at state2 from\n",
-       "        state1 via action, assuming cost c to get up to state1. If the problem\n",
-       "        is such that the path doesn't matter, this function will only look at\n",
-       "        state2.  If the path does matter, it will consider c and maybe state1\n",
-       "        and action. The default method costs 1 for every step in the path."""\n",
-       "        return c + 1\n",
-       "\n",
-       "    def value(self, state):\n",
-       "        """For optimization problems, each state has a value.  Hill-climbing\n",
-       "        and related algorithms try to maximize this value."""\n",
-       "        raise NotImplementedError\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(Problem)" ] @@ -316,172 +162,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class Node:\n",
-       "\n",
-       "    """A node in a search tree. Contains a pointer to the parent (the node\n",
-       "    that this is a successor of) and to the actual state for this node. Note\n",
-       "    that if a state is arrived at by two paths, then there are two nodes with\n",
-       "    the same state.  Also includes the action that got us to this state, and\n",
-       "    the total path_cost (also known as g) to reach the node.  Other functions\n",
-       "    may add an f and h value; see best_first_graph_search and astar_search for\n",
-       "    an explanation of how the f and h values are handled. You will not need to\n",
-       "    subclass this class."""\n",
-       "\n",
-       "    def __init__(self, state, parent=None, action=None, path_cost=0):\n",
-       "        """Create a search tree Node, derived from a parent by an action."""\n",
-       "        self.state = state\n",
-       "        self.parent = parent\n",
-       "        self.action = action\n",
-       "        self.path_cost = path_cost\n",
-       "        self.depth = 0\n",
-       "        if parent:\n",
-       "            self.depth = parent.depth + 1\n",
-       "\n",
-       "    def __repr__(self):\n",
-       "        return "<Node {}>".format(self.state)\n",
-       "\n",
-       "    def __lt__(self, node):\n",
-       "        return self.state < node.state\n",
-       "\n",
-       "    def expand(self, problem):\n",
-       "        """List the nodes reachable in one step from this node."""\n",
-       "        return [self.child_node(problem, action)\n",
-       "                for action in problem.actions(self.state)]\n",
-       "\n",
-       "    def child_node(self, problem, action):\n",
-       "        """[Figure 3.10]"""\n",
-       "        next_state = problem.result(self.state, action)\n",
-       "        next_node = Node(next_state, self, action,\n",
-       "                    problem.path_cost(self.path_cost, self.state,\n",
-       "                                      action, next_state))\n",
-       "        return next_node\n",
-       "    \n",
-       "    def solution(self):\n",
-       "        """Return the sequence of actions to go from the root to this node."""\n",
-       "        return [node.action for node in self.path()[1:]]\n",
-       "\n",
-       "    def path(self):\n",
-       "        """Return a list of nodes forming the path from the root to this node."""\n",
-       "        node, path_back = self, []\n",
-       "        while node:\n",
-       "            path_back.append(node)\n",
-       "            node = node.parent\n",
-       "        return list(reversed(path_back))\n",
-       "\n",
-       "    # We want for a queue of nodes in breadth_first_graph_search or\n",
-       "    # astar_search to have no duplicated states, so we treat nodes\n",
-       "    # with the same state as equal. [Problem: this may not be what you\n",
-       "    # want in other contexts.]\n",
-       "\n",
-       "    def __eq__(self, other):\n",
-       "        return isinstance(other, Node) and self.state == other.state\n",
-       "\n",
-       "    def __hash__(self):\n",
-       "        return hash(self.state)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(Node)" ] @@ -524,148 +207,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class GraphProblem(Problem):\n",
-       "\n",
-       "    """The problem of searching a graph from one node to another."""\n",
-       "\n",
-       "    def __init__(self, initial, goal, graph):\n",
-       "        Problem.__init__(self, initial, goal)\n",
-       "        self.graph = graph\n",
-       "\n",
-       "    def actions(self, A):\n",
-       "        """The actions at a graph node are just its neighbors."""\n",
-       "        return list(self.graph.get(A).keys())\n",
-       "\n",
-       "    def result(self, state, action):\n",
-       "        """The result of going to a neighbor is just that neighbor."""\n",
-       "        return action\n",
-       "\n",
-       "    def path_cost(self, cost_so_far, A, action, B):\n",
-       "        return cost_so_far + (self.graph.get(A, B) or infinity)\n",
-       "\n",
-       "    def find_min_edge(self):\n",
-       "        """Find minimum value of edges."""\n",
-       "        m = infinity\n",
-       "        for d in self.graph.graph_dict.values():\n",
-       "            local_min = min(d.values())\n",
-       "            m = min(m, local_min)\n",
-       "\n",
-       "        return m\n",
-       "\n",
-       "    def h(self, node):\n",
-       "        """h function is straight-line distance from a node's state to goal."""\n",
-       "        locs = getattr(self.graph, 'locations', None)\n",
-       "        if locs:\n",
-       "            if type(node) is str:\n",
-       "                return int(distance(locs[node], locs[self.goal]))\n",
-       "\n",
-       "            return int(distance(locs[node.state], locs[self.goal]))\n",
-       "        else:\n",
-       "            return infinity\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(GraphProblem)" ] @@ -679,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -710,9 +254,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "It is pretty straightforward to understand this `romania_map`. The first node **Arad** has three neighbours named **Zerind**, **Sibiu**, **Timisoara**. Each of these nodes are 75, 140, 118 units apart from **Arad** respectively. And the same goes with other nodes.\n", "\n", @@ -726,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -751,17 +293,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Arad': (91, 492), 'Bucharest': (400, 327), 'Craiova': (253, 288), 'Drobeta': (165, 299), 'Eforie': (562, 293), 'Fagaras': (305, 449), 'Giurgiu': (375, 270), 'Hirsova': (534, 350), 'Iasi': (473, 506), 'Lugoj': (165, 379), 'Mehadia': (168, 339), 'Neamt': (406, 537), 'Oradea': (131, 571), 'Pitesti': (320, 368), 'Rimnicu': (233, 410), 'Sibiu': (207, 457), 'Timisoara': (94, 410), 'Urziceni': (456, 350), 'Vaslui': (509, 444), 'Zerind': (108, 531)}\n" - ] - } - ], + "outputs": [], "source": [ "romania_locations = romania_map.locations\n", "print(romania_locations)" @@ -776,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -810,22 +344,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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xAmLMerXr69GjRpp48aNqlatmhwdHeXh4aFVq1Yltunevbu++eYbnT17NnEZfULx9XHL2JctW6Y6derI0dFRzs7O6tSpky5cuGDRplixYvL19dXcuXNVrlw52dvba8OGDWn9MQHJotiZzd27d08LFixQ6dKl1b59e9WtW1e2tvETfk0mk9zd3dWxY0dt2bJF9+/f19GjRw1OjOf13//+V7Gxsfr666+NjgIAAIAUMJlM8vDwkLe3t5o2bapq1aopR44cqR6ndOnSWrRokTZv3qzt27erTJkymjt3rqKjeSALrNSNMCny2rP1jbwa3z+dxcbGKiYmJvEVGxtrcb5v376ytbXVN998o/nz50uS1qxZo1atWumFF17Q999/r08++UTh4eGqX7++rly5YtH/+PHjGjRokAYPHqzly5ercOHCat++feIDzAIDA+Xj46MiRYokLqNftmzZY/POmjVLnTp1UuXKlfXDDz9o9uzZCg8PV6NGjXT/vuVep5s2bUp8dsT69etVqVKltPjIgKdiGXs29uDBAy1fvlw9evSQjc2T6945c+ZUhw4dFBoaqri4OHl4eGRQSqQ1GxsbzZw5U+3atVPbtm2VL18+oyMBAAAgA1WuXFkrV67U3r17NWLECE2aNEljx45V586dn/pzAZBpHBgg3T745DYPL0gxqZzVmSDmoRT2luRY7PFtXvCUaiTd6zI1ypcvb/G+Xr16FjMpX375Zc2ZM8eizciRI1W2bFmtXbs28RcfderUUfny5RUSEqLJkycntr1x44Z27dqll156SZJUtWpVFS1aVEuXLtWQIUPk7u6uAgUKyMHB4alL1u/evavhw4fLz8/PIlOtWrVUvnx5LViwQP369Us8fufOHf32228pmoEOpCX+S5aNrVixQt27d0/V/6Fp1KiRTp06pb/++isdkyG91alTR6+++qrGjh1rdBQAAAAYpE6dOtq8ebPmzJmjGTNmyNPTU6tWrZLZwKW7QJoyx0p61n/P5v/rn75WrFihffv2Jb4SZm8m+OfDx6T4gmN4eLg6d+5sMcO7dOnS8vLy0vbt2y3aly9fPrHQKUmurq4qUKCAzp07l+qsP//8s+7fv69u3bpZzEYtUaKEypQpox07dli0f/nllyl0whDM7MymTpw4ocqVKz/T8pdWrVppzZo1atOmTTokQ0YJDg6Wh4eH/Pz8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QKFQYMuWLdi0aRMGDBgAHR0dAMDx48dRsWJFzJgxA02aNIGDg8M7d2+3t7fHyJEjsXPnTsyePRvr169/52tZWloCABITE/OPvblZEVFpx2KnGuBSdiLSBnl5eTAyMsKDBw/QoUMHDB8+HM2bN8f169dx4MABhIaG4vTp08jOzsaiRYtExyWif2FpaYm1a9di4MCBePnypeg4REREak1fXx99+/bFnDlzEB8fj6FDh+Z/rXr16rh37x62b9+O+Ph4rFmzBjt27Chw/fjx4xEREYG//voL58+fR0REBGrXrv3O1zIyMoKjoyMWLlyIa9euITo6Gt9//32xPh+ROmGxUw1wkyIi0gYymQwAsHz5cjx9+hR//PEHNmzYAAcHB0ilUshkMhgbG6NJkya4fPmy4LREVBjdunWDs7MzvL29RUchIiJSe8OGDcOzZ8/QokUL1KpVK/949+7dMXnyZEyYMAENGzZEZGQk5s6dW+DavLw8jB07FrVr10anTp1Qvnx5+Pv7v/e1AgICkJubC0dHR4wZM+a9S96JSiOJisMihatYsSKOHTuGihUrio5CRFSsEhIS0K5dOwwcOBAzZszI33399Vyhly9fombNmpg5cyZGjRolMioRFdKLFy/QoEEDrF27Fm5ubqLjEBEREZGWY2enGmBnJxFpi4yMDGRmZqJfv34A/i5ySqVSZGZmYteuXXBxcYG5uTm6d+8uOCkRFVaZMmXg7++PYcOGITk5WXQcIiIiItJyLHaqAc7sJCJtUb16dZiZmcHPzw93795FdnY2tm3bhgkTJmDJkiUoX7481qxZAysrK9FRiegjuLi4wNPTE6NHjwYXDRERERGRSCx2qgF2dhKRNlm7di2uX7+ORo0aoVy5cli6dClu3bqFTp06YcWKFWjVqpXoiET0CRYsWIArV64gKChIdBQiIiIi0mJy0QHo713ZWOwkIm3RvHlz7N+/HxEREdDT0wMANGzYEHZ2doKTEdHn0NfXR2BgINzc3ODs7My/00REREQkBIudaoDL2IlI2xgZGcHDw0N0DCIqYo0bN8b48eMxZMgQREREQCKRiI5ERERERFqGy9jVAJexExERUWkxbdo0vHjxAj///LPoKERERELl5OSgSpUqiIqKEh2FSKuw2KkGuIydiAhQqVTc2ISoFJDL5di8eTN8fHxw69Yt0XGIiIiE2bJl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RZcuXQC8KkDXrFnz1tvb32bRokWwtbXFihUr8Pnnn6NatWpo1qxZpZoPWyIIgiB2CCIiIiIiondxc3PDkCFDMGrUKLGjEBERkRpj2UlERERERGrt8ePHaNKkCR4/fowqVaqIHYeIiIjUmI7YAYiIiIiIiN4lICAAQ4YMYdFJRERE78WRnUREREREpLYUCgWkUil2796NFi1aiB2HiIiI1BxHdhIREWmY+fPno1GjRmLHICKqEKdOnYKpqSmaN28udhQiIiLSACw7/6+9+4/Vuqz/B/68ETkczoFNzrAfgMQRISg4SSAWzjlxobDmPFGK0YaDTQJmbZoZmzSiWBlqLsBsUpow1MCs4a9Vp0z/MGQHiMLDDx2K6CjAgiO/jp3780f7su8JEPCc0+HcPB5/8b7u68frvv86e3Jd7wsA2smuXbvyta99LRdeeGHKysrSt2/fXHPNNXn66adbNe9tt92W559/vo2qBDizLV26NNOnTz/t22YBgLOTY+wA0A62b9+esWPHpmfPnvnOd76TmpqaNDc35/e//33uuuuuvPHGG8eMOXLkSLp169YB1QKcmfbu3Zvq6uq89tpr6d27d0eXAwB0AnZ2AkA7mDlzZorFYtauXZsvfelLGTJkSIYOHZrZs2dnw4YNSZJCoZDFixentrY2FRUVmTNnTv79739n2rRpGThwYMrLy3PRRRflrrvuSnNz89G5//sYe3Nzc+bPn5/+/funrKwsw4cPz69//eujn3/mM5/Jrbfe2qK+ffv2pby8PL/61a+SJMuWLcvo0aPTs2fPnH/++fniF7+YnTt3tudPBHBSy5cvzzXXXCPoBABOmbATANrY3r178+yzz2b27NmprKw85vPzzjvv6L/nzZuXCRMmZOPGjZk1a1aam5vTt2/fPP7443nllVfyve99LwsWLMjPf/7zE65333335Yc//GF+8IMfZOPGjbnuuutSW1ub9evXJ0mmTJmSRx99tEVgumrVqpSXl2fixIlJ/rOrdN68edmwYUNWr16d3bt3Z/LkyW31kwCctmKxmAcffDDTp0/v6FIAgE7EMXYAaGNr1qzJmDFj8sQTT+S66647Yb9CoZDZs2fnxz/+8fvOd8cdd2Tt2rX53e9+l+Q/OztXrlyZv/71r0mSvn375uabb87cuXOPjrniiivSr1+/LFu2LHv27MlHPvKRPPPMMxk3blyS5KqrrsqFF16YBx544LhrNjQ0ZOjQodmxY0f69et3Wt8foC38v53x27ZtS5cu9mgAAKfGXw0A0MZO5/8RR40adUzbT37yk4waNSp9+vRJZWVl7r333uO+4zP5z3H0t956K2PHjm3Rftlll2XTpk1JkqqqqowfPz7Lly9Pkrz99tv5wx/+kClTphztX19fn2uvvTYDBgxIz549j9Z1onUB2tvSpUtz0003CToBgNPiLwcAaGMXXXRRCoVCXnnllZP2raioaPH82GOP5etf/3qmTp2a5557LuvXr8/MmTNz5MiR953neLcU//9tU6ZMyapVq3Lo0KGsWLEi/fv3z2WXXZYkeffddzN+/Pj06NEjjzzySF5++eU8++yzSXLSdQHaw4EDB/LYY49l6tSpHV0KANDJCDsBoI317t0748ePz6JFi9LY2HjM5//85z9POPbFF1/MmDFjMnv27IwcOTKDBg3Kq6++esL+vXr1ykc/+tG8+OKLx8wzbNiwo8/XXnttkmT16tVZvnx5vvzlLx8NQxsaGrJ79+4sWLAgl19+eT7+8Y/n73//+2l9Z4C2tHLlylx66aXp379/R5cCAHQywk4AaAdLlixJsVjMqFGj8stf/jKbN29OQ0ND7r///owYMeKE4wYPHpz6+vo888wz2bp1a+bPn5/nn3/+fdf6xje+kYULF2bFihXZsmVL5s6dmxdeeKHFDezdu3dPbW1tvvvd76a+vr7FEfYLLrggZWVlWbRoUV577bU89dRTufPOO1v/IwB8QEuXLs20adM6ugwAoBPq2tEFAEApGjhwYOrr67NgwYJ885vfzM6dO1NVVZWampoTXgqUJDfffHPWr1+fG2+8McViMV/4whdy66235mc/+9kJx9xyyy3Zv39/br/99uzatStDhgzJqlWr8qlPfapFv6985St56KGHMnLkyAwdOvRoe58+ffLwww9nzpw5Wbx4cUaMGJF77rknV199det/CIDTtGXLljQ0NOTzn/98R5cCAHRCbmMHAADOGHfccUfee++9LFy4sKNLAQA6IWEnAABwRnjvvffSv3//1NXVtdiBDgBwqryzEwAAOCM8/fTTqa6uFnQCAB+YsBMAADgjPPjggy4mAgBaxTF2AACgw7311lv5xCc+kR07dqSysrKjywEAOik7OwEAgA738MMPZ9KkSYJOAKBV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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "show_map(romania_graph_data)" ] @@ -848,144 +369,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class SimpleProblemSolvingAgentProgram:\n",
-       "\n",
-       "    """Abstract framework for a problem-solving agent. [Figure 3.1]"""\n",
-       "\n",
-       "    def __init__(self, initial_state=None):\n",
-       "        """State is an abstract representation of the state\n",
-       "        of the world, and seq is the list of actions required\n",
-       "        to get to a particular state from the initial state(root)."""\n",
-       "        self.state = initial_state\n",
-       "        self.seq = []\n",
-       "\n",
-       "    def __call__(self, percept):\n",
-       "        """[Figure 3.1] Formulate a goal and problem, then\n",
-       "        search for a sequence of actions to solve it."""\n",
-       "        self.state = self.update_state(self.state, percept)\n",
-       "        if not self.seq:\n",
-       "            goal = self.formulate_goal(self.state)\n",
-       "            problem = self.formulate_problem(self.state, goal)\n",
-       "            self.seq = self.search(problem)\n",
-       "            if not self.seq:\n",
-       "                return None\n",
-       "        return self.seq.pop(0)\n",
-       "\n",
-       "    def update_state(self, state, percept):\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def formulate_goal(self, state):\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def formulate_problem(self, state, goal):\n",
-       "        raise NotImplementedError\n",
-       "\n",
-       "    def search(self, problem):\n",
-       "        raise NotImplementedError\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(SimpleProblemSolvingAgentProgram)" ] @@ -1020,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1061,19 +447,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Left\n", - "Suck\n", - "Right\n" - ] - } - ], + "outputs": [], "source": [ "state1 = [(0, 0), [(0, 0), \"Dirty\"], [(1, 0), [\"Dirty\"]]]\n", "state2 = [(1, 0), [(0, 0), \"Dirty\"], [(1, 0), [\"Dirty\"]]]\n", @@ -1296,9 +672,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "## 3. BREADTH-FIRST GRAPH SEARCH\n", "\n", @@ -1307,7 +681,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1389,7 +763,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1475,7 +849,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1560,7 +934,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1574,9 +948,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "all_node_colors = []\n", @@ -1598,7 +970,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1694,7 +1066,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1728,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1765,7 +1137,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1802,7 +1174,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1886,9 +1258,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "all_node_colors = []\n", @@ -1924,145 +1294,9 @@ }, { "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def recursive_best_first_search(problem, h=None):\n",
-       "    """[Figure 3.26] Recursive best-first search (RBFS) is an\n",
-       "    informative search algorithm. Like A*, it uses the heuristic\n",
-       "    f(n) = g(n) + h(n) to determine the next node to expand, making\n",
-       "    it both optimal and complete (iff the heuristic is consistent).\n",
-       "    To reduce memory consumption, RBFS uses a depth first search\n",
-       "    and only retains the best f values of its ancestors."""\n",
-       "    h = memoize(h or problem.h, 'h')\n",
-       "\n",
-       "    def RBFS(problem, node, flimit):\n",
-       "        if problem.goal_test(node.state):\n",
-       "            return node, 0   # (The second value is immaterial)\n",
-       "        successors = node.expand(problem)\n",
-       "        if len(successors) == 0:\n",
-       "            return None, infinity\n",
-       "        for s in successors:\n",
-       "            s.f = max(s.path_cost + h(s), node.f)\n",
-       "        while True:\n",
-       "            # Order by lowest f value\n",
-       "            successors.sort(key=lambda x: x.f)\n",
-       "            best = successors[0]\n",
-       "            if best.f > flimit:\n",
-       "                return None, best.f\n",
-       "            if len(successors) > 1:\n",
-       "                alternative = successors[1].f\n",
-       "            else:\n",
-       "                alternative = infinity\n",
-       "            result, best.f = RBFS(problem, best, min(flimit, alternative))\n",
-       "            if result is not None:\n",
-       "                return result, best.f\n",
-       "\n",
-       "    node = Node(problem.initial)\n",
-       "    node.f = h(node)\n",
-       "    result, bestf = RBFS(problem, node, infinity)\n",
-       "    return result\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(recursive_best_first_search)" ] @@ -2076,20 +1310,9 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Sibiu', 'Rimnicu', 'Pitesti', 'Bucharest']" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "recursive_best_first_search(romania_problem).solution()" ] @@ -2103,20 +1326,9 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['UP', 'LEFT', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'RIGHT', 'DOWN']" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "puzzle = EightPuzzle((2, 4, 3, 1, 5, 6, 7, 8, 0))\n", "assert puzzle.check_solvability((2, 4, 3, 1, 5, 6, 7, 8, 0))\n", @@ -2138,20 +1350,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABLEAAAFdCAYAAAD8Af8KAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAvvJJREFUeJzs3Xd4U+XbB/DvyepM94Iyyi5bpgOVKVMFlKE/VBABEcUBKEPZIALiRMEXUBScqCggKKKCiMqUvVeBli7aNB1JmvG8f2AjISnNOaVNKd/PdfUKnD73uZ/TJOc+5zlLEkIIEBERERERERERVWAqX3eAiIiIiIiIiIioJBzEIiIiIiIiIiKiCo+DWEREREREREREVOFxEIuIiIiIiIiIiCo8DmIREREREREREVGFx0EsIiIiIiIiIiKq8DiIRUREREREREREFR4HsYiIiIiIiIiIqMLjIBbd1AYPHoz777+/xGl0bW3atMG4ceMq/DyJiG5EGzZsQEJCAg4fPnzNaXRtCxYsQEJCAux2e4WeJxFRWbrzzjvxwgsvlDiNimc0GpGQkIBFixZV6HlWVhzEqqC+++47JCQkOH9q1aqFli1bon///vj5559LbH/lT//+/V3abtmyBQ8//DDatGmDZs2a4YEHHsCyZctQUFBQqj5v3boVDz74IBo2bIgWLVrgueeeQ1pamlu7t956q9i+ZmRklKoPcqWlpSElJaXEaXRt58+fR2ZmZoWfJ1FlY7PZ8Nlnn2HgwIFo0aIFEhMT0bFjRwwdOhTr1q2DzWZztk1KSnJZ39auXRu33HILhgwZgn/++cdt3le3v/pnxIgR16Vt3bp10bJlS/Tt2xdz587FhQsXnG2XLVuGhIQErFmzxuPyf/7550hISMAXX3yh6O/3119/oVatWkhISMCpU6fcfp+ZmYn/+7//Q5cuXZCQkICpU6cqylNa+fn5SEpKQmFh4TWn0bVlZ2cjKSkJQogKPU+iG4XZbEaTJk2QkJCAbdu2FdvOYrHg/fffR8+ePdGkSRPccccdGDZsGLZs2eJsM3jw4GvWEU/7NVu2bEFCQgKaNWtW7Lrw119/dYmvU6cO2rRpg9GjR+PMmTPX5e+wevVq9O7dG40aNUKnTp3wwQcfuA1sjx492uPyNGvW7Lr0QY4LFy647XN5mkbFczgcSEpKQk5OToWeZ2Wl8XUHyLO8vDwkJSXhgw8+QNeuXQEA6enpWLx4Mbp27Yr33nsPo0aNumb7Iv7+/s5/T506FTNmzMBTTz2Ft99+G2FhYdi8eTMmTZqElStX4rffflPU388//xyPPPIIhgwZghUrViA3NxcTJkxA27ZtsX37dsTFxTnbGgwGJCUl4dChQwgMDHSZT0REhKL8REQ3mwsXLqB37964cOECxo4di7FjxyIsLAwXLlzAN998gwceeACPPPIIPvzwQwCA1WpFUlISRo4cifHjx8PhcODUqVOYOHEibr31Vvz2229o166dc/5Xt7/alevv0rQVQsBgMODAgQNYsmQJpk6dijlz5uCFF17AkCFDsHTpUgwfPhy33XYbYmJiXJZ/1KhRaNWqFQYOHCj775efn4/HHnsMWVlZMBqNsFqtLr83Go1o2rQp7rvvPgwbNgwPP/wwLl26JDsPEVFl9c033+DQoUMIDQ3FBx984FJDiphMJtxxxx04f/48Zs6ciTvuuAMWiwXLly9Hp06d8P777+PJJ5/EvHnzYDKZnHEbNmzAqFGj8Oabb6JPnz7O6Vfu1yxevBg5OTlISkrCd999hwEDBrjlLygoQFJSEubPn49+/frBarXiwIEDGDt2LD777DPs2bMHNWvWVPw3GDZsGNauXYuZM2firrvuQm5uLj7++GMsWrQIzzzzjLNdRkYGLBYL/vrrL5d4lYrnlBDJxUGsCi4mJgYJCQkAgISEBLRp0wabNm1yG8Ty1P5qWVlZePXVV3H//ffj/fffd05v1KgRHnzwQcyaNUtRH61WK5599lm0bt0ay5Ytc05fs2YN6tSpg1deeQVLly51i6tRowaCg4MV5SQiuplZrVb06tULmZmZ2LNnD+Lj452/q1+/Pjp16oQnn3wSn3/+uVtsaGios07Url0bdevWRe3atTFv3jx8//3312xfktK0bdGiBR599FE888wzGDNmDOLi4vDwww9jxYoVuOWWWzBs2DDnGVlCCDz++OOQJAnLly+HJEle5bzS2LFjIUkShg8fjgULFrj9Xq/X4/z589BoNEhNTZU9fyKiym7p0qW444470K1bN7z22mt45513EBYW5tJm5cqV2Lt3Lz777DM8/PDDzult27bFfffd51y/xsbGusRFR0cDAKKiojzWlaysLKxevRpTp07F6tWrsXTpUo+DWEWunE+9evUQEBCA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "from aima.notebook_utils import grid_search_steps, plot_grid_search\n", @@ -2201,7 +1402,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2225,7 +1426,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2286,20 +1487,9 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solving the puzzle \n", "puzzle = EightPuzzle((2, 4, 3, 1, 5, 6, 7, 8, 0))\n", @@ -2317,20 +1507,9 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['UP', 'LEFT', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'RIGHT', 'DOWN']" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "astar_search(puzzle).solution()" ] @@ -2345,82 +1524,36 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['UP', 'LEFT', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'RIGHT', 'DOWN']" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "astar_search(puzzle, linear).solution()" ] }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['LEFT', 'UP', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'DOWN', 'RIGHT']" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "astar_search(puzzle, manhattan).solution()" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['LEFT', 'UP', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'DOWN', 'RIGHT']" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "astar_search(puzzle, sqrt_manhattan).solution()" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['LEFT', 'UP', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'DOWN', 'RIGHT']" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "astar_search(puzzle, max_heuristic).solution()" ] @@ -2434,20 +1567,9 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['LEFT', 'UP', 'UP', 'LEFT', 'DOWN', 'RIGHT', 'DOWN', 'UP', 'DOWN', 'RIGHT']" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "recursive_best_first_search(puzzle, manhattan).solution()" ] @@ -2466,7 +1588,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2484,17 +1606,9 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.24 ms ± 190 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(puzzle_1)\n", @@ -2504,17 +1618,9 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.68 ms ± 368 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(puzzle_1, linear)\n", @@ -2524,17 +1630,9 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.12 ms ± 88.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(puzzle_1, manhattan)\n", @@ -2544,17 +1642,9 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "22.7 ms ± 1.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(puzzle_1, sqrt_manhattan)\n", @@ -2564,17 +1654,9 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.91 ms ± 434 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(puzzle_1, max_heuristic)\n", @@ -2603,17 +1685,9 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "140 ms ± 9.89 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "recursive_best_first_search(puzzle_1, linear)\n", @@ -2649,124 +1723,9 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def hill_climbing(problem):\n",
-       "    """From the initial node, keep choosing the neighbor with highest value,\n",
-       "    stopping when no neighbor is better. [Figure 4.2]"""\n",
-       "    current = Node(problem.initial)\n",
-       "    while True:\n",
-       "        neighbors = current.expand(problem)\n",
-       "        if not neighbors:\n",
-       "            break\n",
-       "        neighbor = argmax_random_tie(neighbors,\n",
-       "                                     key=lambda node: problem.value(node.state))\n",
-       "        if problem.value(neighbor.state) <= problem.value(current.state):\n",
-       "            break\n",
-       "        current = neighbor\n",
-       "    return current.state\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(hill_climbing)" ] @@ -2784,7 +1743,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2834,17 +1793,9 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Arad', 'Bucharest', 'Craiova', 'Drobeta', 'Eforie', 'Fagaras', 'Giurgiu', 'Hirsova', 'Iasi', 'Lugoj', 'Mehadia', 'Neamt', 'Oradea', 'Pitesti', 'Rimnicu', 'Sibiu', 'Timisoara', 'Urziceni', 'Vaslui', 'Zerind']\n" - ] - } - ], + "outputs": [], "source": [ "distances = {}\n", "all_cities = []\n", @@ -2866,7 +1817,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2939,7 +1890,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2956,39 +1907,9 @@ }, { "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Arad',\n", - " 'Timisoara',\n", - " 'Lugoj',\n", - " 'Mehadia',\n", - " 'Drobeta',\n", - " 'Craiova',\n", - " 'Pitesti',\n", - " 'Giurgiu',\n", - " 'Bucharest',\n", - " 'Urziceni',\n", - " 'Eforie',\n", - " 'Hirsova',\n", - " 'Vaslui',\n", - " 'Iasi',\n", - " 'Neamt',\n", - " 'Fagaras',\n", - " 'Rimnicu',\n", - " 'Sibiu',\n", - " 'Oradea',\n", - " 'Zerind']" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "hill_climbing(tsp)" ] @@ -3031,125 +1952,9 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def simulated_annealing(problem, schedule=exp_schedule()):\n",
-       "    """[Figure 4.5] CAUTION: This differs from the pseudocode as it\n",
-       "    returns a state instead of a Node."""\n",
-       "    current = Node(problem.initial)\n",
-       "    for t in range(sys.maxsize):\n",
-       "        T = schedule(t)\n",
-       "        if T == 0:\n",
-       "            return current.state\n",
-       "        neighbors = current.expand(problem)\n",
-       "        if not neighbors:\n",
-       "            return current.state\n",
-       "        next_choice = random.choice(neighbors)\n",
-       "        delta_e = problem.value(next_choice.state) - problem.value(current.state)\n",
-       "        if delta_e > 0 or probability(math.exp(delta_e / T)):\n",
-       "            current = next_choice\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(simulated_annealing)" ] @@ -3165,113 +1970,9 @@ }, { "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def exp_schedule(k=20, lam=0.005, limit=100):\n",
-       "    """One possible schedule function for simulated annealing"""\n",
-       "    return lambda t: (k * math.exp(-lam * t) if t < limit else 0)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(exp_schedule)" ] @@ -3286,7 +1987,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3304,20 +2005,9 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'E': (1, 0), 'N': (0, 1), 'S': (0, -1), 'W': (-1, 0)}" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "directions4" ] @@ -3331,7 +2021,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3347,7 +2037,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3356,20 +2046,9 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "max(solutions)" ] @@ -3391,7 +2070,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3407,20 +2086,9 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "heatmap(grid, cmap='jet', interpolation='spline16')" ] @@ -3435,27 +2103,9 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'E': (1, 0),\n", - " 'N': (0, 1),\n", - " 'NE': (1, 1),\n", - " 'NW': (-1, 1),\n", - " 'S': (0, -1),\n", - " 'SE': (1, -1),\n", - " 'SW': (-1, -1),\n", - " 'W': (-1, 0)}" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "directions8" ] @@ -3471,7 +2121,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3480,17 +2130,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "533 ms ± 51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "solutions = {problem.value(simulated_annealing(problem)) for i in range(100)}" @@ -3498,20 +2140,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "max(solutions)" ] @@ -3537,17 +2168,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "206 µs ± 21.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "solution = problem.value(hill_climbing(problem))" @@ -3555,20 +2178,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "solution = problem.value(hill_climbing(problem))\n", "solution" @@ -3594,7 +2206,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3607,20 +2219,9 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "heatmap(grid, cmap='jet', interpolation='spline16')" ] @@ -3643,7 +2244,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3659,10 +2260,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "solution = problem.value(hill_climbing(problem))" @@ -3670,20 +2269,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "solution" ] @@ -3697,20 +2285,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "32" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "solutions = {problem.value(simulated_annealing(problem)) for i in range(100)}\n", "max(solutions)" @@ -3837,122 +2414,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def genetic_algorithm(population, fitness_fn, gene_pool=[0, 1], f_thres=None, ngen=1000, pmut=0.1):\n",
-       "    """[Figure 4.8]"""\n",
-       "    for i in range(ngen):\n",
-       "        population = [mutate(recombine(*select(2, population, fitness_fn)), gene_pool, pmut)\n",
-       "                      for i in range(len(population))]\n",
-       "\n",
-       "        fittest_individual = fitness_threshold(fitness_fn, f_thres, population)\n",
-       "        if fittest_individual:\n",
-       "            return fittest_individual\n",
-       "\n",
-       "\n",
-       "    return argmax(population, key=fitness_fn)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(genetic_algorithm)" ] @@ -3989,114 +2453,9 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def recombine(x, y):\n",
-       "    n = len(x)\n",
-       "    c = random.randrange(0, n)\n",
-       "    return x[:c] + y[c:]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(recombine)" ] @@ -4112,121 +2471,9 @@ }, { "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def mutate(x, gene_pool, pmut):\n",
-       "    if random.uniform(0, 1) >= pmut:\n",
-       "        return x\n",
-       "\n",
-       "    n = len(x)\n",
-       "    g = len(gene_pool)\n",
-       "    c = random.randrange(0, n)\n",
-       "    r = random.randrange(0, g)\n",
-       "\n",
-       "    new_gene = gene_pool[r]\n",
-       "    return x[:c] + [new_gene] + x[c+1:]\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(mutate)" ] @@ -4242,122 +2489,9 @@ }, { "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def init_population(pop_number, gene_pool, state_length):\n",
-       "    """Initializes population for genetic algorithm\n",
-       "    pop_number  :  Number of individuals in population\n",
-       "    gene_pool   :  List of possible values for individuals\n",
-       "    state_length:  The length of each individual"""\n",
-       "    g = len(gene_pool)\n",
-       "    population = []\n",
-       "    for i in range(pop_number):\n",
-       "        new_individual = [gene_pool[random.randrange(0, g)] for j in range(state_length)]\n",
-       "        population.append(new_individual)\n",
-       "\n",
-       "    return population\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(init_population)" ] @@ -4409,10 +2543,8 @@ }, { "cell_type": "code", - "execution_count": 55, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "target = 'Genetic Algorithm'" @@ -4420,19 +2552,15 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "We then need to define our gene pool, i.e the elements which an individual from the population might comprise of. Here, the gene pool contains all uppercase and lowercase letters of the English alphabet and the space character." ] }, { "cell_type": "code", - "execution_count": 56, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# The ASCII values of uppercase characters ranges from 65 to 91\n", @@ -4455,10 +2583,8 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "max_population = 100" @@ -4473,10 +2599,8 @@ }, { "cell_type": "code", - "execution_count": 58, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "mutation_rate = 0.07 # 7%" @@ -4491,10 +2615,8 @@ }, { "cell_type": "code", - "execution_count": 59, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def fitness_fn(sample):\n", @@ -4516,10 +2638,8 @@ }, { "cell_type": "code", - "execution_count": 60, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "population = init_population(max_population, gene_pool, len(target))" @@ -4534,10 +2654,8 @@ }, { "cell_type": "code", - "execution_count": 61, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "parents = select(2, population, fitness_fn) " @@ -4545,10 +2663,8 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "# The recombine function takes two parents as arguments, so we need to unpack the previous variable\n", @@ -4564,10 +2680,8 @@ }, { "cell_type": "code", - "execution_count": 63, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "child = mutate(child, gene_pool, mutation_rate)" @@ -4586,10 +2700,8 @@ }, { "cell_type": "code", - "execution_count": 64, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "population = [mutate(recombine(*select(2, population, fitness_fn)), gene_pool, mutation_rate) for i in range(len(population))]" @@ -4604,10 +2716,8 @@ }, { "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "current_best = max(population, key=fitness_fn)" @@ -4622,17 +2732,9 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['J', 'y', 'O', 'e', ' ', 'h', 'c', 'r', 'C', 'W', 'H', 'o', 'r', 'R', 'y', 'P', 'U']\n" - ] - } - ], + "outputs": [], "source": [ "print(current_best)" ] @@ -4646,17 +2748,9 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "JyOe hcrCWHorRyPU\n" - ] - } - ], + "outputs": [], "source": [ "current_best_string = ''.join(current_best)\n", "print(current_best_string)" @@ -4675,10 +2769,8 @@ }, { "cell_type": "code", - "execution_count": 68, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "ngen = 1200 # maximum number of generations\n", @@ -4690,19 +2782,15 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "To generate `ngen` number of generations, we run a `for` loop `ngen` number of times. After each generation, we calculate the fitness of the best individual of the generation and compare it to the value of `f_thres` using the `fitness_threshold` function. After every generation, we print out the best individual of the generation and the corresponding fitness value. Lets now write a function to do this." ] }, { "cell_type": "code", - "execution_count": 69, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def genetic_algorithm_stepwise(population, fitness_fn, gene_pool=[0, 1], f_thres=None, ngen=1200, pmut=0.1):\n", @@ -4730,122 +2818,9 @@ }, { "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def genetic_algorithm(population, fitness_fn, gene_pool=[0, 1], f_thres=None, ngen=1000, pmut=0.1):\n",
-       "    """[Figure 4.8]"""\n",
-       "    for i in range(ngen):\n",
-       "        population = [mutate(recombine(*select(2, population, fitness_fn)), gene_pool, pmut)\n",
-       "                      for i in range(len(population))]\n",
-       "\n",
-       "        fittest_individual = fitness_threshold(fitness_fn, f_thres, population)\n",
-       "        if fittest_individual:\n",
-       "            return fittest_individual\n",
-       "\n",
-       "\n",
-       "    return argmax(population, key=fitness_fn)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(genetic_algorithm)" ] @@ -4859,17 +2834,9 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current best: Genetic Algorithm\t\tGeneration: 985\t\tFitness: 17\r" - ] - } - ], + "outputs": [], "source": [ "population = init_population(max_population, gene_pool, len(target))\n", "solution, generations = genetic_algorithm_stepwise(population, fitness_fn, gene_pool, f_thres, ngen, mutation_rate)" @@ -4912,10 +2879,8 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "edges = {\n", @@ -4937,17 +2902,9 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[['R', 'G', 'G', 'G'], ['G', 'R', 'R', 'G'], ['G', 'G', 'G', 'G'], ['G', 'R', 'G', 'G'], ['G', 'G', 'G', 'R'], ['G', 'R', 'R', 'G'], ['G', 'R', 'G', 'G'], ['G', 'G', 'R', 'G']]\n" - ] - } - ], + "outputs": [], "source": [ "population = init_population(8, ['R', 'G'], 4)\n", "print(population)" @@ -4964,10 +2921,8 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def fitness(c):\n", @@ -4983,17 +2938,9 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['R', 'G', 'R', 'G']\n" - ] - } - ], + "outputs": [], "source": [ "solution = genetic_algorithm(population, fitness, gene_pool=['R', 'G'])\n", "print(solution)" @@ -5008,17 +2955,9 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n" - ] - } - ], + "outputs": [], "source": [ "print(fitness(solution))" ] @@ -5053,17 +2992,9 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[2, 6, 2, 0, 2, 3, 4, 7], [7, 2, 0, 6, 3, 3, 0, 6], [2, 3, 0, 6, 6, 2, 5, 5], [2, 6, 4, 2, 3, 5, 5, 5], [3, 1, 5, 1, 5, 1, 0, 3]]\n" - ] - } - ], + "outputs": [], "source": [ "population = init_population(100, range(8), 8)\n", "print(population[:5])" @@ -5084,10 +3015,8 @@ }, { "cell_type": "code", - "execution_count": 78, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "def fitness(q):\n", @@ -5116,18 +3045,9 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2, 5, 7, 1, 3, 6, 4, 6]\n", - "25\n" - ] - } - ], + "outputs": [], "source": [ "solution = genetic_algorithm(population, fitness, f_thres=25, gene_pool=range(8))\n", "print(solution)\n", @@ -5163,170 +3083,9 @@ }, { "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class NQueensProblem(Problem):\n",
-       "\n",
-       "    """The problem of placing N queens on an NxN board with none attacking\n",
-       "    each other.  A state is represented as an N-element array, where\n",
-       "    a value of r in the c-th entry means there is a queen at column c,\n",
-       "    row r, and a value of -1 means that the c-th column has not been\n",
-       "    filled in yet.  We fill in columns left to right.\n",
-       "    >>> depth_first_tree_search(NQueensProblem(8))\n",
-       "    <Node (7, 3, 0, 2, 5, 1, 6, 4)>\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, N):\n",
-       "        self.N = N\n",
-       "        self.initial = tuple([-1] * N)\n",
-       "        Problem.__init__(self, self.initial)\n",
-       "\n",
-       "    def actions(self, state):\n",
-       "        """In the leftmost empty column, try all non-conflicting rows."""\n",
-       "        if state[-1] is not -1:\n",
-       "            return []  # All columns filled; no successors\n",
-       "        else:\n",
-       "            col = state.index(-1)\n",
-       "            return [row for row in range(self.N)\n",
-       "                    if not self.conflicted(state, row, col)]\n",
-       "\n",
-       "    def result(self, state, row):\n",
-       "        """Place the next queen at the given row."""\n",
-       "        col = state.index(-1)\n",
-       "        new = list(state[:])\n",
-       "        new[col] = row\n",
-       "        return tuple(new)\n",
-       "\n",
-       "    def conflicted(self, state, row, col):\n",
-       "        """Would placing a queen at (row, col) conflict with anything?"""\n",
-       "        return any(self.conflict(row, col, state[c], c)\n",
-       "                   for c in range(col))\n",
-       "\n",
-       "    def conflict(self, row1, col1, row2, col2):\n",
-       "        """Would putting two queens in (row1, col1) and (row2, col2) conflict?"""\n",
-       "        return (row1 == row2 or  # same row\n",
-       "                col1 == col2 or  # same column\n",
-       "                row1 - col1 == row2 - col2 or  # same \\ diagonal\n",
-       "                row1 + col1 == row2 + col2)   # same / diagonal\n",
-       "\n",
-       "    def goal_test(self, state):\n",
-       "        """Check if all columns filled, no conflicts."""\n",
-       "        if state[-1] is -1:\n",
-       "            return False\n",
-       "        return not any(self.conflicted(state, state[col], col)\n",
-       "                       for col in range(len(state)))\n",
-       "\n",
-       "    def h(self, node):\n",
-       "        """Return number of conflicting queens for a given node"""\n",
-       "        num_conflicts = 0\n",
-       "        for (r1, c1) in enumerate(node.state):\n",
-       "            for (r2, c2) in enumerate(node.state):\n",
-       "                if (r1, c1) != (r2, c2):\n",
-       "                    num_conflicts += self.conflict(r1, c1, r2, c2)\n",
-       "\n",
-       "        return num_conflicts\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NQueensProblem)" ] @@ -5345,10 +3104,8 @@ }, { "cell_type": "code", - "execution_count": 81, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "nqp = NQueensProblem(8)" @@ -5365,17 +3122,9 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4.82 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "depth_first_tree_search(nqp)" @@ -5384,9 +3133,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "_, _, goal_node = depth_first_tree_search(nqp) # Unpack the tuple\n", @@ -5395,20 +3142,9 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_NQueens(dfts)" ] @@ -5422,17 +3158,9 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "88.6 ms ± 2.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "breadth_first_tree_search(nqp)" @@ -5441,9 +3169,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "_, _, goal_node = breadth_first_tree_search(nqp) # Unpack the tuple\n", @@ -5452,20 +3178,9 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_NQueens(bfts)" ] @@ -5479,17 +3194,9 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.08 s ± 154 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "uniform_cost_search(nqp)" @@ -5497,10 +3204,8 @@ }, { "cell_type": "code", - "execution_count": 89, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "ucs = uniform_cost_search(nqp).solution()" @@ -5508,20 +3213,9 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_NQueens(ucs)" ] @@ -5544,136 +3238,18 @@ }, { "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
    def h(self, node):\n",
-       "        """Return number of conflicting queens for a given node"""\n",
-       "        num_conflicts = 0\n",
-       "        for (r1, c1) in enumerate(node.state):\n",
-       "            for (r2, c2) in enumerate(node.state):\n",
-       "                if (r1, c1) != (r2, c2):\n",
-       "                    num_conflicts += self.conflict(r1, c1, r2, c2)\n",
-       "\n",
-       "        return num_conflicts\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(NQueensProblem.h)" ] }, { "cell_type": "code", - "execution_count": 92, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8.85 ms ± 424 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "%%timeit\n", "astar_search(nqp)" @@ -5688,10 +3264,8 @@ }, { "cell_type": "code", - "execution_count": 93, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "astar = astar_search(nqp).solution()" @@ -5699,22 +3273,9 @@ }, { "cell_type": "code", - "execution_count": 94, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plot_NQueens(astar)" ] @@ -5747,144 +3308,9 @@ }, { "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
def and_or_graph_search(problem):\n",
-       "    """[Figure 4.11]Used when the environment is nondeterministic and completely observable.\n",
-       "    Contains OR nodes where the agent is free to choose any action.\n",
-       "    After every action there is an AND node which contains all possible states\n",
-       "    the agent may reach due to stochastic nature of environment.\n",
-       "    The agent must be able to handle all possible states of the AND node (as it\n",
-       "    may end up in any of them).\n",
-       "    Returns a conditional plan to reach goal state,\n",
-       "    or failure if the former is not possible."""\n",
-       "\n",
-       "    # functions used by and_or_search\n",
-       "    def or_search(state, problem, path):\n",
-       "        """returns a plan as a list of actions"""\n",
-       "        if problem.goal_test(state):\n",
-       "            return []\n",
-       "        if state in path:\n",
-       "            return None\n",
-       "        for action in problem.actions(state):\n",
-       "            plan = and_search(problem.result(state, action),\n",
-       "                              problem, path + [state, ])\n",
-       "            if plan is not None:\n",
-       "                return [action, plan]\n",
-       "\n",
-       "    def and_search(states, problem, path):\n",
-       "        """Returns plan in form of dictionary where we take action plan[s] if we reach state s."""\n",
-       "        plan = {}\n",
-       "        for s in states:\n",
-       "            plan[s] = or_search(s, problem, path)\n",
-       "            if plan[s] is None:\n",
-       "                return None\n",
-       "        return plan\n",
-       "\n",
-       "    # body of and or search\n",
-       "    return or_search(problem.initial, problem, [])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(and_or_graph_search)" ] @@ -5914,7 +3340,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5924,28 +3350,16 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Suck',\n", - " {'State_5': ['Right', {'State_6': ['Suck', {'State_8': []}]}], 'State_7': []}]" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "plan" ] }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -5960,22 +3374,9 @@ }, { "cell_type": "code", - "execution_count": 80, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "run_plan('State_1', vacuum_world, plan)" ] @@ -6014,155 +3415,9 @@ }, { "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class OnlineDFSAgent:\n",
-       "\n",
-       "    """[Figure 4.21] The abstract class for an OnlineDFSAgent. Override\n",
-       "    update_state method to convert percept to state. While initializing\n",
-       "    the subclass a problem needs to be provided which is an instance of\n",
-       "    a subclass of the Problem class."""\n",
-       "\n",
-       "    def __init__(self, problem):\n",
-       "        self.problem = problem\n",
-       "        self.s = None\n",
-       "        self.a = None\n",
-       "        self.untried = dict()\n",
-       "        self.unbacktracked = dict()\n",
-       "        self.result = {}\n",
-       "\n",
-       "    def __call__(self, percept):\n",
-       "        s1 = self.update_state(percept)\n",
-       "        if self.problem.goal_test(s1):\n",
-       "            self.a = None\n",
-       "        else:\n",
-       "            if s1 not in self.untried.keys():\n",
-       "                self.untried[s1] = self.problem.actions(s1)\n",
-       "            if self.s is not None:\n",
-       "                if s1 != self.result[(self.s, self.a)]:\n",
-       "                    self.result[(self.s, self.a)] = s1\n",
-       "                    self.unbacktracked[s1].insert(0, self.s)\n",
-       "            if len(self.untried[s1]) == 0:\n",
-       "                if len(self.unbacktracked[s1]) == 0:\n",
-       "                    self.a = None\n",
-       "                else:\n",
-       "                    # else a <- an action b such that result[s', b] = POP(unbacktracked[s'])\n",
-       "                    unbacktracked_pop = self.unbacktracked.pop(s1)\n",
-       "                    for (s, b) in self.result.keys():\n",
-       "                        if self.result[(s, b)] == unbacktracked_pop:\n",
-       "                            self.a = b\n",
-       "                            break\n",
-       "            else:\n",
-       "                self.a = self.untried.pop(s1)\n",
-       "        self.s = s1\n",
-       "        return self.a\n",
-       "\n",
-       "    def update_state(self, percept):\n",
-       "        """To be overridden in most cases. The default case\n",
-       "        assumes the percept to be of type state."""\n",
-       "        return percept\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(OnlineDFSAgent)" ] @@ -6204,160 +3459,9 @@ }, { "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class LRTAStarAgent:\n",
-       "\n",
-       "    """ [Figure 4.24]\n",
-       "    Abstract class for LRTA*-Agent. A problem needs to be\n",
-       "    provided which is an instance of a subclass of Problem Class.\n",
-       "\n",
-       "    Takes a OnlineSearchProblem [Figure 4.23] as a problem.\n",
-       "    """\n",
-       "\n",
-       "    def __init__(self, problem):\n",
-       "        self.problem = problem\n",
-       "        # self.result = {}      # no need as we are using problem.result\n",
-       "        self.H = {}\n",
-       "        self.s = None\n",
-       "        self.a = None\n",
-       "\n",
-       "    def __call__(self, s1):     # as of now s1 is a state rather than a percept\n",
-       "        if self.problem.goal_test(s1):\n",
-       "            self.a = None\n",
-       "            return self.a\n",
-       "        else:\n",
-       "            if s1 not in self.H:\n",
-       "                self.H[s1] = self.problem.h(s1)\n",
-       "            if self.s is not None:\n",
-       "                # self.result[(self.s, self.a)] = s1    # no need as we are using problem.output\n",
-       "\n",
-       "                # minimum cost for action b in problem.actions(s)\n",
-       "                self.H[self.s] = min(self.LRTA_cost(self.s, b, self.problem.output(self.s, b),\n",
-       "                                     self.H) for b in self.problem.actions(self.s))\n",
-       "\n",
-       "            # an action b in problem.actions(s1) that minimizes costs\n",
-       "            self.a = argmin(self.problem.actions(s1),\n",
-       "                            key=lambda b: self.LRTA_cost(s1, b, self.problem.output(s1, b), self.H))\n",
-       "\n",
-       "            self.s = s1\n",
-       "            return self.a\n",
-       "\n",
-       "    def LRTA_cost(self, s, a, s1, H):\n",
-       "        """Returns cost to move from state 's' to state 's1' plus\n",
-       "        estimated cost to get to goal from s1."""\n",
-       "        print(s, a, s1)\n",
-       "        if s1 is None:\n",
-       "            return self.problem.h(s)\n",
-       "        else:\n",
-       "            # sometimes we need to get H[s1] which we haven't yet added to H\n",
-       "            # to replace this try, except: we can initialize H with values from problem.h\n",
-       "            try:\n",
-       "                return self.problem.c(s, a, s1) + self.H[s1]\n",
-       "            except:\n",
-       "                return self.problem.c(s, a, s1) + self.problem.h(s1)\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(LRTAStarAgent)" ] @@ -6385,20 +3489,9 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "one_dim_state_space" ] @@ -6412,7 +3505,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6428,7 +3521,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6444,118 +3537,36 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State_3 Right State_4\n", - "State_3 Left State_2\n" - ] - }, - { - "data": { - "text/plain": [ - "'Right'" - ] - }, - "execution_count": 86, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "lrta_agent('State_3')" ] }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State_3 Right State_4\n", - "State_3 Left State_2\n", - "State_4 Right State_5\n", - "State_4 Left State_3\n" - ] - }, - { - "data": { - "text/plain": [ - "'Left'" - ] - }, - "execution_count": 87, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "lrta_agent('State_4')" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State_4 Right State_5\n", - "State_4 Left State_3\n", - "State_3 Right State_4\n", - "State_3 Left State_2\n" - ] - }, - { - "data": { - "text/plain": [ - "'Right'" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "lrta_agent('State_3')" ] }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State_3 Right State_4\n", - "State_3 Left State_2\n", - "State_4 Right State_5\n", - "State_4 Left State_3\n" - ] - }, - { - "data": { - "text/plain": [ - "'Right'" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "lrta_agent('State_4')" ] @@ -6569,7 +3580,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6619,39 +3630,6 @@ }, "source": [] } - }, - "widgets": { - "state": { - "1516e2501ddd4a2e8e3250bffc0164db": { - "views": [ - { - "cell_index": 59 - } - ] - }, - "17be64c89a9a4a43b3272cb018df0970": { - "views": [ - { - "cell_index": 59 - } - ] - }, - "ac05040009a340b0af81b0ee69161fbc": { - "views": [ - { - "cell_index": 59 - } - ] - }, - "d9735ffe77c24f13ae4ad3620ce84334": { - "views": [ - { - "cell_index": 59 - } - ] - } - }, - "version": "1.2.0" } }, "nbformat": 4, diff --git a/notebooks/text.ipynb b/notebooks/text.ipynb index 7ef5b29e1..3632dd259 100644 --- a/notebooks/text.ipynb +++ b/notebooks/text.ipynb @@ -20,10 +20,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from aima.text import *\n", @@ -92,20 +90,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(2081, 'the'), (1479, 'of'), (1021, 'and'), (1008, 'to'), (850, 'a')]\n", - "[(368, ('of', 'the')), (152, ('to', 'the')), (152, ('in', 'the')), (86, ('of', 'a')), (80, ('it', 'is'))]\n", - "0.0036724740723330495\n", - "0.00114584557527324\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "wordseq = words(flatland)\n", @@ -131,21 +118,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Conditional Probabilities Table: {'now': 2, 'glad': 1, 'keenly': 1, 'considered': 1, 'once': 2, 'not': 4, 'in': 2, 'by': 1, 'simulating': 1, 'intoxicated': 1, 'wearied': 1, 'quite': 1, 'certain': 2, 'sitting': 1, 'to': 2, 'rapidly': 1, 'will': 1, 'describing': 1, 'allowed': 1, 'at': 2, 'afraid': 1, 'covered': 1, 'approaching': 1, 'standing': 1, 'myself': 1, 'surprised': 1, 'unusually': 1, 'rapt': 1, 'pleased': 1, 'crushed': 1} \n", - "\n", - "Conditional Probability of 'once' give 'i was': 0.05128205128205128 \n", - "\n", - "Next word after 'i was': wearied\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "wordseq = words(flatland)\n", @@ -173,20 +148,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(19208, 'e'), (13965, 't'), (12069, 'o'), (11702, 'a'), (11440, 'i')]\n", - "[(5364, (' ', 't')), (4573, ('t', 'h')), (4063, (' ', 'a')), (3654, ('h', 'e')), (2967, (' ', 'i'))]\n", - "0.0006028715031814578\n", - "0.0032371578540395666\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "wordseq = words(flatland)\n", @@ -221,19 +185,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "hearing as inside is confined to conduct by the duties\n", - "all and of voice being in a day of the\n", - "party they are stirred to mutual warfare and perish by\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "wordseq = words(flatland)\n", @@ -258,20 +212,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "leave them at cleveland this christmas now pray do not ask you to relate or\n", - "meaning and both of us sprang forward in the direction and no sooner had they\n", - "palmer though very unwilling to go as well from real humanity and good nature as\n", - "time about what they should do and they agreed he should take orders directly and\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "data = open_data(\"EN-text/flatland.txt\").read()\n", "data += open_data(\"EN-text/sense.txt\").read()\n", @@ -345,18 +288,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sequence of words is: ['it', 'is', 'easy', 'to', 'read', 'words', 'without', 'spaces']\n", - "Probability of sequence is: 2.273672843573388e-24\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "wordseq = words(flatland)\n", @@ -413,10 +347,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "psource(IRSystem)" @@ -456,10 +388,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "psource(UnixConsultant)" @@ -476,17 +406,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7682667868462166 aima-data/MAN/rm.txt\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "uc = UnixConsultant()\n", "\n", @@ -505,17 +427,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7546722691607105 aima-data/MAN/diff.txt\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "q = uc.query(\"how do I delete a file\")\n", "\n", @@ -600,17 +514,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DEFGZABC\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plaintext = \"ABCDWXYZ\"\n", "ciphertext = shift_encode(plaintext, 3)\n", @@ -628,17 +534,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['th', 'hi', 'is', 's ', ' i', 'is', 's ', ' a', 'a ', ' s', 'se', 'en', 'nt', 'te', 'en', 'nc', 'ce']\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(bigrams('this is a sentence'))" ] @@ -652,10 +550,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "%psource ShiftDecoder" @@ -672,17 +568,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The code is \"Guvf vf n frperg zrffntr\"\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plaintext = \"This is a secret message\"\n", "ciphertext = shift_encode(plaintext, 13)\n", @@ -691,17 +579,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The decoded message is \"This is a secret message\"\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "flatland = open_data(\"EN-text/flatland.txt\").read()\n", "decoder = ShiftDecoder(flatland)\n", @@ -737,18 +617,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\"ahed world\" decodes to \"shed could\"\n", - "\"ahed woxld\" decodes to \"shew atiow\"\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ciphertexts = ['ahed world', 'ahed woxld']\n", "\n", diff --git a/notebooks/vacuum_world.ipynb b/notebooks/vacuum_world.ipynb index 8fa52dffc..9ccddd704 100644 --- a/notebooks/vacuum_world.ipynb +++ b/notebooks/vacuum_world.ipynb @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -99,171 +99,26 @@ }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "

\n", - "\n", - "
class TrivialVacuumEnvironment(Environment):\n",
-       "\n",
-       "    """This environment has two locations, A and B. Each can be Dirty\n",
-       "    or Clean. The agent perceives its location and the location's\n",
-       "    status. This serves as an example of how to implement a simple\n",
-       "    Environment."""\n",
-       "\n",
-       "    def __init__(self):\n",
-       "        super().__init__()\n",
-       "        self.status = {loc_A: random.choice(['Clean', 'Dirty']),\n",
-       "                       loc_B: random.choice(['Clean', 'Dirty'])}\n",
-       "\n",
-       "    def thing_classes(self):\n",
-       "        return [Wall, Dirt, ReflexVacuumAgent, RandomVacuumAgent,\n",
-       "                TableDrivenVacuumAgent, ModelBasedVacuumAgent]\n",
-       "\n",
-       "    def percept(self, agent):\n",
-       "        """Returns the agent's location, and the location status (Dirty/Clean)."""\n",
-       "        return (agent.location, self.status[agent.location])\n",
-       "\n",
-       "    def execute_action(self, agent, action):\n",
-       "        """Change agent's location and/or location's status; track performance.\n",
-       "        Score 10 for each dirt cleaned; -1 for each move."""\n",
-       "        if action == 'Right':\n",
-       "            agent.location = loc_B\n",
-       "            agent.performance -= 1\n",
-       "        elif action == 'Left':\n",
-       "            agent.location = loc_A\n",
-       "            agent.performance -= 1\n",
-       "        elif action == 'Suck':\n",
-       "            if self.status[agent.location] == 'Dirty':\n",
-       "                agent.performance += 10\n",
-       "            self.status[agent.location] = 'Clean'\n",
-       "\n",
-       "    def default_location(self, thing):\n",
-       "        """Agents start in either location at random."""\n",
-       "        return random.choice([loc_A, loc_B])\n",
-       "
\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "psource(TrivialVacuumEnvironment)" ] }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n" - ] - } - ], - "source": [ - "# These are the two locations for the two-state environment\n", - "loc_A, loc_B = (0, 0), (1, 0)\n", - "\n", - "# Initialize the two-state environment\n", - "trivial_vacuum_env = TrivialVacuumEnvironment()\n", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# These are the four locations for the four-state environment\n", + "loc_A, loc_B = (0, 0), (0, 1)\n", + "loc_C, loc_D = (1, 0), (1, 1)\n", + "locations = [loc_A, loc_B, loc_C, loc_D]\n", "\n", + "# Initialize the four-state environment\n", + "trivial_vacuum_env = TrivialVacuumEnvironment()\n", "# Check the initial state of the environment\n", "print(\"State of the Environment: {}.\".format(trivial_vacuum_env.status))" ] @@ -277,12 +132,12 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create the random agent\n", - "random_agent = Agent(program=RandomAgentProgram(['Right', 'Left', 'Suck', 'NoOp']))" + "random_agent = Agent(program=RandomAgentProgram(['Right', 'Left', 'Up', 'Down', 'Suck', 'NoOp']))" ] }, { @@ -294,17 +149,9 @@ }, { "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "RandomVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Add agent to the environment\n", "trivial_vacuum_env.add_thing(random_agent)\n", @@ -321,18 +168,9 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n", - "RandomVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Running the environment\n", "trivial_vacuum_env.step()\n", @@ -355,21 +193,36 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "table = {((loc_A, 'Clean'),): 'Right',\n", - " ((loc_A, 'Dirty'),): 'Suck',\n", - " ((loc_B, 'Clean'),): 'Left',\n", - " ((loc_B, 'Dirty'),): 'Suck',\n", - " ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", - " ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Left',\n", - " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck'\n", - " }" + "from itertools import product\n", + "MAX_HISTORY = 3\n", + "\n", + "'''\n", + "This is actually what the locations look like as a matrix\n", + "y=1: loc_C (0,1) loc_D (1,1)\n", + "y=0: loc_A (0,0) loc_B (1,0)\n", + "'''\n", + "\n", + "tour = {\n", + " (0, 0): 'Right', # goes to (1, 0)\n", + " (1, 0): 'Up', # goes to (1, 1)\n", + " (1, 1): 'Left', # goes to (0, 1)\n", + " (0, 1): 'Down', # goes to (0, 0)\n", + "}\n", + "\n", + "def action(percept):\n", + " loc, status = percept\n", + " return 'Suck' if status == 'Dirty' else tour[loc]\n", + "\n", + "single_percepts = [(loc, status) for loc in locations for status in ('Clean', 'Dirty')]\n", + "\n", + "table = {}\n", + "for length in range(1, MAX_HISTORY + 1):\n", + " for history in product(single_percepts, repeat=length):\n", + " table[history] = action(history[-1]) # history[-1] here is just the most recent percept\n" ] }, { @@ -381,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -398,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -407,17 +260,9 @@ }, { "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TableDrivenVacuumAgent is located at (0, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Add the table-driven agent to the environment\n", "trivial_vacuum_env.add_thing(table_driven_agent)\n", @@ -427,18 +272,9 @@ }, { "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n", - "TableDrivenVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Run the environment\n", "trivial_vacuum_env.step()\n", @@ -471,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -488,13 +324,15 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "loc_A = (0, 0)\n", "loc_B = (1, 0)\n", + "loc_C = (0, 1)\n", + "loc_D = (1, 1)\n", "\n", "\"\"\"We change the simpleReflexAgentProgram so that it doesn't make use of the Rule class\"\"\"\n", "def SimpleReflexAgentProgram():\n", @@ -502,9 +340,12 @@ " \n", " def program(percept):\n", " loc, status = percept\n", - " return ('Suck' if status == 'Dirty' \n", - " else'Right' if loc == loc_A \n", - " else'Left')\n", + " if status == 'Dirty':\n", + " return 'Suck'\n", + " return ('Right' if loc == loc_A else\n", + " 'Up' if loc == loc_B else\n", + " 'Down' if loc == loc_C else\n", + " 'Left' if loc == loc_D else None)\n", " return program\n", "\n", " \n", @@ -522,17 +363,9 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SimpleReflexVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "trivial_vacuum_env.add_thing(simple_reflex_agent)\n", "\n", @@ -541,18 +374,9 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Clean'}.\n", - "SimpleReflexVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Run the environment\n", "trivial_vacuum_env.step()\n", @@ -584,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -601,21 +425,15 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ModelBasedVacuumAgent is located at (0, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# TODO: Implement this function for the two-dimensional environment\n", "def update_state(state, action, percept, model):\n", - " pass\n", + " location, status = percept\n", + " model[location] = status # Adds newest learned info\n", + " return model # Persistent memory\n", "\n", "# Create a model-based reflex agent\n", "model_based_reflex_agent = ModelBasedVacuumAgent()\n", @@ -628,18 +446,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Clean'}.\n", - "ModelBasedVacuumAgent is located at (1, 0).\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Run the environment\n", "trivial_vacuum_env.step()\n", @@ -702,7 +511,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.13.5" } }, "nbformat": 4, diff --git a/notebooks/vacuum_world.py b/notebooks/vacuum_world.py index af6076e12..2e2a56029 100644 --- a/notebooks/vacuum_world.py +++ b/notebooks/vacuum_world.py @@ -117,18 +117,32 @@ # In the two-state vacuum world, the table would consist of all the possible states of the agent. # %% -table = {((loc_A, 'Clean'),): 'Right', - ((loc_A, 'Dirty'),): 'Suck', - ((loc_B, 'Clean'),): 'Left', - ((loc_B, 'Dirty'),): 'Suck', - ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', - ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', - ((loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck', - ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Left', - ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', - ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck' - } - +from itertools import product +MAX_HISTORY = 3 + +''' +This is actually what the locations look like as a matrix +y=1: loc_C (0,1) loc_D (1,1) +y=0: loc_A (0,0) loc_B (1,0) +''' + +tour = { + (0, 0): 'Right', # goes to (1, 0) + (1, 0): 'Up', # goes to (1, 1) + (1, 1): 'Left', # goes to (0, 1) + (0, 1): 'Down', # goes to (0, 0) +} + +def action(percept): + loc, status = percept + return 'Suck' if status == 'Dirty' else tour[loc] + +single_percepts = [(loc, status) for loc in locations for status in ('Clean', 'Dirty')] + +table = {} +for length in range(1, MAX_HISTORY + 1): + for history in product(single_percepts, repeat=length): + table[history] = action(history[-1]) # history[-1] here is just the most recent percept # %% [markdown] # We will now create a table-driven agent program for our two-state environment. @@ -180,6 +194,8 @@ loc_A = (0, 0) loc_B = (1, 0) +loc_C = (0, 1) +loc_D = (1, 1) """We change the simpleReflexAgentProgram so that it doesn't make use of the Rule class""" def SimpleReflexAgentProgram(): @@ -187,9 +203,12 @@ def SimpleReflexAgentProgram(): def program(percept): loc, status = percept - return ('Suck' if status == 'Dirty' - else'Right' if loc == loc_A - else'Left') + if status == 'Dirty': + return 'Suck' + return ('Right' if loc == loc_A else + 'Up' if loc == loc_B else + 'Down' if loc == loc_C else + 'Left' if loc == loc_D else None) return program diff --git a/notebooks/viterbi_algorithm.ipynb b/notebooks/viterbi_algorithm.ipynb index 346f7b3e1..e7aa51e89 100644 --- a/notebooks/viterbi_algorithm.ipynb +++ b/notebooks/viterbi_algorithm.ipynb @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -39,31 +39,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mclass\u001b[0m \u001b[0mHiddenMarkovModel\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"A Hidden markov model which takes Transition model and Sensor model as inputs\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransition_model\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msensor_model\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprior\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransition_model\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransition_model\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msensor_model\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msensor_model\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprior\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mprior\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m0.5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msensor_dist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mev\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mev\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msensor_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msensor_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource HiddenMarkovModel" ] @@ -90,57 +68,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;32mdef\u001b[0m \u001b[0mviterbi\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mev\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n", - "\u001b[0;34m [Equation 15.11]\u001b[0m\n", - "\u001b[0;34m Viterbi algorithm to find the most likely sequence. Computes the best path and the\u001b[0m\n", - "\u001b[0;34m corresponding probabilities, given an HMM model and a sequence of observations.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mev\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mev\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mev\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mev\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minsert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mev\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# the recursion is initialized with m1 = forward(P(X0), e1)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprior\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mev\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# keep track of maximizing predecessors\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbacktracking_graph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0melement_wise_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msensor_dist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mev\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0melement_wise_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransition_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0melement_wise_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransition_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbacktracking_graph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0melement_wise_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransition_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\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\n", - "\u001b[0;34m\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0melement_wise_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHMM\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransition_model\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# computed probabilities\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mml_probabilities\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m0.0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mev\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\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# most likely sequence\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mml_path\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mev\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\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# the construction of the most likely sequence starts in the final state with the largest probability, and\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;31m# runs backwards; the algorithm needs to store for each xt its predecessor xt-1 maximizing its probability\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mi_max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\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[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\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[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mml_probabilities\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi_max\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mml_path\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi_max\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mi_max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbacktracking_graph\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi_max\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mml_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mml_probabilities\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%psource viterbi" ] @@ -187,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -198,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -207,136 +137,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "%3\n", - "\n", - "\n", - "\n", - "I\n", - "\n", - "\n", - "Start\n", - "\n", - "\n", - "\n", - "R\n", - "\n", - "Rainy\n", - "\n", - "\n", - "\n", - "I->R\n", - "\n", - "\n", - "0.5\n", - "\n", - "\n", - "\n", - "S\n", - "\n", - "Sunny\n", - "\n", - "\n", - "\n", - "I->S\n", - "\n", - "\n", - "0.5\n", - "\n", - "\n", - "\n", - "R->R\n", - "\n", - "\n", - "0.6\n", - "\n", - "\n", - "\n", - "R->S\n", - "\n", - "\n", - "0.2\n", - "\n", - "\n", - "\n", - "Y\n", - "\n", - "Yes\n", - "\n", - "\n", - "\n", - "R->Y\n", - "\n", - "\n", - "0.8\n", - "\n", - "\n", - "\n", - "N\n", - "\n", - "No\n", - "\n", - "\n", - "\n", - "R->N\n", - "\n", - "\n", - "0.2\n", - "\n", - "\n", - "\n", - "S->R\n", - "\n", - "\n", - "0.4\n", - "\n", - "\n", - "\n", - "S->S\n", - "\n", - "\n", - "0.8\n", - "\n", - "\n", - "\n", - "S->Y\n", - "\n", - "\n", - "0.1\n", - "\n", - "\n", - "\n", - "S->N\n", - "\n", - "\n", - "0.9\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "dot = Digraph()\n", "\n", @@ -373,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -382,20 +185,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([1, 1, 0, 1, 1], [0.8182, 0.5155, 0.1237, 0.0334, 0.021])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "umbrella_evidence = [True, True, False, True, True]\n", "\n",