From 6dd3777df28710a5013b7bc9b1e13ae734b89589 Mon Sep 17 00:00:00 2001 From: Hubert Bere?? Date: Tue, 2 Jan 2018 17:53:36 +0100 Subject: [PATCH 01/34] Simplest env --- agents.py | 7 ++++--- our_vacuum.py | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 our_vacuum.py diff --git a/agents.py b/agents.py index 9308225f2..30a7ad994 100644 --- a/agents.py +++ b/agents.py @@ -108,7 +108,7 @@ def TraceAgent(agent): def new_program(percept): action = old_program(percept) - print('{} perceives {} and does {}'.format(agent, percept, action)) + print('{} perceives {} and does {}; performance is {}'.format(agent, percept, action, agent.performance)) return action agent.program = new_program return agent @@ -249,7 +249,8 @@ def percept(self, agent): def execute_action(self, agent, action): """Change the world to reflect this action. (Implement this.)""" - raise NotImplementedError + if action != "": + raise NotImplementedError def default_location(self, thing): """Default location to place a new thing with unspecified location.""" @@ -813,6 +814,7 @@ def get_world(self, show_walls=True): result = [] x_start, y_start = (0, 0) if show_walls else (1, 1) + if show_walls: x_end, y_end = self.width, self.height else: @@ -870,7 +872,6 @@ def execute_action(self, agent, action): if isinstance(agent, Explorer) and self.in_danger(agent): return - agent.bump = False if action == 'TurnRight': agent.direction += Direction.R diff --git a/our_vacuum.py b/our_vacuum.py new file mode 100644 index 000000000..d3205c5ea --- /dev/null +++ b/our_vacuum.py @@ -0,0 +1,4 @@ +from agents import * + +env = TrivialVacuumEnvironment() +env.add_thing(TraceAgent(RandomVacuumAgent())) From 0df340e8af942d0cdf2584aecf190d261041ac7b Mon Sep 17 00:00:00 2001 From: Hubert Bere?? Date: Tue, 2 Jan 2018 17:53:36 +0100 Subject: [PATCH 02/34] Simplest env --- agents.py | 7 ++++--- our_vacuum.py | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 our_vacuum.py diff --git a/agents.py b/agents.py index 9308225f2..30a7ad994 100644 --- a/agents.py +++ b/agents.py @@ -108,7 +108,7 @@ def TraceAgent(agent): def new_program(percept): action = old_program(percept) - print('{} perceives {} and does {}'.format(agent, percept, action)) + print('{} perceives {} and does {}; performance is {}'.format(agent, percept, action, agent.performance)) return action agent.program = new_program return agent @@ -249,7 +249,8 @@ def percept(self, agent): def execute_action(self, agent, action): """Change the world to reflect this action. (Implement this.)""" - raise NotImplementedError + if action != "": + raise NotImplementedError def default_location(self, thing): """Default location to place a new thing with unspecified location.""" @@ -813,6 +814,7 @@ def get_world(self, show_walls=True): result = [] x_start, y_start = (0, 0) if show_walls else (1, 1) + if show_walls: x_end, y_end = self.width, self.height else: @@ -870,7 +872,6 @@ def execute_action(self, agent, action): if isinstance(agent, Explorer) and self.in_danger(agent): return - agent.bump = False if action == 'TurnRight': agent.direction += Direction.R diff --git a/our_vacuum.py b/our_vacuum.py new file mode 100644 index 000000000..f21fbd153 --- /dev/null +++ b/our_vacuum.py @@ -0,0 +1,5 @@ +from agents import * +def our_vacuum(): + env = TrivialVacuumEnvironment() + env.add_thing(TraceAgent(RandomVacuumAgent())) + return env From d8c8a6ed3de98f02093ae6a02afa4baa1eae19e9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 17:05:08 +0000 Subject: [PATCH 03/34] Simple env init function, separate file --- Our_vacuum.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Our_vacuum.py diff --git a/Our_vacuum.py b/Our_vacuum.py new file mode 100644 index 000000000..79e770a6a --- /dev/null +++ b/Our_vacuum.py @@ -0,0 +1,6 @@ +from Agents import * + +def OurVacuum(): + Env = TrivialVacuumEnvironment() + Env.Add.Things(TraceAgent(RandomVacuumAgent())) + return Env From fd58025459a80739cfbc610dad5006e5671e4842 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 17:08:15 +0000 Subject: [PATCH 04/34] New version, debugged --- Our_vacuum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Our_vacuum.py b/Our_vacuum.py index 79e770a6a..1475876f9 100644 --- a/Our_vacuum.py +++ b/Our_vacuum.py @@ -1,6 +1,6 @@ -from Agents import * +from agents import * def OurVacuum(): Env = TrivialVacuumEnvironment() - Env.Add.Things(TraceAgent(RandomVacuumAgent())) + Env.add_things(TraceAgent(RandomVacuumAgent())) return Env From cccc086a579b80c81f038be968da833aaffaac86 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 17:14:19 +0000 Subject: [PATCH 05/34] Bugfix --- Our_vacuum.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Our_vacuum.py b/Our_vacuum.py index 1475876f9..3ab6ddf2f 100644 --- a/Our_vacuum.py +++ b/Our_vacuum.py @@ -4,3 +4,4 @@ def OurVacuum(): Env = TrivialVacuumEnvironment() Env.add_things(TraceAgent(RandomVacuumAgent())) return Env + Env.add_thing(TraceAgent(RandomVacuumAgent())) From 5813b6f327141252e716a53205d0ad196a65d9ac Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 17:14:41 +0000 Subject: [PATCH 06/34] comments added --- Our_vacuum.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Our_vacuum.py b/Our_vacuum.py index 3ab6ddf2f..e2cb844b5 100644 --- a/Our_vacuum.py +++ b/Our_vacuum.py @@ -2,6 +2,5 @@ def OurVacuum(): Env = TrivialVacuumEnvironment() - Env.add_things(TraceAgent(RandomVacuumAgent())) - return Env Env.add_thing(TraceAgent(RandomVacuumAgent())) + return Env #dupa From adb2c4209daaa3d525bfcae475018787bb0640f8 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Tue, 2 Jan 2018 19:38:01 +0100 Subject: [PATCH 07/34] Environment for task 2.13, failing Suck and dirt sensor --- Our_vacuum.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Our_vacuum.py b/Our_vacuum.py index e2cb844b5..518380b1d 100644 --- a/Our_vacuum.py +++ b/Our_vacuum.py @@ -1,5 +1,33 @@ +import agents from agents import * +from random import random +class VacuumEnvironment213(agents.TrivialVacuumEnvironment): + def percept(self, agent): + if random() < 0.9: + return super().percept(agent) + else: + print("Dirt sensor failed") + if self.status[agent.location] == "Dirty": + return (agent.location, "Clean") + else: + return (agent.location, "Dirty") + + def execute_action(self, agent, action): + if action is not "Suck" or random() < 0.75: + # everything is normal + super().execute_action(agent, action) + else: # Suck failed + print("Suck failed") + if self.status[agent.location] == "Clean": + print("Deposited dirt on a clean floor") + self.add_thing(Dirt(), agent.location) + +env = VacuumEnvironment213() +env.add_thing(agents.TraceAgent(agents.RandomVacuumAgent())) +env.run(100) + + def OurVacuum(): Env = TrivialVacuumEnvironment() Env.add_thing(TraceAgent(RandomVacuumAgent())) From e1df989365db16febc1ef92f5da0b728e9df24af Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 22:56:46 +0000 Subject: [PATCH 08/34] Working Hill Climber for Queens problem --- Our_vacuum.py | 2 +- Queens.ipynb | 380 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 Queens.ipynb diff --git a/Our_vacuum.py b/Our_vacuum.py index 518380b1d..6cd8cf807 100644 --- a/Our_vacuum.py +++ b/Our_vacuum.py @@ -31,4 +31,4 @@ def execute_action(self, agent, action): def OurVacuum(): Env = TrivialVacuumEnvironment() Env.add_thing(TraceAgent(RandomVacuumAgent())) - return Env #dupa + return Env diff --git a/Queens.ipynb b/Queens.ipynb new file mode 100644 index 000000000..fb83b444a --- /dev/null +++ b/Queens.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from random import random\n", + "from agents import *\n", + "import agents\n", + "from copy import copy" + ] + }, + { + "cell_type": "code", + "execution_count": 249, + "metadata": {}, + "outputs": [], + "source": [ + "class QueensEnvironment(agents.Environment):\n", + " \n", + " def __init__(self):\n", + " super().__init__()\n", + " self.random_state()\n", + " \n", + " def random_state(self):\n", + " self.state = [int(8 * random.random()) for j in range(8) ]\n", + " \n", + " def percept(self, agent):\n", + " return self.state\n", + " \n", + " def execute_action(self, agent, action):\n", + " if action == \"NoOp\":\n", + " print(\"new board generated\")\n", + " self.random_state()\n", + " return state\n", + " elif action == \"Success\":\n", + " agent.alive = False\n", + " return None\n", + " agent.performance -= 1\n", + " num, pos = action\n", + " self.state[num] = pos" + ] + }, + { + "cell_type": "code", + "execution_count": 263, + "metadata": {}, + "outputs": [], + "source": [ + "def QueensHillClimbAgent():\n", + " \n", + " def count_collisions(state):\n", + " count = 0\n", + " for i in range(8):\n", + " for j in range(i+1, 8):\n", + " if state[i] == state[j] or abs(state[i] - state[j]) == j - i:\n", + " count += 1\n", + " return count\n", + " \n", + " def print_board(state):\n", + " print(\"--\"*10)\n", + " for row in state:\n", + " print(str(row) + \" \" + \" \" * row + \"x\" )\n", + " print(\"--\"*10)\n", + "\n", + " def check_actions(state):\n", + " res = []\n", + " run = copy(state)\n", + " for q in range(8):\n", + " col_res = []\n", + " pos = state[q]\n", + " for i in range(8):\n", + " run[q] = i\n", + " col_res.append(count_collisions(run))\n", + " col_res[pos] = 100\n", + " run[q] = pos\n", + " res.append(col_res)\n", + " return res\n", + " \n", + " def program(state):\n", + " print_board(state)\n", + " current = count_collisions(state) \n", + " \n", + " if(current == 0):\n", + " print(\"Success\", state)\n", + " print_board(state)\n", + " return \"Success\"\n", + " \n", + " grid = check_actions(state)\n", + " d = dict()\n", + " for i in range(8):\n", + " for j in range(8):\n", + " d[grid[i][j]] = d.get(grid[i][j], []) + [(i, j)]\n", + " new_min = min(d)\n", + "\n", + " if(new_min < current):\n", + " return random.choice(d[new_min])\n", + " else:\n", + " print(\"Local minimum reached at: \" + str(new_min))\n", + " return \"NoOp\"\n", + " \n", + " return program" + ] + }, + { + "cell_type": "code", + "execution_count": 264, + "metadata": {}, + "outputs": [], + "source": [ + "q = QueensEnvironment()" + ] + }, + { + "cell_type": "code", + "execution_count": 265, + "metadata": {}, + "outputs": [], + "source": [ + "q.add_thing(Agent(QueensHillClimbAgent()))" + ] + }, + { + "cell_type": "code", + "execution_count": 266, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "3 x\n", + "6 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "4 x\n", + "4 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "7 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "5 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n" + ] + } + ], + "source": [ + "q.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 522bcac8977ef9c4338380c1d834728c7608bb85 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 23:23:03 +0000 Subject: [PATCH 09/34] Plateau exploring version of Hill Climber --- Queens.ipynb | 11325 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 11243 insertions(+), 82 deletions(-) diff --git a/Queens.ipynb b/Queens.ipynb index fb83b444a..465285b9b 100644 --- a/Queens.ipynb +++ b/Queens.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 174, + "execution_count": 295, "metadata": { "collapsed": true }, @@ -16,7 +16,18 @@ }, { "cell_type": "code", - "execution_count": 249, + "execution_count": 296, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "queens = 8" + ] + }, + { + "cell_type": "code", + "execution_count": 297, "metadata": {}, "outputs": [], "source": [ @@ -25,9 +36,10 @@ " def __init__(self):\n", " super().__init__()\n", " self.random_state()\n", + " self.failures, self.wins = 0, 0\n", " \n", " def random_state(self):\n", - " self.state = [int(8 * random.random()) for j in range(8) ]\n", + " self.state = [int(queens * random.random()) for j in range(queens) ]\n", " \n", " def percept(self, agent):\n", " return self.state\n", @@ -35,11 +47,13 @@ " def execute_action(self, agent, action):\n", " if action == \"NoOp\":\n", " print(\"new board generated\")\n", + " self.failures += 1\n", " self.random_state()\n", " return state\n", " elif action == \"Success\":\n", - " agent.alive = False\n", - " return None\n", + " self.wins += 1\n", + " self.random_state()\n", + " return state\n", " agent.performance -= 1\n", " num, pos = action\n", " self.state[num] = pos" @@ -47,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 263, + "execution_count": 303, "metadata": {}, "outputs": [], "source": [ @@ -55,25 +69,25 @@ " \n", " def count_collisions(state):\n", " count = 0\n", - " for i in range(8):\n", - " for j in range(i+1, 8):\n", + " for i in range(queens):\n", + " for j in range(i+1, queens):\n", " if state[i] == state[j] or abs(state[i] - state[j]) == j - i:\n", " count += 1\n", " return count\n", " \n", " def print_board(state):\n", - " print(\"--\"*10)\n", + " print(\"--\"*(queens + 2))\n", " for row in state:\n", " print(str(row) + \" \" + \" \" * row + \"x\" )\n", - " print(\"--\"*10)\n", + " print(\"--\"* (queens + 2))\n", "\n", " def check_actions(state):\n", " res = []\n", " run = copy(state)\n", - " for q in range(8):\n", + " for q in range(queens):\n", " col_res = []\n", " pos = state[q]\n", - " for i in range(8):\n", + " for i in range(queens):\n", " run[q] = i\n", " col_res.append(count_collisions(run))\n", " col_res[pos] = 100\n", @@ -92,23 +106,31 @@ " \n", " grid = check_actions(state)\n", " d = dict()\n", - " for i in range(8):\n", - " for j in range(8):\n", + " for i in range(queens):\n", + " for j in range(queens):\n", " d[grid[i][j]] = d.get(grid[i][j], []) + [(i, j)]\n", " new_min = min(d)\n", + " program.last_d = d[new_min]\n", "\n", " if(new_min < current):\n", + " program.plateau_count = 0\n", + " return random.choice(d[new_min])\n", + " elif new_min == current and program.plateau_count < 30:\n", + " print(\"Exploring plateau\")\n", + " program.plateau_count += 1\n", " return random.choice(d[new_min])\n", " else:\n", + " program.plateau_count = 0\n", " print(\"Local minimum reached at: \" + str(new_min))\n", " return \"NoOp\"\n", - " \n", + " \n", + " program.plateau_count = 0 \n", " return program" ] }, { "cell_type": "code", - "execution_count": 264, + "execution_count": 304, "metadata": {}, "outputs": [], "source": [ @@ -117,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 265, + "execution_count": 305, "metadata": {}, "outputs": [], "source": [ @@ -126,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 266, + "execution_count": 306, "metadata": {}, "outputs": [ { @@ -134,217 +156,11356 @@ "output_type": "stream", "text": [ "--------------------\n", + "5 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "7 x\n", "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", "0 x\n", "7 x\n", - "4 x\n", - "6 x\n", "1 x\n", - "2 x\n", + "6 x\n", + "7 x\n", "2 x\n", "--------------------\n", "--------------------\n", - "2 x\n", + "5 x\n", + "3 x\n", "0 x\n", "7 x\n", - "4 x\n", - "6 x\n", "1 x\n", + "6 x\n", + "0 x\n", "2 x\n", - "5 x\n", "--------------------\n", "--------------------\n", + "5 x\n", "3 x\n", "0 x\n", "7 x\n", "4 x\n", "6 x\n", - "1 x\n", + "0 x\n", "2 x\n", - "5 x\n", "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", "--------------------\n", - "2 x\n", + "5 x\n", "3 x\n", + "1 x\n", "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", "2 x\n", + "--------------------\n", + "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", + "--------------------\n", + "5 x\n", "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", "6 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", "5 x\n", "6 x\n", + "3 x\n", "--------------------\n", "--------------------\n", - "2 x\n", - "3 x\n", + "6 x\n", + "4 x\n", "7 x\n", + "3 x\n", + "0 x\n", "2 x\n", + "6 x\n", "3 x\n", + "--------------------\n", + "--------------------\n", "6 x\n", + "4 x\n", + "7 x\n", + "5 x\n", "0 x\n", + "2 x\n", "6 x\n", + "3 x\n", "--------------------\n", "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", + "6 x\n", "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", - "4 x\n", "6 x\n", - "0 x\n", "6 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", - "2 x\n", - "3 x\n", + "1 x\n", + "4 x\n", "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", - "4 x\n", - "6 x\n", "0 x\n", - "5 x\n", + "6 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", "7 x\n", - "3 x\n", - "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", - "4 x\n", "6 x\n", - "0 x\n", - "5 x\n", + "6 x\n", "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", + "Exploring plateau\n", "--------------------\n", "1 x\n", "4 x\n", - "4 x\n", - "4 x\n", - "3 x\n", - "4 x\n", "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", "6 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", "1 x\n", "4 x\n", - "4 x\n", + "7 x\n", + "5 x\n", "0 x\n", - "3 x\n", + "2 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", "4 x\n", "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", "6 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", "1 x\n", "4 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", "6 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", "1 x\n", "4 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", + "6 x\n", + "3 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", "1 x\n", "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", "6 x\n", - "0 x\n", "3 x\n", - "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", "7 x\n", + "5 x\n", "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "5 x\n", - "5 x\n", + "2 x\n", + "0 x\n", "6 x\n", + "3 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "5 x\n", + "2 x\n", "0 x\n", "6 x\n", + "3 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", "2 x\n", "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "5 x\n", + "2 x\n", "0 x\n", "6 x\n", + "3 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", "2 x\n", "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "3 x\n", "0 x\n", + "2 x\n", "6 x\n", + "3 x\n", "--------------------\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", "6 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "3 x\n", "0 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "6 x\n", "--------------------\n", - "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", + "Exploring plateau\n", "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", "2 x\n", + "0 x\n", "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", "1 x\n", + "4 x\n", "7 x\n", "5 x\n", - "3 x\n", "0 x\n", + "2 x\n", "4 x\n", - "--------------------\n" - ] - } + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "7 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Success [1, 5, 0, 6, 3, 7, 2, 4]\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "5 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "5 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Success [1, 3, 5, 7, 2, 0, 6, 4]\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "1 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------\n", + "6 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Success [4, 0, 3, 5, 7, 1, 6, 2]\n", + "--------------------\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "4 x\n", + "5 x\n", + "3 x\n", + "7 x\n", + "1 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "1 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Success [3, 0, 4, 7, 1, 6, 2, 5]\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Success [3, 0, 4, 7, 5, 2, 6, 1]\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "0 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "7 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "5 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "5 x\n", + "3 x\n", + "6 x\n", + "6 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "5 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Success [4, 7, 3, 0, 2, 5, 1, 6]\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "6 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "0 x\n", + "0 x\n", + "5 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "0 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "1 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "1 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "0 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "Success [4, 1, 3, 6, 2, 7, 5, 0]\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "4 x\n", + "1 x\n", + "2 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "4 x\n", + "1 x\n", + "2 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "1 x\n", + "2 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Success [3, 0, 4, 7, 1, 6, 2, 5]\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "5 x\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Success [1, 6, 4, 7, 0, 3, 5, 2]\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "7 x\n", + "1 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "1 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "2 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "2 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "2 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "2 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "1 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "Success [3, 6, 2, 7, 1, 4, 0, 5]\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "4 x\n", + "1 x\n", + "4 x\n", + "5 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "4 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "3 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "4 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "4 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Success [1, 4, 6, 0, 2, 7, 5, 3]\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "3 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "1 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "2 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Success [2, 0, 6, 4, 7, 1, 3, 5]\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "5 x\n", + "6 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "5 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "5 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "Success [5, 2, 0, 6, 4, 7, 1, 3]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "2 x\n", + "3 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "3 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "6 x\n", + "1 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "Success [5, 3, 6, 0, 2, 4, 1, 7]\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "3 x\n", + "4 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "4 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "6 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "5 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "5 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "4 x\n", + "6 x\n", + "5 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "6 x\n", + "5 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "1 x\n", + "0 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Success [2, 4, 1, 7, 0, 6, 3, 5]\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "2 x\n", + "3 x\n", + "1 x\n", + "1 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "2 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Success [0, 6, 3, 5, 7, 1, 4, 2]\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "6 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "5 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Success [4, 6, 0, 2, 7, 5, 3, 1]\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "5 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Success [5, 2, 6, 1, 7, 4, 0, 3]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "6 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "3 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "6 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "Success [1, 7, 5, 0, 2, 4, 6, 3]\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "3 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "3 x\n", + "2 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "3 x\n", + "2 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "5 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "4 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "Success [3, 1, 7, 5, 0, 2, 4, 6]\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "1 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "4 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "2 x\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Success [3, 6, 4, 2, 0, 5, 7, 1]\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "5 x\n", + "4 x\n", + "3 x\n", + "4 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "4 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Success [3, 6, 0, 7, 4, 1, 5, 2]\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "2 x\n", + "4 x\n", + "5 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Success [1, 6, 2, 5, 7, 4, 0, 3]\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "0 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "0 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "1 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "1 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "1 x\n", + "1 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Success [3, 1, 6, 2, 5, 7, 0, 4]\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "4 x\n", + "5 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "3 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "Success [4, 6, 0, 2, 7, 5, 3, 1]\n", + "--------------------\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "5 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "4 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "5 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "4 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Success [2, 5, 1, 6, 0, 3, 7, 4]\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "1 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "6 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "Success [1, 6, 2, 5, 7, 4, 0, 3]\n", + "--------------------\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "4 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "Success [5, 2, 0, 7, 3, 1, 6, 4]\n", + "--------------------\n", + "5 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "3 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "3 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "1 x\n", + "6 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "0 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "0 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "7 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "6 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "0 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "7 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "2 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "2 x\n", + "3 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "4 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "1 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "Success [3, 6, 4, 2, 0, 5, 7, 1]\n", + "--------------------\n", + "3 x\n", + "6 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "4 x\n", + "5 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "4 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "2 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "7 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "5 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "0 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "1 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Success [3, 1, 6, 2, 5, 7, 0, 4]\n", + "--------------------\n", + "3 x\n", + "1 x\n", + "6 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "6 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "3 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "2 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "0 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", + "--------------------\n", + "2 x\n", + "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", + "0 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "5 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "4 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "6 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "3 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "7 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "4 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "1 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", + "--------------------\n", + "4 x\n", + "1 x\n", + "5 x\n", + "0 x\n", + "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "2 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "7 x\n", + "3 x\n", + "2 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "6 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "4 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "3 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "3 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "0 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "3 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "7 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "5 x\n", + "--------------------\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "0 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------\n", + "7 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "2 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", + "--------------------\n", + "5 x\n", + "3 x\n", + "1 x\n", + "7 x\n", + "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "3 x\n", + "3 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "5 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "7 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "7 x\n", + "7 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "4 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "0 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "3 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "Exploring plateau\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "6 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "Success [2, 5, 7, 0, 4, 6, 1, 3]\n", + "--------------------\n", + "2 x\n", + "5 x\n", + "7 x\n", + "0 x\n", + "4 x\n", + "6 x\n", + "1 x\n", + "3 x\n", + "--------------------\n", + "--------------------\n", + "2 x\n", + "2 x\n", + "5 x\n", + "1 x\n", + "0 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "--------------------\n" + ] + } ], "source": [ - "q.run()" + "q.run(1000)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] + "execution_count": 307, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.12698412698412698" + ] + }, + "execution_count": 307, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "q.failures / (q.failures + q.wins)" + ] }, { "cell_type": "code", From 3950c5a102399e9ce41f968658a9ee97417ec2a7 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 Jan 2018 23:39:59 +0000 Subject: [PATCH 10/34] Stats module added --- Queens.ipynb | 11851 ++++--------------------------------------------- 1 file changed, 887 insertions(+), 10964 deletions(-) diff --git a/Queens.ipynb b/Queens.ipynb index 465285b9b..db037d856 100644 --- a/Queens.ipynb +++ b/Queens.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 295, + "execution_count": 317, "metadata": { "collapsed": true }, @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 296, + "execution_count": 328, "metadata": { "collapsed": true }, @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 297, + "execution_count": 330, "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ " def __init__(self):\n", " super().__init__()\n", " self.random_state()\n", - " self.failures, self.wins = 0, 0\n", + " self.fail_times, self.win_times = [], []\n", " \n", " def random_state(self):\n", " self.state = [int(queens * random.random()) for j in range(queens) ]\n", @@ -47,21 +47,29 @@ " def execute_action(self, agent, action):\n", " if action == \"NoOp\":\n", " print(\"new board generated\")\n", - " self.failures += 1\n", + " self.fail_times.append(agent.performance)\n", + " agent.performance = 0\n", " self.random_state()\n", " return state\n", " elif action == \"Success\":\n", - " self.wins += 1\n", + " self.win_times.append(agent.performance)\n", + " agent.performance = 0\n", " self.random_state()\n", " return state\n", - " agent.performance -= 1\n", + " \n", + " agent.performance += 1\n", " num, pos = action\n", - " self.state[num] = pos" + " self.state[num] = pos\n", + " \n", + " def print_stats(self):\n", + " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", + " print(\"Average fail time:\", sum(self.fail_times)/len(self.fail_times))\n", + " print(\"Average win time:\", sum(self.win_times)/len(self.win_times)) " ] }, { "cell_type": "code", - "execution_count": 303, + "execution_count": 331, "metadata": {}, "outputs": [], "source": [ @@ -96,7 +104,7 @@ " return res\n", " \n", " def program(state):\n", - " print_board(state)\n", + " # print_board(state)\n", " current = count_collisions(state) \n", " \n", " if(current == 0):\n", @@ -130,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 304, + "execution_count": 332, "metadata": {}, "outputs": [], "source": [ @@ -139,191 +147,235 @@ }, { "cell_type": "code", - "execution_count": 305, + "execution_count": 333, "metadata": {}, "outputs": [], "source": [ - "q.add_thing(Agent(QueensHillClimbAgent()))" + "q.add_thing(Agent(QueensHillClimbAgent()))\n", + "q.failures, q.wins = 0,0" ] }, { "cell_type": "code", - "execution_count": 306, + "execution_count": 334, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", "--------------------\n", - "5 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "7 x\n", "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", "6 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "7 x\n", "1 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", + "7 x\n", "5 x\n", "3 x\n", "0 x\n", - "7 x\n", "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", "--------------------\n", "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", "2 x\n", - "--------------------\n", - "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", + "6 x\n", "1 x\n", + "3 x\n", "7 x\n", - "4 x\n", - "6 x\n", "0 x\n", - "2 x\n", + "4 x\n", "--------------------\n", + "Success [2, 4, 1, 7, 0, 6, 3, 5]\n", "--------------------\n", - "6 x\n", + "2 x\n", "4 x\n", + "1 x\n", "7 x\n", - "3 x\n", "0 x\n", - "5 x\n", "6 x\n", "3 x\n", + "5 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", "--------------------\n", - "6 x\n", "4 x\n", "7 x\n", "3 x\n", "0 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", "6 x\n", - "4 x\n", - "7 x\n", + "1 x\n", "5 x\n", - "0 x\n", "2 x\n", - "6 x\n", - "3 x\n", "--------------------\n", + "Exploring plateau\n", + "Success [6, 4, 2, 0, 5, 7, 1, 3]\n", "--------------------\n", - "1 x\n", + "6 x\n", "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", "2 x\n", - "6 x\n", + "0 x\n", + "5 x\n", + "7 x\n", + "1 x\n", "3 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [3, 7, 0, 4, 6, 1, 5, 2]\n", "--------------------\n", - "1 x\n", - "4 x\n", + "3 x\n", "7 x\n", - "5 x\n", "0 x\n", - "2 x\n", - "6 x\n", + "4 x\n", "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", "1 x\n", - "4 x\n", - "7 x\n", "5 x\n", - "0 x\n", "2 x\n", - "0 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 6, 3, 0, 2, 7, 5, 1]\n", "--------------------\n", - "1 x\n", "4 x\n", - "7 x\n", - "5 x\n", + "6 x\n", + "3 x\n", "0 x\n", "2 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", "7 x\n", "5 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "6 x\n", + "1 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", "5 x\n", - "0 x\n", "2 x\n", + "4 x\n", "6 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", + "0 x\n", + "3 x\n", "1 x\n", - "4 x\n", "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", "--------------------\n", + "3 x\n", "1 x\n", "4 x\n", "7 x\n", @@ -331,11018 +383,809 @@ "0 x\n", "2 x\n", "6 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", "1 x\n", - "4 x\n", "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", + "4 x\n", "6 x\n", - "3 x\n", + "0 x\n", + "2 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Success [1, 7, 5, 0, 2, 4, 6, 3]\n", "--------------------\n", "1 x\n", - "4 x\n", "7 x\n", "5 x\n", + "0 x\n", "2 x\n", - "2 x\n", + "4 x\n", "6 x\n", "3 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", "2 x\n", - "0 x\n", "6 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", "1 x\n", - "4 x\n", "7 x\n", "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", "3 x\n", + "0 x\n", + "4 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", "--------------------\n", + "2 x\n", + "6 x\n", "1 x\n", - "4 x\n", "7 x\n", - "5 x\n", - "2 x\n", + "4 x\n", "0 x\n", - "6 x\n", "3 x\n", + "5 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [2, 7, 3, 6, 0, 5, 1, 4]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", "2 x\n", - "2 x\n", - "6 x\n", + "7 x\n", "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", + "6 x\n", + "0 x\n", + "5 x\n", "1 x\n", "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 2, 7, 3, 6, 0, 5, 1]\n", "--------------------\n", - "1 x\n", "4 x\n", - "7 x\n", - "5 x\n", "2 x\n", - "2 x\n", - "6 x\n", + "7 x\n", "3 x\n", + "6 x\n", + "0 x\n", + "5 x\n", + "1 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", "--------------------\n", - "1 x\n", "4 x\n", - "7 x\n", + "1 x\n", "5 x\n", "0 x\n", - "2 x\n", "6 x\n", "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", "7 x\n", - "5 x\n", - "0 x\n", "2 x\n", - "6 x\n", - "6 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [4, 0, 7, 5, 2, 6, 1, 3]\n", "--------------------\n", - "1 x\n", "4 x\n", + "0 x\n", "7 x\n", "5 x\n", - "0 x\n", "2 x\n", "6 x\n", + "1 x\n", "3 x\n", "--------------------\n", "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Success [6, 2, 0, 5, 7, 4, 1, 3]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", + "6 x\n", "2 x\n", "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", "5 x\n", - "0 x\n", - "2 x\n", + "7 x\n", "4 x\n", - "6 x\n", + "1 x\n", + "3 x\n", "--------------------\n", "Exploring plateau\n", + "Success [3, 7, 0, 2, 5, 1, 6, 4]\n", "--------------------\n", - "1 x\n", - "4 x\n", + "3 x\n", "7 x\n", - "5 x\n", "0 x\n", "2 x\n", - "0 x\n", + "5 x\n", + "1 x\n", "6 x\n", + "4 x\n", "--------------------\n", "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [1, 6, 4, 7, 0, 3, 5, 2]\n", "--------------------\n", "1 x\n", + "6 x\n", "4 x\n", "7 x\n", - "5 x\n", "0 x\n", + "3 x\n", + "5 x\n", "2 x\n", - "0 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", "--------------------\n", - "1 x\n", "4 x\n", - "7 x\n", + "1 x\n", "5 x\n", "0 x\n", - "2 x\n", - "4 x\n", "6 x\n", + "3 x\n", + "7 x\n", + "2 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", "--------------------\n", + "3 x\n", "1 x\n", "4 x\n", "7 x\n", "5 x\n", "0 x\n", "2 x\n", - "0 x\n", "6 x\n", "--------------------\n", "Exploring plateau\n", + "Success [4, 2, 0, 6, 1, 7, 5, 3]\n", "--------------------\n", - "1 x\n", "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", "2 x\n", + "0 x\n", "6 x\n", - "6 x\n", + "1 x\n", + "7 x\n", + "5 x\n", + "3 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", "--------------------\n", - "1 x\n", - "4 x\n", - "7 x\n", "5 x\n", + "3 x\n", + "6 x\n", "0 x\n", - "2 x\n", + "7 x\n", + "1 x\n", "4 x\n", - "6 x\n", + "2 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", "Local minimum reached at: 1\n", "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", "--------------------\n", "5 x\n", + "2 x\n", + "6 x\n", + "1 x\n", "3 x\n", "7 x\n", - "3 x\n", - "5 x\n", "0 x\n", "4 x\n", - "4 x\n", "--------------------\n", + "Exploring plateau\n", + "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", "--------------------\n", "5 x\n", "3 x\n", "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "4 x\n", + "7 x\n", "4 x\n", + "6 x\n", + "0 x\n", + "2 x\n", "--------------------\n", + "Exploring plateau\n", + "Local minimum reached at: 2\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [5, 3, 0, 4, 7, 1, 6, 2]\n", "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "3 x\n", "5 x\n", + "3 x\n", "0 x\n", "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", "7 x\n", - "3 x\n", "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", + "6 x\n", "2 x\n", - "4 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [1, 4, 6, 3, 0, 7, 5, 2]\n", "--------------------\n", - "7 x\n", - "6 x\n", "1 x\n", + "4 x\n", + "6 x\n", "3 x\n", - "5 x\n", "0 x\n", + "7 x\n", + "5 x\n", "2 x\n", - "4 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [7, 1, 3, 0, 6, 4, 2, 5]\n", "--------------------\n", "7 x\n", - "3 x\n", "1 x\n", "3 x\n", - "5 x\n", "0 x\n", - "2 x\n", + "6 x\n", "4 x\n", + "2 x\n", + "5 x\n", "--------------------\n", "Exploring plateau\n", + "Success [2, 5, 7, 1, 3, 0, 6, 4]\n", "--------------------\n", + "2 x\n", + "5 x\n", "7 x\n", - "3 x\n", "1 x\n", - "7 x\n", - "5 x\n", + "3 x\n", "0 x\n", - "2 x\n", + "6 x\n", "4 x\n", "--------------------\n", + "Success [5, 3, 0, 4, 7, 1, 6, 2]\n", "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", "5 x\n", + "3 x\n", "0 x\n", - "2 x\n", "4 x\n", - "--------------------\n", - "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Success [1, 5, 0, 6, 3, 7, 2, 4]\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "5 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "5 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Success [1, 3, 5, 7, 2, 0, 6, 4]\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "1 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------------------\n", - "6 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 0, 3, 5, 7, 1, 6, 2]\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "4 x\n", - "5 x\n", - "3 x\n", - "7 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Success [3, 0, 4, 7, 1, 6, 2, 5]\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Success [3, 0, 4, 7, 5, 2, 6, 1]\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "0 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "7 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "5 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "5 x\n", - "3 x\n", - "6 x\n", - "6 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "5 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Success [4, 7, 3, 0, 2, 5, 1, 6]\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "6 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "0 x\n", - "0 x\n", - "5 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "0 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "1 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "1 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "0 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "Success [4, 1, 3, 6, 2, 7, 5, 0]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "4 x\n", - "1 x\n", - "2 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "4 x\n", - "1 x\n", - "2 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "1 x\n", - "2 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "1 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Success [3, 0, 4, 7, 1, 6, 2, 5]\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "5 x\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [1, 6, 4, 7, 0, 3, 5, 2]\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "7 x\n", - "1 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "1 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "2 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "2 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "2 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "2 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "1 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "Success [3, 6, 2, 7, 1, 4, 0, 5]\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "3 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "4 x\n", - "1 x\n", - "4 x\n", - "5 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "4 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "3 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "4 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "4 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Success [1, 4, 6, 0, 2, 7, 5, 3]\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "3 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "2 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Success [2, 0, 6, 4, 7, 1, 3, 5]\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "5 x\n", - "6 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "5 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "5 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Success [5, 2, 0, 6, 4, 7, 1, 3]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "2 x\n", - "3 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "3 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "6 x\n", - "1 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "Success [5, 3, 6, 0, 2, 4, 1, 7]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "3 x\n", - "4 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "4 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "6 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "5 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "5 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "4 x\n", - "6 x\n", - "5 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "5 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "1 x\n", - "0 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Success [2, 4, 1, 7, 0, 6, 3, 5]\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "2 x\n", - "3 x\n", - "1 x\n", - "1 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "2 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Success [0, 6, 3, 5, 7, 1, 4, 2]\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "6 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "5 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Success [4, 6, 0, 2, 7, 5, 3, 1]\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "5 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Success [5, 2, 6, 1, 7, 4, 0, 3]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "6 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "3 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "6 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "Success [1, 7, 5, 0, 2, 4, 6, 3]\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "3 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "3 x\n", - "2 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "3 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "5 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "4 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "Success [3, 1, 7, 5, 0, 2, 4, 6]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "1 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "4 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "2 x\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Success [3, 6, 4, 2, 0, 5, 7, 1]\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "5 x\n", - "4 x\n", - "3 x\n", - "4 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "4 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "3 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "Success [5, 2, 4, 7, 0, 3, 1, 6]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [3, 6, 0, 7, 4, 1, 5, 2]\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "2 x\n", - "4 x\n", - "5 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Success [1, 6, 2, 5, 7, 4, 0, 3]\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "0 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "0 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "1 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Success [3, 1, 6, 2, 5, 7, 0, 4]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "4 x\n", - "5 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "3 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "Success [4, 6, 0, 2, 7, 5, 3, 1]\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "5 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "4 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "5 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "4 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Success [2, 5, 1, 6, 0, 3, 7, 4]\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "6 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "Success [1, 6, 2, 5, 7, 4, 0, 3]\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "4 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Success [5, 2, 0, 7, 3, 1, 6, 4]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Success [6, 0, 2, 7, 5, 3, 1, 4]\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "1 x\n", - "6 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "0 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "0 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "7 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "2 x\n", - "3 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "0 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "--------------------\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "1 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "Success [3, 6, 4, 2, 0, 5, 7, 1]\n", - "--------------------\n", - "3 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "4 x\n", - "5 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "2 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "5 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Success [3, 1, 6, 2, 5, 7, 0, 4]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "4 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "0 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "2 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "7 x\n", - "3 x\n", - "2 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "6 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "0 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", "1 x\n", - "7 x\n", - "4 x\n", "6 x\n", - "0 x\n", "2 x\n", - "5 x\n", - "7 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [7, 1, 4, 2, 0, 6, 3, 5]\n", "--------------------\n", - "1 x\n", "7 x\n", + "1 x\n", "4 x\n", - "6 x\n", - "0 x\n", "2 x\n", - "5 x\n", + "0 x\n", + "6 x\n", "3 x\n", + "5 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [3, 1, 6, 4, 0, 7, 5, 2]\n", "--------------------\n", + "3 x\n", "1 x\n", - "7 x\n", - "4 x\n", "6 x\n", + "4 x\n", "0 x\n", - "2 x\n", - "5 x\n", + "7 x\n", "5 x\n", + "2 x\n", "--------------------\n", "Exploring plateau\n", + "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", "--------------------\n", - "1 x\n", - "7 x\n", - "4 x\n", "6 x\n", - "0 x\n", "2 x\n", - "5 x\n", "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", "1 x\n", - "7 x\n", "4 x\n", - "6 x\n", "0 x\n", - "2 x\n", "5 x\n", "3 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 1, 7, 0, 3, 6, 2, 5]\n", "--------------------\n", + "4 x\n", "1 x\n", "7 x\n", - "4 x\n", - "6 x\n", "0 x\n", + "3 x\n", + "6 x\n", "2 x\n", "5 x\n", - "5 x\n", "--------------------\n", - "Exploring plateau\n", + "Success [4, 1, 3, 5, 7, 2, 0, 6]\n", "--------------------\n", - "1 x\n", - "7 x\n", "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", + "1 x\n", + "3 x\n", "5 x\n", "7 x\n", + "2 x\n", + "0 x\n", + "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Success [4, 6, 1, 3, 7, 0, 2, 5]\n", "--------------------\n", - "1 x\n", - "7 x\n", "4 x\n", "6 x\n", + "1 x\n", + "3 x\n", + "7 x\n", "0 x\n", "2 x\n", "5 x\n", - "5 x\n", "--------------------\n", - "Local minimum reached at: 1\n", - "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 2, 7, 3, 6, 0, 5, 1]\n", "--------------------\n", + "4 x\n", + "2 x\n", "7 x\n", "3 x\n", - "1 x\n", - "7 x\n", + "6 x\n", "0 x\n", - "2 x\n", "5 x\n", - "6 x\n", + "1 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", "--------------------\n", - "7 x\n", + "6 x\n", "3 x\n", "1 x\n", "7 x\n", + "5 x\n", "0 x\n", "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "4 x\n", "--------------------\n", - "7 x\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", + "--------------------\n", + "5 x\n", "3 x\n", "1 x\n", "7 x\n", "4 x\n", - "2 x\n", - "0 x\n", "6 x\n", + "0 x\n", + "2 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", "--------------------\n", "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", "2 x\n", - "0 x\n", "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", - "3 x\n", "1 x\n", - "7 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "5 x\n", "3 x\n", - "1 x\n", "7 x\n", - "4 x\n", - "6 x\n", "0 x\n", - "5 x\n", - "--------------------\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", "--------------------\n", "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", "--------------------\n", @@ -11355,130 +1198,210 @@ "0 x\n", "2 x\n", "--------------------\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [2, 7, 3, 6, 0, 5, 1, 4]\n", "--------------------\n", "2 x\n", "7 x\n", - "5 x\n", - "7 x\n", - "3 x\n", "3 x\n", - "5 x\n", "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "5 x\n", - "7 x\n", "0 x\n", - "3 x\n", "5 x\n", - "6 x\n", + "1 x\n", + "4 x\n", "--------------------\n", + "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", "--------------------\n", "2 x\n", + "6 x\n", + "1 x\n", "7 x\n", "5 x\n", - "7 x\n", - "0 x\n", "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "5 x\n", - "7 x\n", "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", "4 x\n", - "7 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", "--------------------\n", + "6 x\n", "2 x\n", - "4 x\n", "7 x\n", + "1 x\n", + "4 x\n", "0 x\n", - "0 x\n", + "5 x\n", "3 x\n", - "1 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", "--------------------\n", + "6 x\n", "2 x\n", - "5 x\n", "7 x\n", + "1 x\n", + "4 x\n", "0 x\n", - "0 x\n", + "5 x\n", "3 x\n", - "1 x\n", - "6 x\n", "--------------------\n", "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Local minimum reached at: 1\n", + "new board generated\n", + "Local minimum reached at: 2\n", + "new board generated\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Exploring plateau\n", + "Success [4, 1, 3, 5, 7, 2, 0, 6]\n", "--------------------\n", - "2 x\n", - "5 x\n", - "7 x\n", - "0 x\n", "4 x\n", - "3 x\n", "1 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "--------------------\n", - "2 x\n", + "3 x\n", "5 x\n", "7 x\n", + "2 x\n", "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", "6 x\n", "--------------------\n", + "Success [2, 4, 7, 3, 0, 6, 1, 5]\n", "--------------------\n", "2 x\n", - "5 x\n", + "4 x\n", "7 x\n", + "3 x\n", "0 x\n", - "4 x\n", "6 x\n", "1 x\n", - "3 x\n", + "5 x\n", "--------------------\n", - "Success [2, 5, 7, 0, 4, 6, 1, 3]\n", + "Exploring plateau\n", + "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", "--------------------\n", + "4 x\n", "2 x\n", + "0 x\n", "5 x\n", "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", "1 x\n", "3 x\n", - "--------------------\n", - "--------------------\n", - "2 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "0 x\n", "6 x\n", - "0 x\n", - "5 x\n", "--------------------\n" ] } @@ -11489,22 +1412,22 @@ }, { "cell_type": "code", - "execution_count": 307, + "execution_count": 327, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.12698412698412698" + "0.13793103448275862" ] }, - "execution_count": 307, + "execution_count": 327, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "q.failures / (q.failures + q.wins)" + "q.print_stats()" ] }, { From 99f1936e832fe693792f66911328d2f73c4278dc Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 3 Jan 2018 14:12:24 +0000 Subject: [PATCH 11/34] Working beam search, low efficiency --- Queens.ipynb | 1418 +++++--------------------------------------------- 1 file changed, 127 insertions(+), 1291 deletions(-) diff --git a/Queens.ipynb b/Queens.ipynb index db037d856..9ac5ff769 100644 --- a/Queens.ipynb +++ b/Queens.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 317, + "execution_count": 149, "metadata": { "collapsed": true }, @@ -16,18 +16,19 @@ }, { "cell_type": "code", - "execution_count": 328, + "execution_count": 150, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "queens = 8" + "queens = 32\n", + "k = queens" ] }, { "cell_type": "code", - "execution_count": 330, + "execution_count": 151, "metadata": {}, "outputs": [], "source": [ @@ -39,28 +40,27 @@ " self.fail_times, self.win_times = [], []\n", " \n", " def random_state(self):\n", - " self.state = [int(queens * random.random()) for j in range(queens) ]\n", + " self.state = [[int(queens * random.random()) for j in range(queens) ] for a in range(k)]\n", " \n", " def percept(self, agent):\n", " return self.state\n", " \n", " def execute_action(self, agent, action):\n", - " if action == \"NoOp\":\n", - " print(\"new board generated\")\n", - " self.fail_times.append(agent.performance)\n", - " agent.performance = 0\n", - " self.random_state()\n", - " return state\n", - " elif action == \"Success\":\n", + " \n", + " if action == \"Success\":\n", " self.win_times.append(agent.performance)\n", " agent.performance = 0\n", " self.random_state()\n", - " return state\n", - " \n", - " agent.performance += 1\n", - " num, pos = action\n", - " self.state[num] = pos\n", " \n", + " elif agent.performance >= int(0.5*queens):\n", + " self.fail_times.append(agent.performance)\n", + " self.random_state()\n", + " agent.performance = 0\n", + " print(agent.performance)\n", + " else:\n", + " agent.performance += 1\n", + " self.state = action\n", + "\n", " def print_stats(self):\n", " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", " print(\"Average fail time:\", sum(self.fail_times)/len(self.fail_times))\n", @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 331, + "execution_count": 166, "metadata": {}, "outputs": [], "source": [ @@ -89,48 +89,37 @@ " print(str(row) + \" \" + \" \" * row + \"x\" )\n", " print(\"--\"* (queens + 2))\n", "\n", - " def check_actions(state):\n", - " res = []\n", + " def check_actions(state, how_many):\n", + " d = dict()\n", " run = copy(state)\n", " for q in range(queens):\n", - " col_res = []\n", - " pos = state[q]\n", " for i in range(queens):\n", " run[q] = i\n", - " col_res.append(count_collisions(run))\n", - " col_res[pos] = 100\n", - " run[q] = pos\n", - " res.append(col_res)\n", - " return res\n", + " c = count_collisions(run)\n", + " d[c] = d.get(c, []) + [(c, copy(run))]\n", + " run[q] = state[q]\n", + " return pick_best(d, how_many)\n", + " \n", + " def pick_best(d, n):\n", + " l = []\n", + " for key in sorted(d):\n", + " l += d[key]\n", + " if len(l) > n:\n", + " break\n", + " return l[:n]\n", " \n", " def program(state):\n", " # print_board(state)\n", - " current = count_collisions(state) \n", + " top = []\n", + " for board in state:\n", + " top = sorted(top + check_actions(board, k))[:k]\n", + " print([el[0] for el in top])\n", " \n", - " if(current == 0):\n", + " if(0 == top[0][0]):\n", " print(\"Success\", state)\n", - " print_board(state)\n", " return \"Success\"\n", + " return [el[1] for el in top]\n", " \n", - " grid = check_actions(state)\n", - " d = dict()\n", - " for i in range(queens):\n", - " for j in range(queens):\n", - " d[grid[i][j]] = d.get(grid[i][j], []) + [(i, j)]\n", - " new_min = min(d)\n", - " program.last_d = d[new_min]\n", - "\n", - " if(new_min < current):\n", - " program.plateau_count = 0\n", - " return random.choice(d[new_min])\n", - " elif new_min == current and program.plateau_count < 30:\n", - " print(\"Exploring plateau\")\n", - " program.plateau_count += 1\n", - " return random.choice(d[new_min])\n", - " else:\n", - " program.plateau_count = 0\n", - " print(\"Local minimum reached at: \" + str(new_min))\n", - " return \"NoOp\"\n", " \n", " program.plateau_count = 0 \n", " return program" @@ -138,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 332, + "execution_count": 167, "metadata": {}, "outputs": [], "source": [ @@ -147,8 +136,10 @@ }, { "cell_type": "code", - "execution_count": 333, - "metadata": {}, + "execution_count": 168, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "q.add_thing(Agent(QueensHillClimbAgent()))\n", @@ -157,1277 +148,122 @@ }, { "cell_type": "code", - "execution_count": 334, + "execution_count": 169, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Success [2, 4, 1, 7, 0, 6, 3, 5]\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 7, 3, 0, 6, 1, 5, 2]\n", - "--------------------\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [6, 4, 2, 0, 5, 7, 1, 3]\n", - "--------------------\n", - "6 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Success [3, 7, 0, 4, 6, 1, 5, 2]\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 6, 3, 0, 2, 7, 5, 1]\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "2 x\n", - "7 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Success [5, 2, 4, 6, 0, 3, 1, 7]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [1, 7, 5, 0, 2, 4, 6, 3]\n", - "--------------------\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "--------------------\n", - "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Success [2, 6, 1, 7, 4, 0, 3, 5]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [2, 7, 3, 6, 0, 5, 1, 4]\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 2, 7, 3, 6, 0, 5, 1]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Success [4, 0, 7, 5, 2, 6, 1, 3]\n", - "--------------------\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [6, 2, 0, 5, 7, 4, 1, 3]\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "4 x\n", - "1 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [3, 7, 0, 2, 5, 1, 6, 4]\n", - "--------------------\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [1, 6, 4, 7, 0, 3, 5, 2]\n", - "--------------------\n", - "1 x\n", - "6 x\n", - "4 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 1, 5, 0, 6, 3, 7, 2]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "5 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "7 x\n", - "2 x\n", - "--------------------\n", - "Success [3, 1, 4, 7, 5, 0, 2, 6]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "4 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [4, 2, 0, 6, 1, 7, 5, 3]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Success [5, 3, 6, 0, 7, 1, 4, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n" + "[18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19]\n", + "[14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]\n", + "[11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12]\n", + "[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]\n", + "[6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6]\n", + "[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]\n", + "[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]\n", + "[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", + "[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", + "[1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", + "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "Success [[2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 0, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 0, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 3, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 3, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25]]\n", + "[21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22]\n", + "[18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19]\n", + "[16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]\n", + "[14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]\n", + "[12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12]\n" ] }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m-----------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/git_test/aima-python/agents.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 288\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\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 289\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mlist_things_at\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtclass\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mThing\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/git_test/aima-python/agents.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0magent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magents\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malive\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0mactions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprogram\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpercept\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0mactions\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[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mboard\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 40\u001b[0;31m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtop\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 41\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mel\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtop\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(state, how_many)\u001b[0m\n\u001b[1;32m 21\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcount_collisions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\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[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mcount_collisions\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 5\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mcount\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcount\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "q.run(1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Local minimum reached at: 2\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [5, 3, 0, 4, 7, 1, 6, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Success [1, 4, 6, 3, 0, 7, 5, 2]\n", - "--------------------\n", - "1 x\n", - "4 x\n", - "6 x\n", - "3 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Success [7, 1, 3, 0, 6, 4, 2, 5]\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [2, 5, 7, 1, 3, 0, 6, 4]\n", - "--------------------\n", - "2 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "4 x\n", - "--------------------\n", - "Success [5, 3, 0, 4, 7, 1, 6, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "7 x\n", - "1 x\n", - "6 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [7, 1, 4, 2, 0, 6, 3, 5]\n", - "--------------------\n", - "7 x\n", - "1 x\n", - "4 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "3 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [3, 1, 6, 4, 0, 7, 5, 2]\n", - "--------------------\n", - "3 x\n", - "1 x\n", - "6 x\n", - "4 x\n", - "0 x\n", - "7 x\n", - "5 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 1, 7, 0, 3, 6, 2, 5]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "7 x\n", - "0 x\n", - "3 x\n", - "6 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Success [4, 1, 3, 5, 7, 2, 0, 6]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Success [4, 6, 1, 3, 7, 0, 2, 5]\n", - "--------------------\n", - "4 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "2 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 2, 7, 3, 6, 0, 5, 1]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [6, 3, 1, 7, 5, 0, 2, 4]\n", - "--------------------\n", - "6 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "0 x\n", - "2 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Success [5, 2, 6, 1, 3, 7, 0, 4]\n", - "--------------------\n", - "5 x\n", - "2 x\n", - "6 x\n", - "1 x\n", - "3 x\n", - "7 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Success [5, 3, 1, 7, 4, 6, 0, 2]\n", - "--------------------\n", - "5 x\n", - "3 x\n", - "1 x\n", - "7 x\n", - "4 x\n", - "6 x\n", - "0 x\n", - "2 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [2, 7, 3, 6, 0, 5, 1, 4]\n", - "--------------------\n", - "2 x\n", - "7 x\n", - "3 x\n", - "6 x\n", - "0 x\n", - "5 x\n", - "1 x\n", - "4 x\n", - "--------------------\n", - "Success [2, 6, 1, 7, 5, 3, 0, 4]\n", - "--------------------\n", - "2 x\n", - "6 x\n", - "1 x\n", - "7 x\n", - "5 x\n", - "3 x\n", - "0 x\n", - "4 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [6, 2, 7, 1, 4, 0, 5, 3]\n", - "--------------------\n", - "6 x\n", - "2 x\n", - "7 x\n", - "1 x\n", - "4 x\n", - "0 x\n", - "5 x\n", - "3 x\n", - "--------------------\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Local minimum reached at: 1\n", - "new board generated\n", - "Local minimum reached at: 2\n", - "new board generated\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Exploring plateau\n", - "Success [4, 1, 3, 5, 7, 2, 0, 6]\n", - "--------------------\n", - "4 x\n", - "1 x\n", - "3 x\n", - "5 x\n", - "7 x\n", - "2 x\n", - "0 x\n", - "6 x\n", - "--------------------\n", - "Success [2, 4, 7, 3, 0, 6, 1, 5]\n", - "--------------------\n", - "2 x\n", - "4 x\n", - "7 x\n", - "3 x\n", - "0 x\n", - "6 x\n", - "1 x\n", - "5 x\n", - "--------------------\n", - "Exploring plateau\n", - "Success [4, 2, 0, 5, 7, 1, 3, 6]\n", - "--------------------\n", - "4 x\n", - "2 x\n", - "0 x\n", - "5 x\n", - "7 x\n", - "1 x\n", - "3 x\n", - "6 x\n", - "--------------------\n" + "Win ratio: 0.7935943060498221\n", + "Average fail time: 4.0\n", + "Average win time: 2.1659192825112106\n" ] } ], "source": [ - "q.run(1000)" + "q.print_stats()" ] }, { "cell_type": "code", - "execution_count": 327, + "execution_count": 141, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "l = [(7, 4), (3, 4), (6, 2)]" + ] + }, + { + "cell_type": "code", + "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.13793103448275862" + "[(3, 4), (6, 2), (7, 4)]" ] }, - "execution_count": 327, + "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "q.print_stats()" + "sorted(l)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(2, 2)}" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set([(2, 2)])" ] }, { From dc3ad073563d767bbafed10be2c4d5ed7da84697 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 3 Jan 2018 17:02:48 +0000 Subject: [PATCH 12/34] Working beam search, numpy --- Queens.ipynb | 1434 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 1304 insertions(+), 130 deletions(-) diff --git a/Queens.ipynb b/Queens.ipynb index 9ac5ff769..9102a93e3 100644 --- a/Queens.ipynb +++ b/Queens.ipynb @@ -2,13 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 149, + "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from random import random\n", + "import numpy as np\n", "from agents import *\n", "import agents\n", "from copy import copy" @@ -16,20 +17,22 @@ }, { "cell_type": "code", - "execution_count": 150, + "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "queens = 32\n", - "k = queens" + "queens = 8\n", + "k = 8" ] }, { "cell_type": "code", - "execution_count": 151, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class QueensEnvironment(agents.Environment):\n", @@ -40,14 +43,15 @@ " self.fail_times, self.win_times = [], []\n", " \n", " def random_state(self):\n", - " self.state = [[int(queens * random.random()) for j in range(queens) ] for a in range(k)]\n", + " self.state = np.random.randint(0, queens-1, [k, queens])\n", " \n", " def percept(self, agent):\n", " return self.state\n", " \n", " def execute_action(self, agent, action):\n", " \n", - " if action == \"Success\":\n", + " mes, state = action\n", + " if mes == \"Success\":\n", " self.win_times.append(agent.performance)\n", " agent.performance = 0\n", " self.random_state()\n", @@ -59,7 +63,7 @@ " print(agent.performance)\n", " else:\n", " agent.performance += 1\n", - " self.state = action\n", + " self.state = state\n", "\n", " def print_stats(self):\n", " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", @@ -69,17 +73,20 @@ }, { "cell_type": "code", - "execution_count": 166, - "metadata": {}, + "execution_count": 9, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def QueensHillClimbAgent():\n", " \n", - " def count_collisions(state):\n", + " dt = np.dtype([('count', int), ('state', int, (queens,))] )\n", + " def count_collisions(board):\n", " count = 0\n", " for i in range(queens):\n", " for j in range(i+1, queens):\n", - " if state[i] == state[j] or abs(state[i] - state[j]) == j - i:\n", + " if board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", " count += 1\n", " return count\n", " \n", @@ -89,36 +96,29 @@ " print(str(row) + \" \" + \" \" * row + \"x\" )\n", " print(\"--\"* (queens + 2))\n", "\n", - " def check_actions(state, how_many):\n", - " d = dict()\n", - " run = copy(state)\n", + " def check_actions(board, how_many):\n", + " d = np.empty([queens, queens], dtype = dt)\n", + " run = np.array(board)\n", " for q in range(queens):\n", " for i in range(queens):\n", " run[q] = i\n", - " c = count_collisions(run)\n", - " d[c] = d.get(c, []) + [(c, copy(run))]\n", - " run[q] = state[q]\n", - " return pick_best(d, how_many)\n", - " \n", - " def pick_best(d, n):\n", - " l = []\n", - " for key in sorted(d):\n", - " l += d[key]\n", - " if len(l) > n:\n", - " break\n", - " return l[:n]\n", + " d[q, i] = (count_collisions(run), np.array(run))\n", + " run[q] = board[q]\n", + " \n", + " ret = np.sort(d, axis=None, order='count')\n", + " return ret[:how_many]\n", " \n", " def program(state):\n", - " # print_board(state)\n", - " top = []\n", - " for board in state:\n", - " top = sorted(top + check_actions(board, k))[:k]\n", - " print([el[0] for el in top])\n", + " top = check_actions(state[0], k)\n", + " for board in state[1:]:\n", + " new = np.unique(np.concatenate((top, check_actions(board, k))))\n", + " top = np.sort(new, order='count')[:k]\n", + " print(top['count'])\n", " \n", - " if(0 == top[0][0]):\n", - " print(\"Success\", state)\n", - " return \"Success\"\n", - " return [el[1] for el in top]\n", + " if(0 in top['count']):\n", + " print(\"Success\", top['state'][0])\n", + " return \"Success\", top['state']\n", + " return \"\", top['state']\n", " \n", " \n", " program.plateau_count = 0 \n", @@ -127,144 +127,1318 @@ }, { "cell_type": "code", - "execution_count": 167, - "metadata": {}, - "outputs": [], - "source": [ - "q = QueensEnvironment()" - ] - }, - { - "cell_type": "code", - "execution_count": 168, + "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ + "q = QueensEnvironment()\n", "q.add_thing(Agent(QueensHillClimbAgent()))\n", "q.failures, q.wins = 0,0" ] }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19]\n", - "[14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]\n", - "[11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12]\n", - "[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]\n", - "[6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6]\n", - "[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]\n", - "[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]\n", - "[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", - "[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", - "[1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]\n", - "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", - "[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", - "Success [[2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 5, 12, 30, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 6, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [2, 15, 20, 16, 23, 30, 12, 7, 9, 17, 3, 28, 21, 8, 24, 27, 31, 8, 5, 26, 4, 10, 19, 11, 22, 29, 18, 13, 1, 14, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 0, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 0, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 3, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 3, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25], [5, 15, 13, 16, 3, 23, 12, 7, 9, 17, 30, 28, 21, 8, 24, 27, 31, 8, 14, 26, 4, 2, 19, 11, 22, 29, 18, 10, 1, 6, 0, 25]]\n", - "[21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22]\n", - "[18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19]\n", - "[16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]\n", - "[14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]\n", - "[12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12]\n" + "[4 5 5 5 5 5 5 5]\n", + "[3 3 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 1 5 0 6 3 7 2]\n", + "[2 2 2 3 3 3 3 3]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [6 0 2 7 5 3 1 4]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [7 3 0 2 5 1 6 4]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 6 2 5 7 4 0]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 4 2 0 6 3 5]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 5 7 2 6 3 1 4]\n", + "[0 1 1 2 2 3 3 3]\n", + "Success [5 1 6 0 3 7 4 2]\n", + "[4 4 4 4 5 5 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 4 1 7 0 6 3 5]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [4 6 3 0 2 7 5 1]\n", + "[4 4 5 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 3 0 7 1 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 0 2 7 5 3 1 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 2 2 2 2 2]\n", + "Success [6 3 1 4 7 0 2 5]\n", + "[3 3 3 3 3 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 1 6 0 3 7 4]\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 1 7 4 0 3]\n", + "[3 4 4 4 4 5 5 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 3 1 7 4 6 0]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 1 6 4 0 7 3]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 4 2 0 6 3 5]\n", + "[4 5 5 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 2 0 5 7 4 1 3]\n", + "[4 4 4 4 5 5 5 5]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [3 5 7 1 6 0 2 4]\n", + "[4 4 5 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 6 4 2 0 5 7 1]\n", + "[3 3 3 3 3 4 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 0 4 1 7 2 6]\n", + "[1 2 3 3 3 4 4 4]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 3 1 7 4 6 0]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [2 5 3 1 7 4 6 0]\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [4 6 0 2 7 5 3 1]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 0 0 1 1 1 1 1]\n", + "Success [1 5 0 6 3 7 2 4]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 4 1 7 5 3 6 0]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 0 6 4 7 1 3]\n", + "[4 4 4 4 4 4 5 5]\n", + "[1 2 2 2 2 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 4 6 3 0 7 5 2]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 0 2 7 5 3 1 4]\n", + "[2 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 7 3 6 0 5 1 4]\n", + "[2 3 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 4 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[2 3 3 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 1 5 2 0 3 7]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 5 7 2 0 3 6 4]\n", + "[1 2 3 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [6 1 3 0 7 4 2 5]\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 3 3 3 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "0\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 7 0 3 6 4 1]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 5 7 2 6 3 1 4]\n", + "[2 3 3 4 4 4 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 0 1 1 1 1 1]\n", + "Success [1 6 2 5 7 4 0 3]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 6 4 7 0 3 5 2]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 0 7 3 1 6 4]\n", + "[4 4 4 4 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 0 3 1 7 5 2]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 0 4 1 7 2 6 3]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 4 6 0 3 1 7 5]\n", + "[3 3 3 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 2 0 5 7 1 3 6]\n", + "[3 3 3 3 3 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 4 6 0 3 1 7 5]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 5 5 5 5 5 5]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 1 7 4 6 0 2 5]\n", + "[3 3 4 4 4 4 4 5]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "0\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [3 1 6 2 5 7 0 4]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[4 4 4 4 4 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 4 2 0 6 3 5]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 7 2 0 6 4 1]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 6 3 5 7 1 4 2]\n", + "[4 4 4 4 4 5 5 5]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 0 4 1 7 2 6]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 1 5 0 6 3 7 2]\n", + "[3 3 3 3 3 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 6 2 5 7 0 4]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 6 1 7 4 0 3 5]\n", + "[1 2 3 3 3 3 4 4]\n", + "[1 1 2 2 2 2 2 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[4 4 4 4 4 5 5 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 1 4 7 0 6 3]\n", + "[3 3 4 4 4 4 4 5]\n", + "[1 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 6 2 7 1 4 0 5]\n", + "[4 4 4 4 4 5 5 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 7 4 2 0 6 1 5]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 7 5 0 2 4 6 3]\n", + "[4 4 5 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [4 1 3 6 2 7 5 0]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 0 3 5 7 1 6 2]\n", + "[1 2 2 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 2 3 3 3 4 4 4]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [3 6 0 7 4 1 5 2]\n", + "[4 4 5 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 3 0 4 7 1 6 2]\n", + "[3 3 3 4 4 4 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 1 5 2 0 7 3]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[5 5 5 5 5 5 5 6]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [3 1 7 5 0 2 4 6]\n", + "[2 3 3 3 3 4 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 7 3 6 0 5 1 4]\n", + "[1 1 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [1 4 6 0 2 7 5 3]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m-----------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/git_test/aima-python/agents.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, steps)\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 288\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\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 289\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mlist_things_at\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtclass\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mThing\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/git_test/aima-python/agents.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0magent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magents\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malive\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0mactions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprogram\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpercept\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 278\u001b[0m \u001b[0mactions\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[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mboard\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 40\u001b[0;31m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtop\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 41\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mel\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mel\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtop\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(state, how_many)\u001b[0m\n\u001b[1;32m 21\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcount_collisions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\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[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcount_collisions\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 5\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mcount\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcount\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 4 2 0 5 7 1 3]\n", + "[2 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [4 2 0 5 7 1 3 6]\n", + "[3 3 4 4 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 6 3 5 7 1 4 2]\n", + "[2 2 3 3 3 3 4 4]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 3 0 7 1 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 2 2 2 2 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 5 7 2 0 3 6 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 4 7 5 2 6 1 3]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 4 7 5 2 6 1 3]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 6 4 7 1 3 5 2]\n", + "[3 3 3 3 3 3 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 3 6 0 7 1 4 2]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "0\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 7 5 0 2 4 6]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 6 2 5 7 4 0 3]\n", + "[5 5 5 5 5 5 6 6]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 2 2 2 2 2]\n", + "Success [4 2 7 3 6 0 5 1]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [4 2 0 6 1 7 5 3]\n", + "[2 3 3 3 3 3 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 0 4 1 7 2 6]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 6 2 7 1 4 0 5]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 4 4 4 4 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [0 4 7 5 2 6 1 3]\n", + "[3 4 4 4 4 4 4 5]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 3 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 5 7 1 6 0 2 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 7 3 0 6 1 5 2]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 5 7 2 6 3 1 4]\n", + "[1 2 3 3 3 3 3 3]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [1 4 6 3 0 7 5 2]\n", + "[3 3 3 3 3 3 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 1 3 7 0 4]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [2 5 1 6 4 0 7 3]\n", + "[4 4 4 4 4 5 5 5]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [1 7 5 0 2 4 6 3]\n", + "[3 3 4 4 4 5 5 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "0\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [2 5 1 6 4 0 7 3]\n", + "[2 2 2 3 3 3 3 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [5 3 0 4 7 1 6 2]\n", + "[1 2 2 3 3 3 3 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 3 3 3 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 3 0 7 4 6 1]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 3 0 4 7 1 6 2]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 4 7 5 2 6 1 3]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 0 2 7 5 3 1 4]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 5 7 2 6 3 1 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [1 6 4 7 0 3 5 2]\n", + "[2 3 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 7 5 0 2 4 6]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [4 1 3 5 7 2 0 6]\n", + "[4 4 5 5 5 5 5 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [6 1 5 2 0 3 7 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 2 0 6 1 7 5 3]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "0\n", + "[2 3 4 4 4 4 5 5]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [4 0 3 5 7 1 6 2]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 6 2 5 7 0 4]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [5 2 4 6 0 3 1 7]\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 0 1 1 1 1 1]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[3 4 4 4 4 5 5 5]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 0 0 1 1 1 1 1]\n", + "Success [3 1 6 2 5 7 0 4]\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [3 5 0 4 1 7 2 6]\n", + "[3 3 3 3 3 3 3 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [4 6 0 3 1 7 5 2]\n", + "[3 4 4 4 4 5 5 5]\n", + "[1 1 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 1 6 0 3 7 4 2]\n", + "[1 1 2 3 3 3 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 0 4 1 7 2 6]\n", + "[2 3 3 3 3 3 3 3]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 7 5 0 2 4 6]\n", + "[3 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 3]\n", + "[0 1 1 1 2 2 2 2]\n", + "Success [4 1 3 5 7 2 0 6]\n", + "[2 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 1 6 0 3 7 4]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 4 7 5 2 6 1 3]\n", + "[5 5 5 6 6 6 6 6]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 3 1 4 7 0 2 5]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 0 3 5 7 1 6 2]\n", + "[1 1 2 2 3 3 4 4]\n", + "[1 1 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 1 5 2 0 3 7 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 0 1 1 1 1 1 2]\n", + "Success [2 5 7 0 3 6 4 1]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 7 4 2 0 6 1 5]\n", + "[3 4 4 4 4 4 4 5]\n", + "[1 2 2 2 2 2 2 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 7 4 2 0 6 1 5]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "0\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 7 4 6 0 2 5]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 2 0 6 1 7 5 3]\n", + "[3 3 3 3 3 3 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 6 4 7 1 3 5 2]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 2 7 1 4 0 5 3]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 3 0 6 4 2 5]\n", + "[1 2 2 2 3 3 3 3]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[3 3 3 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 7 5 0 2 4 6]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 1 5 2 0 3 7 4]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 7 4 2 0 6 1 5]\n", + "[2 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 0 3 5 7 1 6 2]\n", + "[2 3 3 3 3 3 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [4 6 3 0 2 7 5 1]\n", + "[4 4 4 4 5 5 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [0 6 4 7 1 3 5 2]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "0\n", + "[5 5 6 6 6 6 6 6]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "0\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 3]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 6 2 5 7 0 4]\n", + "[4 4 4 4 4 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [6 1 5 2 0 3 7 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [5 3 0 4 7 1 6 2]\n", + "[3 4 4 4 4 4 4 5]\n", + "[2 2 2 2 2 2 3 3]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 1 5 2 0 7 3]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [6 4 2 0 5 7 1 3]\n", + "[4 5 5 5 5 5 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 5 5 5 5 5 5 5]\n", + "[3 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 1 3 7 0 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 1 4 7 5 0 2 6]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[1 1 3 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 1 5 0 6 3 7 2]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 3 3 3]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [6 1 5 2 0 3 7 4]\n", + "[2 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 6 1 7 4 0 3 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 0 2 7 5 3 1]\n", + "[2 3 3 3 3 3 3 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 3 6 0 7 1 4 2]\n", + "[2 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 3 1 4 7 0 2 5]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 0 2 7 5 3 1]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 4 6 0 3 1 7 5]\n", + "[3 3 3 3 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 3 3 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 0 6 4 7 1 3 5]\n", + "[3 3 3 3 3 4 4 4]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 2 0 5 7 4 1 3]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 1 7 4 6 0 2 5]\n", + "[2 2 3 3 3 4 4 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 4 7 0 3 1 6]\n", + "[3 3 3 3 3 3 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 0 7 3 1 6 4]\n", + "[4 4 4 4 5 5 5 5]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 4 2 0 6 3 5]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 1 1 1 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [2 7 3 6 0 5 1 4]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [2 4 1 7 0 6 3 5]\n", + "[3 3 3 3 3 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 1 5 2 0 7 3]\n", + "[3 3 3 3 3 3 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 5 7 1 6 0 2 4]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[2 2 3 3 4 4 4 5]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [5 2 6 1 7 4 0 3]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 1 3 5 7 2 0 6]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 3 3 3]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [6 2 7 1 4 0 5 3]\n", + "[3 4 4 4 5 5 5 5]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [1 6 2 5 7 4 0 3]\n", + "[4 4 4 4 5 5 5 5]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 1 6 0 3 7 4]\n", + "[3 3 4 5 5 5 5 5]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 0 7 4 1 3 6]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [0 6 4 7 1 3 5 2]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 3 0 2 5 1 6 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 7 0 2 5 1 6 4]\n", + "[3 3 3 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 2 0 5 7 4 1 3]\n", + "[2 3 3 3 3 3 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 4 6 3 0 7 5 2]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 3 3 3 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [1 5 7 2 0 3 6 4]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [6 0 2 7 5 3 1 4]\n", + "[2 2 3 3 4 4 4 4]\n", + "[1 1 1 2 2 2 2 2]\n", + "[0 0 1 1 1 1 1 1]\n", + "Success [3 0 4 7 1 6 2 5]\n", + "[3 3 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 0 0 0 1 1 1 1]\n", + "Success [2 4 1 7 5 3 6 0]\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [0 6 3 5 7 1 4 2]\n", + "[3 4 4 4 4 4 4 4]\n", + "[1 1 2 2 2 2 2 2]\n", + "[0 0 0 1 1 1 1 1]\n", + "Success [2 5 1 4 7 0 6 3]\n", + "[5 5 5 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 2 2 2]\n", + "Success [5 2 0 7 4 1 3 6]\n", + "[2 2 2 2 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[3 3 3 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [1 3 5 7 2 0 6 4]\n", + "[3 4 4 4 4 4 4 4]\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 1 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [0 6 4 7 1 3 5 2]\n", + "[2 3 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 7 1 3 0 6 4 2]\n", + "[3 3 3 3 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [5 2 6 3 0 7 1 4]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[3 3 3 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 2]\n", + "Success [3 6 4 2 0 5 7 1]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 2 2 2 2 2]\n", + "[1 1 1 1 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 4 5]\n", + "[2 2 2 2 2 2 2 2]\n", + "[0 0 1 1 1 1 2 2]\n", + "Success [2 5 7 0 3 6 4 1]\n", + "[4 4 4 4 4 4 4 4]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[2 2 3 3 3 3 3 3]\n", + "[1 2 2 2 2 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [7 1 4 2 0 6 3 5]\n", + "[3 3 4 4 4 4 4 4]\n", + "[1 2 2 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "0\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 2 2 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 7 3 6 0 5 1 4]\n", + "[2 2 2 2 2 2 3 3]\n", + "[1 1 1 1 1 2 2 2]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 6 1 7 5 3 0 4]\n", + "[4 4 4 4 4 4 5 5]\n", + "[1 2 2 3 3 3 3 3]\n", + "[0 1 1 1 1 1 2 2]\n", + "Success [3 0 4 7 5 2 6 1]\n", + "[4 4 4 5 5 5 5 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [4 6 1 5 2 0 7 3]\n", + "[3 4 4 4 4 4 4 5]\n", + "[2 2 2 3 3 3 3 3]\n", + "[1 1 1 1 1 1 1 1]\n", + "[1 1 1 1 1 1 1 1]\n", + "[0 1 1 1 1 1 1 1]\n", + "Success [2 5 7 0 3 6 4 1]\n", + "[4 4 4 4 4 4 5 5]\n", + "[2 2 2 2 2 3 3 3]\n", + "[1 1 1 2 2 2 2 2]\n", + "[1 1 1 1 1 1 1 1]\n" ] } ], "source": [ - "q.run(1000)" + "q.run(1000)\n", + "q.print_stats()" ] }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Win ratio: 0.7935943060498221\n", + "Win ratio: 0.8016194331983806\n", "Average fail time: 4.0\n", - "Average win time: 2.1659192825112106\n" + "Average win time: 2.792929292929293\n" ] } ], - "source": [ - "q.print_stats()" - ] + "source": [] }, { "cell_type": "code", - "execution_count": 141, + "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], - "source": [ - "l = [(7, 4), (3, 4), (6, 2)]" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(3, 4), (6, 2), (7, 4)]" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 160, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(2, 2)}" - ] - }, - "execution_count": 160, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "set([(2, 2)])" - ] + "source": [] }, { "cell_type": "code", From 2e1c2df46273595c3fd134cc2b5c8f936ae782e9 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Fri, 12 Jan 2018 19:48:49 +0000 Subject: [PATCH 13/34] New Table class to store (board, agent) pairs --- Queens/Environment.py | 151 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Queens/Environment.py diff --git a/Queens/Environment.py b/Queens/Environment.py new file mode 100644 index 000000000..30ceac1e0 --- /dev/null +++ b/Queens/Environment.py @@ -0,0 +1,151 @@ +import numpy as np + +class Table: + """ + Simple storage class for single agent and it's board. Provides plotting utilities but does not + tackle actions or agent messages. Also stores performance measure and random board generator. + """ + def __init__(self, agent, queens): + self.board = self.randomize_board(queens) + self.agent_func = agent + self.perf = 0 + + def randomize_board(self, queens): + self.board = np.random.randint(0, queens - 1, queens) + return self.board + + def plot_board(self): + print("--" * (len(self.board) + 2)) + for row in self.board: + print(str(row) + " " + " " * row + "x") + print("--" * (len(self.board) + 2)) + + def print_board(self): + print(self.board.tolist()) + + +class QueensEnv: + """ Environment for all agents and boards. Here steps are evaluated, found solutions stored + and performance measurement calls may be implemented. """ + def __init__(self, agents, queens=8, boards=1, master_agents=[]): + assert isinstance(agents, list) + self.solutions = {} + self.queens, self.boards = queens, boards + self.random_state() + self.tables = [Table(a, queens). for a in agents] + for a, b in agents: + a.performance = 0 + self.master_agents = master_agents + + + def step(self): + for pair in self.agents: + a, b = pair + mes, state = a(b) + if mes == "Success": + self.win_times.append(a.performance) + a.performance = 0 + # self.solutions.add(b) + pair[1] = self.random_state() + + elif a.performance >= int(0.5 * self.queens): + b = self.random_state() + a.performance = 0 + else: + a.performance += 1 + b = state + def execute_action(self, agent, action): + + + def print_stats(self): + print("Win ratio:", len(self.win_times) / (len(self.fail_times) + len(self.win_times))) + print("Average fail time:", sum(self.fail_times) / len(self.fail_times)) + print("Average win time:", sum(self.win_times) / len(self.win_times)) + + def __init__(self): + self.things = [] + self.agents = [] + + def thing_classes(self): + return [] # List of classes that can go into environment + + def percept(self, agent): + """Return the percept that the agent sees at this point. (Implement this.)""" + raise NotImplementedError + + def execute_action(self, agent, action): + """Change the world to reflect this action. (Implement this.)""" + if action != "": + raise NotImplementedError + + def default_location(self, thing): + """Default location to place a new thing with unspecified location.""" + return None + + def exogenous_change(self): + """If there is spontaneous change in the world, override this.""" + pass + + def is_done(self): + """By default, we're done when we can't find a live agent.""" + return not any(agent.is_alive() for agent in self.agents) + + def step(self): + """Run the environment for one time step. If the + actions and exogenous changes are independent, this method will + do. If there are interactions between them, you'll need to + override this method.""" + if not self.is_done(): + actions = [] + for agent in self.agents: + if agent.alive: + actions.append(agent.program(self.percept(agent))) + else: + actions.append("") + for (agent, action) in zip(self.agents, actions): + self.execute_action(agent, action) + self.exogenous_change() + + def run(self, steps=1000): + """Run the Environment for given number of time steps.""" + for step in range(steps): + if self.is_done(): + return + self.step() + + def list_things_at(self, location, tclass=Thing): + """Return all things exactly at a given location.""" + return [thing for thing in self.things + if thing.location == location and isinstance(thing, tclass)] + + def some_things_at(self, location, tclass=Thing): + """Return true if at least one of the things at location + is an instance of class tclass (or a subclass).""" + return self.list_things_at(location, tclass) != [] + + def add_thing(self, thing, location=None): + """Add a thing to the environment, setting its location. For + convenience, if thing is an agent program we make a new agent + for it. (Shouldn't need to override this.)""" + if not isinstance(thing, Thing): + thing = Agent(thing) + if thing in self.things: + print("Can't add the same thing twice") + else: + thing.location = location if location is not None else self.default_location(thing) + self.things.append(thing) + if isinstance(thing, Agent): + thing.performance = 0 + self.agents.append(thing) + + def delete_thing(self, thing): + """Remove a thing from the environment.""" + try: + self.things.remove(thing) + except ValueError as e: + print(e) + print(" in Environment delete_thing") + print(" Thing to be removed: {} at {}".format(thing, thing.location)) + print(" from list: {}".format([(thing, thing.location) for thing in self.things])) + if thing in self.agents: + self.agents.remove(thing) From f709e1f6139a913b5169059696dfeb5aec300f24 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Fri, 12 Jan 2018 21:13:43 +0000 Subject: [PATCH 14/34] Debugging new QueensEnv --- Queens.ipynb | 1474 ----------------------------------------- Queens/Environment.py | 148 +---- Queens/Queens.ipynb | 227 +++++++ Queens/__init__.py | 0 4 files changed, 263 insertions(+), 1586 deletions(-) delete mode 100644 Queens.ipynb create mode 100644 Queens/Queens.ipynb create mode 100644 Queens/__init__.py diff --git a/Queens.ipynb b/Queens.ipynb deleted file mode 100644 index 9102a93e3..000000000 --- a/Queens.ipynb +++ /dev/null @@ -1,1474 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from random import random\n", - "import numpy as np\n", - "from agents import *\n", - "import agents\n", - "from copy import copy" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "queens = 8\n", - "k = 8" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class QueensEnvironment(agents.Environment):\n", - " \n", - " def __init__(self):\n", - " super().__init__()\n", - " self.random_state()\n", - " self.fail_times, self.win_times = [], []\n", - " \n", - " def random_state(self):\n", - " self.state = np.random.randint(0, queens-1, [k, queens])\n", - " \n", - " def percept(self, agent):\n", - " return self.state\n", - " \n", - " def execute_action(self, agent, action):\n", - " \n", - " mes, state = action\n", - " if mes == \"Success\":\n", - " self.win_times.append(agent.performance)\n", - " agent.performance = 0\n", - " self.random_state()\n", - " \n", - " elif agent.performance >= int(0.5*queens):\n", - " self.fail_times.append(agent.performance)\n", - " self.random_state()\n", - " agent.performance = 0\n", - " print(agent.performance)\n", - " else:\n", - " agent.performance += 1\n", - " self.state = state\n", - "\n", - " def print_stats(self):\n", - " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", - " print(\"Average fail time:\", sum(self.fail_times)/len(self.fail_times))\n", - " print(\"Average win time:\", sum(self.win_times)/len(self.win_times)) " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def QueensHillClimbAgent():\n", - " \n", - " dt = np.dtype([('count', int), ('state', int, (queens,))] )\n", - " def count_collisions(board):\n", - " count = 0\n", - " for i in range(queens):\n", - " for j in range(i+1, queens):\n", - " if board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", - " count += 1\n", - " return count\n", - " \n", - " def print_board(state):\n", - " print(\"--\"*(queens + 2))\n", - " for row in state:\n", - " print(str(row) + \" \" + \" \" * row + \"x\" )\n", - " print(\"--\"* (queens + 2))\n", - "\n", - " def check_actions(board, how_many):\n", - " d = np.empty([queens, queens], dtype = dt)\n", - " run = np.array(board)\n", - " for q in range(queens):\n", - " for i in range(queens):\n", - " run[q] = i\n", - " d[q, i] = (count_collisions(run), np.array(run))\n", - " run[q] = board[q]\n", - " \n", - " ret = np.sort(d, axis=None, order='count')\n", - " return ret[:how_many]\n", - " \n", - " def program(state):\n", - " top = check_actions(state[0], k)\n", - " for board in state[1:]:\n", - " new = np.unique(np.concatenate((top, check_actions(board, k))))\n", - " top = np.sort(new, order='count')[:k]\n", - " print(top['count'])\n", - " \n", - " if(0 in top['count']):\n", - " print(\"Success\", top['state'][0])\n", - " return \"Success\", top['state']\n", - " return \"\", top['state']\n", - " \n", - " \n", - " program.plateau_count = 0 \n", - " return program" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q = QueensEnvironment()\n", - "q.add_thing(Agent(QueensHillClimbAgent()))\n", - "q.failures, q.wins = 0,0" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4 5 5 5 5 5 5 5]\n", - "[3 3 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 1 5 0 6 3 7 2]\n", - "[2 2 2 3 3 3 3 3]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [6 0 2 7 5 3 1 4]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [7 3 0 2 5 1 6 4]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 6 2 5 7 4 0]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 4 2 0 6 3 5]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 5 7 2 6 3 1 4]\n", - "[0 1 1 2 2 3 3 3]\n", - "Success [5 1 6 0 3 7 4 2]\n", - "[4 4 4 4 5 5 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 4 1 7 0 6 3 5]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [4 6 3 0 2 7 5 1]\n", - "[4 4 5 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 3 0 7 1 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 0 2 7 5 3 1 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 2 2 2 2 2]\n", - "Success [6 3 1 4 7 0 2 5]\n", - "[3 3 3 3 3 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 1 6 0 3 7 4]\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 1 7 4 0 3]\n", - "[3 4 4 4 4 5 5 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 3 1 7 4 6 0]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 1 6 4 0 7 3]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 4 2 0 6 3 5]\n", - "[4 5 5 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 2 0 5 7 4 1 3]\n", - "[4 4 4 4 5 5 5 5]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [3 5 7 1 6 0 2 4]\n", - "[4 4 5 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 6 4 2 0 5 7 1]\n", - "[3 3 3 3 3 4 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 0 4 1 7 2 6]\n", - "[1 2 3 3 3 4 4 4]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 3 1 7 4 6 0]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [2 5 3 1 7 4 6 0]\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [4 6 0 2 7 5 3 1]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 0 0 1 1 1 1 1]\n", - "Success [1 5 0 6 3 7 2 4]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 4 1 7 5 3 6 0]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 0 6 4 7 1 3]\n", - "[4 4 4 4 4 4 5 5]\n", - "[1 2 2 2 2 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 4 6 3 0 7 5 2]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 0 2 7 5 3 1 4]\n", - "[2 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 7 3 6 0 5 1 4]\n", - "[2 3 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 4 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[2 3 3 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 1 5 2 0 3 7]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 5 7 2 0 3 6 4]\n", - "[1 2 3 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [6 1 3 0 7 4 2 5]\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 3 3 3 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "0\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 7 0 3 6 4 1]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 5 7 2 6 3 1 4]\n", - "[2 3 3 4 4 4 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 0 1 1 1 1 1]\n", - "Success [1 6 2 5 7 4 0 3]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 6 4 7 0 3 5 2]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 0 7 3 1 6 4]\n", - "[4 4 4 4 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 0 3 1 7 5 2]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 0 4 1 7 2 6 3]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 4 6 0 3 1 7 5]\n", - "[3 3 3 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 2 0 5 7 1 3 6]\n", - "[3 3 3 3 3 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 4 6 0 3 1 7 5]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 5 5 5 5 5 5]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 1 7 4 6 0 2 5]\n", - "[3 3 4 4 4 4 4 5]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "0\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [3 1 6 2 5 7 0 4]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[4 4 4 4 4 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 4 2 0 6 3 5]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 7 2 0 6 4 1]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 6 3 5 7 1 4 2]\n", - "[4 4 4 4 4 5 5 5]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 0 4 1 7 2 6]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 1 5 0 6 3 7 2]\n", - "[3 3 3 3 3 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 6 2 5 7 0 4]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 6 1 7 4 0 3 5]\n", - "[1 2 3 3 3 3 4 4]\n", - "[1 1 2 2 2 2 2 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[4 4 4 4 4 5 5 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 1 4 7 0 6 3]\n", - "[3 3 4 4 4 4 4 5]\n", - "[1 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 6 2 7 1 4 0 5]\n", - "[4 4 4 4 4 5 5 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 7 4 2 0 6 1 5]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 7 5 0 2 4 6 3]\n", - "[4 4 5 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [4 1 3 6 2 7 5 0]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 0 3 5 7 1 6 2]\n", - "[1 2 2 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 2 3 3 3 4 4 4]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [3 6 0 7 4 1 5 2]\n", - "[4 4 5 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 3 0 4 7 1 6 2]\n", - "[3 3 3 4 4 4 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 1 5 2 0 7 3]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[5 5 5 5 5 5 5 6]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [3 1 7 5 0 2 4 6]\n", - "[2 3 3 3 3 4 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 7 3 6 0 5 1 4]\n", - "[1 1 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [1 4 6 0 2 7 5 3]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 4 2 0 5 7 1 3]\n", - "[2 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [4 2 0 5 7 1 3 6]\n", - "[3 3 4 4 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 6 3 5 7 1 4 2]\n", - "[2 2 3 3 3 3 4 4]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 3 0 7 1 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 2 2 2 2 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 5 7 2 0 3 6 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 4 7 5 2 6 1 3]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 4 7 5 2 6 1 3]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 6 4 7 1 3 5 2]\n", - "[3 3 3 3 3 3 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 3 6 0 7 1 4 2]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "0\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 7 5 0 2 4 6]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 6 2 5 7 4 0 3]\n", - "[5 5 5 5 5 5 6 6]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 2 2 2 2 2]\n", - "Success [4 2 7 3 6 0 5 1]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [4 2 0 6 1 7 5 3]\n", - "[2 3 3 3 3 3 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 0 4 1 7 2 6]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 6 2 7 1 4 0 5]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 4 4 4 4 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [0 4 7 5 2 6 1 3]\n", - "[3 4 4 4 4 4 4 5]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 3 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 5 7 1 6 0 2 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 7 3 0 6 1 5 2]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 5 7 2 6 3 1 4]\n", - "[1 2 3 3 3 3 3 3]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [1 4 6 3 0 7 5 2]\n", - "[3 3 3 3 3 3 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 1 3 7 0 4]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [2 5 1 6 4 0 7 3]\n", - "[4 4 4 4 4 5 5 5]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [1 7 5 0 2 4 6 3]\n", - "[3 3 4 4 4 5 5 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "0\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [2 5 1 6 4 0 7 3]\n", - "[2 2 2 3 3 3 3 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [5 3 0 4 7 1 6 2]\n", - "[1 2 2 3 3 3 3 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 3 3 3 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 3 0 7 4 6 1]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 3 0 4 7 1 6 2]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 4 7 5 2 6 1 3]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 0 2 7 5 3 1 4]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 5 7 2 6 3 1 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [1 6 4 7 0 3 5 2]\n", - "[2 3 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 7 5 0 2 4 6]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [4 1 3 5 7 2 0 6]\n", - "[4 4 5 5 5 5 5 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [6 1 5 2 0 3 7 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 2 0 6 1 7 5 3]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "0\n", - "[2 3 4 4 4 4 5 5]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [4 0 3 5 7 1 6 2]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 6 2 5 7 0 4]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [5 2 4 6 0 3 1 7]\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 0 1 1 1 1 1]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[3 4 4 4 4 5 5 5]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 0 0 1 1 1 1 1]\n", - "Success [3 1 6 2 5 7 0 4]\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [3 5 0 4 1 7 2 6]\n", - "[3 3 3 3 3 3 3 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [4 6 0 3 1 7 5 2]\n", - "[3 4 4 4 4 5 5 5]\n", - "[1 1 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 1 6 0 3 7 4 2]\n", - "[1 1 2 3 3 3 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 0 4 1 7 2 6]\n", - "[2 3 3 3 3 3 3 3]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 7 5 0 2 4 6]\n", - "[3 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 3]\n", - "[0 1 1 1 2 2 2 2]\n", - "Success [4 1 3 5 7 2 0 6]\n", - "[2 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 1 6 0 3 7 4]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 4 7 5 2 6 1 3]\n", - "[5 5 5 6 6 6 6 6]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 3 1 4 7 0 2 5]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 0 3 5 7 1 6 2]\n", - "[1 1 2 2 3 3 4 4]\n", - "[1 1 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 1 5 2 0 3 7 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 0 1 1 1 1 1 2]\n", - "Success [2 5 7 0 3 6 4 1]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 7 4 2 0 6 1 5]\n", - "[3 4 4 4 4 4 4 5]\n", - "[1 2 2 2 2 2 2 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 7 4 2 0 6 1 5]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "0\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 7 4 6 0 2 5]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 2 0 6 1 7 5 3]\n", - "[3 3 3 3 3 3 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 6 4 7 1 3 5 2]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 2 7 1 4 0 5 3]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 3 0 6 4 2 5]\n", - "[1 2 2 2 3 3 3 3]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[3 3 3 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 7 5 0 2 4 6]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 1 5 2 0 3 7 4]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 7 4 2 0 6 1 5]\n", - "[2 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 0 3 5 7 1 6 2]\n", - "[2 3 3 3 3 3 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [4 6 3 0 2 7 5 1]\n", - "[4 4 4 4 5 5 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [0 6 4 7 1 3 5 2]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "0\n", - "[5 5 6 6 6 6 6 6]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "0\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 3]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 6 2 5 7 0 4]\n", - "[4 4 4 4 4 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [6 1 5 2 0 3 7 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [5 3 0 4 7 1 6 2]\n", - "[3 4 4 4 4 4 4 5]\n", - "[2 2 2 2 2 2 3 3]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 1 5 2 0 7 3]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [6 4 2 0 5 7 1 3]\n", - "[4 5 5 5 5 5 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 5 5 5 5 5 5 5]\n", - "[3 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 1 3 7 0 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 1 4 7 5 0 2 6]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[1 1 3 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 1 5 0 6 3 7 2]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 3 3 3]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [6 1 5 2 0 3 7 4]\n", - "[2 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 6 1 7 4 0 3 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 0 2 7 5 3 1]\n", - "[2 3 3 3 3 3 3 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 3 6 0 7 1 4 2]\n", - "[2 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 3 1 4 7 0 2 5]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 0 2 7 5 3 1]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 4 6 0 3 1 7 5]\n", - "[3 3 3 3 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 3 3 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 0 6 4 7 1 3 5]\n", - "[3 3 3 3 3 4 4 4]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 2 0 5 7 4 1 3]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 1 7 4 6 0 2 5]\n", - "[2 2 3 3 3 4 4 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 4 7 0 3 1 6]\n", - "[3 3 3 3 3 3 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 0 7 3 1 6 4]\n", - "[4 4 4 4 5 5 5 5]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 4 2 0 6 3 5]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 1 1 1 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [2 7 3 6 0 5 1 4]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [2 4 1 7 0 6 3 5]\n", - "[3 3 3 3 3 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 1 5 2 0 7 3]\n", - "[3 3 3 3 3 3 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 5 7 1 6 0 2 4]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[2 2 3 3 4 4 4 5]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [5 2 6 1 7 4 0 3]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 1 3 5 7 2 0 6]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 3 3 3]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [6 2 7 1 4 0 5 3]\n", - "[3 4 4 4 5 5 5 5]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [1 6 2 5 7 4 0 3]\n", - "[4 4 4 4 5 5 5 5]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 1 6 0 3 7 4]\n", - "[3 3 4 5 5 5 5 5]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 0 7 4 1 3 6]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [0 6 4 7 1 3 5 2]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 3 0 2 5 1 6 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 7 0 2 5 1 6 4]\n", - "[3 3 3 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 2 0 5 7 4 1 3]\n", - "[2 3 3 3 3 3 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 4 6 3 0 7 5 2]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 3 3 3 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [1 5 7 2 0 3 6 4]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [6 0 2 7 5 3 1 4]\n", - "[2 2 3 3 4 4 4 4]\n", - "[1 1 1 2 2 2 2 2]\n", - "[0 0 1 1 1 1 1 1]\n", - "Success [3 0 4 7 1 6 2 5]\n", - "[3 3 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 0 0 0 1 1 1 1]\n", - "Success [2 4 1 7 5 3 6 0]\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [0 6 3 5 7 1 4 2]\n", - "[3 4 4 4 4 4 4 4]\n", - "[1 1 2 2 2 2 2 2]\n", - "[0 0 0 1 1 1 1 1]\n", - "Success [2 5 1 4 7 0 6 3]\n", - "[5 5 5 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 2 2 2]\n", - "Success [5 2 0 7 4 1 3 6]\n", - "[2 2 2 2 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[3 3 3 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [1 3 5 7 2 0 6 4]\n", - "[3 4 4 4 4 4 4 4]\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 1 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [0 6 4 7 1 3 5 2]\n", - "[2 3 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 7 1 3 0 6 4 2]\n", - "[3 3 3 3 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [5 2 6 3 0 7 1 4]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[3 3 3 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 2]\n", - "Success [3 6 4 2 0 5 7 1]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 2 2 2 2 2]\n", - "[1 1 1 1 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 4 5]\n", - "[2 2 2 2 2 2 2 2]\n", - "[0 0 1 1 1 1 2 2]\n", - "Success [2 5 7 0 3 6 4 1]\n", - "[4 4 4 4 4 4 4 4]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[2 2 3 3 3 3 3 3]\n", - "[1 2 2 2 2 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [7 1 4 2 0 6 3 5]\n", - "[3 3 4 4 4 4 4 4]\n", - "[1 2 2 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "0\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 2 2 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 7 3 6 0 5 1 4]\n", - "[2 2 2 2 2 2 3 3]\n", - "[1 1 1 1 1 2 2 2]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 6 1 7 5 3 0 4]\n", - "[4 4 4 4 4 4 5 5]\n", - "[1 2 2 3 3 3 3 3]\n", - "[0 1 1 1 1 1 2 2]\n", - "Success [3 0 4 7 5 2 6 1]\n", - "[4 4 4 5 5 5 5 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [4 6 1 5 2 0 7 3]\n", - "[3 4 4 4 4 4 4 5]\n", - "[2 2 2 3 3 3 3 3]\n", - "[1 1 1 1 1 1 1 1]\n", - "[1 1 1 1 1 1 1 1]\n", - "[0 1 1 1 1 1 1 1]\n", - "Success [2 5 7 0 3 6 4 1]\n", - "[4 4 4 4 4 4 5 5]\n", - "[2 2 2 2 2 3 3 3]\n", - "[1 1 1 2 2 2 2 2]\n", - "[1 1 1 1 1 1 1 1]\n" - ] - } - ], - "source": [ - "q.run(1000)\n", - "q.print_stats()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Win ratio: 0.8016194331983806\n", - "Average fail time: 4.0\n", - "Average win time: 2.792929292929293\n" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/Queens/Environment.py b/Queens/Environment.py index 30ceac1e0..9b235aa6c 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -6,12 +6,13 @@ class Table: tackle actions or agent messages. Also stores performance measure and random board generator. """ def __init__(self, agent, queens): - self.board = self.randomize_board(queens) - self.agent_func = agent self.perf = 0 + self.board = self.randomize_board(queens) + self.agent = agent def randomize_board(self, queens): self.board = np.random.randint(0, queens - 1, queens) + self.perf = 0 return self.board def plot_board(self): @@ -27,125 +28,48 @@ def print_board(self): class QueensEnv: """ Environment for all agents and boards. Here steps are evaluated, found solutions stored and performance measurement calls may be implemented. """ - def __init__(self, agents, queens=8, boards=1, master_agents=[]): + def __init__(self, agents, queens=8, master_agents=[]): assert isinstance(agents, list) self.solutions = {} - self.queens, self.boards = queens, boards - self.random_state() - self.tables = [Table(a, queens). for a in agents] - for a, b in agents: - a.performance = 0 + self.queens = queens + self.tables = [Table(a, queens) for a in agents] self.master_agents = master_agents + self.stats = StatsModule(len(agents)) - def step(self): - for pair in self.agents: - a, b = pair - mes, state = a(b) + for t in self.tables: + mes, new_state = t.agent(t.board) if mes == "Success": - self.win_times.append(a.performance) - a.performance = 0 + self.stats.addWin(t) # self.solutions.add(b) - pair[1] = self.random_state() - - elif a.performance >= int(0.5 * self.queens): - b = self.random_state() - a.performance = 0 + t.print_board() + t.randomize_board() + elif mes == "Pass": + self.stats.addLoss(t) + t.randomize_board() else: - a.performance += 1 - b = state - def execute_action(self, agent, action): - - - def print_stats(self): - print("Win ratio:", len(self.win_times) / (len(self.fail_times) + len(self.win_times))) - print("Average fail time:", sum(self.fail_times) / len(self.fail_times)) - print("Average win time:", sum(self.win_times) / len(self.win_times)) - - def __init__(self): - self.things = [] - self.agents = [] - - def thing_classes(self): - return [] # List of classes that can go into environment - - def percept(self, agent): - """Return the percept that the agent sees at this point. (Implement this.)""" - raise NotImplementedError - - def execute_action(self, agent, action): - """Change the world to reflect this action. (Implement this.)""" - if action != "": - raise NotImplementedError - - def default_location(self, thing): - """Default location to place a new thing with unspecified location.""" - return None - - def exogenous_change(self): - """If there is spontaneous change in the world, override this.""" - pass - - def is_done(self): - """By default, we're done when we can't find a live agent.""" - return not any(agent.is_alive() for agent in self.agents) - - def step(self): - """Run the environment for one time step. If the - actions and exogenous changes are independent, this method will - do. If there are interactions between them, you'll need to - override this method.""" - if not self.is_done(): - actions = [] - for agent in self.agents: - if agent.alive: - actions.append(agent.program(self.percept(agent))) - else: - actions.append("") - for (agent, action) in zip(self.agents, actions): - self.execute_action(agent, action) - self.exogenous_change() - - def run(self, steps=1000): - """Run the Environment for given number of time steps.""" - for step in range(steps): - if self.is_done(): - return + t.perf += 1 + t.board = new_state + + for su in self.master_agents: + pass + + def run(self, steps): + for i in range(steps): self.step() + + +class StatsModule: + """ Class to measure agent's performance. Should be called on every win and loss which occurs + in the environment. """ + def __init__(self, count): + pass - def list_things_at(self, location, tclass=Thing): - """Return all things exactly at a given location.""" - return [thing for thing in self.things - if thing.location == location and isinstance(thing, tclass)] - - def some_things_at(self, location, tclass=Thing): - """Return true if at least one of the things at location - is an instance of class tclass (or a subclass).""" - return self.list_things_at(location, tclass) != [] + def addWin(self, Table): + pass - def add_thing(self, thing, location=None): - """Add a thing to the environment, setting its location. For - convenience, if thing is an agent program we make a new agent - for it. (Shouldn't need to override this.)""" - if not isinstance(thing, Thing): - thing = Agent(thing) - if thing in self.things: - print("Can't add the same thing twice") - else: - thing.location = location if location is not None else self.default_location(thing) - self.things.append(thing) - if isinstance(thing, Agent): - thing.performance = 0 - self.agents.append(thing) + def addLost(self, Table): + pass - def delete_thing(self, thing): - """Remove a thing from the environment.""" - try: - self.things.remove(thing) - except ValueError as e: - print(e) - print(" in Environment delete_thing") - print(" Thing to be removed: {} at {}".format(thing, thing.location)) - print(" from list: {}".format([(thing, thing.location) for thing in self.things])) - if thing in self.agents: - self.agents.remove(thing) + def printStats(self): + pass diff --git a/Queens/Queens.ipynb b/Queens/Queens.ipynb new file mode 100644 index 000000000..c364c76a5 --- /dev/null +++ b/Queens/Queens.ipynb @@ -0,0 +1,227 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from random import random\n", + "import numpy as np\n", + "from agents import *\n", + "import agents\n", + "from copy import copy" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "queens = 8\n", + "k = 8" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class QueensEnvironment(agents.Environment):\n", + " \n", + " def __init__(self):\n", + " super().__init__()\n", + " self.random_state()\n", + " self.fail_times, self.win_times = [], []\n", + " \n", + " def random_state(self):\n", + " self.state = np.random.randint(0, queens-1, [k, queens])\n", + " \n", + " def percept(self, agent):\n", + " return self.state\n", + " \n", + " def execute_action(self, agent, action):\n", + " \n", + " mes, state = action\n", + " if mes == \"Success\":\n", + " self.win_times.append(agent.performance)\n", + " agent.performance = 0\n", + " self.random_state()\n", + " \n", + " elif agent.performance >= int(0.5*queens):\n", + " self.fail_times.append(agent.performance)\n", + " self.random_state()\n", + " agent.performance = 0\n", + " print(agent.performance)\n", + " else:\n", + " agent.performance += 1\n", + " self.state = state\n", + "\n", + " def print_stats(self):\n", + " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", + " print(\"Average fail time:\", sum(self.fail_times)/len(self.fail_times))\n", + " print(\"Average win time:\", sum(self.win_times)/len(self.win_times)) " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def QueensHillClimbAgent():\n", + " \n", + " dt = np.dtype([('count', int), ('state', int, (queens,))] )\n", + " def count_collisions(board):\n", + " count = 0\n", + " for i in range(queens):\n", + " for j in range(i+1, queens):\n", + " if board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", + " count += 1\n", + " return count\n", + "\n", + " def check_actions(board, how_many):\n", + " d = np.empty([queens, queens], dtype = dt)\n", + " run = np.array(board)\n", + " for q in range(queens):\n", + " for i in range(queens):\n", + " run[q] = i\n", + " d[q, i] = (count_collisions(run), np.array(run))\n", + " run[q] = board[q]\n", + " \n", + " ret = np.sort(d, axis=None, order='count')\n", + " return ret[:how_many]\n", + " \n", + " def program(state):\n", + " top = check_actions(state[0], k)\n", + " for board in state[1:]:\n", + " new = np.unique(np.concatenate((top, check_actions(board, k))))\n", + " top = np.sort(new, order='count')[:k]\n", + " print(top['count'])\n", + " \n", + " if(0 in top['count']):\n", + " print(\"Success\", top['state'][0])\n", + " return \"Success\", top['state']\n", + " return \"\", top['state']\n", + " \n", + " \n", + " program.plateau_count = 0 \n", + " return program" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "q = QueensEnvironment()\n", + "q.add_thing(Agent(QueensHillClimbAgent()))\n", + "q.failures, q.wins = 0, 0" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "from Queens.Environment import QueensEnv\n", + "from importlib import reload" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reload(Environment)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [], + "source": [ + "env = QueensEnv([QueensHillClimbAgent()])" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "too many indices for array", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Code/Henkel/Learning/aima-python/Queens/Environment.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstep\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\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtables\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mmes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Success\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddWin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mprogram\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[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mboard\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate\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[0m\n\u001b[1;32m 27\u001b[0m \u001b[0mnew\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(board, how_many)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\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\u001b[0mcount_collisions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mboard\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: too many indices for array" + ], + "output_type": "error" + } + ], + "source": [ + "env.step()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Queens/__init__.py b/Queens/__init__.py new file mode 100644 index 000000000..e69de29bb From c8d3f0d0f7cfe7a4e26305fc7d9469950bfc0ff6 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Fri, 12 Jan 2018 22:23:13 +0000 Subject: [PATCH 15/34] SteepAscentAgent rewritten as generator class --- Queens/Queens.ipynb | 191 ++++++++++++++++++++------------------------ Queens/__init__.py | 0 2 files changed, 85 insertions(+), 106 deletions(-) delete mode 100644 Queens/__init__.py diff --git a/Queens/Queens.ipynb b/Queens/Queens.ipynb index c364c76a5..597663cfb 100644 --- a/Queens/Queens.ipynb +++ b/Queens/Queens.ipynb @@ -8,154 +8,133 @@ }, "outputs": [], "source": [ - "from random import random\n", "import numpy as np\n", - "from agents import *\n", - "import agents\n", - "from copy import copy" + "from importlib import reload\n", + "from Environment import QueensEnv" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "queens = 8\n", - "k = 8" + "k = 8\n", + "reload(Environment)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "class QueensEnvironment(agents.Environment):\n", - " \n", - " def __init__(self):\n", - " super().__init__()\n", - " self.random_state()\n", - " self.fail_times, self.win_times = [], []\n", - " \n", - " def random_state(self):\n", - " self.state = np.random.randint(0, queens-1, [k, queens])\n", - " \n", - " def percept(self, agent):\n", - " return self.state\n", - " \n", - " def execute_action(self, agent, action):\n", - " \n", - " mes, state = action\n", - " if mes == \"Success\":\n", - " self.win_times.append(agent.performance)\n", - " agent.performance = 0\n", - " self.random_state()\n", - " \n", - " elif agent.performance >= int(0.5*queens):\n", - " self.fail_times.append(agent.performance)\n", - " self.random_state()\n", - " agent.performance = 0\n", - " print(agent.performance)\n", - " else:\n", - " agent.performance += 1\n", - " self.state = state\n", + "class SteepestAscentAgent:\n", + "\tdef new_agent(self):\n", + "\t\tdef count_collisions(board):\n", + "\t\t\tcount = 0\n", + "\t\t\tqueens = len(board)\n", + "\t\t\tfor i in range(queens):\n", + "\t\t\t\tfor j in range(i + 1, queens):\n", + "\t\t\t\t\tif board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", + "\t\t\t\t\t\tcount += 1\n", + "\t\t\treturn count\n", + "\t\t\t\n", + "\t\tdef check_actions(board, how_many):\n", + "\t\t\td = np.empty([queens, queens], dtype=self.dt)\n", + "\t\t\trun = np.array(board)\n", + "\t\t\tfor q in range(queens):\n", + "\t\t\t\tfor i in range(queens):\n", + "\t\t\t\t\trun[q] = i\n", + "\t\t\t\t\td[q, i] = (count_collisions(run), np.array(run))\n", + "\t\t\t\trun[q] = board[q]\n", + "\t\t\t\t\n", + "\t\t\tret = np.sort(d, axis=None, order='count')\n", + "\t\t\treturn ret[:how_many]\n", + "\t\t\n", + "\t\tdef program(state):\n", + "\t\t\tcols = count_collisions(state)\n", + "\t\t\tif cols == 0:\n", + "\t\t\t\treturn \"Success\", state\n", + "\t\t\telse:\n", + "\t\t\t\tupdate = check_actions(state, 1)\n", + "\t\t\t\tif update['count'] < cols:\n", + "\t\t\t\t\treturn \"\", update['state']\n", + "\t\t\t\telse:\n", + "\t\t\t\t\treturn \"NoOp\", state\n", "\n", - " def print_stats(self):\n", - " print(\"Win ratio:\", len(self.win_times)/ (len(self.fail_times) + len(self.win_times)))\n", - " print(\"Average fail time:\", sum(self.fail_times)/len(self.fail_times))\n", - " print(\"Average win time:\", sum(self.win_times)/len(self.win_times)) " - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def QueensHillClimbAgent():\n", - " \n", - " dt = np.dtype([('count', int), ('state', int, (queens,))] )\n", - " def count_collisions(board):\n", - " count = 0\n", - " for i in range(queens):\n", - " for j in range(i+1, queens):\n", - " if board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", - " count += 1\n", - " return count\n", + "\t\treturn program\n", "\n", - " def check_actions(board, how_many):\n", - " d = np.empty([queens, queens], dtype = dt)\n", - " run = np.array(board)\n", - " for q in range(queens):\n", - " for i in range(queens):\n", - " run[q] = i\n", - " d[q, i] = (count_collisions(run), np.array(run))\n", - " run[q] = board[q]\n", - " \n", - " ret = np.sort(d, axis=None, order='count')\n", - " return ret[:how_many]\n", - " \n", - " def program(state):\n", - " top = check_actions(state[0], k)\n", - " for board in state[1:]:\n", - " new = np.unique(np.concatenate((top, check_actions(board, k))))\n", - " top = np.sort(new, order='count')[:k]\n", - " print(top['count'])\n", - " \n", - " if(0 in top['count']):\n", - " print(\"Success\", top['state'][0])\n", - " return \"Success\", top['state']\n", - " return \"\", top['state']\n", - " \n", - " \n", - " program.plateau_count = 0 \n", - " return program" + "\n", + "SteepestAscentAgent.dt = np.dtype([('count', int), ('state', int, (queens,))])\n" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "q = QueensEnvironment()\n", - "q.add_thing(Agent(QueensHillClimbAgent()))\n", - "q.failures, q.wins = 0, 0" + "agentGenerator = SteepestAscentAgent()\n", + "agent = agentGenerator.new_agent()" ] }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'dt' is not defined", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0magent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"Success\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m \u001b[0mupdate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 33\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'count'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mcols\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'state'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(board, how_many)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhow_many\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueens\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0mrun\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'dt' is not defined" + ], + "output_type": "error" + } + ], "source": [ - "from Queens.Environment import QueensEnv\n", - "from importlib import reload" + "agent(np.random.randint(0, 7, [8]))" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" + "ename": "NameError", + "evalue": "name 'reload' is not defined", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mEnvironment\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'reload' is not defined" + ], + "output_type": "error" } ], "source": [ @@ -164,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/Queens/__init__.py b/Queens/__init__.py deleted file mode 100644 index e69de29bb..000000000 From 6bcbbcb261653c5cd6849efbce09152f001d247a Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Fri, 12 Jan 2018 22:59:27 +0000 Subject: [PATCH 16/34] Working OO implementation --- Queens/Environment.py | 10 ++- Queens/Queens.ipynb | 160 +++++++++++----------------------- Queens/SteepestAscentAgent.py | 41 +++++++++ Queens/main.py | 14 +++ 4 files changed, 114 insertions(+), 111 deletions(-) create mode 100644 Queens/SteepestAscentAgent.py create mode 100644 Queens/main.py diff --git a/Queens/Environment.py b/Queens/Environment.py index 9b235aa6c..cdafed77e 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -42,11 +42,13 @@ def step(self): if mes == "Success": self.stats.addWin(t) # self.solutions.add(b) + print("Success!!!") t.print_board() - t.randomize_board() - elif mes == "Pass": + t.randomize_board(self.queens) + elif mes == "NoOp": self.stats.addLoss(t) - t.randomize_board() + print("No luck, reset.") + t.randomize_board(self.queens) else: t.perf += 1 t.board = new_state @@ -68,7 +70,7 @@ def __init__(self, count): def addWin(self, Table): pass - def addLost(self, Table): + def addLoss(self, Table): pass def printStats(self): diff --git a/Queens/Queens.ipynb b/Queens/Queens.ipynb index 597663cfb..aa3aaae46 100644 --- a/Queens/Queens.ipynb +++ b/Queens/Queens.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -10,168 +10,114 @@ "source": [ "import numpy as np\n", "from importlib import reload\n", - "from Environment import QueensEnv" + "from Environment import QueensEnv\n", + "from SteepestAscentAgent import SteepestAscentAgent" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": { "collapsed": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "queens = 8\n", "k = 8\n", - "reload(Environment)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class SteepestAscentAgent:\n", - "\tdef new_agent(self):\n", - "\t\tdef count_collisions(board):\n", - "\t\t\tcount = 0\n", - "\t\t\tqueens = len(board)\n", - "\t\t\tfor i in range(queens):\n", - "\t\t\t\tfor j in range(i + 1, queens):\n", - "\t\t\t\t\tif board[i] == board[j] or abs(board[i] - board[j]) == j - i:\n", - "\t\t\t\t\t\tcount += 1\n", - "\t\t\treturn count\n", - "\t\t\t\n", - "\t\tdef check_actions(board, how_many):\n", - "\t\t\td = np.empty([queens, queens], dtype=self.dt)\n", - "\t\t\trun = np.array(board)\n", - "\t\t\tfor q in range(queens):\n", - "\t\t\t\tfor i in range(queens):\n", - "\t\t\t\t\trun[q] = i\n", - "\t\t\t\t\td[q, i] = (count_collisions(run), np.array(run))\n", - "\t\t\t\trun[q] = board[q]\n", - "\t\t\t\t\n", - "\t\t\tret = np.sort(d, axis=None, order='count')\n", - "\t\t\treturn ret[:how_many]\n", - "\t\t\n", - "\t\tdef program(state):\n", - "\t\t\tcols = count_collisions(state)\n", - "\t\t\tif cols == 0:\n", - "\t\t\t\treturn \"Success\", state\n", - "\t\t\telse:\n", - "\t\t\t\tupdate = check_actions(state, 1)\n", - "\t\t\t\tif update['count'] < cols:\n", - "\t\t\t\t\treturn \"\", update['state']\n", - "\t\t\t\telse:\n", - "\t\t\t\t\treturn \"NoOp\", state\n", - "\n", - "\t\treturn program\n", - "\n", - "\n", - "SteepestAscentAgent.dt = np.dtype([('count', int), ('state', int, (queens,))])\n" + "# reload(Environment)\n", + "# reload(SteepestAscentAgent)" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "agentGenerator = SteepestAscentAgent()\n", - "agent = agentGenerator.new_agent()" + "agent = agentGenerator.new_agent()\n", + "a2 = agentGenerator.new_agent()\n", + "env = QueensEnv([agent])" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'dt' is not defined", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0magent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"Success\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m \u001b[0mupdate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 33\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'count'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mcols\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'state'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(board, how_many)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhow_many\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mqueens\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0mrun\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'dt' is not defined" - ], - "output_type": "error" + "name": "stdout", + "output_type": "stream", + "text": [ + "Returning (3, [0, 5, 5, 1, 6, 4, 2, 2])\nReturning (2, [0, 5, 3, 1, 6, 4, 2, 2])\nReturning (1, [0, 5, 3, 1, 6, 4, 2, 0])\n" + ] } ], "source": [ - "agent(np.random.randint(0, 7, [8]))" + "env.run(20)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 11, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'reload' is not defined", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mreload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mEnvironment\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'reload' is not defined" - ], - "output_type": "error" + "name": "stdout", + "output_type": "stream", + "text": [ + "[2 2 6 3 7 0 3 5]\n[2 2 6 3 7 0 3 5]\n69\n" + ] } ], "source": [ - "reload(Environment)" + "env.step()\n", + "print(env.tables[0].board)\n", + "env.step()\n", + "print(env.tables[0].board)\n", + "env.step()\n", + "print(env.tables[0].perf)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "env = QueensEnv([QueensHillClimbAgent()])" + "ref = None\n", + "for t in env.tables:\n", + "\tref = t" ] }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 13, "metadata": {}, "outputs": [ { - "ename": "IndexError", - "evalue": "too many indices for array", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/Code/Henkel/Learning/aima-python/Queens/Environment.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstep\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\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtables\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mmes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmes\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"Success\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddWin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprogram\u001b[0;34m(state)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mprogram\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[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mtop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mboard\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate\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[0m\n\u001b[1;32m 27\u001b[0m \u001b[0mnew\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mboard\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mcheck_actions\u001b[0;34m(board, how_many)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\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[0mqueens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\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\u001b[0mcount_collisions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mboard\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mq\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mIndexError\u001b[0m: too many indices for array" - ], - "output_type": "error" + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] } ], "source": [ - "env.step()" + "print(env.tables[0].perf)" ] }, { diff --git a/Queens/SteepestAscentAgent.py b/Queens/SteepestAscentAgent.py new file mode 100644 index 000000000..497a22efd --- /dev/null +++ b/Queens/SteepestAscentAgent.py @@ -0,0 +1,41 @@ +import numpy as np + + +class SteepestAscentAgent: + def new_agent(self): + def count_collisions(board): + count = 0 + queens = len(board) + for i in range(queens): + for j in range(i + 1, queens): + if board[i] == board[j] or abs(board[i] - board[j]) == j - i: + count += 1 + return count + + def check_actions(board, how_many): + queens = len(board) + dt = np.dtype([('count', int), ('state', int, (queens,))]) + d = np.empty([queens, queens], dtype=dt) + run = np.array(board) + for q in range(queens): + for i in range(queens): + run[q] = i + d[q, i] = (count_collisions(run), np.array(run)) + run[q] = board[q] + + ret = np.sort(d, axis=None, order='count') + return ret[:how_many] + + def program(state): + cols = count_collisions(state) + if cols == 0: + return "Success", state + else: + update = check_actions(state, 1)[0] + if update['count'] < cols: + # print("Returning ", update) + return "", update['state'] + else: + return "NoOp", state + + return program diff --git a/Queens/main.py b/Queens/main.py new file mode 100644 index 000000000..693c5d092 --- /dev/null +++ b/Queens/main.py @@ -0,0 +1,14 @@ +import numpy as np +from importlib import reload +from Environment import QueensEnv +from SteepestAscentAgent import SteepestAscentAgent + +queens = 8 +k = 8 + +agentGenerator = SteepestAscentAgent() +agent = agentGenerator.new_agent() +a2 = agentGenerator.new_agent() +env = QueensEnv([agent]) + +env.run(200) \ No newline at end of file From 6fbf0208a1f730950148eccb05c31be570b74631 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 00:00:24 +0000 Subject: [PATCH 17/34] SteepestAscent with stats module --- Queens/Environment.py | 34 +++++++++++++++++++++------------- Queens/Queens.ipynb | 2 +- Queens/SteepestAscentAgent.py | 7 +++---- Queens/main.py | 10 ++++++---- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index cdafed77e..7b91bab07 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -30,7 +30,6 @@ class QueensEnv: and performance measurement calls may be implemented. """ def __init__(self, agents, queens=8, master_agents=[]): assert isinstance(agents, list) - self.solutions = {} self.queens = queens self.tables = [Table(a, queens) for a in agents] self.master_agents = master_agents @@ -39,15 +38,11 @@ def __init__(self, agents, queens=8, master_agents=[]): def step(self): for t in self.tables: mes, new_state = t.agent(t.board) - if mes == "Success": + if isinstance(mes, str) and mes == "Success": self.stats.addWin(t) - # self.solutions.add(b) - print("Success!!!") - t.print_board() t.randomize_board(self.queens) - elif mes == "NoOp": + elif isinstance(mes, str) and mes == "NoOp": self.stats.addLoss(t) - print("No luck, reset.") t.randomize_board(self.queens) else: t.perf += 1 @@ -59,19 +54,32 @@ def step(self): def run(self, steps): for i in range(steps): self.step() + + def find_sol(self, how_many): + while len(self.stats.solutions) < how_many: + self.step() class StatsModule: """ Class to measure agent's performance. Should be called on every win and loss which occurs in the environment. """ def __init__(self, count): - pass + self.count = count + self.solutions = set() + self.win_times, self.loss_times = [], [] - def addWin(self, Table): - pass + def addWin(self, table): + self.win_times.append(table.perf) + if not tuple(table.board.tolist()) in self.solutions: + self.solutions.add(tuple(table.board.tolist())) + print(len(self.solutions)) - def addLoss(self, Table): - pass + def addLoss(self, table): + self.loss_times.append(table.perf) def printStats(self): - pass + total = len(self.win_times) + len(self.loss_times) + print("Found {} solutions".format(len(self.solutions))) + print("Win ratio:", len(self.win_times)/total) + print("Avg. win time:", np.average(self.win_times)) + print("Avg. loss time:", np.average(self.loss_times)) diff --git a/Queens/Queens.ipynb b/Queens/Queens.ipynb index aa3aaae46..7e106ee2b 100644 --- a/Queens/Queens.ipynb +++ b/Queens/Queens.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": true }, diff --git a/Queens/SteepestAscentAgent.py b/Queens/SteepestAscentAgent.py index 497a22efd..2edaed9d1 100644 --- a/Queens/SteepestAscentAgent.py +++ b/Queens/SteepestAscentAgent.py @@ -31,10 +31,9 @@ def program(state): if cols == 0: return "Success", state else: - update = check_actions(state, 1)[0] - if update['count'] < cols: - # print("Returning ", update) - return "", update['state'] + update = check_actions(state, 10) + if update['count'][0] < cols: + return update, update['state'][0] else: return "NoOp", state diff --git a/Queens/main.py b/Queens/main.py index 693c5d092..1f3bdc5f5 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,14 +1,16 @@ import numpy as np -from importlib import reload from Environment import QueensEnv from SteepestAscentAgent import SteepestAscentAgent -queens = 8 +queens = 9 k = 8 agentGenerator = SteepestAscentAgent() agent = agentGenerator.new_agent() a2 = agentGenerator.new_agent() -env = QueensEnv([agent]) +env = QueensEnv([agent], queens=queens) -env.run(200) \ No newline at end of file +env.find_sol(400) + +print(env.stats.solutions) +env.stats.printStats() From f7b191d35621f2d759261a1c9281af182cfa7476 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 00:29:50 +0000 Subject: [PATCH 18/34] PlateauExplorer --- Queens/Environment.py | 2 +- Queens/PlateauExplorerAgent.py | 50 ++++++++++++++++++++++++++++++++++ Queens/SteepestAscentAgent.py | 3 +- Queens/main.py | 22 +++++++++------ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 Queens/PlateauExplorerAgent.py diff --git a/Queens/Environment.py b/Queens/Environment.py index 7b91bab07..e411c3cdd 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -72,7 +72,7 @@ def addWin(self, table): self.win_times.append(table.perf) if not tuple(table.board.tolist()) in self.solutions: self.solutions.add(tuple(table.board.tolist())) - print(len(self.solutions)) + # print(len(self.solutions)) def addLoss(self, table): self.loss_times.append(table.perf) diff --git a/Queens/PlateauExplorerAgent.py b/Queens/PlateauExplorerAgent.py new file mode 100644 index 000000000..d6cdf5ed7 --- /dev/null +++ b/Queens/PlateauExplorerAgent.py @@ -0,0 +1,50 @@ +import numpy as np + + +class PlateauExplorerAgent: + @staticmethod + def new_agent(): + def count_collisions(board): + count = 0 + queens = len(board) + for i in range(queens): + for j in range(i + 1, queens): + if board[i] == board[j] or abs(board[i] - board[j]) == j - i: + count += 1 + return count + + def check_actions(board, how_many): + queens = len(board) + dt = np.dtype([('count', int), ('state', int, (queens,))]) + d = np.empty([queens, queens], dtype=dt) + run = np.array(board) + for q in range(queens): + for i in range(queens): + run[q] = i + d[q, i] = (count_collisions(run), np.array(run)) + run[q] = board[q] + + ret = np.sort(d, axis=None, order='count') + how_many = np.count_nonzero(ret['count'] == ret['count'][0]) + return ret[:how_many] + + def program(state): + cols = count_collisions(state) + if cols == 0: + return "Success", state + else: + update = check_actions(state, 10) + if update['count'][0] < cols: + program.plateau = None + return update, update['state'][0] + elif program.plateau is None: # we arrived to a plateau + program.plateau = update[1:] + return "Plateau", update['state'][0] + elif len(program.plateau) > 0: # there are options left to be explored + ans = program.plateau['state'][0] + program.plateau = program.plateau[1:] + return "Plateau", ans + else: # explored plateau, nowhere to go + return "NoOp", state + + return program diff --git a/Queens/SteepestAscentAgent.py b/Queens/SteepestAscentAgent.py index 2edaed9d1..05d6a6a11 100644 --- a/Queens/SteepestAscentAgent.py +++ b/Queens/SteepestAscentAgent.py @@ -2,7 +2,8 @@ class SteepestAscentAgent: - def new_agent(self): + @staticmethod + def new_agent(): def count_collisions(board): count = 0 queens = len(board) diff --git a/Queens/main.py b/Queens/main.py index 1f3bdc5f5..f76d10ff9 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,16 +1,22 @@ import numpy as np from Environment import QueensEnv +from PlateauExplorerAgent import PlateauExplorerAgent from SteepestAscentAgent import SteepestAscentAgent -queens = 9 +queens = 8 k = 8 -agentGenerator = SteepestAscentAgent() -agent = agentGenerator.new_agent() -a2 = agentGenerator.new_agent() -env = QueensEnv([agent], queens=queens) +plateauGenerator = PlateauExplorerAgent() +stepGenerator = SteepestAscentAgent() + +env = QueensEnv([plateauGenerator.new_agent()], queens=queens) +env2 = QueensEnv([stepGenerator.new_agent()], queens=queens) + +# env.find_sol(92) +sol_no = [] +for env in [env, env2]: + env.find(85) + # print(env.stats.solutions) + env.stats.printStats() -env.find_sol(400) -print(env.stats.solutions) -env.stats.printStats() From 70c9a47b4ed5355b09e9c7a96b57519d9490d097 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 12:55:16 +0000 Subject: [PATCH 19/34] Stats now operate agent-wise; added find_sol challenge --- Queens/Environment.py | 64 +++++++++++++++++++++++++++++-------------- Queens/main.py | 12 ++++---- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index e411c3cdd..1b9a662f4 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -33,16 +33,16 @@ def __init__(self, agents, queens=8, master_agents=[]): self.queens = queens self.tables = [Table(a, queens) for a in agents] self.master_agents = master_agents - self.stats = StatsModule(len(agents)) + self.stats = StatsModule(agents) def step(self): for t in self.tables: mes, new_state = t.agent(t.board) if isinstance(mes, str) and mes == "Success": - self.stats.addWin(t) + self.stats.add_win(t) t.randomize_board(self.queens) elif isinstance(mes, str) and mes == "NoOp": - self.stats.addLoss(t) + self.stats.add_loss(t) t.randomize_board(self.queens) else: t.perf += 1 @@ -56,30 +56,52 @@ def run(self, steps): self.step() def find_sol(self, how_many): - while len(self.stats.solutions) < how_many: + while True: self.step() + for t in self.tables: + if len(self.stats.solutions[t.agent]) >= how_many: + self.print_stats() + return + + def print_stats(self): + self.stats.print_stats(self.tables, self.queens) class StatsModule: """ Class to measure agent's performance. Should be called on every win and loss which occurs in the environment. """ - def __init__(self, count): - self.count = count - self.solutions = set() - self.win_times, self.loss_times = [], [] - - def addWin(self, table): - self.win_times.append(table.perf) + def __init__(self, agents): + self.count = len(agents) + self.solutions = dict([(k, set()) for k in agents]) + self.win_times = dict([(k,[]) for k in agents]) + self.loss_times = dict([(k, []) for k in agents]) + + def add_win(self, table): + self.win_times[table.agent].append(table.perf) if not tuple(table.board.tolist()) in self.solutions: - self.solutions.add(tuple(table.board.tolist())) - # print(len(self.solutions)) + self.solutions[table.agent].add(tuple(table.board.tolist())) - def addLoss(self, table): - self.loss_times.append(table.perf) + def add_loss(self, table): + self.loss_times[table.agent].append(table.perf) - def printStats(self): - total = len(self.win_times) + len(self.loss_times) - print("Found {} solutions".format(len(self.solutions))) - print("Win ratio:", len(self.win_times)/total) - print("Avg. win time:", np.average(self.win_times)) - print("Avg. loss time:", np.average(self.loss_times)) + def print_stats(self, tables, queens): + for t in tables: + print("Agent", t.agent) + self.print_table_stats(t) + + def print_table_stats(self, table): + win = len(self.win_times[table.agent]) + loss = len(self.loss_times[table.agent]) + print("Found {} solutions".format(len(self.solutions[table.agent]))) + if win + loss > 0: + print("Win ratio:", win/(win + loss)) + print("Avg. win time:", np.average(self.win_times[table.agent])) + print("Avg. loss time:", np.average(self.loss_times[table.agent])) + + + + + + + + \ No newline at end of file diff --git a/Queens/main.py b/Queens/main.py index f76d10ff9..30ff39fc9 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -9,14 +9,12 @@ plateauGenerator = PlateauExplorerAgent() stepGenerator = SteepestAscentAgent() -env = QueensEnv([plateauGenerator.new_agent()], queens=queens) -env2 = QueensEnv([stepGenerator.new_agent()], queens=queens) +env = QueensEnv( + [plateauGenerator.new_agent(), stepGenerator.new_agent()], + queens=queens) # env.find_sol(92) -sol_no = [] -for env in [env, env2]: - env.find(85) - # print(env.stats.solutions) - env.stats.printStats() +env.find_sol(80) +# print(env.stats.solutions) From 51491a61e70524dedf44f960bba67ebf56199724 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 13:08:39 +0000 Subject: [PATCH 20/34] Plateau Limit approach --- Queens/Environment.py | 2 +- Queens/PlateauExplorerAgent.py | 56 ++++++++++++++++++++++++++++++++++ Queens/main.py | 8 ++--- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index 1b9a662f4..6dc3c44f0 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -86,7 +86,7 @@ def add_loss(self, table): def print_stats(self, tables, queens): for t in tables: - print("Agent", t.agent) + print("Agent with limit", t.agent.threshold) self.print_table_stats(t) def print_table_stats(self, table): diff --git a/Queens/PlateauExplorerAgent.py b/Queens/PlateauExplorerAgent.py index d6cdf5ed7..75c02e78c 100644 --- a/Queens/PlateauExplorerAgent.py +++ b/Queens/PlateauExplorerAgent.py @@ -48,3 +48,59 @@ def program(state): return "NoOp", state return program + + +class PlateauLimitedAgent: + @staticmethod + def new_agent(threshold): + def count_collisions(board): + count = 0 + queens = len(board) + for i in range(queens): + for j in range(i + 1, queens): + if board[i] == board[j] or abs(board[i] - board[j]) == j - i: + count += 1 + return count + + def check_actions(board, how_many): + queens = len(board) + dt = np.dtype([('count', int), ('state', int, (queens,))]) + d = np.empty([queens, queens], dtype=dt) + run = np.array(board) + for q in range(queens): + for i in range(queens): + run[q] = i + d[q, i] = (count_collisions(run), np.array(run)) + run[q] = board[q] + + ret = np.sort(d, axis=None, order='count') + how_many = np.count_nonzero(ret['count'] == ret['count'][0]) + return ret[:how_many] + + def program(state): + program.threshold = threshold + cols = count_collisions(state) + if cols == 0: + return "Success", state + else: + update = check_actions(state, 10) + if update['count'][0] < cols: + program.plateau, program.count = None, 0 + return update, update['state'][0] + + elif program.plateau is None: # we arrived to a plateau + program.plateau = update[1:] + program.count += 1 + return "Plateau", update['state'][0] + + elif len(program.plateau) > 0 and program.count < threshold: # there are options left to + # be explored + ans = program.plateau['state'][0] + program.plateau = program.plateau[1:] + program.count += 1 + return "Plateau", ans + + else: # explored plateau or time over, nowhere to go + return "NoOp", state + + return program \ No newline at end of file diff --git a/Queens/main.py b/Queens/main.py index 30ff39fc9..3584b4758 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,20 +1,20 @@ import numpy as np from Environment import QueensEnv -from PlateauExplorerAgent import PlateauExplorerAgent +from PlateauExplorerAgent import PlateauExplorerAgent, PlateauLimitedAgent from SteepestAscentAgent import SteepestAscentAgent queens = 8 k = 8 -plateauGenerator = PlateauExplorerAgent() +plateauLimitedGenerator = PlateauLimitedAgent() stepGenerator = SteepestAscentAgent() env = QueensEnv( - [plateauGenerator.new_agent(), stepGenerator.new_agent()], + [PlateauLimitedAgent.new_agent(t) for t in range(1, k)], queens=queens) # env.find_sol(92) -env.find_sol(80) +env.find_sol(20) # print(env.stats.solutions) From 41d94c8fa860fced8800b0db56f22ca292c58a04 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 19:42:44 +0000 Subject: [PATCH 21/34] Reworked as generators --- Queens/Agents.py | 68 ++++++++++++++++++++++ Queens/Environment.py | 4 +- Queens/PlateauExplorerAgent.py | 103 --------------------------------- Queens/SteepestAscentAgent.py | 63 ++++++++------------ Queens/__init__.py | 0 Queens/main.py | 16 ++--- Queens/utility_measures.py | 25 ++++++++ 7 files changed, 128 insertions(+), 151 deletions(-) create mode 100644 Queens/Agents.py create mode 100644 Queens/__init__.py create mode 100644 Queens/utility_measures.py diff --git a/Queens/Agents.py b/Queens/Agents.py new file mode 100644 index 000000000..85aa1e0cc --- /dev/null +++ b/Queens/Agents.py @@ -0,0 +1,68 @@ +from utility_measures import * + +def steepestAscentAgent(): + state = yield + while True: + cols = count_collisions(state) + if cols == 0: + state = yield "Success", state + else: + update = check_actions(state) + if update['count'][0] < cols: + state = yield update, update['state'][0] + else: + state = yield "NoOp", state + + +def plateauExplorerGenerator(): + state = yield + plateau = None + while True: + cols = count_collisions(state) + if cols == 0: + state = yield "Success", state + else: + update = check_actions(state) + if update['count'][0] < cols: + plateau = None + state = yield update, update['state'][0] + elif plateau is None: # we arrived to a plateau + how_many = np.count_nonzero(update['count'] == update['count'][0]) + plateau = update[1:how_many] + state = yield "Plateau", update['state'][0] + + elif len(plateau) > 0: # there are options left to be explored + state = yield "Plateau", plateau['state'][0] + plateau = plateau[1:] + else: # explored plateau, nowhere to go + state = yield "NoOp", state + + +def plateauLimitedGenerator(threshold): + state = yield + plateau, count = None, 0 + while True: + cols = count_collisions(state) + if cols == 0: + state = yield "Success", state + else: + update = check_actions(state) + if update['count'][0] < cols: + plateau, count = None, 0 + state = yield update, update['state'][0] + + elif plateau is None: # we arrived to a plateau + how_many = np.count_nonzero(update['count'] == update['count'][0]) + plateau = update[1:how_many] + count += 1 + state = yield "Plateau", update['state'][0] + + elif len(plateau) > 0 and count < threshold: # there are options left to + # be explored + ans = plateau['state'][0] + plateau = plateau[1:] + count += 1 + state = yield "Plateau", ans + + else: # explored plateau or time over, nowhere to go + state = yield "NoOp", state diff --git a/Queens/Environment.py b/Queens/Environment.py index 6dc3c44f0..3353016c9 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -37,7 +37,7 @@ def __init__(self, agents, queens=8, master_agents=[]): def step(self): for t in self.tables: - mes, new_state = t.agent(t.board) + mes, new_state = t.agent.send(t.board) if isinstance(mes, str) and mes == "Success": self.stats.add_win(t) t.randomize_board(self.queens) @@ -86,7 +86,7 @@ def add_loss(self, table): def print_stats(self, tables, queens): for t in tables: - print("Agent with limit", t.agent.threshold) + # print("Agent with limit", t.agent.threshold) self.print_table_stats(t) def print_table_stats(self, table): diff --git a/Queens/PlateauExplorerAgent.py b/Queens/PlateauExplorerAgent.py index 75c02e78c..50872db24 100644 --- a/Queens/PlateauExplorerAgent.py +++ b/Queens/PlateauExplorerAgent.py @@ -1,106 +1,3 @@ import numpy as np -class PlateauExplorerAgent: - @staticmethod - def new_agent(): - def count_collisions(board): - count = 0 - queens = len(board) - for i in range(queens): - for j in range(i + 1, queens): - if board[i] == board[j] or abs(board[i] - board[j]) == j - i: - count += 1 - return count - - def check_actions(board, how_many): - queens = len(board) - dt = np.dtype([('count', int), ('state', int, (queens,))]) - d = np.empty([queens, queens], dtype=dt) - run = np.array(board) - for q in range(queens): - for i in range(queens): - run[q] = i - d[q, i] = (count_collisions(run), np.array(run)) - run[q] = board[q] - - ret = np.sort(d, axis=None, order='count') - how_many = np.count_nonzero(ret['count'] == ret['count'][0]) - return ret[:how_many] - - def program(state): - cols = count_collisions(state) - if cols == 0: - return "Success", state - else: - update = check_actions(state, 10) - if update['count'][0] < cols: - program.plateau = None - return update, update['state'][0] - elif program.plateau is None: # we arrived to a plateau - program.plateau = update[1:] - return "Plateau", update['state'][0] - elif len(program.plateau) > 0: # there are options left to be explored - ans = program.plateau['state'][0] - program.plateau = program.plateau[1:] - return "Plateau", ans - else: # explored plateau, nowhere to go - return "NoOp", state - - return program - - -class PlateauLimitedAgent: - @staticmethod - def new_agent(threshold): - def count_collisions(board): - count = 0 - queens = len(board) - for i in range(queens): - for j in range(i + 1, queens): - if board[i] == board[j] or abs(board[i] - board[j]) == j - i: - count += 1 - return count - - def check_actions(board, how_many): - queens = len(board) - dt = np.dtype([('count', int), ('state', int, (queens,))]) - d = np.empty([queens, queens], dtype=dt) - run = np.array(board) - for q in range(queens): - for i in range(queens): - run[q] = i - d[q, i] = (count_collisions(run), np.array(run)) - run[q] = board[q] - - ret = np.sort(d, axis=None, order='count') - how_many = np.count_nonzero(ret['count'] == ret['count'][0]) - return ret[:how_many] - - def program(state): - program.threshold = threshold - cols = count_collisions(state) - if cols == 0: - return "Success", state - else: - update = check_actions(state, 10) - if update['count'][0] < cols: - program.plateau, program.count = None, 0 - return update, update['state'][0] - - elif program.plateau is None: # we arrived to a plateau - program.plateau = update[1:] - program.count += 1 - return "Plateau", update['state'][0] - - elif len(program.plateau) > 0 and program.count < threshold: # there are options left to - # be explored - ans = program.plateau['state'][0] - program.plateau = program.plateau[1:] - program.count += 1 - return "Plateau", ans - - else: # explored plateau or time over, nowhere to go - return "NoOp", state - - return program \ No newline at end of file diff --git a/Queens/SteepestAscentAgent.py b/Queens/SteepestAscentAgent.py index 05d6a6a11..032097f94 100644 --- a/Queens/SteepestAscentAgent.py +++ b/Queens/SteepestAscentAgent.py @@ -1,41 +1,28 @@ import numpy as np -class SteepestAscentAgent: - @staticmethod - def new_agent(): - def count_collisions(board): - count = 0 - queens = len(board) - for i in range(queens): - for j in range(i + 1, queens): - if board[i] == board[j] or abs(board[i] - board[j]) == j - i: - count += 1 - return count - - def check_actions(board, how_many): - queens = len(board) - dt = np.dtype([('count', int), ('state', int, (queens,))]) - d = np.empty([queens, queens], dtype=dt) - run = np.array(board) - for q in range(queens): - for i in range(queens): - run[q] = i - d[q, i] = (count_collisions(run), np.array(run)) - run[q] = board[q] - - ret = np.sort(d, axis=None, order='count') - return ret[:how_many] - - def program(state): - cols = count_collisions(state) - if cols == 0: - return "Success", state - else: - update = check_actions(state, 10) - if update['count'][0] < cols: - return update, update['state'][0] - else: - return "NoOp", state - - return program +def count_collisions(board): + count = 0 + queens = len(board) + for i in range(queens): + for j in range(i + 1, queens): + if board[i] == board[j] or abs(board[i] - board[j]) == j - i: + count += 1 + return count + + +def check_actions(board): + queens = len(board) + dt = np.dtype([('count', int), ('state', int, (queens,))]) + d = np.empty([queens, queens], dtype=dt) + run = np.array(board) + for q in range(queens): + for i in range(queens): + run[q] = i + d[q, i] = (count_collisions(run), np.array(run)) + run[q] = board[q] + + ret = np.sort(d, axis=None, order='count') + return ret + + diff --git a/Queens/__init__.py b/Queens/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Queens/main.py b/Queens/main.py index 3584b4758..4792dba9e 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,17 +1,17 @@ -import numpy as np from Environment import QueensEnv -from PlateauExplorerAgent import PlateauExplorerAgent, PlateauLimitedAgent -from SteepestAscentAgent import SteepestAscentAgent +from Agents import * queens = 8 k = 8 -plateauLimitedGenerator = PlateauLimitedAgent() -stepGenerator = SteepestAscentAgent() +# plateauLimitedGenerator = PlateauLimitedAgent() +# stepGenerator = SteepestAscentAgent() +agents = [plateauLimitedGenerator(t) for t in range(k)] +for a in agents: a.send(None) -env = QueensEnv( - [PlateauLimitedAgent.new_agent(t) for t in range(1, k)], - queens=queens) +a = steepestAscentAgent() +a.send(None) +env = QueensEnv([a], queens=queens) # env.find_sol(92) env.find_sol(20) diff --git a/Queens/utility_measures.py b/Queens/utility_measures.py new file mode 100644 index 000000000..bce242f96 --- /dev/null +++ b/Queens/utility_measures.py @@ -0,0 +1,25 @@ +import numpy as np + +def count_collisions(board): + count = 0 + queens = len(board) + for i in range(queens): + for j in range(i + 1, queens): + if board[i] == board[j] or abs(board[i] - board[j]) == j - i: + count += 1 + return count + + +def check_actions(board): + queens = len(board) + dt = np.dtype([('count', int), ('state', int, (queens,))]) + d = np.empty([queens, queens], dtype=dt) + run = np.array(board) + for q in range(queens): + for i in range(queens): + run[q] = i + d[q, i] = (count_collisions(run), np.array(run)) + run[q] = board[q] + + ret = np.sort(d, axis=None, order='count') + return ret \ No newline at end of file From 7d009c526b2382f0be15dc73c94b406796118be5 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 20:07:13 +0000 Subject: [PATCH 22/34] Fixed imports, better stats formatting and table names --- Queens/Agents.py | 8 ++++---- Queens/Environment.py | 9 +++++---- Queens/PlateauExplorerAgent.py | 3 --- Queens/SteepestAscentAgent.py | 28 ---------------------------- Queens/main.py | 11 +++++------ 5 files changed, 14 insertions(+), 45 deletions(-) delete mode 100644 Queens/PlateauExplorerAgent.py delete mode 100644 Queens/SteepestAscentAgent.py diff --git a/Queens/Agents.py b/Queens/Agents.py index 85aa1e0cc..c3026b12b 100644 --- a/Queens/Agents.py +++ b/Queens/Agents.py @@ -1,7 +1,7 @@ -from utility_measures import * +from Queens.utility_measures import * def steepestAscentAgent(): - state = yield + state = yield "steepestAscentAgent" while True: cols = count_collisions(state) if cols == 0: @@ -15,7 +15,7 @@ def steepestAscentAgent(): def plateauExplorerGenerator(): - state = yield + state = yield "plateauExplorerGenerator" plateau = None while True: cols = count_collisions(state) @@ -39,7 +39,7 @@ def plateauExplorerGenerator(): def plateauLimitedGenerator(threshold): - state = yield + state = yield "Plateau limited to {}".format(threshold) plateau, count = None, 0 while True: cols = count_collisions(state) diff --git a/Queens/Environment.py b/Queens/Environment.py index 3353016c9..edc55d2ea 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -9,6 +9,7 @@ def __init__(self, agent, queens): self.perf = 0 self.board = self.randomize_board(queens) self.agent = agent + self.name = agent.send(None) def randomize_board(self, queens): self.board = np.random.randint(0, queens - 1, queens) @@ -85,18 +86,18 @@ def add_loss(self, table): self.loss_times[table.agent].append(table.perf) def print_stats(self, tables, queens): - for t in tables: - # print("Agent with limit", t.agent.threshold) + for t in sorted(tables, key=lambda t: len(self.solutions[t.agent]), reverse=True): self.print_table_stats(t) def print_table_stats(self, table): win = len(self.win_times[table.agent]) loss = len(self.loss_times[table.agent]) - print("Found {} solutions".format(len(self.solutions[table.agent]))) + print("Agent {} found {} solutions".format(table.name, len(self.solutions[table.agent]))) if win + loss > 0: print("Win ratio:", win/(win + loss)) - print("Avg. win time:", np.average(self.win_times[table.agent])) + print("Avg. win time:", np.mean(self.win_times[table.agent])) print("Avg. loss time:", np.average(self.loss_times[table.agent])) + print() diff --git a/Queens/PlateauExplorerAgent.py b/Queens/PlateauExplorerAgent.py deleted file mode 100644 index 50872db24..000000000 --- a/Queens/PlateauExplorerAgent.py +++ /dev/null @@ -1,3 +0,0 @@ -import numpy as np - - diff --git a/Queens/SteepestAscentAgent.py b/Queens/SteepestAscentAgent.py deleted file mode 100644 index 032097f94..000000000 --- a/Queens/SteepestAscentAgent.py +++ /dev/null @@ -1,28 +0,0 @@ -import numpy as np - - -def count_collisions(board): - count = 0 - queens = len(board) - for i in range(queens): - for j in range(i + 1, queens): - if board[i] == board[j] or abs(board[i] - board[j]) == j - i: - count += 1 - return count - - -def check_actions(board): - queens = len(board) - dt = np.dtype([('count', int), ('state', int, (queens,))]) - d = np.empty([queens, queens], dtype=dt) - run = np.array(board) - for q in range(queens): - for i in range(queens): - run[q] = i - d[q, i] = (count_collisions(run), np.array(run)) - run[q] = board[q] - - ret = np.sort(d, axis=None, order='count') - return ret - - diff --git a/Queens/main.py b/Queens/main.py index 4792dba9e..e0a734b75 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,20 +1,19 @@ -from Environment import QueensEnv -from Agents import * +from Queens.Environment import QueensEnv +from Queens.Agents import * -queens = 8 +queens = 16 k = 8 # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() agents = [plateauLimitedGenerator(t) for t in range(k)] -for a in agents: a.send(None) a = steepestAscentAgent() a.send(None) -env = QueensEnv([a], queens=queens) +env = QueensEnv(agents, queens=queens) # env.find_sol(92) -env.find_sol(20) +env.find_sol(10) # print(env.stats.solutions) From c8f75531fb1d02559eda4970739f60092b455de8 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sat, 13 Jan 2018 20:15:16 +0000 Subject: [PATCH 23/34] Catched empty list average warning --- Queens/Environment.py | 8 +++++--- Queens/main.py | 6 ++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index edc55d2ea..c4cd71cef 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -1,5 +1,5 @@ import numpy as np - +import warnings class Table: """ Simple storage class for single agent and it's board. Provides plotting utilities but does not @@ -87,7 +87,9 @@ def add_loss(self, table): def print_stats(self, tables, queens): for t in sorted(tables, key=lambda t: len(self.solutions[t.agent]), reverse=True): - self.print_table_stats(t) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=RuntimeWarning) + self.print_table_stats(t) def print_table_stats(self, table): win = len(self.win_times[table.agent]) @@ -96,7 +98,7 @@ def print_table_stats(self, table): if win + loss > 0: print("Win ratio:", win/(win + loss)) print("Avg. win time:", np.mean(self.win_times[table.agent])) - print("Avg. loss time:", np.average(self.loss_times[table.agent])) + print("Avg. loss time:", np.mean(self.loss_times[table.agent])) print() diff --git a/Queens/main.py b/Queens/main.py index e0a734b75..2278d3d36 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,7 +1,7 @@ from Queens.Environment import QueensEnv from Queens.Agents import * -queens = 16 +queens = 8 k = 8 # plateauLimitedGenerator = PlateauLimitedAgent() @@ -13,7 +13,5 @@ env = QueensEnv(agents, queens=queens) # env.find_sol(92) -env.find_sol(10) +env.find_sol(2) # print(env.stats.solutions) - - From 07d7a64e80bddaaad6c5c48bf1e875c4b1f54060 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 11:54:26 +0000 Subject: [PATCH 24/34] Total steps counter --- Queens/Agents.py | 2 +- Queens/Environment.py | 3 +++ Queens/main.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Queens/Agents.py b/Queens/Agents.py index c3026b12b..8d2434bd6 100644 --- a/Queens/Agents.py +++ b/Queens/Agents.py @@ -39,7 +39,7 @@ def plateauExplorerGenerator(): def plateauLimitedGenerator(threshold): - state = yield "Plateau limited to {}".format(threshold) + state = yield "PlateauLimited, max={}".format(threshold) plateau, count = None, 0 while True: cols = count_collisions(state) diff --git a/Queens/Environment.py b/Queens/Environment.py index c4cd71cef..4cecee29a 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -35,6 +35,7 @@ def __init__(self, agents, queens=8, master_agents=[]): self.tables = [Table(a, queens) for a in agents] self.master_agents = master_agents self.stats = StatsModule(agents) + self.steps = 0 def step(self): for t in self.tables: @@ -48,6 +49,7 @@ def step(self): else: t.perf += 1 t.board = new_state + self.steps += 1 for su in self.master_agents: pass @@ -65,6 +67,7 @@ def find_sol(self, how_many): return def print_stats(self): + print("Total steps:", self.steps) self.stats.print_stats(self.tables, self.queens) diff --git a/Queens/main.py b/Queens/main.py index 2278d3d36..3af721df5 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -13,5 +13,5 @@ env = QueensEnv(agents, queens=queens) # env.find_sol(92) -env.find_sol(2) +env.find_sol(20) # print(env.stats.solutions) From c05bd9e364e54194886bbbf96ef7e6cc43bde5f4 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 13:05:41 +0000 Subject: [PATCH 25/34] Beam search - implemented super agent --- Queens/Agents.py | 19 ++++++++++++++++++- Queens/Environment.py | 14 ++++++++------ Queens/main.py | 12 +++++------- Queens/utility_measures.py | 8 ++++++-- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Queens/Agents.py b/Queens/Agents.py index 8d2434bd6..eb9f6a1a5 100644 --- a/Queens/Agents.py +++ b/Queens/Agents.py @@ -9,7 +9,7 @@ def steepestAscentAgent(): else: update = check_actions(state) if update['count'][0] < cols: - state = yield update, update['state'][0] + state = yield update[:len(state)], update['state'][0] else: state = yield "NoOp", state @@ -66,3 +66,20 @@ def plateauLimitedGenerator(threshold): else: # explored plateau or time over, nowhere to go state = yield "NoOp", state + + +def masterBeamGenerator(queens): + tables = yield "Master Beam Generator" + k = len(tables) + while True: + av = np.empty(0, dtype=dt(queens)) + for t in tables: + if not isinstance(t.message, str): + av = np.unique(np.concatenate((av[:k], t.message))) + av.sort(kind='mergesort') + t.message = None + + for t, s in zip(tables, av): + if not isinstance(t.message, str): + t.state = s['state'] + tables = yield diff --git a/Queens/Environment.py b/Queens/Environment.py index 4cecee29a..4a5adf5d4 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -10,6 +10,7 @@ def __init__(self, agent, queens): self.board = self.randomize_board(queens) self.agent = agent self.name = agent.send(None) + self.message = "" def randomize_board(self, queens): self.board = np.random.randint(0, queens - 1, queens) @@ -31,19 +32,20 @@ class QueensEnv: and performance measurement calls may be implemented. """ def __init__(self, agents, queens=8, master_agents=[]): assert isinstance(agents, list) + assert isinstance(master_agents, list) self.queens = queens self.tables = [Table(a, queens) for a in agents] - self.master_agents = master_agents + self.master_agents = [Table(a, queens) for a in master_agents] self.stats = StatsModule(agents) self.steps = 0 def step(self): for t in self.tables: - mes, new_state = t.agent.send(t.board) - if isinstance(mes, str) and mes == "Success": + t.message, new_state = t.agent.send(t.board) + if isinstance(t.message, str) and t.message == "Success": self.stats.add_win(t) t.randomize_board(self.queens) - elif isinstance(mes, str) and mes == "NoOp": + elif isinstance(t.message, str) and t.message == "NoOp": self.stats.add_loss(t) t.randomize_board(self.queens) else: @@ -52,8 +54,8 @@ def step(self): self.steps += 1 for su in self.master_agents: - pass - + su.agent.send(self.tables) + def run(self, steps): for i in range(steps): self.step() diff --git a/Queens/main.py b/Queens/main.py index 3af721df5..110d3559d 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -6,12 +6,10 @@ # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() -agents = [plateauLimitedGenerator(t) for t in range(k)] +agents = [steepestAscentAgent() for t in range(k)] +masters = [masterBeamGenerator(queens)] +env = QueensEnv(agents, master_agents=masters, queens=queens) -a = steepestAscentAgent() -a.send(None) -env = QueensEnv(agents, queens=queens) - -# env.find_sol(92) -env.find_sol(20) +env.run(200) +env.print_stats() # print(env.stats.solutions) diff --git a/Queens/utility_measures.py b/Queens/utility_measures.py index bce242f96..25bae195b 100644 --- a/Queens/utility_measures.py +++ b/Queens/utility_measures.py @@ -1,5 +1,10 @@ import numpy as np + +def dt(queens): + return np.dtype([('count', int), ('state', int, (queens,))]) + + def count_collisions(board): count = 0 queens = len(board) @@ -12,8 +17,7 @@ def count_collisions(board): def check_actions(board): queens = len(board) - dt = np.dtype([('count', int), ('state', int, (queens,))]) - d = np.empty([queens, queens], dtype=dt) + d = np.empty([queens, queens], dtype=dt(queens)) run = np.array(board) for q in range(queens): for i in range(queens): From 074375344d9a8a5b3def890219c410184b39e9c7 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 13:46:16 +0000 Subject: [PATCH 26/34] Stats printout for beam search --- Queens/Environment.py | 86 ++++--------------------------------------- Queens/Stats.py | 56 ++++++++++++++++++++++++++++ Queens/Table.py | 29 +++++++++++++++ Queens/main.py | 8 ++-- 4 files changed, 97 insertions(+), 82 deletions(-) create mode 100644 Queens/Stats.py create mode 100644 Queens/Table.py diff --git a/Queens/Environment.py b/Queens/Environment.py index 4a5adf5d4..a7a121140 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -1,43 +1,16 @@ -import numpy as np -import warnings -class Table: - """ - Simple storage class for single agent and it's board. Provides plotting utilities but does not - tackle actions or agent messages. Also stores performance measure and random board generator. - """ - def __init__(self, agent, queens): - self.perf = 0 - self.board = self.randomize_board(queens) - self.agent = agent - self.name = agent.send(None) - self.message = "" - - def randomize_board(self, queens): - self.board = np.random.randint(0, queens - 1, queens) - self.perf = 0 - return self.board - - def plot_board(self): - print("--" * (len(self.board) + 2)) - for row in self.board: - print(str(row) + " " + " " * row + "x") - print("--" * (len(self.board) + 2)) - - def print_board(self): - print(self.board.tolist()) +from Queens.Table import Table +from Queens.Stats import StatsModule class QueensEnv: """ Environment for all agents and boards. Here steps are evaluated, found solutions stored and performance measurement calls may be implemented. """ - def __init__(self, agents, queens=8, master_agents=[]): + def __init__(self, agents, queens=8, master=None): assert isinstance(agents, list) - assert isinstance(master_agents, list) self.queens = queens self.tables = [Table(a, queens) for a in agents] - self.master_agents = [Table(a, queens) for a in master_agents] - self.stats = StatsModule(agents) - self.steps = 0 + self.master = [] if master is None else [Table(master, queens)] + self.stats = StatsModule(agents, self.master[0]) def step(self): for t in self.tables: @@ -51,9 +24,9 @@ def step(self): else: t.perf += 1 t.board = new_state - self.steps += 1 + self.stats.steps += 1 - for su in self.master_agents: + for su in self.master: su.agent.send(self.tables) def run(self, steps): @@ -69,47 +42,4 @@ def find_sol(self, how_many): return def print_stats(self): - print("Total steps:", self.steps) - self.stats.print_stats(self.tables, self.queens) - - -class StatsModule: - """ Class to measure agent's performance. Should be called on every win and loss which occurs - in the environment. """ - def __init__(self, agents): - self.count = len(agents) - self.solutions = dict([(k, set()) for k in agents]) - self.win_times = dict([(k,[]) for k in agents]) - self.loss_times = dict([(k, []) for k in agents]) - - def add_win(self, table): - self.win_times[table.agent].append(table.perf) - if not tuple(table.board.tolist()) in self.solutions: - self.solutions[table.agent].add(tuple(table.board.tolist())) - - def add_loss(self, table): - self.loss_times[table.agent].append(table.perf) - - def print_stats(self, tables, queens): - for t in sorted(tables, key=lambda t: len(self.solutions[t.agent]), reverse=True): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=RuntimeWarning) - self.print_table_stats(t) - - def print_table_stats(self, table): - win = len(self.win_times[table.agent]) - loss = len(self.loss_times[table.agent]) - print("Agent {} found {} solutions".format(table.name, len(self.solutions[table.agent]))) - if win + loss > 0: - print("Win ratio:", win/(win + loss)) - print("Avg. win time:", np.mean(self.win_times[table.agent])) - print("Avg. loss time:", np.mean(self.loss_times[table.agent])) - print() - - - - - - - - \ No newline at end of file + self.stats.print_stats(self.tables) diff --git a/Queens/Stats.py b/Queens/Stats.py new file mode 100644 index 000000000..89e59beb4 --- /dev/null +++ b/Queens/Stats.py @@ -0,0 +1,56 @@ +import numpy as np +import warnings + + +class StatsModule: + """ Class to measure agent's performance. Should be called on every win and loss which occurs + in the environment. """ + + def __init__(self, agents, master): + self.master_tab = master + self.count = len(agents) + self.solutions = dict([(k, set()) for k in agents]) + self.win_times = dict([(k, []) for k in agents]) + self.loss_times = dict([(k, []) for k in agents]) + self.steps = 0 + + def add_win(self, table): + self.win_times[table.agent].append(table.perf) + if not tuple(table.board.tolist()) in self.solutions: + self.solutions[table.agent].add(tuple(table.board.tolist())) + + def add_loss(self, table): + self.loss_times[table.agent].append(table.perf) + + def print_stats(self, tables): + print("\nTotal steps:", self.steps) + print() + # master stats go first + + sols = set().union(*self.solutions.values()) + ticks = sum([t.perf for t in tables]) + for win in self.win_times.values(): + ticks += sum(win) + for loss in self.loss_times.values(): + ticks += sum(loss) + print("Total ticks taken:", ticks); + print("{} found {} solutions using {} threads\n" + .format(self.master_tab.name, len(sols), len(tables))) + print() + + # table stats + + for t in sorted(tables, key=lambda tab: len(self.solutions[tab.agent]), reverse=True): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=RuntimeWarning) + self.print_table_stats(t) + + def print_table_stats(self, table): + win = len(self.win_times[table.agent]) + loss = len(self.loss_times[table.agent]) + print("Agent {} found {} solutions".format(table.name, len(self.solutions[table.agent]))) + if win + loss > 0: + print("Win ratio:", win / (win + loss)) + print("Avg. win time:", np.mean(self.win_times[table.agent])) + print("Avg. loss time:", np.mean(self.loss_times[table.agent])) + print() diff --git a/Queens/Table.py b/Queens/Table.py new file mode 100644 index 000000000..d1ace017b --- /dev/null +++ b/Queens/Table.py @@ -0,0 +1,29 @@ +import numpy as np + + +class Table: + """ + Simple storage class for single agent and it's board. Provides plotting utilities but does not + tackle actions or agent messages. Also stores performance measure and random board generator. + """ + + def __init__(self, agent, queens): + self.perf = 0 + self.board = self.randomize_board(queens) + self.agent = agent + self.name = agent.send(None) + self.message = "" + + def randomize_board(self, queens): + self.board = np.random.randint(0, queens - 1, queens) + self.perf = 0 + return self.board + + def plot_board(self): + print("--" * (len(self.board) + 2)) + for row in self.board: + print(str(row) + " " + " " * row + "x") + print("--" * (len(self.board) + 2)) + + def print_board(self): + print(self.board.tolist()) diff --git a/Queens/main.py b/Queens/main.py index 110d3559d..e4f1feb29 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -2,14 +2,14 @@ from Queens.Agents import * queens = 8 -k = 8 +k = 4 # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() agents = [steepestAscentAgent() for t in range(k)] -masters = [masterBeamGenerator(queens)] -env = QueensEnv(agents, master_agents=masters, queens=queens) +master = masterBeamGenerator(queens) +env = QueensEnv(agents, master=master, queens=queens) -env.run(200) +env.run(400) env.print_stats() # print(env.stats.solutions) From 071863a4a8d783b879ec83b25a91dcec09f534b2 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 18:59:30 +0000 Subject: [PATCH 27/34] Some comments added --- Queens/Environment.py | 27 +++++++++++++++++---- Queens/Stats.py | 55 ++++++++++++++++++++++++++----------------- Queens/main.py | 6 +++-- 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index a7a121140..d07b04270 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -3,20 +3,28 @@ class QueensEnv: - """ Environment for all agents and boards. Here steps are evaluated, found solutions stored - and performance measurement calls may be implemented. """ + + """Environment for all agents and boards. Here steps are evaluated + and performance measurement calls occur. + - agents - list of generators taking state and returning their move each step + - master - optional master agent which can read everybody's messages and then arbitrarily + change state of the tables. It is meant to be 'main thread' in multi thread algorithms like + beam search""" def __init__(self, agents, queens=8, master=None): assert isinstance(agents, list) self.queens = queens self.tables = [Table(a, queens) for a in agents] self.master = [] if master is None else [Table(master, queens)] self.stats = StatsModule(agents, self.master[0]) + self.sol_count = 0 def step(self): + """ This is a single iteration of search. Every agent returns message and new state. + Then the master agent is called""" for t in self.tables: t.message, new_state = t.agent.send(t.board) if isinstance(t.message, str) and t.message == "Success": - self.stats.add_win(t) + self.sol_count += self.stats.add_win(t) t.randomize_board(self.queens) elif isinstance(t.message, str) and t.message == "NoOp": self.stats.add_loss(t) @@ -30,16 +38,27 @@ def step(self): su.agent.send(self.tables) def run(self, steps): + """Shorthand to run multiple steps""" for i in range(steps): self.step() - + def find_sol(self, how_many): + """Run until specified amount of distinct solutions is found by one of agents. May be + used to compare performance in terms of steps/ticks""" while True: self.step() for t in self.tables: if len(self.stats.solutions[t.agent]) >= how_many: self.print_stats() return + + def find_sol_master(self, how_many): + """The same as above but all found solutions are on account of master agent""" + while True: + self.step() + if self.sol_count >= how_many: + self.print_stats() + return def print_stats(self): self.stats.print_stats(self.tables) diff --git a/Queens/Stats.py b/Queens/Stats.py index 89e59beb4..62a299c7d 100644 --- a/Queens/Stats.py +++ b/Queens/Stats.py @@ -4,47 +4,41 @@ class StatsModule: """ Class to measure agent's performance. Should be called on every win and loss which occurs - in the environment. """ + in the environment. Counts: + - ticks - how many times agents change state + - win and loss times - how many moves before Success/NoOp + - solutions - set of distinct solutions found by each agent + """ def __init__(self, agents, master): self.master_tab = master self.count = len(agents) self.solutions = dict([(k, set()) for k in agents]) + self.solutions[master.agent] = set() self.win_times = dict([(k, []) for k in agents]) self.loss_times = dict([(k, []) for k in agents]) - self.steps = 0 - - def add_win(self, table): - self.win_times[table.agent].append(table.perf) - if not tuple(table.board.tolist()) in self.solutions: - self.solutions[table.agent].add(tuple(table.board.tolist())) - - def add_loss(self, table): - self.loss_times[table.agent].append(table.perf) - + self.steps, self.ticks = 0, 0 + def print_stats(self, tables): + """Main method to be called when testing is finished""" print("\nTotal steps:", self.steps) print() # master stats go first + self.ticks += sum([t.perf for t in tables]) - sols = set().union(*self.solutions.values()) - ticks = sum([t.perf for t in tables]) - for win in self.win_times.values(): - ticks += sum(win) - for loss in self.loss_times.values(): - ticks += sum(loss) - print("Total ticks taken:", ticks); + print("Total ticks taken:", self.ticks) print("{} found {} solutions using {} threads\n" - .format(self.master_tab.name, len(sols), len(tables))) + .format(self.master_tab.name, len(self.solutions[self.master_tab.agent]), + len(tables))) print() # table stats - + for t in sorted(tables, key=lambda tab: len(self.solutions[tab.agent]), reverse=True): with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) self.print_table_stats(t) - + def print_table_stats(self, table): win = len(self.win_times[table.agent]) loss = len(self.loss_times[table.agent]) @@ -54,3 +48,22 @@ def print_table_stats(self, table): print("Avg. win time:", np.mean(self.win_times[table.agent])) print("Avg. loss time:", np.mean(self.loss_times[table.agent])) print() + + def add_win(self, table): + """Called when agent reports winning combination as it's state. Returns the number of new + solutions.""" + self.ticks += table.perf + self.win_times[table.agent].append(table.perf) + if not tuple(table.board.tolist()) in self.solutions: + self.solutions[table.agent].add(tuple(table.board.tolist())) + self.solutions[self.master_tab.agent] \ + .add((tuple(table.board.tolist()))) + return 1 + self.ticks += table.perf + return 0 + + def add_loss(self, table): + """Called when agent takes no further action""" + self.loss_times[table.agent].append(table.perf) + self.ticks += table.perf + diff --git a/Queens/main.py b/Queens/main.py index e4f1feb29..2bc3f9bac 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -10,6 +10,8 @@ master = masterBeamGenerator(queens) env = QueensEnv(agents, master=master, queens=queens) -env.run(400) -env.print_stats() + +env.find_sol_master(40) +# env.run(400) +# env.print_stats() # print(env.stats.solutions) From e5c4a1b8b5d390516696842d4f6cbceb301dedf2 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 21:14:33 +0000 Subject: [PATCH 28/34] Bugfixes to handle master=None; comments added --- Queens/Agents.py | 2 ++ Queens/Environment.py | 18 ++++++++---------- Queens/Stats.py | 19 ++++++++++++------- Queens/main.py | 3 ++- Queens/utility_measures.py | 4 ++++ 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Queens/Agents.py b/Queens/Agents.py index eb9f6a1a5..978d9753f 100644 --- a/Queens/Agents.py +++ b/Queens/Agents.py @@ -1,8 +1,10 @@ from Queens.utility_measures import * + def steepestAscentAgent(): state = yield "steepestAscentAgent" while True: + # yield "Success", np.arange(0, 7, 1, dtype=int) cols = count_collisions(state) if cols == 0: state = yield "Success", state diff --git a/Queens/Environment.py b/Queens/Environment.py index d07b04270..267083f24 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -14,9 +14,9 @@ def __init__(self, agents, queens=8, master=None): assert isinstance(agents, list) self.queens = queens self.tables = [Table(a, queens) for a in agents] - self.master = [] if master is None else [Table(master, queens)] - self.stats = StatsModule(agents, self.master[0]) - self.sol_count = 0 + if master: + self.master = Table(master, queens) + self.stats = StatsModule(agents, self.master) def step(self): """ This is a single iteration of search. Every agent returns message and new state. @@ -24,7 +24,7 @@ def step(self): for t in self.tables: t.message, new_state = t.agent.send(t.board) if isinstance(t.message, str) and t.message == "Success": - self.sol_count += self.stats.add_win(t) + self.stats.add_win(t) t.randomize_board(self.queens) elif isinstance(t.message, str) and t.message == "NoOp": self.stats.add_loss(t) @@ -34,8 +34,8 @@ def step(self): t.board = new_state self.stats.steps += 1 - for su in self.master: - su.agent.send(self.tables) + if self.master: + self.master.agent.send(self.tables) def run(self, steps): """Shorthand to run multiple steps""" @@ -54,11 +54,9 @@ def find_sol(self, how_many): def find_sol_master(self, how_many): """The same as above but all found solutions are on account of master agent""" - while True: + while len(self.stats.solutions[self.master.agent]) < how_many: self.step() - if self.sol_count >= how_many: - self.print_stats() - return + self.print_stats() def print_stats(self): self.stats.print_stats(self.tables) diff --git a/Queens/Stats.py b/Queens/Stats.py index 62a299c7d..3e2e50cd8 100644 --- a/Queens/Stats.py +++ b/Queens/Stats.py @@ -10,11 +10,14 @@ class StatsModule: - solutions - set of distinct solutions found by each agent """ - def __init__(self, agents, master): - self.master_tab = master + def __init__(self, agents, master=None): self.count = len(agents) self.solutions = dict([(k, set()) for k in agents]) - self.solutions[master.agent] = set() + if master: + self.master = master + self.solutions[master.agent] = set() + else: + self.master = None self.win_times = dict([(k, []) for k in agents]) self.loss_times = dict([(k, []) for k in agents]) self.steps, self.ticks = 0, 0 @@ -27,9 +30,10 @@ def print_stats(self, tables): self.ticks += sum([t.perf for t in tables]) print("Total ticks taken:", self.ticks) - print("{} found {} solutions using {} threads\n" - .format(self.master_tab.name, len(self.solutions[self.master_tab.agent]), - len(tables))) + if self.master: + print("{} found {} solutions using {} threads\n" + .format(self.master.name, len(self.solutions[self.master.agent]), + len(tables))) print() # table stats @@ -56,7 +60,8 @@ def add_win(self, table): self.win_times[table.agent].append(table.perf) if not tuple(table.board.tolist()) in self.solutions: self.solutions[table.agent].add(tuple(table.board.tolist())) - self.solutions[self.master_tab.agent] \ + if self.master: + self.solutions[self.master.agent] \ .add((tuple(table.board.tolist()))) return 1 self.ticks += table.perf diff --git a/Queens/main.py b/Queens/main.py index 2bc3f9bac..6764161cd 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -6,12 +6,13 @@ # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() -agents = [steepestAscentAgent() for t in range(k)] +agents = [steepestAscentAgent() for t in range(2)] master = masterBeamGenerator(queens) env = QueensEnv(agents, master=master, queens=queens) env.find_sol_master(40) +# env.find_sol(10) # env.run(400) # env.print_stats() # print(env.stats.solutions) diff --git a/Queens/utility_measures.py b/Queens/utility_measures.py index 25bae195b..926b04999 100644 --- a/Queens/utility_measures.py +++ b/Queens/utility_measures.py @@ -2,10 +2,12 @@ def dt(queens): + """numpy data type used to store (collision count, board state) pair""" return np.dtype([('count', int), ('state', int, (queens,))]) def count_collisions(board): + """Count how many pairs of queens are checking each other""" count = 0 queens = len(board) for i in range(queens): @@ -16,6 +18,8 @@ def count_collisions(board): def check_actions(board): + """What are the values of utility function for all possible moves? This function expands the + given node and returns list of it's descendants sorted by utility""" queens = len(board) d = np.empty([queens, queens], dtype=dt(queens)) run = np.array(board) From e86d54c573bd49999a330b3a1027a720d362dad1 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 21:55:55 +0000 Subject: [PATCH 29/34] Added progress bar interface --- Queens/Environment.py | 22 +++++++++++++++------- Queens/main.py | 4 ++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Queens/Environment.py b/Queens/Environment.py index 267083f24..1160c637d 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -41,22 +41,30 @@ def run(self, steps): """Shorthand to run multiple steps""" for i in range(steps): self.step() + progress_bar(i, steps, "steps done.") def find_sol(self, how_many): """Run until specified amount of distinct solutions is found by one of agents. May be used to compare performance in terms of steps/ticks""" - while True: + max_found = 0 + while max_found < how_many: self.step() - for t in self.tables: - if len(self.stats.solutions[t.agent]) >= how_many: - self.print_stats() - return - + max_found = max(self.stats.solutions.values()) + progress_bar(max_found, how_many, "solutions found") + self.print_stats() + def find_sol_master(self, how_many): """The same as above but all found solutions are on account of master agent""" - while len(self.stats.solutions[self.master.agent]) < how_many: + found = 0 + while found < how_many: self.step() + found = len(self.stats.solutions[self.master.agent]) + progress_bar(found, how_many, "solutions found by master") self.print_stats() def print_stats(self): self.stats.print_stats(self.tables) + + +def progress_bar(current, total, what): + print('\r', current, "out of", total, what, end="", flush=True) diff --git a/Queens/main.py b/Queens/main.py index 6764161cd..331636aad 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -6,12 +6,12 @@ # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() -agents = [steepestAscentAgent() for t in range(2)] +agents = [steepestAscentAgent() for t in range(4)] master = masterBeamGenerator(queens) env = QueensEnv(agents, master=master, queens=queens) -env.find_sol_master(40) +env.find_sol_master(82) # env.find_sol(10) # env.run(400) # env.print_stats() From 504a695a4c925804273fdee2401e295a07989a61 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Mon, 15 Jan 2018 23:06:26 +0000 Subject: [PATCH 30/34] Plotting utility --- Queens/Stats.py | 16 +++++++++++++++- Queens/main.py | 4 ++-- Queens/plots/08board04752613.png | Bin 0 -> 447 bytes Queens/plots/08board05726314.png | Bin 0 -> 447 bytes Queens/plots/08board06357142.png | Bin 0 -> 443 bytes Queens/plots/08board13572064.png | Bin 0 -> 441 bytes Queens/plots/08board14630752.png | Bin 0 -> 444 bytes Queens/plots/08board15063724.png | Bin 0 -> 444 bytes Queens/plots/08board15720364.png | Bin 0 -> 446 bytes Queens/plots/08board16257403.png | Bin 0 -> 447 bytes Queens/plots/08board16470352.png | Bin 0 -> 446 bytes Queens/plots/08board20647135.png | Bin 0 -> 441 bytes Queens/plots/08board24175360.png | Bin 0 -> 443 bytes Queens/plots/08board24603175.png | Bin 0 -> 441 bytes Queens/plots/08board24730615.png | Bin 0 -> 445 bytes Queens/plots/08board25147063.png | Bin 0 -> 444 bytes Queens/plots/08board25160374.png | Bin 0 -> 446 bytes Queens/plots/08board25164073.png | Bin 0 -> 443 bytes Queens/plots/08board25307461.png | Bin 0 -> 445 bytes Queens/plots/08board25317460.png | Bin 0 -> 442 bytes Queens/plots/08board25703641.png | Bin 0 -> 445 bytes Queens/plots/08board25704613.png | Bin 0 -> 443 bytes Queens/plots/08board25713064.png | Bin 0 -> 445 bytes Queens/plots/08board26174035.png | Bin 0 -> 445 bytes Queens/plots/08board26175304.png | Bin 0 -> 443 bytes Queens/plots/08board27360514.png | Bin 0 -> 443 bytes Queens/plots/08board30471625.png | Bin 0 -> 445 bytes Queens/plots/08board30475261.png | Bin 0 -> 446 bytes Queens/plots/08board31475026.png | Bin 0 -> 444 bytes Queens/plots/08board31625704.png | Bin 0 -> 446 bytes Queens/plots/08board31625740.png | Bin 0 -> 447 bytes Queens/plots/08board31640752.png | Bin 0 -> 441 bytes Queens/plots/08board31746025.png | Bin 0 -> 441 bytes Queens/plots/08board31750246.png | Bin 0 -> 437 bytes Queens/plots/08board35041726.png | Bin 0 -> 448 bytes Queens/plots/08board35716024.png | Bin 0 -> 441 bytes Queens/plots/08board35720641.png | Bin 0 -> 443 bytes Queens/plots/08board36074152.png | Bin 0 -> 443 bytes Queens/plots/08board36271405.png | Bin 0 -> 444 bytes Queens/plots/08board36415027.png | Bin 0 -> 448 bytes Queens/plots/08board36420571.png | Bin 0 -> 447 bytes Queens/plots/08board37420615.png | Bin 0 -> 446 bytes Queens/plots/08board40357162.png | Bin 0 -> 442 bytes Queens/plots/08board40731625.png | Bin 0 -> 442 bytes Queens/plots/08board40752613.png | Bin 0 -> 446 bytes Queens/plots/08board41362750.png | Bin 0 -> 446 bytes Queens/plots/08board41506372.png | Bin 0 -> 443 bytes Queens/plots/08board41703625.png | Bin 0 -> 443 bytes Queens/plots/08board42057136.png | Bin 0 -> 445 bytes Queens/plots/08board42061753.png | Bin 0 -> 444 bytes Queens/plots/08board42736051.png | Bin 0 -> 445 bytes Queens/plots/08board46027531.png | Bin 0 -> 439 bytes Queens/plots/08board46031752.png | Bin 0 -> 445 bytes Queens/plots/08board46137025.png | Bin 0 -> 439 bytes Queens/plots/08board46152037.png | Bin 0 -> 446 bytes Queens/plots/08board46152073.png | Bin 0 -> 446 bytes Queens/plots/08board46302751.png | Bin 0 -> 444 bytes Queens/plots/08board47302516.png | Bin 0 -> 444 bytes Queens/plots/08board47306152.png | Bin 0 -> 444 bytes Queens/plots/08board50417263.png | Bin 0 -> 446 bytes Queens/plots/08board51603742.png | Bin 0 -> 446 bytes Queens/plots/08board52073164.png | Bin 0 -> 444 bytes Queens/plots/08board52074136.png | Bin 0 -> 440 bytes Queens/plots/08board52460317.png | Bin 0 -> 443 bytes Queens/plots/08board52470316.png | Bin 0 -> 444 bytes Queens/plots/08board52613704.png | Bin 0 -> 443 bytes Queens/plots/08board52617403.png | Bin 0 -> 444 bytes Queens/plots/08board52630714.png | Bin 0 -> 443 bytes Queens/plots/08board53047162.png | Bin 0 -> 446 bytes Queens/plots/08board53174602.png | Bin 0 -> 439 bytes Queens/plots/08board53602417.png | Bin 0 -> 443 bytes Queens/plots/08board53607142.png | Bin 0 -> 446 bytes Queens/plots/08board57130642.png | Bin 0 -> 443 bytes Queens/plots/08board60275314.png | Bin 0 -> 437 bytes Queens/plots/08board61520374.png | Bin 0 -> 444 bytes Queens/plots/08board62057413.png | Bin 0 -> 438 bytes Queens/plots/08board62714053.png | Bin 0 -> 445 bytes Queens/plots/08board63147025.png | Bin 0 -> 446 bytes Queens/plots/08board63175024.png | Bin 0 -> 440 bytes Queens/plots/08board64205713.png | Bin 0 -> 444 bytes Queens/plots/08board71306425.png | Bin 0 -> 441 bytes Queens/plots/08board71420635.png | Bin 0 -> 445 bytes Queens/plots/08board72051463.png | Bin 0 -> 443 bytes Queens/plots/08board73025164.png | Bin 0 -> 445 bytes Queens/q8board01234567.jpg | Bin 0 -> 427 bytes 85 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Queens/plots/08board04752613.png create mode 100644 Queens/plots/08board05726314.png create mode 100644 Queens/plots/08board06357142.png create mode 100644 Queens/plots/08board13572064.png create mode 100644 Queens/plots/08board14630752.png create mode 100644 Queens/plots/08board15063724.png create mode 100644 Queens/plots/08board15720364.png create mode 100644 Queens/plots/08board16257403.png create mode 100644 Queens/plots/08board16470352.png create mode 100644 Queens/plots/08board20647135.png create mode 100644 Queens/plots/08board24175360.png create mode 100644 Queens/plots/08board24603175.png create mode 100644 Queens/plots/08board24730615.png create mode 100644 Queens/plots/08board25147063.png create mode 100644 Queens/plots/08board25160374.png create mode 100644 Queens/plots/08board25164073.png create mode 100644 Queens/plots/08board25307461.png create mode 100644 Queens/plots/08board25317460.png create mode 100644 Queens/plots/08board25703641.png create mode 100644 Queens/plots/08board25704613.png create mode 100644 Queens/plots/08board25713064.png create mode 100644 Queens/plots/08board26174035.png create mode 100644 Queens/plots/08board26175304.png create mode 100644 Queens/plots/08board27360514.png create mode 100644 Queens/plots/08board30471625.png create mode 100644 Queens/plots/08board30475261.png create mode 100644 Queens/plots/08board31475026.png create mode 100644 Queens/plots/08board31625704.png create mode 100644 Queens/plots/08board31625740.png create mode 100644 Queens/plots/08board31640752.png create mode 100644 Queens/plots/08board31746025.png create mode 100644 Queens/plots/08board31750246.png create mode 100644 Queens/plots/08board35041726.png create mode 100644 Queens/plots/08board35716024.png create mode 100644 Queens/plots/08board35720641.png create mode 100644 Queens/plots/08board36074152.png create mode 100644 Queens/plots/08board36271405.png create mode 100644 Queens/plots/08board36415027.png create mode 100644 Queens/plots/08board36420571.png create mode 100644 Queens/plots/08board37420615.png create mode 100644 Queens/plots/08board40357162.png create mode 100644 Queens/plots/08board40731625.png create mode 100644 Queens/plots/08board40752613.png create mode 100644 Queens/plots/08board41362750.png create mode 100644 Queens/plots/08board41506372.png create mode 100644 Queens/plots/08board41703625.png create mode 100644 Queens/plots/08board42057136.png create mode 100644 Queens/plots/08board42061753.png create mode 100644 Queens/plots/08board42736051.png create mode 100644 Queens/plots/08board46027531.png create mode 100644 Queens/plots/08board46031752.png create mode 100644 Queens/plots/08board46137025.png create mode 100644 Queens/plots/08board46152037.png create mode 100644 Queens/plots/08board46152073.png create mode 100644 Queens/plots/08board46302751.png create mode 100644 Queens/plots/08board47302516.png create mode 100644 Queens/plots/08board47306152.png create mode 100644 Queens/plots/08board50417263.png create mode 100644 Queens/plots/08board51603742.png create mode 100644 Queens/plots/08board52073164.png create mode 100644 Queens/plots/08board52074136.png create mode 100644 Queens/plots/08board52460317.png create mode 100644 Queens/plots/08board52470316.png create mode 100644 Queens/plots/08board52613704.png create mode 100644 Queens/plots/08board52617403.png create mode 100644 Queens/plots/08board52630714.png create mode 100644 Queens/plots/08board53047162.png create mode 100644 Queens/plots/08board53174602.png create mode 100644 Queens/plots/08board53602417.png create mode 100644 Queens/plots/08board53607142.png create mode 100644 Queens/plots/08board57130642.png create mode 100644 Queens/plots/08board60275314.png create mode 100644 Queens/plots/08board61520374.png create mode 100644 Queens/plots/08board62057413.png create mode 100644 Queens/plots/08board62714053.png create mode 100644 Queens/plots/08board63147025.png create mode 100644 Queens/plots/08board63175024.png create mode 100644 Queens/plots/08board64205713.png create mode 100644 Queens/plots/08board71306425.png create mode 100644 Queens/plots/08board71420635.png create mode 100644 Queens/plots/08board72051463.png create mode 100644 Queens/plots/08board73025164.png create mode 100644 Queens/q8board01234567.jpg diff --git a/Queens/Stats.py b/Queens/Stats.py index 3e2e50cd8..33b5fa359 100644 --- a/Queens/Stats.py +++ b/Queens/Stats.py @@ -1,4 +1,5 @@ import numpy as np +import matplotlib.pyplot as plt import warnings @@ -42,6 +43,8 @@ def print_stats(self, tables): with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) self.print_table_stats(t) + for b in self.solutions[t.agent]: + self.plot_board(b) def print_table_stats(self, table): win = len(self.win_times[table.agent]) @@ -52,7 +55,18 @@ def print_table_stats(self, table): print("Avg. win time:", np.mean(self.win_times[table.agent])) print("Avg. loss time:", np.mean(self.loss_times[table.agent])) print() - + + def plot_board(self, board): + q = len(board) + im = np.zeros((q, q)) + for i in board: + im[i, board[i]] = 1 + dpp = 15 + im = np.repeat(np.repeat(im, dpp, axis=0), dpp, axis=1) + num = "".join(map(lambda k: str(k), board)) + path = './plots/' + str(q).zfill(2) + 'board' + num + '.png' + plt.imsave(fname=path, arr=im, cmap=plt.cm.binary) + def add_win(self, table): """Called when agent reports winning combination as it's state. Returns the number of new solutions.""" diff --git a/Queens/main.py b/Queens/main.py index 331636aad..09bb81103 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,8 +1,7 @@ from Queens.Environment import QueensEnv from Queens.Agents import * -queens = 8 -k = 4 +queens = 8 # how big is the # plateauLimitedGenerator = PlateauLimitedAgent() # stepGenerator = SteepestAscentAgent() @@ -16,3 +15,4 @@ # env.run(400) # env.print_stats() # print(env.stats.solutions) + diff --git a/Queens/plots/08board04752613.png b/Queens/plots/08board04752613.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ce08b43508656c4dfa436d2af64deebcbd849a GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lsba4!+ znDh3IBiA7Z0oQ{rMgO&rYkRQeK8xJSzoI{`_EDwG@miab`~C7y-QzCHH@p|J@Oxm< z_?V?n7z^Xwuk9z_+nhgs{@su0ow${OO<4Dm|3kL5U!At_a&D}K!R>kX{@EeX;C!`p zHm{p-SPWGwJ)67yPw)lV`#vQH3z?2{%BUC2Ie?YXd$!fuFJF7vvp{j&ia`4BT#DK8 xSh^{A*}nAzoSB!YH)qy?GgIal6R>+PBa^1~i%Co@ioh6Q@O1TaS?83{1OOcKu$ce= literal 0 HcmV?d00001 diff --git a/Queens/plots/08board05726314.png b/Queens/plots/08board05726314.png new file mode 100644 index 0000000000000000000000000000000000000000..abfd67fddb5f6cdfefe59778e3de985ad81f4b32 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lsba4!+ znDh3oBiA7Z5!Qn)MgO&rYkRQ$^@-lf?=m~m*6sXbi+7I~{;vC@VgG4X9pgUl2NsQw zS^9)6{ID=~oPP3s=Vu#vd+V>Z)&~ojj&sVW7tA?;l@WVcf5YUJC-YO6l{Dcr5Nwz9 zZ0_M{(f=e~_L&R+Emw?J#HaMmr5Fp-+kbDL sJt9iTNbll@eVgwB4Gp&-;L5#>TT8WH~Ycl({ozugo1;d-$#qGxgY&-wE&_Yolz sbAKCNirsv-bMk#IaoqNToODO}WRLcX9mjNJfU&{g>FVdQ&MBb@0QO?fm};gU zC}cX$DWhI62OHzOHow1bUD~PdJ0DmyK4$3?w(!Hw&^y~2d}hk~;)D21V>*7fNN-Nj z@tK!caa##;jk%fly^p?oHN)%HbK|xX&1?bQTIMX{AH|} zcA${yIH!zy!5nOi<8#}~V}Aa<-F2A-w<3`K^6c0hi$k^dhh}>T<1!3l&z)(n56Sv- ztgBkj*(Yq__rRj@F$-2kUZ0`f`;BFL=6t?C1Gg%$0esr~@0UL}SxU&n)2BVcBTG3~ x)r)_cgw4C~kT`v<^`HF@Sv7p_^LwyEJtbb}iNNXY8NldZ@O1TaS?83{1OP0kvI77B literal 0 HcmV?d00001 diff --git a/Queens/plots/08board15063724.png b/Queens/plots/08board15063724.png new file mode 100644 index 0000000000000000000000000000000000000000..9394c925fd117f879ef1dbb85a9a3e15d21795f1 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3IBiA7V2G@fwRsXfG3-8$A>KvE;&Gq5LtLihKSI&F9$nyDB|Kq*$pK`CiTHkPA z$inY|MdM?ZK4C13cRN0RysWlg_IaQ>7Fi^XJ1mdw*pqCVt9NIju#9@aoCAeS$2qYw z?j(Nt-5+W$JQugEU~}_q-FBVo>u;*+nKEAhpXGU{cYeq;S9*VDu^&ErflfO8?2v3e z$GS&`L3Vh3op&>4N7kq6TRtyYaCidhzwd0l({!G^_{=;L7#$3ru6{1-oD!M<%p|m< literal 0 HcmV?d00001 diff --git a/Queens/plots/08board15720364.png b/Queens/plots/08board15720364.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb3c85e825468193ff94bd065cdc4cc2e035d6 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3oBiA7V5!Z_@cm7X%Ew;tcDewGD@u{cfZM#12T9sR1Zl^x|z6-mZaOXUec>GQ5>z14ET=a0c52AL*_s+@l&4u?rZ^GvnmOkrG`?>w+ x{3-LDL&!ko=Z8dhr|pgvUe1j>a6p#7V~+3BdGe{3HwG9X44$rjF6*2UngDX5xt0I` literal 0 HcmV?d00001 diff --git a/Queens/plots/08board16257403.png b/Queens/plots/08board16257403.png new file mode 100644 index 0000000000000000000000000000000000000000..c26c2907fd0070cb8c0161b3f62f9e2792553058 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lsba4!+ znDh3oW7c5<23JSTAOFJ3`~@;}yDoe_bMMH93$K*Z?|rZBZ+|w&UtX5m{V9+l z3g#RrWIE0%qmG?%``IDkx3m6)rFp4ibsXIK9oKO5go^VvNPbl{epA+48ChhZ3mn z-#d2}Jd&R1ujVI?+g^~9?!;x^y?0*CFMt0rR(x*cl=(i(;^*973tqVB;d7$jgB=s) zm2FLb`p(ge#pPjWSR8+LsPppeBj&<{6y|Sxuk*y`rfV87LKr+<{an^LB{Ts5m}#|3 literal 0 HcmV?d00001 diff --git a/Queens/plots/08board20647135.png b/Queens/plots/08board20647135.png new file mode 100644 index 0000000000000000000000000000000000000000..918c91e6497d140abcf78a1772e8db0a5bf0680f GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3IBiA7Z5!Qn}PyU7XsS6xQ*q6EbTVrEdSpP|@zQ;G%)@-%=SN7t>_AfK+81AbU z%sEiVbevO09Sh^mt!-}~zdf7t{r8;*7LAWt`h+d~urtag-#1+r7rg5rPP4$)yuHl6 zpoUwIBch literal 0 HcmV?d00001 diff --git a/Queens/plots/08board24175360.png b/Queens/plots/08board24175360.png new file mode 100644 index 0000000000000000000000000000000000000000..7eccb92d33727530fcaa1c068b76cd2065340a39 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3IBUiJ7fUBeWlYil6G(N`0`0e-i!<8rBx6Qo7dYn^6y2$!oU~)3y|V4aE7zx3pWlVceNdt25pD}9vn-HebM<%QLBp1iw$ZznJ|7(8A5T-G@yGywpwN4R+a literal 0 HcmV?d00001 diff --git a/Queens/plots/08board24603175.png b/Queens/plots/08board24603175.png new file mode 100644 index 0000000000000000000000000000000000000000..ad95ce0be7a1e894c588a52d39a85a72234c81bb GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3|LC(VlBCL+uJN{3bDyJj#@ah@cBOCr)J}g&!t}@r)SjC^)zWsl^=HKN%kk2Wj zUNGlCA=7bejPm!t9>-3;pJ}|5yHD7{?}0_*V-~E8yxTE5P7|Rl=K9x)?yASP%a#`& z#9=4YId}8t{PFv};02dBJ_o87+_`kzqx@{ya^E`b7~CEK8|q!W@a8-Fu(U{mM#fak lGT-O>vI&Q8p#kxmiFu#SlO6Bo{s+bdgQu&X%Q~loCID|Uu+to-~YB_z7`c7j}8L)??2OX{!6xSqm@c#%&r%^}7>0KWsB+DW7+f z^*E=Ddcm9ng-lo(+vh$1S=DV-Shc&Ckdeuse#-~vyAX2Ywtqcew%N1ZHT+r~i`!nX mlcI|s=1#uf`FRB)tHqC*>O7g5#uWgJ4+c+HKbLh*2~7ZY^tAZ^ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25147063.png b/Queens/plots/08board25147063.png new file mode 100644 index 0000000000000000000000000000000000000000..9363d621eeea3506b474eec20f7604f736520428 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3oBUiJ7fUBc=#eePD)*2@-oL^NNQ1RtebL92X*yC*3Yj5wr`{k5!ZP|W?{i+3X z4iqvS=af;$!nm{Z^+93v{hh+gx%-4I{2o{|K4!tncy}?zqR_57>5=tr+={^Z<<7PW zKi|CFca9!D^ZXv{$dy;VoBHU<_moE^2XQ(O?Dn;fE%M%{3oqZky^w&)xoZ3W-}ovR vB97I!@PN2;qJN^_pZ^DA&zBM~u$HlMkIs`q?z+Xm=wR@4^>bP0l+XkKy^OL+ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25160374.png b/Queens/plots/08board25160374.png new file mode 100644 index 0000000000000000000000000000000000000000..05b18b756273287dc9d815ad44b4a2f2409eff6a GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3oBiA7Z0oQ{)75}x53-2hLuyKB9wc&>sSC8*__j})Z=4(;%_1`Wi_kXeY%TP1@ zKq1p{P8s!rIoKHIgX3)qKh3r%-1Wes@i9xEu!SFX#pcIa37;~SzT307 z)z76bpED~g7Q2;j*Sy}fu7A5m@x%AU2k|+P>A0=BU)}$2LRVzFVdQ&MBb@0QYyg AP5=M^ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25164073.png b/Queens/plots/08board25164073.png new file mode 100644 index 0000000000000000000000000000000000000000..6897d43cc1dd52d1c12cb4153db32021f4d78da7 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3oBUg)o0E6S^AOH1t>)+^B+MK!SUDAS?mlI;Hm&P7%*m~`4dVAlVrRTpeR!l!o z$aI`jM!jGTHpcTS-Q_Vq-|l#1auA;~rsK9z;_r6YRVN)cp8de0@i9xEu!SFXhTK~2 z@|gL)Go#kd!ma?W_n4mYT%)bqiX}DI3*a&hq&QFZcwu$_)7OXor#IoVnWfKq?Vo@5 xC+jQuV)rdPAfn^ktV$QY5c#k7L>;eZ_T8$`dGgk|QwbOw44$rjF6*2UngAy3wUYn< literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25307461.png b/Queens/plots/08board25307461.png new file mode 100644 index 0000000000000000000000000000000000000000..ac86d3f9fb2b997ffc5b7537cb5d39c4085c4efe GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3oBiA7Z0oQ{)PyU7Xl^0AXn-^LgSo!6ZaP0ZdHrE@rUOT>C_SXsbD&KmBeclf& z8XvRt30wGKVeF`W)$2d!kKY`N*n&9+3Ym^`%BW*!Bo{yITY2-{kb#vSQ}lXRZ^xFp^Jj1LA+S3j3^P60t zLZ;)KGU^3$urc1p^4k@DvMzj7auA;~rsKJ@xx?Sgdh0jGA{M(za7(<47v6mLGlm#d z=3!}(;<%g!G4RerdF9x`NB{ZP*<5GE?GKRR@8!i0*PYD2?(?$gF-xDYh2H~o6n6;nXtt>=73h6CkZ_>m4K1K;OXk;vd$@?2>_^DuoeIS literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25703641.png b/Queens/plots/08board25703641.png new file mode 100644 index 0000000000000000000000000000000000000000..6436a190b374ef038fb82c8bb9ead1558fe97fd0 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3IBiEq-0oH>xAOD5-l^dKe$h{iJW3stQ<@vt%zoiP!{rt7vxqr{4>|cyObQ>SD z^a)$|J+Q#WxEEZ%r|{Eli^5&l<>6Y7Jv-F9Ol`lq@ltNwrh!zyi@E;wE8Dh@ya($a zH{r9IrLQ`F&L6Wnk&-R~M&>;|?qTj%7c9J-pu(6RN3P_Un-cVn+}T!Xd#+s{&mK{a lDVTGhkm)$5j5>CP{1+viC+_buZUEzh!PC{xWt~$(69DNzw?qH{ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board25704613.png b/Queens/plots/08board25704613.png new file mode 100644 index 0000000000000000000000000000000000000000..42f64d252e3b2e86d703e769da95274f16588e39 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3IBNwxx0K-AkH~;tN{1f0ziZ10Z%zS3@Vn*?~^k&0j=l9<&d7@lfCg1R1$inY| zMdM?ZK4C13cXz)YS6}zXFQ#x7Zbe}I+tzaXZ^?eTebX|NgN01TIc3xf<{ZGv=zU&U zcdv17h4Tk9H7r&lxn{@rZBy@e@^`H>AYf$dcZruEb#rdA;Io-iX8RVsJ#UxY>x#Xf q-Gsx-Q2V2!#P5{_zjqg%3Y&U@Xk_1f|IwqH&t@Ab21xUX6; z=RhITaZVX^EQ~v~ue#O!>V(z(#Ief5wcgpdvtUv1gTe~DWM4f{ZO}q literal 0 HcmV?d00001 diff --git a/Queens/plots/08board26174035.png b/Queens/plots/08board26174035.png new file mode 100644 index 0000000000000000000000000000000000000000..b80e302ffe8cef72fd755e3e47e8443b797519bd GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3IBUiJ70E46XkN^6!#aWzGe6|Ibicd}RJN$0fy4O~0Yqr|emA#m}{mYDh4Ewwv zSTsIn=@Yi_!@}56{OaicZJ%aG_0Pg0i>xtkE%#i3n)_G&6QS^b?o;!p=c2B$9Osl# zFPL+nkO?cpyiD@t6j^_lT|HB#<8mO_3DL(3YxZ;(?fUS2CIMHTlMS!4o+mITsR^f- t!6x4RWOQle)cbweUc&fXs9tbKxRXie$xWXO;~*1fi3TeG$9-`fky`7cfXGW?l- zppfY}r;K{R9Bho|SLE$;Kh2)yKKFq|<71XSVGBR(jJ&h0c^q~5uWE@<=s)|-rRAtABD{7byf6E5Stv%uJ3@O1TaS?83{1OQnyw#)zk literal 0 HcmV?d00001 diff --git a/Queens/plots/08board27360514.png b/Queens/plots/08board27360514.png new file mode 100644 index 0000000000000000000000000000000000000000..75a2b539065bf5919ab9afb375af928a6d376ea5 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3IBNvmQ2N#c9 z3+5asWIB$GQU3l{(&YQ^!}G9BlXQ7@Qt04u}yZ0qv9E4QCIlmC=}-Lq$L`_|o$HeI_5mp`D+oc34pWoEwG yx~epB-1dT;bZ67f0-z(0cV1@2=R{7K?~J`!I#1R<7fArd2ZN`ppUXO@geCyVFSzvp literal 0 HcmV?d00001 diff --git a/Queens/plots/08board30475261.png b/Queens/plots/08board30475261.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5c18ea5e4509cbbc6823e806030ebb1b06b2cd GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3IBi9iH0fvJ+p8St5`!8@))H<|W@zR-0gXD9T>ks!B%FVa^u*=(Sw|&EXAq&3; z7LAWt`h>AC@?x%kt*HOD?dt7LpMp6D3Ym^`%BW*!e7_x5mtQ?IqX~ymP+NAF*B{tF zcgLsb$ii8;?FB22+pZV0@pbB>Q<1{BEQPq|&bHEro%XD@A5#}`V)X{xhk3VmeK>OU uc314{Ktg6-0;&{m+WltNdIDy?<37Nv^F(QRQa&(37(8A5T-G@yGywqU|FwYt literal 0 HcmV?d00001 diff --git a/Queens/plots/08board31475026.png b/Queens/plots/08board31475026.png new file mode 100644 index 0000000000000000000000000000000000000000..b2eee3b2c89245df26e4b84c9d5224f0a6841e77 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3oBNvmQ2tIazBcv*Ob*W{_}od z(fF99PuRi_3u8z5)5E*dcHdUpFRF)C0bK8nr8_?yx%qCJx^Qg4oCAeS$2n!xu`|4j zA9ni9`4gt*Cyq-AME9N2;)h+r@%vsi;dCF^dg=3@|Lk#{`(w$y+!*Xu!d>%z-O2ac x{tMhW%8J{4AjR9?rY_m;TetgJAR#x3zh9~IOI?gGhUNGkXR)+7{*0kOC*Uk!y#iatOIk@;? z&t*G}U9aX6QhEB>AzAhPvg&@~xUB^ldS}zl0{7Kw`)AI)#EQ>}oHFL?URUjHeEWm{ u;N=~-ybKMEcbC=n%i3#L9VTGpcUGHDohRz%T2p}$!r@x%0o?@&5NdGvi|wf8Mmkm!Hc1%Kl(K zOP{cX-vf)r$JiLv=WX_6ZL`k(H2Yx_Rt0dqvuAOiE!!V$x^@>Xv!F_sJv$`1d~ZO> z)%3E1g-pjeWz-Ai9Kg!Zoy}c7=TF%ji&$JLpqfuVJ0!by)}ORAFLB(afz;k9EPmLx zU*OCA)*4lOX5QJc?)68pt&h1~{T~zX_iqMuTb(EBt2Ax_V}!xe)z4*}Q$iB}6$`ha literal 0 HcmV?d00001 diff --git a/Queens/plots/08board31640752.png b/Queens/plots/08board31640752.png new file mode 100644 index 0000000000000000000000000000000000000000..9aebd69f7ae02a2ec1c41c2fb47200f446adc8b3 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3IBUg)o0E6S^AOH1t$4BsZ`$U)WYn+|amJ)NlRCcyx@*TU~58wO!T=S3NpZ5cc z#>Xsu!WMp57(0reeOR^i?(MKTW1oUK2MU>vbIPb=X9T}?%HDl{ZPeOXSj<7TV%fD; z>#Ezm9>Taxf>?6LqVMrHxzleCJvTmx&t9hEbHnP+n-?ozV!`b=kdfba9rs9o^JBtF wP8^zopr0MN#;-2eap literal 0 HcmV?d00001 diff --git a/Queens/plots/08board31746025.png b/Queens/plots/08board31746025.png new file mode 100644 index 0000000000000000000000000000000000000000..f55840cdbea2e5bc66b526d87c400f250e500c89 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3|LEb|KBCH1`mj0jS%pZ}kXWmZthOqx%T#kLVIlpzL;j!cA^L`XB-xF5PxX=56 zMdM?ZK4A+#EQ}r1&mM+uzMDDuK99JJdcm9ng-pjeu`=#liOJaZyLV>fHC7xdpqkB1 z#ouKd7oT~qW*s*UTcHkmw_|6))hFAtmX#dDX)V~$-q*YA?k(EW^X30eEPg=t-n+~H sa?7O%d1ce|iSI0azO^XaMZmawo4j|_EZs&fQ{jljVOP{cX-vf(Atc=;SxX+fIpD{Bv7Po0&i-LL@2Zl(cwq2!^>bP0l+XkKd|0q3 literal 0 HcmV?d00001 diff --git a/Queens/plots/08board35041726.png b/Queens/plots/08board35041726.png new file mode 100644 index 0000000000000000000000000000000000000000..5295b2d239d2c0739f5ca55371ee95a7357d48f9 GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lwba4!+ znDh3IBUiJ7fUBeWlYil6bmO_pc{ji|Vhhe(<`lrp%tdBIK2W^`kV2KtgTe~DWM4f Dn|Zcl literal 0 HcmV?d00001 diff --git a/Queens/plots/08board35716024.png b/Queens/plots/08board35716024.png new file mode 100644 index 0000000000000000000000000000000000000000..477d6a5bc3e13262b6a8e4e1b490bc828057d9b2 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3oBNvmQ2P_u{khwpR?F&$*s>Ork%&`oZnkPq+Ru)J#86 z$aI`jM!jGTHpcgN>=jAZpOioHdD--srBB$x?}0@lR)%$v-kqmMW?o{&Z5YU&?Iz;$ ze&p^JURx8UhubiaJv)}}yzu1v&e+SVxbfL5Y>^jp{cAW2TSN9jreO@Vdc+FP5`mzVt?|$0#oAHNk z<71XSVGF+p7T6f~%Iyz`3ajtmt>z~#qh2uQKq1p{POOYOR(+2@iJ2B|tCk|9^7fPO z|I6xTzG%W{GfSWJPoqn+!vDWtIPLM%3%m0mF5j_s=ZDP8w_Wsb`2t1Rk;*HqIQ#(h nUit0Q9_oJi!p{Q<`Gh^bR_DnSmhu{4Y%qAb`njxgN@xNAp#QVK literal 0 HcmV?d00001 diff --git a/Queens/plots/08board36271405.png b/Queens/plots/08board36271405.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5ed4a5a0fb4c9034fa4ed9df04a24e5dcec21f GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3IBiA7V2G@fwd;U*-%*m2Dal-YPdj%>}zIr~7%I-aU#!~65pUXk?hV^e&>2y8ZOrmRAH+mS^kL+~PhMThlXTJsvl*^zAkkpJ(yYHuq6UGd|C-^vzE0IW2vo z^YhKiI}YM-9@OP~ee3pHe@tB@jn6CU1$Wq^MRlGqx{ECZMhAnZtDnm{r-UW|moTy{ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board36415027.png b/Queens/plots/08board36415027.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f8566f4607b267522be1ed370010f6cfaaaebf GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lwba4!+ znDh3IBiA7Z0oQ{)75}x5YkROs{)*fxuGAk_JE`>k_gdb~*Q);9Zmcgq{rU^@hiInb zoHFVKa}E?@W9;>}KOiiuzCT!aId`A1h2H~<#>XsJ8F^1)c09h4Q=avx?o7 Bwb%dv literal 0 HcmV?d00001 diff --git a/Queens/plots/08board36420571.png b/Queens/plots/08board36420571.png new file mode 100644 index 0000000000000000000000000000000000000000..f0609b9588c49deffc8ad6addd3c989fff76e59e GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lsba4!+ znDh3oW7lB^0T#!zkN($3{yVhjpvmN}9nvZ4wOTFLYwv$Aow4=WratRuSo^NjsK@g89zNq^6*X@g*YAF^`8VSa-Nwf( zeZm%g4=k`T-reQ@aO8Gao%ZWMVHx#;IR^@vj&ovV+?n|Lkf{1RpO~HNIdPi@vMTTP zu7c~g-sP$b`{FYYXxHOi>yH24ynXFGzmz6?u4L)kz4p()-S)Xd-220?Qi|QJc+eDh|?!vPukAn_O080+jOlJ s0fo80C0^dnQ~UMa>7Nrm|Lo9DQPO#``yz&oX;|mCEB?>t0t(Fg*75{<|OHd&BG*?yDBe zIZ()SoKr>}3*(MO-{Ws=+aA|^Gtsl~dtlM{n59n`D`UsyC*S|4-Rmehh|@5zJ#$yf zKj>Rt8&L9WW-Jy9k=+tp{BYIHyyGYHMa8i?4zBjjm6(iezwfNdyvmBhA5f*+-y|=w w)A%J#$Sx_Mj`@A1m zG(KkO6SnZf!q`z7d;Pfe2I1@J|Bta8=af+|m~)_z2`l6KmQTNHt<{x$aVr7qKL1kM z;^dWfpYnC42XPn$wWW70xBs8^2c7DMgv?BSeMmSw-+I}##cEi+0r%mKwWSX`)mfJN v*skZq;bo}WyzE$utxTJj)yyZL@Ez-%4LVN_?Ol}*j1UG-S3j3^P6U}Ma)=AUn|cdo_Hw*^i3)Uov4p2fX<*>>UdQ<{DSa}E?T9p{u$$Igf@ zemF%~egDeN%bd6^2DvFONAJ&e>89ZKZ&+}f2C~T9OnjcjPv4s}!{%c52Hb~zelF7^T)o+xBDjF=TW!tdtlM{n59n`D`UsXogZ?6DnG9f#%dDWk~O6@nJ<1J?4F*qFKbLh*2~7ZGEU>!( literal 0 HcmV?d00001 diff --git a/Queens/plots/08board41703625.png b/Queens/plots/08board41703625.png new file mode 100644 index 0000000000000000000000000000000000000000..fced8285296e09ed88d5d5d9786b371fad89f9ab GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3|LC(VlBCL+uJN{3bDyP%5=vG0(R%l=Dz=p|6uI< sHw5gyZ6-d?;^$n8!dqyPW_ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board42057136.png b/Queens/plots/08board42057136.png new file mode 100644 index 0000000000000000000000000000000000000000..f16f9fc296980ef100f68f5f6157a0c3c65a5701 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3IBiA7Z0oQ{)75}x5Yj-sB{0-VFe$;)v-N{|=fA5n^S^M>Ky86G+^_T4%{tH?7 zJ+Nqe%+e=}h4HTTRk#1yGGX=ovU*sgk#z1TjlF*U_sz@8ws*!9%sEiVbevO09Xlg` z^8N2>`%YY8#jOOSyZlY+65+YC{*K@HgBjV0~(U?DVwR*yx@3ryllF2sv%8u`Uwe=VGhiInb zoHFVKa}E?@W9$vD{jln0-tm+9ZNj)!feg5_W8LeIb!E4{Y*SXZ@Oxm<_?V?n7%OAP z_LJ}J!|wXNWWi@Mr;PbmgG-n1F4i_}4&CR6WYc$t&cUY$XrA2xOPwcoHWZu!MhAnZtDnm{r-UW|C&ss^ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board42736051.png b/Queens/plots/08board42736051.png new file mode 100644 index 0000000000000000000000000000000000000000..94f6059c458211837f1de7df8f54476924bcdac5 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3|LC(VlBCL+uJN{3bE7s&H5OwyBbI}Tl{ zw(xsk(fAk}V|V!9kE?Fx9Y2}h#*I&%utna@n2K9D=E-SMr3VX{j&sVW7tA?;m7zPE zJAKYK$BQ%5%Lu5nQs8z;I0#ISl#MtQ`B&&foR`RD0BSy?iJSaw%zXK#BCr*@w+>3x7^M1 zDVTGhkm)$5j5>D4={mQpr{DK!uMQQ)r39k;PFcBl+{RZfOLlWtdSdqm)QQpSxZm&C r7JZZjx2+%}%QIs$a=-s4gTe~DWM4fY^AW6 literal 0 HcmV?d00001 diff --git a/Queens/plots/08board46031752.png b/Queens/plots/08board46031752.png new file mode 100644 index 0000000000000000000000000000000000000000..f092c08ac7f654e4cd9ccb019e9ac95296274aa7 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3oBiA7V5!Z`uyZ-B5x0T2_an`cfanGNNi%V_Je~w|7O#budrfmJH^RM&|)N{(H z7tA?O$aEYVqkR28ru=BrpKE7n#^P25HsJBDb@R8cke$EHx|h38*uw9DMdM=@tc-W} z3O`xDZCzv>L%_&jedSow+jGr+o-H_t!+}t@`<`u0+g*O<%qBg27W+Nev2y1J6Kgx) rmrXd_26c9{nfSXO|C@C+zm(Lc|waredTK(OVHcdfg=d;8^UW!6Rn9C=qyB-faL8r|JJ oCC8`U@6+}Z#uqf|1$V?BBbXtENlL~)Ra8`+2*?AF^To|yC27Yjr_~{L$~oU zOP{cX-vbM5jCWV#AKVY~ty`VuB`%|0Fy}xa({WC$j5}9iDsD}#G7kG2M~uoR+aKG! zYQkqVOJDRiqf4^Ox63{cBxK@_b+5m&ZF^i(CPhf)-p4?jCwH#if!)9GpqRF|r{q}X g#KyB~x1hRHX)7qaks zVA1%PrB4_O<6T^BLwxksPtjYKnH(%+I?gGhUNGkXR)+6dZvWrG`Nvj$Hzh)4^v}0D zdQE>`WGG) sc{fv+7?ziIY?-&bin?a_2w|iT3?(z(LrU5OQ7VDPv^!r}*)u9BPcwa9j^{Vtl|9Ped s@%ftRxNVg9yt0Ka`qIq^D6D0;_fhAG%_MFeV018ey85}Sb4q9e07zD^p8x;= literal 0 HcmV?d00001 diff --git a/Queens/plots/08board47302516.png b/Queens/plots/08board47302516.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e9968e96f1e25960b25c9bdca7937c701e8c60 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3IBNvmQfa}4|ivQaElkLWZyB=6HK4$3?w(!Hwa68xP|GV|Ux!JK;%t5x|^{#d6 zx3B2DeEaea>?Xl2xwl+x|MI_1A4J5lIu35=osIU&b1i=Q&aoh5cXaW?BR_MFA2Hue o!0K(!4t0LMskwYvC?UJqv*dK12wUtG2Sx{jr>mdKI;Vst0KjgxssI20 literal 0 HcmV?d00001 diff --git a/Queens/plots/08board47306152.png b/Queens/plots/08board47306152.png new file mode 100644 index 0000000000000000000000000000000000000000..72d943b95e7275d486c83dc7378bcbb317eafe0c GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3|LEb|KBCH1`mj0jS%O9cgsp?suNW|aE!4k#iDrHl8K7LLw|FhCA-=5*WYQdZX zg-pjeWz?}S?)?46Y?FKZWPa+Sl7l!^fepyD6rcC4?ZGMI-484pAG7ocTlisT94n2r z&kwZr%U@ndz{tC5`_uP)bz8!X+c1zlc`wg<`2P;RAevtrFOJn4a39{e6jO2Q$@a%K wubS{Vk)A%C<{Z>{QYz0C0*np@Pgg&ebxsLQ06ajl5dZ)H literal 0 HcmV?d00001 diff --git a/Queens/plots/08board50417263.png b/Queens/plots/08board50417263.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc83b8604085f6293311813a39a12603590f4a1 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3wW7lB^0T#!zkN($3{yX%DtzTWVQ2dbJuaJzp-)rOloQ`_^IKBMu+4|^vr>=9z zs29vRP{?$g6ANSey4Sxdj&CygXD5zD7D?ls*O`;=cgA!0?Ra3(_?V?n*uoDxBW`lL z|D1b%bN;Bs;Ig3R5<PT~DNcfQ6E^0@S=lR8hLyBVs15yIf<>gTe~DWM4fx#Y8R literal 0 HcmV?d00001 diff --git a/Queens/plots/08board51603742.png b/Queens/plots/08board51603742.png new file mode 100644 index 0000000000000000000000000000000000000000..24baa821044bc970473497e1521a71a7891df190 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3oBUiHlgR5ikp8r$da&jGYxNMXDE$QRLtM1n8Uhm@DXLM{w?b}ty|3npq*SS5g zXnf4lCv4$|g|Vaf*(2HKnLl9#Nu$^A5Yru$qho`Aa%$k;ZA zJN?a%v_=2*o+#t?Hc;WTv#qPsb}!#M^92hIe?YzXoo$Vu&XbVLR1IK+FnGH9xvXy(2%<;P#Co+3~mCEB?>s~*YW_axJ`E|c$+k5YuI$zMj z?}0_*W0pQ)ER1(CUyoY*3rFQ!%nEF(cg?NNm}naQF81|e%V2M1~MJ@J=?lEZMUrY{!l`e2Ny5A`EFn6 uT?}Ml1ZEx+o7S+7|jHUknvg`N%-1-z!=k~y& z@i9xEu!SEM#*Xjn*ymg9ox5YrE-bRh8lOo#{=`=HsOFoA9#)g!YIkfu`TqaiO5w|_ z$2n!x3+5asWWvhW{x*5ZZkxBtD+rkvUHtI!vhBh<2{zopr02;lz4gdfE literal 0 HcmV?d00001 diff --git a/Queens/plots/08board52460317.png b/Queens/plots/08board52460317.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf1f0bf5f9038d5e19fb9fdff3996cb2eafc1fa GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3|LC(VlBCL+uJN{3bE7rs+7XsJ8F@Ejc4SrEE?hR}VG|A|P~FjH z;_HfT`Me~cO!|81-g}G6YHq(X(Zgr4--8|1$4|cB!ryhS;2;iPKt1SN+f#Bir~K9v v^TVuIeG3l=b5rqIZ~rByO)Di}WG!Rmb)6^4Rt{@{vBBW!>gTe~DWM4fc^|U| literal 0 HcmV?d00001 diff --git a/Queens/plots/08board52470316.png b/Queens/plots/08board52470316.png new file mode 100644 index 0000000000000000000000000000000000000000..772b51b2a9d97c291482e03e444abf19266cf5c8 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3IBUiJ7fUBeWlYil6;T)14#^+b<<*=*zda(5V_u7wBw_ZDc-mmuA^%K!Qr5hi! z^a)$|J+Q#WxEHK%S6F3T7+HF-km)$5jC#SG16UcoXIq0W-|jSi$|sIn5lH`?8!;A7 zkDSa;e^f%i$hEI`)!jSqH|O5GW32eB=9KwvSNN&=7Qbux4(z^wdvIHwo0aKp+uTpL wA2#9hHcQ{_S=?vK?$4eT7K_Wr(7=#y@zHtW@oCj0V018ey85}Sb4q9e0Q@Mk`2YX_ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board52613704.png b/Queens/plots/08board52613704.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4b0f6f21cea0f2b57fe3574363f410c2233d1f GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3IBUiJ72&d zlu<93bD$6#WA19XJ&(U^d%WpY(_@xCVGF+p7L8aL(PrZBEcTv_Fzw%kO9@o>vS){6 z?+e5nJ?`<76T4Xmg`vVTW`430$L&6l)9-BRpLnj~_7ihsf_5J(l!O2L o{RH%6aVik=c9y-d?%?r`e~_eQpmd z8XvRt30wGKVeI&QrM-O4y|S3FxmaY8H6D9*NOt*l?Pbpb)v=lcSG&Wz_+g(p%kqkz zDg6TYl)k$Z^CN%q{VCd;*9gm~7tA?O$aI_&E91_Mzopr0As=K5jcRrRu%>!q@HjE+_OxgEOx=hi1HYkCh9 zG9BlXQ7@Q-jq!XH`+JMMZ+EP*I*3mh({bI|+~srbrLCFeKKFq|<71XSVGBR(jA>_E zjqmvEInRk(2}pOI%<+#E$A4{?Zn7?F!e<^!pS5q@{`_ZVONDXy0^-3tSB`s>|Iv8S z_orM@9;c5%YRyf>-&y?pd;7>s7TiGtQuv+iG@H(o9nIGhfw95h>FVdQ&MBb@0I-*_ A9{>OV literal 0 HcmV?d00001 diff --git a/Queens/plots/08board53047162.png b/Queens/plots/08board53047162.png new file mode 100644 index 0000000000000000000000000000000000000000..c0249f5d6bb9067fd118226fe39edb0fd1878110 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3IBUg)o0E6S^AOH2!_ivE6F=5*)y{@x!+EUI~K0oSzOrn4O-LJFlqwk%%&mp5; zFy}xa({WBLjPm#Y8q~|yzV*AaX4V6X#>Xsu!WMqm8OKUv`^yv5*PXw2j0LM%aBIr< z=RPfe)VfI92e-vw#qM!#yB-~xdjC|{WdcTS-=bG@+jDPh*uSZqxSa@ceO_j4#?$Y+ zV^@a?WAQKCjp_w=ww?C4UuINz-F!B755vP^U(+p}C(ZAD#efmQ;OXk;vd$@?2>@-1 BwPyeT literal 0 HcmV?d00001 diff --git a/Queens/plots/08board53174602.png b/Queens/plots/08board53174602.png new file mode 100644 index 0000000000000000000000000000000000000000..cc50a06c766f23bc48e977039b975f0209242d02 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|`Jiba4!+ znDh3oBiA7Z5!Qn}PyU6=tyhpdF~jd_oXG6`RT9VN6wCcd=_&lVb@#q!=ckoFHDfx? zDWhI6=RhGg#@yZZ2Sj(L?N--Yt!Lr)z@qUnOP?@S#*U>sFXVjxAA`#zs3qRT3va%Y z)84#>8;3biE8b1ySC0L7~XD> wc=^BhAXeYP17dFe@2z)l@4)9@pgZ?1-=*{9qTZS#z?fk0boFyt=akR{02OVriU0rr literal 0 HcmV?d00001 diff --git a/Queens/plots/08board53602417.png b/Queens/plots/08board53602417.png new file mode 100644 index 0000000000000000000000000000000000000000..04a48d0b4b9a03e50c92a746b44ed4f63e73697d GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3oBiA7V5!Z`uyZ-AQ*Y#lL-8s)#ziYaERlxB%#c_X9dOrTR8EgMJ{q*urQjL#U z`h+d~9#~*wyt^C!pfh&!-OkgixN)lj8Sw7J&JRa!=3PJXvI(DoEPc|~OKtBh@|*Ma zUoRme@0tFb`@_CLz35;e({WB2^@2GEurhM1C0EY;B&&zZ7Z4BbSPFFE%eO~P=C=~C sI4@K0&-RzO)2BvWW5s7Lr_6WOmdKI;Vst0No0=+yDRo literal 0 HcmV?d00001 diff --git a/Queens/plots/08board53607142.png b/Queens/plots/08board53607142.png new file mode 100644 index 0000000000000000000000000000000000000000..58a4689225efcea43f3589b7edf522b8afc7122b GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3IBiA7Z5!Qn}PyU7XsSBtu_g!9jt2^m)cz;UF^-|fI)SklMn^*sPc70O*({z?T zVGF+p7LAXwF|5P?H&}nFBFVdQ&MBb@02Sr6GXMYp literal 0 HcmV?d00001 diff --git a/Queens/plots/08board60275314.png b/Queens/plots/08board60275314.png new file mode 100644 index 0000000000000000000000000000000000000000..7faf75a86467a383684f83e5849cde4b5c4c6a77 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|`Jgba4!+ znDh3oBUiJ72&?rAd%g5SadOY?^XF8m?$%Ax<&aS? zm~)_z={P4AhI!xP9eZ6PrRJY!#VQZiTE1@9pRn58@A)yf4FfBFzDj)dpMB=WYj-`c zXnf4lCv4$|oiXift98^@*CqAhpC;mR9@xa_bFJ3r%2w~dZVcRpWzU>8-~GIkpsGW% m>AORPpKIyiau~$K9p+yIb)I}-&CdkJ1B0ilpUXO@geCx%SFRcW literal 0 HcmV?d00001 diff --git a/Queens/plots/08board61520374.png b/Queens/plots/08board61520374.png new file mode 100644 index 0000000000000000000000000000000000000000..1889ab760dbc40e50428851b9e8c0d0ed136ffe4 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3IBUiJ7fa}4T6Mo0vymL^|!+!NQp+k$qAEb}ZicA$RiqBb8TJahL_Qrrbn) z-VBSqzH{7Tu~>-gmg=>o)y%Uk=I`z0#$hScJ@2dwKh6G;_9!@pfQkLJJztL8R@*zuW%UZTb9hdbm)noc&2bmOfz% zzXukLkFha!m;L>)?q|;Q*#9?Kk8{eX7tA?O$b^+)eq5rze2sAW?(KyKaVUZ6j#b-# zf9?;rCEWNd7PiQ{ecZ!;OZKPenVPYB(E2C#(M3odw1RgQu&X%Q~lo FCIIHEyG{TA literal 0 HcmV?d00001 diff --git a/Queens/plots/08board63147025.png b/Queens/plots/08board63147025.png new file mode 100644 index 0000000000000000000000000000000000000000..0f02ea82b1dae5a2eccf4901b6fb0109193f4e07 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=luba4!+ znDh3|LC(VlBCL+uJN{3bE7s&95Ow~JFVksz+czI=&KG|yPwsh{9xhb7Z2l7trsJG4 z>IHKS6k=oC-TnVSPweH}U9tOLH$7(Q6SnYsV9|(`5j~5${A^iV$Dg^}_>>7-9&Y16HtkThciZ*o$jSWFMN+X6??n>HeQMn2vMG zs29vRP>78oySx5DSM2KTqPzEHH$7(Q6SnYsV9|(`5gjG|F6#D9fuEMbxXlAub?4Hq z3%B0MX=g_gQm8DieD`VRc1>Sg&V#zVxTmmE{At<4_r?dY`U37j+1+7vyYpWCl_q5K kw&NaaHQy%^@NzYCCzH;TKi@tm1EYe$)78&qol`;+0OypeBLDyZ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board64205713.png b/Queens/plots/08board64205713.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfa29f1b1cd36d3f907fef90a5d1abae17c0303 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3oBiA7V5!Z`ucm7X%EVjhaIq&>T@gt|@ZM}}qDUSPdN8<6f&Dx!D+vh*wU^>nz zqh2uQKp{59-tzwq^|wuLzl}hW-toYq@i9xEu!SFX#<9}a?cX;q z_sv%?I*8RuxNG+M*4@AT)$IwFIBxfW6yJHgFLp=L^(Whnf_GuJ6YiX8&khOS-)4RB zRQ=N?e2!%4i=M^pUvv9irtwm4+`;K{%kIob8o^VZIbTD|j`njxgN@xNArAoG< literal 0 HcmV?d00001 diff --git a/Queens/plots/08board71306425.png b/Queens/plots/08board71306425.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c515bb5e5883e57e01d8bc95b061628dd39155 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3IBUiJ72&f2wwx#(fB60Xkg!H&C6zRRz!6MWf(!+B7(vws<1Qjapdy>?b=EOxiSoqhV*q3vhO tR`0;=Ww4pk&bIo`c^l?C$C!|><115io_ySwrw@z^22WQ%mvv4FO#l!~vW5Tv literal 0 HcmV?d00001 diff --git a/Queens/plots/08board71420635.png b/Queens/plots/08board71420635.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a6ca423bbb6e1e05bc791ed0ba0ebc3b2567d3 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh4TLEb|KBCH1`mj0jS%&p-jk)QTXu;Z$|E#u=|>s~)t-)op>|NGaY-w*gXWz-Ai z94KTuj*U@%&c?<#Ia1T!{Bz{a2NsQwS^9)6{ID~YJv$_;zJIyz96ekrAewiq+*xpJ z)y=%)C-d95aT^CxoF{XEU`^!oW;_wO7le)hRFG*Ve x`~P6o^-=;#b1lW!&AL}MM>7_8_<&8#pCP03q|h($A}~G}JYD@<);T3K0RTPiuyX(a literal 0 HcmV?d00001 diff --git a/Queens/plots/08board72051463.png b/Queens/plots/08board72051463.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2e41ee72ae04f943ac2635588e978286fe7610 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh4TLEb|KBCH1`mj0jS%dNr2nxFQLU}K!yeXk;wsruHTou6uB3+5asWIE0%qmG^N*rM-r^p(qLyJdG`Hw&m#KH>V(jGm vvBpaYsXPrdQk~^*xuU%ycKgTe~DWM4f3I4JK literal 0 HcmV?d00001 diff --git a/Queens/plots/08board73025164.png b/Queens/plots/08board73025164.png new file mode 100644 index 0000000000000000000000000000000000000000..11127a8fc07248191204f706defdef0665f203ed GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3IW7lB=0ar)uC;!6B-X)y9aMAm!okGQzSHkOm?|a|9e%rOGKew;T?`zgqDVTGh zkm)$5j5-#^o$6nV{%_8ttFK#ZonLkkr#i3^YhUk@%MVod%in*D6^D6HtG>^h^{4Kw zd{b}?7CVuhlPs@nTlmSk@KFf?yK~RBs-H`@_N&><-6w3}_rRj@F$-2kUbdc1q1|jF y)3v*BD+233X6I&=nzik-VbH%;+#v*Xt^DV2I!^>+j=lxP2ZN`ppUXO@geCx3)v)dW literal 0 HcmV?d00001 diff --git a/Queens/q8board01234567.jpg b/Queens/q8board01234567.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f52e3f35a6f7c8d49479f60ac47d40ccd13f6252 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|>x0ba4!+ znDh4LLC(VlBCL*@JN{3bE7s)tB*nH^oMT#jRdG*YU-!AspMuRQ@BU@n=l#H<@i9xE zu!SEM#*XCFPqT~T>aw%$9A-VvDWhI6=RhG7Rz~?68#B{?cH;Qds2AM16tm;dl^yNe zI4p#^<=wWO1+6PT7VBYk72Lr)_RrxCx5>>aIf%niQ1{yA>BW5P4_-{b)^jmCPR0^c b^^TXRK>Nj~nBzBrq0ivy>gTe~DWM4fqadZ{ literal 0 HcmV?d00001 From fe81e9be9537aed68fd974bfc270749d2354e88e Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Tue, 16 Jan 2018 08:47:07 +0000 Subject: [PATCH 31/34] Informative main added, code improvements --- Queens/Agents.py | 9 ++++---- Queens/Environment.py | 4 +++- Queens/main.py | 34 +++++++++++++++++++++---------- Queens/plots/08board06471352.png | Bin 0 -> 441 bytes Queens/plots/08board14602753.png | Bin 0 -> 443 bytes Queens/plots/08board17502463.png | Bin 0 -> 438 bytes Queens/plots/08board24170635.png | Bin 0 -> 444 bytes Queens/plots/08board37025164.png | Bin 0 -> 444 bytes Queens/plots/08board37046152.png | Bin 0 -> 445 bytes Queens/plots/08board41357206.png | Bin 0 -> 440 bytes Queens/plots/08board51602473.png | Bin 0 -> 443 bytes Queens/plots/08board52064713.png | Bin 0 -> 442 bytes Queens/plots/08board61307425.png | Bin 0 -> 443 bytes 13 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 Queens/plots/08board06471352.png create mode 100644 Queens/plots/08board14602753.png create mode 100644 Queens/plots/08board17502463.png create mode 100644 Queens/plots/08board24170635.png create mode 100644 Queens/plots/08board37025164.png create mode 100644 Queens/plots/08board37046152.png create mode 100644 Queens/plots/08board41357206.png create mode 100644 Queens/plots/08board51602473.png create mode 100644 Queens/plots/08board52064713.png create mode 100644 Queens/plots/08board61307425.png diff --git a/Queens/Agents.py b/Queens/Agents.py index 978d9753f..c2825c1c1 100644 --- a/Queens/Agents.py +++ b/Queens/Agents.py @@ -4,7 +4,6 @@ def steepestAscentAgent(): state = yield "steepestAscentAgent" while True: - # yield "Success", np.arange(0, 7, 1, dtype=int) cols = count_collisions(state) if cols == 0: state = yield "Success", state @@ -16,8 +15,8 @@ def steepestAscentAgent(): state = yield "NoOp", state -def plateauExplorerGenerator(): - state = yield "plateauExplorerGenerator" +def plateauExplorerAgent(): + state = yield "plateauExplorerAgent" plateau = None while True: cols = count_collisions(state) @@ -40,7 +39,7 @@ def plateauExplorerGenerator(): state = yield "NoOp", state -def plateauLimitedGenerator(threshold): +def plateauLimitedAgent(threshold): state = yield "PlateauLimited, max={}".format(threshold) plateau, count = None, 0 while True: @@ -70,7 +69,7 @@ def plateauLimitedGenerator(threshold): state = yield "NoOp", state -def masterBeamGenerator(queens): +def masterBeamAgent(queens): tables = yield "Master Beam Generator" k = len(tables) while True: diff --git a/Queens/Environment.py b/Queens/Environment.py index 1160c637d..6f928b414 100644 --- a/Queens/Environment.py +++ b/Queens/Environment.py @@ -16,6 +16,8 @@ def __init__(self, agents, queens=8, master=None): self.tables = [Table(a, queens) for a in agents] if master: self.master = Table(master, queens) + else: + self.master = None self.stats = StatsModule(agents, self.master) def step(self): @@ -49,7 +51,7 @@ def find_sol(self, how_many): max_found = 0 while max_found < how_many: self.step() - max_found = max(self.stats.solutions.values()) + max_found = max(map(len, self.stats.solutions.values())) progress_bar(max_found, how_many, "solutions found") self.print_stats() diff --git a/Queens/main.py b/Queens/main.py index 09bb81103..0a52515bd 100644 --- a/Queens/main.py +++ b/Queens/main.py @@ -1,18 +1,30 @@ from Queens.Environment import QueensEnv from Queens.Agents import * -queens = 8 # how big is the +queens = 8 # how big is the chessboard -# plateauLimitedGenerator = PlateauLimitedAgent() -# stepGenerator = SteepestAscentAgent() -agents = [steepestAscentAgent() for t in range(4)] -master = masterBeamGenerator(queens) -env = QueensEnv(agents, master=master, queens=queens) +env = QueensEnv([steepestAscentAgent()], queens=queens) +env.run(200) +# Let agent do 2000 steps and see how many solutions it finds + +print() +steep = steepestAscentAgent() +plateau = plateauExplorerAgent() +env = QueensEnv([steep, plateau], queens=queens) +env.find_sol(73) +# challenge which agent finds 90% of all solutions possible +print() +agents = [plateauLimitedAgent(t) for t in range(6)] +env = QueensEnv(agents, queens=queens) +env.find_sol(73) +# see for how long is it efficient to explore the plateau -env.find_sol_master(82) -# env.find_sol(10) -# env.run(400) -# env.print_stats() -# print(env.stats.solutions) +print() +agents = [steepestAscentAgent() for t in range(4)] +master = masterBeamAgent(queens) +env = QueensEnv(agents, master=master, queens=queens) +env.find_sol(73) +# use beam search to find all the solutions +# remember to check the plots ;) \ No newline at end of file diff --git a/Queens/plots/08board06471352.png b/Queens/plots/08board06471352.png new file mode 100644 index 0000000000000000000000000000000000000000..834a8d4700c6967ddfde7a74e548c18881521afc GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lpba4!+ znDh3IBUiJ72&E uB_Y407C#hTzFoa;=8GmA0Rwg8Z>Any?H4mY?%e>43kFYDKbLh*2~7YKZm-t> literal 0 HcmV?d00001 diff --git a/Queens/plots/08board14602753.png b/Queens/plots/08board14602753.png new file mode 100644 index 0000000000000000000000000000000000000000..559276fde4045b3495218df08cc7af4baa9491eb GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3oW7bgx5r;tC`v1{>;Q<-Su6yPgPiN7~|6(xn{AZiTOD&(@UYz`J*hC$l8lN4DP8BjmpP_?0?OI8Lkx2gU}2r>mdKI;Vst0HpJ>P5=M^ literal 0 HcmV?d00001 diff --git a/Queens/plots/08board17502463.png b/Queens/plots/08board17502463.png new file mode 100644 index 0000000000000000000000000000000000000000..16eccd70765b52e956bdb19666bdd4dbc158fc22 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|`Jkba4!+ znDh4TLEdHq0R~6wMgOOH@*d>!n>KSl>!nw5>W6L4f0hwHYq?%dmb?Ec^ZL8`2g*5R z)C=YuC}cX0jZwZvX4|LT$4^CFW5Fs9*SdX+Ud^o7?V91|W<9WIe9Y1(Y~hEU@l4|J zC%sc|58Y31!l#U-&$?{wpFiI}$f@Bn31Z2PTzTcK%l5Q$;)$dW<@p>mAYt6SE)_Jle^Km>dA{abf{an^LB{Ts5t#+_! literal 0 HcmV?d00001 diff --git a/Queens/plots/08board24170635.png b/Queens/plots/08board24170635.png new file mode 100644 index 0000000000000000000000000000000000000000..010b1273bdea5368f46ca263b4b166df6305a29c GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lvba4!+ znDh3oW7c5@0ar)g4}aIMiBZhhVEs8}tGSp>)mO);@3r@@H*CH3_&%TQr-^mTXB*0U+Jn{8ye umXMLh!QkoY=d#Wzp$PyT^S3hq literal 0 HcmV?d00001 diff --git a/Queens/plots/08board37046152.png b/Queens/plots/08board37046152.png new file mode 100644 index 0000000000000000000000000000000000000000..04e0380496cf1a1ec00a392bb42dcc2356f188d1 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lqba4!+ znDh3|LC(VlBCL+uOa4!rDyP$QA?umkhRA;}1^X?Z*YFu1tN44HIlla4`gi6J@l3}# zWz-Ai94N%bs4cfYAidqUPW$r;?ml4)zXukLk6ExX@@&q3uBzUhyUltc0hRBnZ$Bx& z-R={M%TlO&-0ONuj;=eIf8FP06AnwE?unkoo&S6Jy{_2zuZd7O`;XrocS4rmwsWg` j^rh^P%_{;X{$`xPt@GrbP0l+XkKaiO%s literal 0 HcmV?d00001 diff --git a/Queens/plots/08board41357206.png b/Queens/plots/08board41357206.png new file mode 100644 index 0000000000000000000000000000000000000000..b6875b91ecd54f7d7228c6baa16b975a66d1a9fb GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|`Jmba4!+ znDh3wBiA7V5!Z`uyZ-AQ*Y#*_i#b12e9d(Gs**F7&%e4Kljxss`*D5M+kcET(+?Cf z9p{u$FPMXk@%_|cb-#RdzdG$0>Cdyy|O}|f`I+hX oUA6u9Z+taf%8kQqP-nm6eJZK*#D>|w4j2^-p00i_>zopr01%z9F8}}l literal 0 HcmV?d00001 diff --git a/Queens/plots/08board51602473.png b/Queens/plots/08board51602473.png new file mode 100644 index 0000000000000000000000000000000000000000..ca229300a585fdf2f99e87002b752c6e5f15d3c5 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=lrba4!+ znDh3IBiA7Z5!Qn}PyU7Xg-_r~nd5iWPQ$GJtHI-4>s~)lPwu&We%-H`_TF|=k8{YV z7tA?O$aI_&3#0s;&7Q|KX359jziE2R(kE=;_rRhND`WO7?(#Y3!y--B?!u)6s{2@> z%=YaX#Si}%AH-oR)IoDstL@*u_e6=PI2M;7Ir`3((;n$FH0M7g;KXP%@pYRXKQT8h oB;>?xbGYw+<3Bi)ps#;3&E?Q}lK3>h6c`%}p00i_>zopr0EI2I?f?J) literal 0 HcmV?d00001 diff --git a/Queens/plots/08board52064713.png b/Queens/plots/08board52064713.png new file mode 100644 index 0000000000000000000000000000000000000000..7a680d9489c6402a83a196e110508baccfc1e2d2 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|=ltba4!+ znDh3oBUiJ72&U_X;(m9pR7=S# tKUK!=3#bSE&b9_moI|KUVSQjn|^=JexH$j- literal 0 HcmV?d00001 From 457400343dbabd2638411def33b14e36151f23a4 Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Tue, 16 Jan 2018 09:45:05 +0000 Subject: [PATCH 32/34] README; old files removed --- .flake8 | 4 - .gitignore | 73 - .gitmodules | 3 - .travis.yml | 24 - Queens/Agents.py => Agents.py | 2 +- CONTRIBUTING.md | 144 - Queens/Environment.py => Environment.py | 4 +- Our_vacuum.py | 34 - Queens/Queens.ipynb => Queens.ipynb | 0 Queens/q8board01234567.jpg | Bin 427 -> 0 bytes README.md | 162 +- SUBMODULE.md | 11 - Queens/Stats.py => Stats.py | 4 +- Queens/Table.py => Table.py | 0 Queens/__init__.py => __init__.py | 0 agents.ipynb | 1260 ------- agents.py | 977 ------ aima-data | 1 - csp.ipynb | 1174 ------- csp.py | 730 ---- games.ipynb | 1659 --------- games.py | 344 -- gui/romania_problem.py | 518 --- gui/tic-tac-toe.py | 236 -- images/IMAGE-CREDITS | 17 - images/aima3e_big.jpg | Bin 57178 -> 0 bytes images/aima_logo.png | Bin 8063 -> 0 bytes images/bayesnet.png | Bin 81000 -> 0 bytes images/decisiontree_fruit.jpg | Bin 45995 -> 0 bytes images/dirt.svg | 291 -- images/dirt05-icon.jpg | Bin 1772 -> 0 bytes images/fig_5_2.png | Bin 49045 -> 0 bytes images/knn_plot.png | Bin 45256 -> 0 bytes images/makefile | 34 - images/mdp-a.png | Bin 31989 -> 0 bytes images/mdp.png | Bin 824 -> 0 bytes images/neural_net.png | Bin 24372 -> 0 bytes images/parse_tree.png | Bin 13655 -> 0 bytes images/perceptron.png | Bin 19756 -> 0 bytes images/pluralityLearner_plot.png | Bin 12658 -> 0 bytes images/point_crossover.png | Bin 5655 -> 0 bytes images/restaurant.png | Bin 175445 -> 0 bytes images/search_animal.svg | 1533 --------- images/sprinklernet.jpg | Bin 42865 -> 0 bytes images/uniform_crossover.png | Bin 5675 -> 0 bytes images/vacuum-icon.jpg | Bin 1428 -> 0 bytes images/vacuum.svg | 150 - images/wall-icon.jpg | Bin 35979 -> 0 bytes index.ipynb | 68 - intro.ipynb | 140 - ipyviews.py | 158 - js/canvas.js | 135 - js/continuousworld.js | 71 - js/gridworld.js | 126 - knowledge.ipynb | 677 ---- knowledge.py | 409 --- learning.ipynb | 1768 ---------- learning.py | 1224 ------- learning_apps.ipynb | 786 ----- logic.ipynb | 1450 -------- logic.py | 1127 ------- Queens/main.py => main.py | 16 +- mdp.ipynb | 2993 ----------------- mdp.py | 194 -- neural_nets.ipynb | 236 -- nlp.ipynb | 1042 ------ nlp.py | 558 --- nlp_apps.ipynb | 228 -- notebook.py | 888 ----- planning.ipynb | 354 -- planning.py | 864 ----- .../08board04752613.png | Bin .../08board05726314.png | Bin .../08board06357142.png | Bin .../08board06471352.png | Bin .../08board13572064.png | Bin .../08board14602753.png | Bin .../08board14630752.png | Bin .../08board15063724.png | Bin .../08board15720364.png | Bin .../08board16257403.png | Bin .../08board16470352.png | Bin .../08board17502463.png | Bin .../08board20647135.png | Bin .../08board24170635.png | Bin .../08board24175360.png | Bin .../08board24603175.png | Bin .../08board24730615.png | Bin .../08board25147063.png | Bin .../08board25160374.png | Bin .../08board25164073.png | Bin .../08board25307461.png | Bin .../08board25317460.png | Bin .../08board25703641.png | Bin .../08board25704613.png | Bin .../08board25713064.png | Bin .../08board26174035.png | Bin .../08board26175304.png | Bin .../08board27360514.png | Bin .../08board30471625.png | Bin .../08board30475261.png | Bin .../08board31475026.png | Bin .../08board31625704.png | Bin .../08board31625740.png | Bin .../08board31640752.png | Bin .../08board31746025.png | Bin .../08board31750246.png | Bin .../08board35041726.png | Bin .../08board35716024.png | Bin .../08board35720641.png | Bin .../08board36074152.png | Bin .../08board36271405.png | Bin .../08board36415027.png | Bin .../08board36420571.png | Bin .../08board37025164.png | Bin .../08board37046152.png | Bin .../08board37420615.png | Bin .../08board40357162.png | Bin .../08board40731625.png | Bin .../08board40752613.png | Bin .../08board41357206.png | Bin .../08board41362750.png | Bin .../08board41506372.png | Bin .../08board41703625.png | Bin .../08board42057136.png | Bin .../08board42061753.png | Bin .../08board42736051.png | Bin .../08board46027531.png | Bin .../08board46031752.png | Bin .../08board46137025.png | Bin .../08board46152037.png | Bin .../08board46152073.png | Bin .../08board46302751.png | Bin .../08board47302516.png | Bin .../08board47306152.png | Bin .../08board50417263.png | Bin .../08board51602473.png | Bin .../08board51603742.png | Bin .../08board52064713.png | Bin .../08board52073164.png | Bin .../08board52074136.png | Bin .../08board52460317.png | Bin .../08board52470316.png | Bin .../08board52613704.png | Bin .../08board52617403.png | Bin .../08board52630714.png | Bin .../08board53047162.png | Bin .../08board53174602.png | Bin .../08board53602417.png | Bin .../08board53607142.png | Bin .../08board57130642.png | Bin .../08board60275314.png | Bin .../08board61307425.png | Bin .../08board61520374.png | Bin .../08board62057413.png | Bin .../08board62714053.png | Bin .../08board63147025.png | Bin .../08board63175024.png | Bin .../08board64205713.png | Bin .../08board71306425.png | Bin .../08board71420635.png | Bin .../08board72051463.png | Bin .../08board73025164.png | Bin probability-4e.ipynb | 1381 -------- probability.ipynb | 1515 --------- probability.py | 717 ---- pytest.ini | 3 - rl.ipynb | 563 ---- rl.py | 203 -- sample_board.png | Bin 0 -> 429 bytes search-4e.ipynb | 2151 ------------ search.ipynb | 1885 ----------- search.py | 1324 -------- tests/__init__.py | 0 tests/pytest.ini | 3 - tests/test_agents.py | 119 - tests/test_csp.py | 380 --- tests/test_games.py | 62 - tests/test_knowledge.py | 284 -- tests/test_learning.py | 220 -- tests/test_logic.py | 319 -- tests/test_mdp.py | 41 - tests/test_nlp.py | 259 -- tests/test_planning.py | 147 - tests/test_probability.py | 277 -- tests/test_rl.py | 55 - tests/test_search.py | 237 -- tests/test_text.py | 296 -- tests/test_utils.py | 307 -- text.ipynb | 780 ----- text.py | 413 --- ...utility_measures.py => utility_measures.py | 0 utils.py | 795 ----- 193 files changed, 29 insertions(+), 39608 deletions(-) delete mode 100644 .flake8 delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 100644 .travis.yml rename Queens/Agents.py => Agents.py (98%) delete mode 100644 CONTRIBUTING.md rename Queens/Environment.py => Environment.py (97%) delete mode 100644 Our_vacuum.py rename Queens/Queens.ipynb => Queens.ipynb (100%) delete mode 100644 Queens/q8board01234567.jpg delete mode 100644 SUBMODULE.md rename Queens/Stats.py => Stats.py (98%) rename Queens/Table.py => Table.py (100%) rename Queens/__init__.py => __init__.py (100%) delete mode 100644 agents.ipynb delete mode 100644 agents.py delete mode 160000 aima-data delete mode 100644 csp.ipynb delete mode 100644 csp.py delete mode 100644 games.ipynb delete mode 100644 games.py delete mode 100644 gui/romania_problem.py delete mode 100644 gui/tic-tac-toe.py delete mode 100644 images/IMAGE-CREDITS delete mode 100644 images/aima3e_big.jpg delete mode 100644 images/aima_logo.png delete mode 100644 images/bayesnet.png delete mode 100644 images/decisiontree_fruit.jpg delete mode 100644 images/dirt.svg delete mode 100644 images/dirt05-icon.jpg delete mode 100644 images/fig_5_2.png delete mode 100644 images/knn_plot.png delete mode 100644 images/makefile delete mode 100644 images/mdp-a.png delete mode 100644 images/mdp.png delete mode 100644 images/neural_net.png delete mode 100644 images/parse_tree.png delete mode 100644 images/perceptron.png delete mode 100644 images/pluralityLearner_plot.png delete mode 100644 images/point_crossover.png delete mode 100644 images/restaurant.png delete mode 100644 images/search_animal.svg delete mode 100644 images/sprinklernet.jpg delete mode 100644 images/uniform_crossover.png delete mode 100644 images/vacuum-icon.jpg delete mode 100644 images/vacuum.svg delete mode 100644 images/wall-icon.jpg delete mode 100644 index.ipynb delete mode 100644 intro.ipynb delete mode 100644 ipyviews.py delete mode 100644 js/canvas.js delete mode 100644 js/continuousworld.js delete mode 100644 js/gridworld.js delete mode 100644 knowledge.ipynb delete mode 100644 knowledge.py delete mode 100644 learning.ipynb delete mode 100644 learning.py delete mode 100644 learning_apps.ipynb delete mode 100644 logic.ipynb delete mode 100644 logic.py rename Queens/main.py => main.py (73%) delete mode 100644 mdp.ipynb delete mode 100644 mdp.py delete mode 100644 neural_nets.ipynb delete mode 100644 nlp.ipynb delete mode 100644 nlp.py delete mode 100644 nlp_apps.ipynb delete mode 100644 notebook.py delete mode 100644 planning.ipynb delete mode 100644 planning.py rename Queens/plots/08board06471352.png => plots/08board04752613.png (100%) rename Queens/plots/08board06357142.png => plots/08board05726314.png (100%) rename Queens/plots/08board05726314.png => plots/08board06357142.png (100%) rename Queens/plots/08board04752613.png => plots/08board06471352.png (100%) rename Queens/plots/08board50417263.png => plots/08board13572064.png (100%) rename Queens/plots/08board30471625.png => plots/08board14602753.png (100%) rename Queens/plots/08board40731625.png => plots/08board14630752.png (100%) rename Queens/plots/08board20647135.png => plots/08board15063724.png (100%) rename Queens/plots/08board40357162.png => plots/08board15720364.png (100%) rename Queens/plots/08board60275314.png => plots/08board16257403.png (100%) rename Queens/plots/08board40752613.png => plots/08board16470352.png (100%) rename Queens/plots/08board30475261.png => plots/08board17502463.png (100%) rename Queens/plots/08board15063724.png => plots/08board20647135.png (100%) rename Queens/plots/08board42061753.png => plots/08board24170635.png (100%) rename Queens/plots/08board72051463.png => plots/08board24175360.png (100%) rename Queens/plots/08board35041726.png => plots/08board24603175.png (100%) rename Queens/plots/08board46031752.png => plots/08board24730615.png (100%) rename Queens/plots/08board52073164.png => plots/08board25147063.png (100%) rename Queens/plots/08board42057136.png => plots/08board25160374.png (100%) rename Queens/plots/08board52074136.png => plots/08board25164073.png (100%) rename Queens/plots/08board37025164.png => plots/08board25307461.png (100%) rename Queens/plots/08board73025164.png => plots/08board25317460.png (100%) rename Queens/plots/08board37046152.png => plots/08board25703641.png (100%) rename Queens/plots/08board36074152.png => plots/08board25704613.png (100%) rename Queens/plots/08board53047162.png => plots/08board25713064.png (100%) rename Queens/plots/08board52064713.png => plots/08board26174035.png (100%) rename Queens/plots/08board62057413.png => plots/08board26175304.png (100%) rename Queens/plots/08board46027531.png => plots/08board27360514.png (100%) rename Queens/plots/08board14602753.png => plots/08board30471625.png (100%) rename Queens/plots/08board17502463.png => plots/08board30475261.png (100%) rename Queens/plots/08board51602473.png => plots/08board31475026.png (100%) rename Queens/plots/08board61307425.png => plots/08board31625704.png (100%) rename Queens/plots/08board71306425.png => plots/08board31625740.png (100%) rename Queens/plots/08board41703625.png => plots/08board31640752.png (100%) rename Queens/plots/08board51603742.png => plots/08board31746025.png (100%) rename Queens/plots/08board41506372.png => plots/08board31750246.png (100%) rename Queens/plots/08board24603175.png => plots/08board35041726.png (100%) rename Queens/plots/08board53607142.png => plots/08board35716024.png (100%) rename Queens/plots/08board47306152.png => plots/08board35720641.png (100%) rename Queens/plots/08board25704613.png => plots/08board36074152.png (100%) rename Queens/plots/08board64205713.png => plots/08board36271405.png (100%) rename Queens/plots/08board53602417.png => plots/08board36415027.png (100%) rename Queens/plots/08board47302516.png => plots/08board36420571.png (100%) rename Queens/plots/08board25307461.png => plots/08board37025164.png (100%) rename Queens/plots/08board25703641.png => plots/08board37046152.png (100%) rename Queens/plots/08board46302751.png => plots/08board37420615.png (100%) rename Queens/plots/08board15720364.png => plots/08board40357162.png (100%) rename Queens/plots/08board14630752.png => plots/08board40731625.png (100%) rename Queens/plots/08board16470352.png => plots/08board40752613.png (100%) rename Queens/plots/08board61520374.png => plots/08board41357206.png (100%) rename Queens/plots/08board71420635.png => plots/08board41362750.png (100%) rename Queens/plots/08board31750246.png => plots/08board41506372.png (100%) rename Queens/plots/08board31640752.png => plots/08board41703625.png (100%) rename Queens/plots/08board25160374.png => plots/08board42057136.png (100%) rename Queens/plots/08board24170635.png => plots/08board42061753.png (100%) rename Queens/plots/08board57130642.png => plots/08board42736051.png (100%) rename Queens/plots/08board27360514.png => plots/08board46027531.png (100%) rename Queens/plots/08board24730615.png => plots/08board46031752.png (100%) rename Queens/plots/08board52630714.png => plots/08board46137025.png (100%) rename Queens/plots/08board52460317.png => plots/08board46152037.png (100%) rename Queens/plots/08board52470316.png => plots/08board46152073.png (100%) rename Queens/plots/08board37420615.png => plots/08board46302751.png (100%) rename Queens/plots/08board36420571.png => plots/08board47302516.png (100%) rename Queens/plots/08board35720641.png => plots/08board47306152.png (100%) rename Queens/plots/08board13572064.png => plots/08board50417263.png (100%) rename Queens/plots/08board31475026.png => plots/08board51602473.png (100%) rename Queens/plots/08board31746025.png => plots/08board51603742.png (100%) rename Queens/plots/08board26174035.png => plots/08board52064713.png (100%) rename Queens/plots/08board25147063.png => plots/08board52073164.png (100%) rename Queens/plots/08board25164073.png => plots/08board52074136.png (100%) rename Queens/plots/08board46152037.png => plots/08board52460317.png (100%) rename Queens/plots/08board46152073.png => plots/08board52470316.png (100%) rename Queens/plots/08board63147025.png => plots/08board52613704.png (100%) rename Queens/plots/08board63175024.png => plots/08board52617403.png (100%) rename Queens/plots/08board46137025.png => plots/08board52630714.png (100%) rename Queens/plots/08board25713064.png => plots/08board53047162.png (100%) rename Queens/plots/08board62714053.png => plots/08board53174602.png (100%) rename Queens/plots/08board36415027.png => plots/08board53602417.png (100%) rename Queens/plots/08board35716024.png => plots/08board53607142.png (100%) rename Queens/plots/08board42736051.png => plots/08board57130642.png (100%) rename Queens/plots/08board16257403.png => plots/08board60275314.png (100%) rename Queens/plots/08board31625704.png => plots/08board61307425.png (100%) rename Queens/plots/08board41357206.png => plots/08board61520374.png (100%) rename Queens/plots/08board26175304.png => plots/08board62057413.png (100%) rename Queens/plots/08board53174602.png => plots/08board62714053.png (100%) rename Queens/plots/08board52613704.png => plots/08board63147025.png (100%) rename Queens/plots/08board52617403.png => plots/08board63175024.png (100%) rename Queens/plots/08board36271405.png => plots/08board64205713.png (100%) rename Queens/plots/08board31625740.png => plots/08board71306425.png (100%) rename Queens/plots/08board41362750.png => plots/08board71420635.png (100%) rename Queens/plots/08board24175360.png => plots/08board72051463.png (100%) rename Queens/plots/08board25317460.png => plots/08board73025164.png (100%) delete mode 100644 probability-4e.ipynb delete mode 100644 probability.ipynb delete mode 100644 probability.py delete mode 100644 pytest.ini delete mode 100644 rl.ipynb delete mode 100644 rl.py create mode 100644 sample_board.png delete mode 100644 search-4e.ipynb delete mode 100644 search.ipynb delete mode 100644 search.py delete mode 100644 tests/__init__.py delete mode 100644 tests/pytest.ini delete mode 100644 tests/test_agents.py delete mode 100644 tests/test_csp.py delete mode 100644 tests/test_games.py delete mode 100644 tests/test_knowledge.py delete mode 100644 tests/test_learning.py delete mode 100644 tests/test_logic.py delete mode 100644 tests/test_mdp.py delete mode 100644 tests/test_nlp.py delete mode 100644 tests/test_planning.py delete mode 100644 tests/test_probability.py delete mode 100644 tests/test_rl.py delete mode 100644 tests/test_search.py delete mode 100644 tests/test_text.py delete mode 100644 tests/test_utils.py delete mode 100644 text.ipynb delete mode 100644 text.py rename Queens/utility_measures.py => utility_measures.py (100%) delete mode 100644 utils.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 688024601..000000000 --- a/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -max-line-length = 100 -ignore = E121,E123,E126,E221,E222,E225,E226,E242,E701,E702,E704,E731,W503,F405,F841 -exclude = tests diff --git a/.gitignore b/.gitignore deleted file mode 100644 index af3dab103..000000000 --- a/.gitignore +++ /dev/null @@ -1,73 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py - -# Flask instance folder -instance/ - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# IPython Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# dotenv -.env -.idea diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c1c16147f..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "aima-data"] - path = aima-data - url = https://github.com/aimacode/aima-data.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e0932e6b2..000000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: - - python - -python: - - "3.4" - -before_install: - - git submodule update --remote - -install: - - pip install six - - pip install flake8 - - pip install ipython - - pip install matplotlib - -script: - - py.test - - python -m doctest -v *.py - -after_success: - - flake8 --max-line-length 100 --ignore=E121,E123,E126,E221,E222,E225,E226,E242,E701,E702,E704,E731,W503 . - -notifications: - email: false diff --git a/Queens/Agents.py b/Agents.py similarity index 98% rename from Queens/Agents.py rename to Agents.py index c2825c1c1..636c5af34 100644 --- a/Queens/Agents.py +++ b/Agents.py @@ -1,4 +1,4 @@ -from Queens.utility_measures import * +from utility_measures import * def steepestAscentAgent(): diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c8a165a25..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,144 +0,0 @@ -How to Contribute to aima-python -========================== - -Thanks for considering contributing to `aima-python`! Whether you are an aspiring [Google Summer of Code](https://summerofcode.withgoogle.com/organizations/5663121491361792/) student, or an independent contributor, here is a guide on how you can help. - -First of all, you can read these write-ups from past GSoC students to get an idea on what you can do for the project. [Chipe1](https://github.com/aimacode/aima-python/issues/641) - [MrDupin](https://github.com/aimacode/aima-python/issues/632) - -In general, the main ways you can contribute to the repository are the following: - -1. Implement algorithms from the [list of algorithms](https://github.com/aimacode/aima-python/blob/master/README.md#index-of-algorithms). -1. Add tests for algorithms that are missing them (you can also add more tests to algorithms that already have some). -1. Take care of [issues](https://github.com/aimacode/aima-python/issues). -1. Write on the notebooks (`.ipynb` files). -1. Add and edit documentation (the docstrings in `.py` files). - -In more detail: - -## Read the Code and Start on an Issue - -- First, read and understand the code to get a feel for the extent and the style. -- Look at the [issues](https://github.com/aimacode/aima-python/issues) and pick one to work on. -- One of the issues is that some algorithms are missing from the [list of algorithms](https://github.com/aimacode/aima-python/blob/master/README.md#index-of-algorithms) and that some don't have tests. - -## Port to Python 3; Pythonic Idioms; py.test - -- Check for common problems in [porting to Python 3](http://python3porting.com/problems.html), such as: `print` is now a function; `range` and `map` and other functions no longer produce `list`s; objects of different types can no longer be compared with `<`; strings are now Unicode; it would be nice to move `%` string formating to `.format`; there is a new `next` function for generators; integer division now returns a float; we can now use set literals. -- Replace old Lisp-based idioms with proper Python idioms. For example, we have many functions that were taken directly from Common Lisp, such as the `every` function: `every(callable, items)` returns true if every element of `items` is callable. This is good Lisp style, but good Python style would be to use `all` and a generator expression: `all(callable(f) for f in items)`. Eventually, fix all calls to these legacy Lisp functions and then remove the functions. -- Add more tests in `test_*.py` files. Strive for terseness; it is ok to group multiple asserts into one `def test_something():` function. Move most tests to `test_*.py`, but it is fine to have a single `doctest` example in the docstring of a function in the `.py` file, if the purpose of the doctest is to explain how to use the function, rather than test the implementation. - -## New and Improved Algorithms - -- Implement functions that were in the third edition of the book but were not yet implemented in the code. Check the [list of pseudocode algorithms (pdf)](https://github.com/aimacode/pseudocode/blob/master/aima3e-algorithms.pdf) to see what's missing. -- As we finish chapters for the new fourth edition, we will share the new pseudocode in the [`aima-pseudocode`](https://github.com/aimacode/aima-pseudocode) repository, and describe what changes are necessary. -We hope to have an `algorithm-name.md` file for each algorithm, eventually; it would be great if contributors could add some for the existing algorithms. -- Give examples of how to use the code in the `.ipynb` files. - -We still support a legacy branch, `aima3python2` (for the third edition of the textbook and for Python 2 code). - -## Jupyter Notebooks - -In this project we use Jupyter/IPython Notebooks to showcase the algorithms in the book. They serve as short tutorials on what the algorithms do, how they are implemented and how one can use them. To install Jupyter, you can follow the instructions [here](https://jupyter.org/install.html). These are some ways you can contribute to the notebooks: - -- Proofread the notebooks for grammar mistakes, typos, or general errors. -- Move visualization and unrelated to the algorithm code from notebooks to `notebook.py` (a file used to store code for the notebooks, like visualization and other miscellaneous stuff). Make sure the notebooks still work and have their outputs showing! -- Replace the `%psource` magic notebook command with the function `psource` from `notebook.py` where needed. Examples where this is useful are a) when we want to show code for algorithm implementation and b) when we have consecutive cells with the magic keyword (in this case, if the code is large, it's best to leave the output hidden). -- Add the function `pseudocode(algorithm_name)` in algorithm sections. The function prints the pseudocode of the algorithm. You can see some example usage in [`knowledge.ipynb`](https://github.com/aimacode/aima-python/blob/master/knowledge.ipynb). -- Edit existing sections for algorithms to add more information and/or examples. -- Add visualizations for algorithms. The visualization code should go in `notebook.py` to keep things clean. -- Add new sections for algorithms not yet covered. The general format we use in the notebooks is the following: First start with an overview of the algorithm, printing the pseudocode and explaining how it works. Then, add some implementation details, including showing the code (using `psource`). Finally, add examples for the implementations, showing how the algorithms work. Don't fret with adding complex, real-world examples; the project is meant for educational purposes. You can of course choose another format if something better suits an algorithm. - -Apart from the notebooks explaining how the algorithms work, we also have notebooks showcasing some indicative applications of the algorithms. These notebooks are in the `*_apps.ipynb` format. We aim to have an `apps` notebook for each module, so if you don't see one for the module you would like to contribute to, feel free to create it from scratch! In these notebooks we are looking for applications showing what the algorithms can do. The general format of these sections is this: Add a description of the problem you are trying to solve, then explain how you are going to solve it and finally provide your solution with examples. Note that any code you write should not require any external libraries apart from the ones already provided (like `matplotlib`). - -# Style Guide - -There are a few style rules that are unique to this project: - -- The first rule is that the code should correspond directly to the pseudocode in the book. When possible this will be almost one-to-one, just allowing for the syntactic differences between Python and pseudocode, and for different library functions. -- Don't make a function more complicated than the pseudocode in the book, even if the complication would add a nice feature, or give an efficiency gain. Instead, remain faithful to the pseudocode, and if you must, add a new function (not in the book) with the added feature. -- I use functional programming (functions with no side effects) in many cases, but not exclusively (sometimes classes and/or functions with side effects are used). Let the book's pseudocode be the guide. - -Beyond the above rules, we use [Pep 8](https://www.python.org/dev/peps/pep-0008), with a few minor exceptions: - -- I have set `--max-line-length 100`, not 79. -- You don't need two spaces after a sentence-ending period. -- Strunk and White is [not a good guide for English](http://chronicle.com/article/50-Years-of-Stupid-Grammar/25497). -- I prefer more concise docstrings; I don't follow [Pep 257](https://www.python.org/dev/peps/pep-0257/). In most cases, -a one-line docstring suffices. It is rarely necessary to list what each argument does; the name of the argument usually is enough. -- Not all constants have to be UPPERCASE. -- At some point I may add [Pep 484](https://www.python.org/dev/peps/pep-0484/) type annotations, but I think I'll hold off for now; - I want to get more experience with them, and some people may still be in Python 3.4. - - -Contributing a Patch -==================== - -1. Submit an issue describing your proposed change to the repo in question (or work on an existing issue). -1. The repo owner will respond to your issue promptly. -1. Fork the desired repo, develop and test your code changes. -1. Submit a pull request. - -Reporting Issues -================ - -- Under which versions of Python does this happen? - -- Provide an example of the issue occuring. - -- Is anybody working on this? - -Patch Rules -=========== - -- Ensure that the patch is Python 3.4 compliant. - -- Include tests if your patch is supposed to solve a bug, and explain - clearly under which circumstances the bug happens. Make sure the test fails - without your patch. - -- Follow the style guidelines described above. - -Running the Test-Suite -===================== - -The minimal requirement for running the testsuite is ``py.test``. You can -install it with: - - pip install pytest - -Clone this repository: - - git clone https://github.com/aimacode/aima-python.git - -Fetch the aima-data submodule: - - cd aima-python - git submodule init - git submodule update - -Then you can run the testsuite from the `aima-python` or `tests` directory with: - - py.test - -# Choice of Programming Languages - -Are we right to concentrate on Java and Python versions of the code? I think so; both languages are popular; Java is -fast enough for our purposes, and has reasonable type declarations (but can be verbose); Python is popular and has a very direct mapping to the pseudocode in the book (but lacks type declarations and can be slow). The [TIOBE Index](http://www.tiobe.com/tiobe_index) says the top seven most popular languages, in order, are: - - Java, C, C++, C#, Python, PHP, Javascript - -So it might be reasonable to also support C++/C# at some point in the future. It might also be reasonable to support a language that combines the terse readability of Python with the type safety and speed of Java; perhaps Go or Julia. I see no reason to support PHP. Javascript is the language of the browser; it would be nice to have code that runs in the browser without need for any downloads; this would be in Javascript or a variant such as Typescript. - -There is also a `aima-lisp` project; in 1995 when we wrote the first edition of the book, Lisp was the right choice, but today it is less popular (currently #31 on the TIOBE index). - -What languages are instructors recommending for their AI class? To get an approximate idea, I gave the query [\[norvig russell "Modern Approach"\]](https://www.google.com/webhp#q=russell%20norvig%20%22modern%20approach%22%20java) along with the names of various languages and looked at the estimated counts of results on -various dates. However, I don't have much confidence in these figures... - -|Language |2004 |2005 |2007 |2010 |2016 | -|-------- |----: |----: |----: |----: |----: | -|[none](http://www.google.com/search?q=norvig+russell+%22Modern+Approach%22)|8,080|20,100|75,200|150,000|132,000| -|[java](http://www.google.com/search?q=java+norvig+russell+%22Modern+Approach%22)|1,990|4,930|44,200|37,000|50,000| -|[c++](http://www.google.com/search?q=c%2B%2B+norvig+russell+%22Modern+Approach%22)|875|1,820|35,300|105,000|35,000| -|[lisp](http://www.google.com/search?q=lisp+norvig+russell+%22Modern+Approach%22)|844|974|30,100|19,000|14,000| -|[prolog](http://www.google.com/search?q=prolog+norvig+russell+%22Modern+Approach%22)|789|2,010|23,200|17,000|16,000| -|[python](http://www.google.com/search?q=python+norvig+russell+%22Modern+Approach%22)|785|1,240|18,400|11,000|12,000| diff --git a/Queens/Environment.py b/Environment.py similarity index 97% rename from Queens/Environment.py rename to Environment.py index 6f928b414..76038678b 100644 --- a/Queens/Environment.py +++ b/Environment.py @@ -1,5 +1,5 @@ -from Queens.Table import Table -from Queens.Stats import StatsModule +from Table import Table +from Stats import StatsModule class QueensEnv: diff --git a/Our_vacuum.py b/Our_vacuum.py deleted file mode 100644 index 6cd8cf807..000000000 --- a/Our_vacuum.py +++ /dev/null @@ -1,34 +0,0 @@ -import agents -from agents import * - -from random import random -class VacuumEnvironment213(agents.TrivialVacuumEnvironment): - def percept(self, agent): - if random() < 0.9: - return super().percept(agent) - else: - print("Dirt sensor failed") - if self.status[agent.location] == "Dirty": - return (agent.location, "Clean") - else: - return (agent.location, "Dirty") - - def execute_action(self, agent, action): - if action is not "Suck" or random() < 0.75: - # everything is normal - super().execute_action(agent, action) - else: # Suck failed - print("Suck failed") - if self.status[agent.location] == "Clean": - print("Deposited dirt on a clean floor") - self.add_thing(Dirt(), agent.location) - -env = VacuumEnvironment213() -env.add_thing(agents.TraceAgent(agents.RandomVacuumAgent())) -env.run(100) - - -def OurVacuum(): - Env = TrivialVacuumEnvironment() - Env.add_thing(TraceAgent(RandomVacuumAgent())) - return Env diff --git a/Queens/Queens.ipynb b/Queens.ipynb similarity index 100% rename from Queens/Queens.ipynb rename to Queens.ipynb diff --git a/Queens/q8board01234567.jpg b/Queens/q8board01234567.jpg deleted file mode 100644 index f52e3f35a6f7c8d49479f60ac47d40ccd13f6252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|>x0ba4!+ znDh4LLC(VlBCL*@JN{3bE7s)tB*nH^oMT#jRdG*YU-!AspMuRQ@BU@n=l#H<@i9xE zu!SEM#*XCFPqT~T>aw%$9A-VvDWhI6=RhG7Rz~?68#B{?cH;Qds2AM16tm;dl^yNe zI4p#^<=wWO1+6PT7VBYk72Lr)_RrxCx5>>aIf%niQ1{yA>BW5P4_-{b)^jmCPR0^c b^^TXRK>Nj~nBzBrq0ivy>gTe~DWM4fqadZ{ diff --git a/README.md b/README.md index f66a5cb8d..3915e8e78 100644 --- a/README.md +++ b/README.md @@ -2,162 +2,32 @@

-# `aima-python` [![Build Status](https://travis-ci.org/aimacode/aima-python.svg?branch=master)](https://travis-ci.org/aimacode/aima-python) [![Binder](http://mybinder.org/badge.svg)](http://mybinder.org/repo/aimacode/aima-python) +Based on the book *[Artificial Intelligence: A Modern Approach](http://aima.cs.berkeley.edu),* and python repository provided. -Python code for the book *[Artificial Intelligence: A Modern Approach](http://aima.cs.berkeley.edu).* You can use this in conjunction with a course on AI, or for study on your own. We're looking for [solid contributors](https://github.com/aimacode/aima-python/blob/master/CONTRIBUTING.md) to help. - +## Structure of the Project + - [main.py](./main.py) - main file to be run from command prompt -## Structure of the Project + - [QueensEnv](./Environment.py)(ironment): + - [Table](./Table.py) - wrapper class to hold agent, it's board and performance measure + - [Statistics Module](./Stats.py) - gathers all statistical information about current run + - [Agents](./Agents.py) - contains definitions of generator objects. Those are function-like creatures which remember their internal state and return a new value + every time .send() is called. Initialisation is done with .send(None), in this case used to print agent's name. + This structure is meant to represent functional nature of agent, as proposed in the book/original repo. May be changed as desired. + - [Utility Measures](./utility_measures.py) - implementation of utility function used by all agents so far, i.e. the number of + pairs which check each other. -When complete, this project will have Python implementations for all the pseudocode algorithms in the book, as well as tests and examples of use. For each major topic, such as `nlp` (natural language processing), we provide the following files: +## Encoding system and plotting -- `nlp.py`: Implementations of all the pseudocode algorithms, and necessary support functions/classes/data. -- `tests/test_nlp.py`: A lightweight test suite, using `assert` statements, designed for use with [`py.test`](http://pytest.org/latest/), but also usable on their own. -- `nlp.ipynb`: A Jupyter (IPython) notebook that explains and gives examples of how to use the code. -- `nlp_apps.ipynb`: A Jupyter notebook that gives example applications of the code. +A board with 8 queens on it is encoded by their y coordinates, assuming there is exactly one queen in each column. Simple plot utility plot_board() +is provided in [StatsModule.py](./StatsModule.py). For example, board encoded as +\[0,1,2,3,4,5,7,7\] will render to: +![sample_board.png][./sample_board.png] ## Python 3.4 and up This code requires Python 3.4 or later, and does not run in Python 2. You can [install Python](https://www.python.org/downloads) or use a browser-based Python interpreter such as [repl.it](https://repl.it/languages/python3). You can run the code in an IDE, or from the command line with `python -i filename.py` where the `-i` option puts you in an interactive loop where you can run Python functions. See [jupyter.org](http://jupyter.org/) for instructions on setting up your own Jupyter notebook environment, or run the notebooks online with [try.jupiter.org](https://try.jupyter.org/). -# Index of Algorithms - -Here is a table of algorithms, the figure, name of the algorithm in the book and in the repository, and the file where they are implemented in the repository. This chart was made for the third edition of the book and is being updated for the upcoming fourth edition. Empty implementations are a good place for contributors to look for an issue. The [aima-pseudocode](https://github.com/aimacode/aima-pseudocode) project describes all the algorithms from the book. An asterisk next to the file name denotes the algorithm is not fully implemented. Another great place for contributors to start is by adding tests and writing on the notebooks. You can see which algorithms have tests and notebook sections below. If the algorithm you want to work on is covered, don't worry! You can still add more tests and provide some examples of use in the notebook! - -| **Figure** | **Name (in 3rd edition)** | **Name (in repository)** | **File** | **Tests** | **Notebook** -|:-------|:----------------------------------|:------------------------------|:--------------------------------|:-----|:---------| -| 2 | Random-Vacuum-Agent | `RandomVacuumAgent` | [`agents.py`][agents] | Done | | -| 2 | Model-Based-Vacuum-Agent | `ModelBasedVacuumAgent` | [`agents.py`][agents] | Done | | -| 2.1 | Environment | `Environment` | [`agents.py`][agents] | Done | Included | -| 2.1 | Agent | `Agent` | [`agents.py`][agents] | Done | Included | -| 2.3 | Table-Driven-Vacuum-Agent | `TableDrivenVacuumAgent` | [`agents.py`][agents] | | | -| 2.7 | Table-Driven-Agent | `TableDrivenAgent` | [`agents.py`][agents] | | | -| 2.8 | Reflex-Vacuum-Agent | `ReflexVacuumAgent` | [`agents.py`][agents] | Done | | -| 2.10 | Simple-Reflex-Agent | `SimpleReflexAgent` | [`agents.py`][agents] | | | -| 2.12 | Model-Based-Reflex-Agent | `ReflexAgentWithState` | [`agents.py`][agents] | | | -| 3 | Problem | `Problem` | [`search.py`][search] | Done | | -| 3 | Node | `Node` | [`search.py`][search] | Done | | -| 3 | Queue | `Queue` | [`utils.py`][utils] | Done | | -| 3.1 | Simple-Problem-Solving-Agent | `SimpleProblemSolvingAgent` | [`search.py`][search] | | | -| 3.2 | Romania | `romania` | [`search.py`][search] | Done | Included | -| 3.7 | Tree-Search | `tree_search` | [`search.py`][search] | Done | | -| 3.7 | Graph-Search | `graph_search` | [`search.py`][search] | Done | | -| 3.11 | Breadth-First-Search | `breadth_first_search` | [`search.py`][search] | Done | Included | -| 3.14 | Uniform-Cost-Search | `uniform_cost_search` | [`search.py`][search] | Done | Included | -| 3.17 | Depth-Limited-Search | `depth_limited_search` | [`search.py`][search] | Done | | -| 3.18 | Iterative-Deepening-Search | `iterative_deepening_search` | [`search.py`][search] | Done | | -| 3.22 | Best-First-Search | `best_first_graph_search` | [`search.py`][search] | Done | | -| 3.24 | A\*-Search | `astar_search` | [`search.py`][search] | Done | Included | -| 3.26 | Recursive-Best-First-Search | `recursive_best_first_search` | [`search.py`][search] | Done | | -| 4.2 | Hill-Climbing | `hill_climbing` | [`search.py`][search] | Done | | -| 4.5 | Simulated-Annealing | `simulated_annealing` | [`search.py`][search] | Done | | -| 4.8 | Genetic-Algorithm | `genetic_algorithm` | [`search.py`][search] | Done | Included | -| 4.11 | And-Or-Graph-Search | `and_or_graph_search` | [`search.py`][search] | Done | | -| 4.21 | Online-DFS-Agent | `online_dfs_agent` | [`search.py`][search] | | | -| 4.24 | LRTA\*-Agent | `LRTAStarAgent` | [`search.py`][search] | Done | | -| 5.3 | Minimax-Decision | `minimax_decision` | [`games.py`][games] | Done | Included | -| 5.7 | Alpha-Beta-Search | `alphabeta_search` | [`games.py`][games] | Done | Included | -| 6 | CSP | `CSP` | [`csp.py`][csp] | Done | Included | -| 6.3 | AC-3 | `AC3` | [`csp.py`][csp] | Done | | -| 6.5 | Backtracking-Search | `backtracking_search` | [`csp.py`][csp] | Done | Included | -| 6.8 | Min-Conflicts | `min_conflicts` | [`csp.py`][csp] | Done | | -| 6.11 | Tree-CSP-Solver | `tree_csp_solver` | [`csp.py`][csp] | Done | Included | -| 7 | KB | `KB` | [`logic.py`][logic] | Done | Included | -| 7.1 | KB-Agent | `KB_Agent` | [`logic.py`][logic] | Done | | -| 7.7 | Propositional Logic Sentence | `Expr` | [`logic.py`][logic] | Done | | -| 7.10 | TT-Entails | `tt_entails` | [`logic.py`][logic] | Done | | -| 7.12 | PL-Resolution | `pl_resolution` | [`logic.py`][logic] | Done | Included | -| 7.14 | Convert to CNF | `to_cnf` | [`logic.py`][logic] | Done | | -| 7.15 | PL-FC-Entails? | `pl_fc_resolution` | [`logic.py`][logic] | Done | | -| 7.17 | DPLL-Satisfiable? | `dpll_satisfiable` | [`logic.py`][logic] | Done | | -| 7.18 | WalkSAT | `WalkSAT` | [`logic.py`][logic] | Done | | -| 7.20 | Hybrid-Wumpus-Agent | `HybridWumpusAgent` | | | | -| 7.22 | SATPlan | `SAT_plan` | [`logic.py`][logic] | Done | | -| 9 | Subst | `subst` | [`logic.py`][logic] | Done | | -| 9.1 | Unify | `unify` | [`logic.py`][logic] | Done | Included | -| 9.3 | FOL-FC-Ask | `fol_fc_ask` | [`logic.py`][logic] | Done | | -| 9.6 | FOL-BC-Ask | `fol_bc_ask` | [`logic.py`][logic] | Done | | -| 9.8 | Append | | | | | -| 10.1 | Air-Cargo-problem | `air_cargo` | [`planning.py`][planning] | Done | | -| 10.2 | Spare-Tire-Problem | `spare_tire` | [`planning.py`][planning] | Done | | -| 10.3 | Three-Block-Tower | `three_block_tower` | [`planning.py`][planning] | Done | | -| 10.7 | Cake-Problem | `have_cake_and_eat_cake_too` | [`planning.py`][planning] | Done | | -| 10.9 | Graphplan | `GraphPlan` | [`planning.py`][planning] | | | -| 10.13 | Partial-Order-Planner | | | | | -| 11.1 | Job-Shop-Problem-With-Resources | `job_shop_problem` | [`planning.py`][planning] | Done | | -| 11.5 | Hierarchical-Search | `hierarchical_search` | [`planning.py`][planning] | | | -| 11.8 | Angelic-Search | | | | | -| 11.10 | Doubles-tennis | `double_tennis_problem` | [`planning.py`][planning] | | | -| 13 | Discrete Probability Distribution | `ProbDist` | [`probability.py`][probability] | Done | Included | -| 13.1 | DT-Agent | `DTAgent` | [`probability.py`][probability] | | | -| 14.9 | Enumeration-Ask | `enumeration_ask` | [`probability.py`][probability] | Done | Included | -| 14.11 | Elimination-Ask | `elimination_ask` | [`probability.py`][probability] | Done | Included | -| 14.13 | Prior-Sample | `prior_sample` | [`probability.py`][probability] | | Included | -| 14.14 | Rejection-Sampling | `rejection_sampling` | [`probability.py`][probability] | Done | Included | -| 14.15 | Likelihood-Weighting | `likelihood_weighting` | [`probability.py`][probability] | Done | Included | -| 14.16 | Gibbs-Ask | `gibbs_ask` | [`probability.py`][probability] | Done | Included | -| 15.4 | Forward-Backward | `forward_backward` | [`probability.py`][probability] | Done | | -| 15.6 | Fixed-Lag-Smoothing | `fixed_lag_smoothing` | [`probability.py`][probability] | Done | | -| 15.17 | Particle-Filtering | `particle_filtering` | [`probability.py`][probability] | Done | | -| 16.9 | Information-Gathering-Agent | | | | | -| 17.4 | Value-Iteration | `value_iteration` | [`mdp.py`][mdp] | Done | Included | -| 17.7 | Policy-Iteration | `policy_iteration` | [`mdp.py`][mdp] | Done | | -| 17.9 | POMDP-Value-Iteration | | | | | -| 18.5 | Decision-Tree-Learning | `DecisionTreeLearner` | [`learning.py`][learning] | Done | Included | -| 18.8 | Cross-Validation | `cross_validation` | [`learning.py`][learning] | | | -| 18.11 | Decision-List-Learning | `DecisionListLearner` | [`learning.py`][learning]\* | | | -| 18.24 | Back-Prop-Learning | `BackPropagationLearner` | [`learning.py`][learning] | Done | Included | -| 18.34 | AdaBoost | `AdaBoost` | [`learning.py`][learning] | | | -| 19.2 | Current-Best-Learning | `current_best_learning` | [`knowledge.py`](knowledge.py) | Done | Included | -| 19.3 | Version-Space-Learning | `version_space_learning` | [`knowledge.py`](knowledge.py) | Done | Included | -| 19.8 | Minimal-Consistent-Det | `minimal_consistent_det` | [`knowledge.py`](knowledge.py) | Done | | -| 19.12 | FOIL | `FOIL_container` | [`knowledge.py`](knowledge.py) | Done | | -| 21.2 | Passive-ADP-Agent | `PassiveADPAgent` | [`rl.py`][rl] | Done | | -| 21.4 | Passive-TD-Agent | `PassiveTDAgent` | [`rl.py`][rl] | Done | Included | -| 21.8 | Q-Learning-Agent | `QLearningAgent` | [`rl.py`][rl] | Done | Included | -| 22.1 | HITS | `HITS` | [`nlp.py`][nlp] | Done | Included | -| 23 | Chart-Parse | `Chart` | [`nlp.py`][nlp] | Done | Included | -| 23.5 | CYK-Parse | `CYK_parse` | [`nlp.py`][nlp] | Done | Included | -| 25.9 | Monte-Carlo-Localization | `monte_carlo_localization` | [`probability.py`][probability] | Done | | - - -# Index of data structures - -Here is a table of the implemented data structures, the figure, name of the implementation in the repository, and the file where they are implemented. - -| **Figure** | **Name (in repository)** | **File** | -|:-------|:--------------------------------|:--------------------------| -| 3.2 | romania_map | [`search.py`][search] | -| 4.9 | vacumm_world | [`search.py`][search] | -| 4.23 | one_dim_state_space | [`search.py`][search] | -| 6.1 | australia_map | [`search.py`][search] | -| 7.13 | wumpus_world_inference | [`logic.py`][logic] | -| 7.16 | horn_clauses_KB | [`logic.py`][logic] | -| 17.1 | sequential_decision_environment | [`mdp.py`][mdp] | -| 18.2 | waiting_decision_tree | [`learning.py`][learning] | - - -# Acknowledgements - -Many thanks for contributions over the years. I got bug reports, corrected code, and other support from Darius Bacon, Phil Ruggera, Peng Shao, Amit Patil, Ted Nienstedt, Jim Martin, Ben Catanzariti, and others. Now that the project is on GitHub, you can see the [contributors](https://github.com/aimacode/aima-python/graphs/contributors) who are doing a great job of actively improving the project. Many thanks to all contributors, especially @darius, @SnShine, @reachtarunhere, @MrDupin, and @Chipe1. - - -[agents]:../master/agents.py -[csp]:../master/csp.py -[games]:../master/games.py -[grid]:../master/grid.py -[knowledge]:../master/knowledge.py -[learning]:../master/learning.py -[logic]:../master/logic.py -[mdp]:../master/mdp.py -[nlp]:../master/nlp.py -[planning]:../master/planning.py -[probability]:../master/probability.py -[rl]:../master/rl.py -[search]:../master/search.py -[utils]:../master/utils.py -[text]:../master/text.py diff --git a/SUBMODULE.md b/SUBMODULE.md deleted file mode 100644 index b9048ea4c..000000000 --- a/SUBMODULE.md +++ /dev/null @@ -1,11 +0,0 @@ -This is a guide on how to update the `aima-data` submodule. This needs to be done every time something changes in the [aima-data](https://github.com/aimacode/aima-data) repository. All the below commands should be executed from the local directory of the `aima-python` repository, using `git`. - -``` -git submodule deinit aima-data -git rm aima-data -git submodule add https://github.com/aimacode/aima-data.git aima-data -git commit -git push origin -``` - -Then you need to pull request the changes (unless you are a collaborator, in which case you can commit directly to the master). diff --git a/Queens/Stats.py b/Stats.py similarity index 98% rename from Queens/Stats.py rename to Stats.py index 33b5fa359..bd3249fa4 100644 --- a/Queens/Stats.py +++ b/Stats.py @@ -59,8 +59,8 @@ def print_table_stats(self, table): def plot_board(self, board): q = len(board) im = np.zeros((q, q)) - for i in board: - im[i, board[i]] = 1 + for i in range(q): + im[board[i], i] = 1 dpp = 15 im = np.repeat(np.repeat(im, dpp, axis=0), dpp, axis=1) num = "".join(map(lambda k: str(k), board)) diff --git a/Queens/Table.py b/Table.py similarity index 100% rename from Queens/Table.py rename to Table.py diff --git a/Queens/__init__.py b/__init__.py similarity index 100% rename from Queens/__init__.py rename to __init__.py diff --git a/agents.ipynb b/agents.ipynb deleted file mode 100644 index 6c547ee6c..000000000 --- a/agents.ipynb +++ /dev/null @@ -1,1260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# AGENT #\n", - "\n", - "An agent, as defined in 2.1 is anything that can perceive its environment through sensors, and act upon that environment through actuators based on its agent program. This can be a dog, robot, or even you. As long as you can perceive the environment and act on it, you are an agent. This notebook will explain how to implement a simple agent, create an environment, and create a program that helps the agent act on the environment based on its percepts.\n", - "\n", - "Before moving on, review the Agent and Environment classes in [agents.py](https://github.com/aimacode/aima-python/blob/master/agents.py).\n", - "\n", - "Let's begin by importing all the functions from the agents.py module and creating our first agent - a blind dog." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from agents import *\n", - "\n", - "class BlindDog(Agent):\n", - " def eat(self, thing):\n", - " print(\"Dog: Ate food at {}.\".format(self.location))\n", - " \n", - " def drink(self, thing):\n", - " print(\"Dog: Drank water at {}.\".format( self.location))\n", - "\n", - "dog = BlindDog()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What we have just done is create a dog who can only feel what's in his location (since he's blind), and can eat or drink. Let's see if he's alive..." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print(dog.alive)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Cool dog](https://gifgun.files.wordpress.com/2015/07/wpid-wp-1435860392895.gif)\n", - "This is our dog. How cool is he? Well, he's hungry and needs to go search for food. For him to do this, we need to give him a program. But before that, let's create a park for our dog to play in." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ENVIRONMENT #\n", - "\n", - "A park is an example of an environment because our dog can perceive and act upon it. The Environment class in agents.py is an abstract class, so we will have to create our own subclass from it before we can use it. The abstract class must contain the following methods:\n", - "\n", - "
  • percept(self, agent) - returns what the agent perceives
  • \n", - "
  • execute_action(self, agent, action) - changes the state of the environment based on what the agent does.
  • " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "class Food(Thing):\n", - " pass\n", - "\n", - "class Water(Thing):\n", - " pass\n", - "\n", - "class Park(Environment):\n", - " def percept(self, agent):\n", - " '''prints & return a list of things that are in our agent's location'''\n", - " things = self.list_things_at(agent.location)\n", - " return things\n", - " \n", - " def execute_action(self, agent, action):\n", - " '''changes the state of the environment based on what the agent does.'''\n", - " if action == \"move down\":\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.movedown()\n", - " elif action == \"eat\":\n", - " items = self.list_things_at(agent.location, tclass=Food)\n", - " if len(items) != 0:\n", - " if agent.eat(items[0]): #Have the dog eat the first item\n", - " print('{} ate {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0]) #Delete it from the Park after.\n", - " elif action == \"drink\":\n", - " items = self.list_things_at(agent.location, tclass=Water)\n", - " if len(items) != 0:\n", - " if agent.drink(items[0]): #Have the dog drink the first item\n", - " print('{} drank {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0]) #Delete it from the Park after.\n", - "\n", - " def is_done(self):\n", - " '''By default, we're done when we can't find a live agent, \n", - " but to prevent killing our cute dog, we will stop before itself - when there is no more food or water'''\n", - " no_edibles = not any(isinstance(thing, Food) or isinstance(thing, Water) for thing in self.things)\n", - " dead_agents = not any(agent.is_alive() for agent in self.agents)\n", - " return dead_agents or no_edibles\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# PROGRAM - BlindDog #\n", - "Now that we have a Park Class, we need to implement a program module for our dog. A program controls how the dog acts upon it's environment. Our program will be very simple, and is shown in the table below.\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Percept: Feel Food Feel WaterFeel Nothing
    Action: eatdrinkmove down
    \n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class BlindDog(Agent):\n", - " location = 1\n", - " \n", - " def movedown(self):\n", - " self.location += 1\n", - " \n", - " def eat(self, thing):\n", - " '''returns True upon success or False otherwise'''\n", - " if isinstance(thing, Food):\n", - " #print(\"Dog: Ate food at {}.\".format(self.location))\n", - " return True\n", - " return False\n", - " \n", - " def drink(self, thing):\n", - " ''' returns True upon success or False otherwise'''\n", - " if isinstance(thing, Water):\n", - " #print(\"Dog: Drank water at {}.\".format(self.location))\n", - " return True\n", - " return False\n", - " \n", - "def program(percepts):\n", - " '''Returns an action based on it's percepts'''\n", - " for p in percepts:\n", - " if isinstance(p, Food):\n", - " return 'eat'\n", - " elif isinstance(p, Water):\n", - " return 'drink'\n", - " return 'move down'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's now run our simulation by creating a park with some food, water, and our dog." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BlindDog decided to move down at location: 1\n", - "BlindDog decided to move down at location: 2\n", - "BlindDog decided to move down at location: 3\n", - "BlindDog decided to move down at location: 4\n", - "BlindDog ate Food at location: 5\n" - ] - } - ], - "source": [ - "park = Park()\n", - "dog = BlindDog(program)\n", - "dogfood = Food()\n", - "water = Water()\n", - "park.add_thing(dog, 1)\n", - "park.add_thing(dogfood, 5)\n", - "park.add_thing(water, 7)\n", - "\n", - "park.run(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that the dog moved from location 1 to 4, over 4 steps, and ate food at location 5 in the 5th step.\n", - "\n", - "Let's continue this simulation for 5 more steps." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BlindDog decided to move down at location: 5\n", - "BlindDog decided to move down at location: 6\n", - "BlindDog drank Water at location: 7\n" - ] - } - ], - "source": [ - "park.run(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perfect! Note how the simulation stopped after the dog drank the water - exhausting all the food and water ends our simulation, as we had defined before. Let's add some more water and see if our dog can reach it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BlindDog decided to move down at location: 7\n", - "BlindDog decided to move down at location: 8\n", - "BlindDog decided to move down at location: 9\n", - "BlindDog decided to move down at location: 10\n", - "BlindDog decided to move down at location: 11\n", - "BlindDog decided to move down at location: 12\n", - "BlindDog decided to move down at location: 13\n", - "BlindDog decided to move down at location: 14\n", - "BlindDog drank Water at location: 15\n" - ] - } - ], - "source": [ - "park.add_thing(water, 15)\n", - "park.run(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is how to implement an agent, its program, and environment. However, this was a very simple case. Let's try a 2-Dimentional environment now with multiple agents.\n", - "\n", - "\n", - "# 2D Environment #\n", - "To make our Park 2D, we will need to make it a subclass of XYEnvironment instead of Environment. Please note that our park is indexed in the 4th quadrant of the X-Y plane.\n", - "\n", - "We will also eventually add a person to pet the dog." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Park2D(XYEnvironment):\n", - " def percept(self, agent):\n", - " '''prints & return a list of things that are in our agent's location'''\n", - " things = self.list_things_at(agent.location)\n", - " return things\n", - " \n", - " def execute_action(self, agent, action):\n", - " '''changes the state of the environment based on what the agent does.'''\n", - " if action == \"move down\":\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.movedown()\n", - " elif action == \"eat\":\n", - " items = self.list_things_at(agent.location, tclass=Food)\n", - " if len(items) != 0:\n", - " if agent.eat(items[0]): #Have the dog eat the first item\n", - " print('{} ate {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0]) #Delete it from the Park after.\n", - " elif action == \"drink\":\n", - " items = self.list_things_at(agent.location, tclass=Water)\n", - " if len(items) != 0:\n", - " if agent.drink(items[0]): #Have the dog drink the first item\n", - " print('{} drank {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0]) #Delete it from the Park after.\n", - " \n", - " def is_done(self):\n", - " '''By default, we're done when we can't find a live agent, \n", - " but to prevent killing our cute dog, we will stop before itself - when there is no more food or water'''\n", - " no_edibles = not any(isinstance(thing, Food) or isinstance(thing, Water) for thing in self.things)\n", - " dead_agents = not any(agent.is_alive() for agent in self.agents)\n", - " return dead_agents or no_edibles\n", - "\n", - "class BlindDog(Agent):\n", - " location = [0,1] # change location to a 2d value\n", - " direction = Direction(\"down\") # variable to store the direction our dog is facing\n", - " \n", - " def movedown(self):\n", - " self.location[1] += 1\n", - " \n", - " def eat(self, thing):\n", - " '''returns True upon success or False otherwise'''\n", - " if isinstance(thing, Food):\n", - " return True\n", - " return False\n", - " \n", - " def drink(self, thing):\n", - " ''' returns True upon success or False otherwise'''\n", - " if isinstance(thing, Water):\n", - " return True\n", - " return False\n", - " \n", - "def program(percepts):\n", - " '''Returns an action based on it's percepts'''\n", - " for p in percepts:\n", - " if isinstance(p, Food):\n", - " return 'eat'\n", - " elif isinstance(p, Water):\n", - " return 'drink'\n", - " return 'move down'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's test this new park with our same dog, food and water" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BlindDog decided to move down at location: [0, 1]\n", - "BlindDog decided to move down at location: [0, 2]\n", - "BlindDog decided to move down at location: [0, 3]\n", - "BlindDog decided to move down at location: [0, 4]\n", - "BlindDog ate Food at location: [0, 5]\n", - "BlindDog decided to move down at location: [0, 5]\n", - "BlindDog decided to move down at location: [0, 6]\n", - "BlindDog drank Water at location: [0, 7]\n", - "BlindDog decided to move down at location: [0, 7]\n", - "BlindDog decided to move down at location: [0, 8]\n", - "BlindDog decided to move down at location: [0, 9]\n", - "BlindDog decided to move down at location: [0, 10]\n", - "BlindDog decided to move down at location: [0, 11]\n", - "BlindDog decided to move down at location: [0, 12]\n", - "BlindDog decided to move down at location: [0, 13]\n", - "BlindDog decided to move down at location: [0, 14]\n", - "BlindDog drank Water at location: [0, 15]\n" - ] - } - ], - "source": [ - "park = Park2D(5,20) # park width is set to 5, and height to 20\n", - "dog = BlindDog(program)\n", - "dogfood = Food()\n", - "water = Water()\n", - "park.add_thing(dog, [0,1])\n", - "park.add_thing(dogfood, [0,5])\n", - "park.add_thing(water, [0,7])\n", - "morewater = Water()\n", - "park.add_thing(morewater, [0,15])\n", - "park.run(20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This works, but our blind dog doesn't make any use of the 2 dimensional space available to him. Let's make our dog more energetic so that he turns and moves forward, instead of always moving down. We'll also need to make appropriate changes to our environment to be able to handle this extra motion.\n", - "\n", - "# PROGRAM - EnergeticBlindDog #\n", - "\n", - "Let's make our dog turn or move forwards at random - except when he's at the edge of our park - in which case we make him change his direction explicitly by turning to avoid trying to leave the park. Our dog is blind, however, so he wouldn't know which way to turn - he'd just have to try arbitrarily.\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Percept: Feel Food Feel WaterFeel Nothing
    Action: eatdrink\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Remember being at Edge : At EdgeNot at Edge
    Action : Turn Left / Turn Right
    ( 50% - 50% chance )
    Turn Left / Turn Right / Move Forward
    ( 25% - 25% - 50% chance )
    \n", - "
    " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from random import choice\n", - "\n", - "turn = False # global variable to remember to turn if our dog hits the boundary\n", - "class EnergeticBlindDog(Agent):\n", - " location = [0,1]\n", - " direction = Direction(\"down\")\n", - " \n", - " def moveforward(self, success=True):\n", - " '''moveforward possible only if success (ie valid destination location)'''\n", - " global turn\n", - " if not success:\n", - " turn = True # if edge has been reached, remember to turn\n", - " return\n", - " if self.direction.direction == Direction.R:\n", - " self.location[0] += 1\n", - " elif self.direction.direction == Direction.L:\n", - " self.location[0] -= 1\n", - " elif self.direction.direction == Direction.D:\n", - " self.location[1] += 1\n", - " elif self.direction.direction == Direction.U:\n", - " self.location[1] -= 1\n", - " \n", - " def turn(self, d):\n", - " self.direction = self.direction + d\n", - " \n", - " def eat(self, thing):\n", - " '''returns True upon success or False otherwise'''\n", - " if isinstance(thing, Food):\n", - " #print(\"Dog: Ate food at {}.\".format(self.location))\n", - " return True\n", - " return False\n", - " \n", - " def drink(self, thing):\n", - " ''' returns True upon success or False otherwise'''\n", - " if isinstance(thing, Water):\n", - " #print(\"Dog: Drank water at {}.\".format(self.location))\n", - " return True\n", - " return False\n", - " \n", - "def program(percepts):\n", - " '''Returns an action based on it's percepts'''\n", - " global turn\n", - " for p in percepts: # first eat or drink - you're a dog!\n", - " if isinstance(p, Food):\n", - " return 'eat'\n", - " elif isinstance(p, Water):\n", - " return 'drink'\n", - " if turn: # then recall if you were at an edge and had to turn\n", - " turn = False\n", - " choice = random.choice((1,2));\n", - " else:\n", - " choice = random.choice((1,2,3,4)) # 1-right, 2-left, others-forward\n", - " if choice == 1:\n", - " return 'turnright'\n", - " elif choice == 2:\n", - " return 'turnleft'\n", - " else:\n", - " return 'moveforward'\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also need to modify our park accordingly, in order to be able to handle all the new actions our dog wishes to execute. Additionally, we'll need to prevent our dog from moving to locations beyond our park boundary - it just isn't safe for blind dogs to be outside the park by themselves." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Park2D(XYEnvironment):\n", - " def percept(self, agent):\n", - " '''prints & return a list of things that are in our agent's location'''\n", - " things = self.list_things_at(agent.location)\n", - " return things\n", - " \n", - " def execute_action(self, agent, action):\n", - " '''changes the state of the environment based on what the agent does.'''\n", - " if action == 'turnright':\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.turn(Direction.R)\n", - " #print('now facing {}'.format(agent.direction.direction))\n", - " elif action == 'turnleft':\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.turn(Direction.L)\n", - " #print('now facing {}'.format(agent.direction.direction))\n", - " elif action == 'moveforward':\n", - " loc = copy.deepcopy(agent.location) # find out the target location\n", - " if agent.direction.direction == Direction.R:\n", - " loc[0] += 1\n", - " elif agent.direction.direction == Direction.L:\n", - " loc[0] -= 1\n", - " elif agent.direction.direction == Direction.D:\n", - " loc[1] += 1\n", - " elif agent.direction.direction == Direction.U:\n", - " loc[1] -= 1\n", - " #print('{} at {} facing {}'.format(agent, loc, agent.direction.direction))\n", - " if self.is_inbounds(loc):# move only if the target is a valid location\n", - " print('{} decided to move {}wards at location: {}'.format(str(agent)[1:-1], agent.direction.direction, agent.location))\n", - " agent.moveforward()\n", - " else:\n", - " print('{} decided to move {}wards at location: {}, but couldnt'.format(str(agent)[1:-1], agent.direction.direction, agent.location))\n", - " agent.moveforward(False)\n", - " elif action == \"eat\":\n", - " items = self.list_things_at(agent.location, tclass=Food)\n", - " if len(items) != 0:\n", - " if agent.eat(items[0]):\n", - " print('{} ate {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0])\n", - " elif action == \"drink\":\n", - " items = self.list_things_at(agent.location, tclass=Water)\n", - " if len(items) != 0:\n", - " if agent.drink(items[0]):\n", - " print('{} drank {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0])\n", - " \n", - " def is_done(self):\n", - " '''By default, we're done when we can't find a live agent, \n", - " but to prevent killing our cute dog, we will stop before itself - when there is no more food or water'''\n", - " no_edibles = not any(isinstance(thing, Food) or isinstance(thing, Water) for thing in self.things)\n", - " dead_agents = not any(agent.is_alive() for agent in self.agents)\n", - " return dead_agents or no_edibles\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dog started at [0,0], facing down. Lets see if he found any food or water!\n", - "EnergeticBlindDog decided to move downwards at location: [0, 0]\n", - "EnergeticBlindDog decided to move downwards at location: [0, 1]\n", - "EnergeticBlindDog drank Water at location: [0, 2]\n", - "EnergeticBlindDog decided to turnright at location: [0, 2]\n", - "EnergeticBlindDog decided to move leftwards at location: [0, 2], but couldnt\n", - "EnergeticBlindDog decided to turnright at location: [0, 2]\n", - "EnergeticBlindDog decided to turnright at location: [0, 2]\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to move leftwards at location: [0, 2], but couldnt\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to turnright at location: [0, 2]\n", - "EnergeticBlindDog decided to move leftwards at location: [0, 2], but couldnt\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to move downwards at location: [0, 2], but couldnt\n", - "EnergeticBlindDog decided to turnright at location: [0, 2]\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n", - "EnergeticBlindDog decided to move rightwards at location: [0, 2]\n", - "EnergeticBlindDog ate Food at location: [1, 2]\n" - ] - } - ], - "source": [ - "park = Park2D(3,3)\n", - "dog = EnergeticBlindDog(program)\n", - "dogfood = Food()\n", - "water = Water()\n", - "park.add_thing(dog, [0,0])\n", - "park.add_thing(dogfood, [1,2])\n", - "park.add_thing(water, [2,1])\n", - "morewater = Water()\n", - "park.add_thing(morewater, [0,2])\n", - "print(\"dog started at [0,0], facing down. Let's see if he found any food or water!\")\n", - "park.run(20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is good, but it still lacks graphics. What if we wanted to visualize our park as it changed? To do that, all we have to do is make our park a subclass of GraphicEnvironment instead of XYEnvironment. Let's see how this looks." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class GraphicPark(GraphicEnvironment):\n", - " def percept(self, agent):\n", - " '''prints & return a list of things that are in our agent's location'''\n", - " things = self.list_things_at(agent.location)\n", - " return things\n", - " \n", - " def execute_action(self, agent, action):\n", - " '''changes the state of the environment based on what the agent does.'''\n", - " if action == 'turnright':\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.turn(Direction.R)\n", - " #print('now facing {}'.format(agent.direction.direction))\n", - " elif action == 'turnleft':\n", - " print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))\n", - " agent.turn(Direction.L)\n", - " #print('now facing {}'.format(agent.direction.direction))\n", - " elif action == 'moveforward':\n", - " loc = copy.deepcopy(agent.location) # find out the target location\n", - " if agent.direction.direction == Direction.R:\n", - " loc[0] += 1\n", - " elif agent.direction.direction == Direction.L:\n", - " loc[0] -= 1\n", - " elif agent.direction.direction == Direction.D:\n", - " loc[1] += 1\n", - " elif agent.direction.direction == Direction.U:\n", - " loc[1] -= 1\n", - " #print('{} at {} facing {}'.format(agent, loc, agent.direction.direction))\n", - " if self.is_inbounds(loc):# move only if the target is a valid location\n", - " print('{} decided to move {}wards at location: {}'.format(str(agent)[1:-1], agent.direction.direction, agent.location))\n", - " agent.moveforward()\n", - " else:\n", - " print('{} decided to move {}wards at location: {}, but couldnt'.format(str(agent)[1:-1], agent.direction.direction, agent.location))\n", - " agent.moveforward(False)\n", - " elif action == \"eat\":\n", - " items = self.list_things_at(agent.location, tclass=Food)\n", - " if len(items) != 0:\n", - " if agent.eat(items[0]):\n", - " print('{} ate {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0])\n", - " elif action == \"drink\":\n", - " items = self.list_things_at(agent.location, tclass=Water)\n", - " if len(items) != 0:\n", - " if agent.drink(items[0]):\n", - " print('{} drank {} at location: {}'\n", - " .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))\n", - " self.delete_thing(items[0])\n", - " \n", - " def is_done(self):\n", - " '''By default, we're done when we can't find a live agent, \n", - " but to prevent killing our cute dog, we will stop before itself - when there is no more food or water'''\n", - " no_edibles = not any(isinstance(thing, Food) or isinstance(thing, Water) for thing in self.things)\n", - " dead_agents = not any(agent.is_alive() for agent in self.agents)\n", - " return dead_agents or no_edibles\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That is the only change we make. The rest of our code stays the same. There is a slight difference in usage though. Every time we create a GraphicPark, we need to define the colors of all the things we plan to put into the park. The colors are defined in typical [RGB digital 8-bit format](https://en.wikipedia.org/wiki/RGB_color_model#Numeric_representations), common across the web." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dog started at [0,0], facing down. Lets see if he found any food or water!\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move downwards at location: [0, 0]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog drank Water at location: [0, 1]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [0, 1]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnright at location: [0, 1]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move downwards at location: [0, 1]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [0, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move rightwards at location: [0, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog ate Food at location: [1, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [1, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [1, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [1, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move downwards at location: [1, 2]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnright at location: [1, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move leftwards at location: [1, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move leftwards at location: [0, 3], but couldnt\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnleft at location: [0, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnright at location: [0, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move leftwards at location: [0, 3], but couldnt\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to turnright at location: [0, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "EnergeticBlindDog decided to move upwards at location: [0, 3]\n" - ] - }, - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "park = GraphicPark(5,5, color={'EnergeticBlindDog': (200,0,0), 'Water': (0, 200, 200), 'Food': (230, 115, 40)})\n", - "dog = EnergeticBlindDog(program)\n", - "dogfood = Food()\n", - "water = Water()\n", - "park.add_thing(dog, [0,0])\n", - "park.add_thing(dogfood, [1,2])\n", - "park.add_thing(water, [0,1])\n", - "morewater = Water()\n", - "morefood = Food()\n", - "park.add_thing(morewater, [2,4])\n", - "park.add_thing(morefood, [4,3])\n", - "print(\"dog started at [0,0], facing down. Let's see if he found any food or water!\")\n", - "park.run(20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "## Wumpus Environment" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from ipythonblocks import BlockGrid\n", - "from agents import *\n", - "\n", - "color = {\"Breeze\": (225, 225, 225),\n", - " \"Pit\": (0,0,0),\n", - " \"Gold\": (253, 208, 23),\n", - " \"Glitter\": (253, 208, 23),\n", - " \"Wumpus\": (43, 27, 23),\n", - " \"Stench\": (128, 128, 128),\n", - " \"Explorer\": (0, 0, 255),\n", - " \"Wall\": (44, 53, 57)\n", - " }\n", - "\n", - "def program(percepts):\n", - " '''Returns an action based on it's percepts'''\n", - " print(percepts)\n", - " return input()\n", - "\n", - "w = WumpusEnvironment(program, 7, 7) \n", - "grid = BlockGrid(w.width, w.height, fill=(123, 234, 123))\n", - "\n", - "def draw_grid(world):\n", - " global grid\n", - " grid[:] = (123, 234, 123)\n", - " for x in range(0, len(world)):\n", - " for y in range(0, len(world[x])):\n", - " if len(world[x][y]):\n", - " grid[y, x] = color[world[x][y][-1].__class__.__name__]\n", - "\n", - "def step():\n", - " global grid, w\n", - " draw_grid(w.get_world())\n", - " grid.show()\n", - " w.step()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[], [], [], [], [, None]]\n", - "Forward\n" - ] - } - ], - "source": [ - "step()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.4rc1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/agents.py b/agents.py deleted file mode 100644 index 30a7ad994..000000000 --- a/agents.py +++ /dev/null @@ -1,977 +0,0 @@ -"""Implement Agents and Environments (Chapters 1-2). - -The class hierarchies are as follows: - -Thing ## A physical object that can exist in an environment - Agent - Wumpus - Dirt - Wall - ... - -Environment ## An environment holds objects, runs simulations - XYEnvironment - VacuumEnvironment - WumpusEnvironment - -An agent program is a callable instance, taking percepts and choosing actions - SimpleReflexAgentProgram - ... - -EnvGUI ## A window with a graphical representation of the Environment - -EnvToolbar ## contains buttons for controlling EnvGUI - -EnvCanvas ## Canvas to display the environment of an EnvGUI - -""" - -# TO DO: -# Implement grabbing correctly. -# When an object is grabbed, does it still have a location? -# What if it is released? -# What if the grabbed or the grabber is deleted? -# What if the grabber moves? -# -# Speed control in GUI does not have any effect -- fix it. - -from utils import distance_squared, turn_heading -from statistics import mean - -import random -import copy -import collections - - -# ______________________________________________________________________________ - - -class Thing: - """This represents any physical object that can appear in an Environment. - You subclass Thing to get the things you want. Each thing can have a - .__name__ slot (used for output only).""" - - def __repr__(self): - return '<{}>'.format(getattr(self, '__name__', self.__class__.__name__)) - - def is_alive(self): - """Things that are 'alive' should return true.""" - return hasattr(self, 'alive') and self.alive - - def show_state(self): - """Display the agent's internal state. Subclasses should override.""" - print("I don't know how to show_state.") - - def display(self, canvas, x, y, width, height): - """Display an image of this Thing on the canvas.""" - # Do we need this? - pass - - -class Agent(Thing): - """An Agent is a subclass of Thing with one required slot, - .program, which should hold a function that takes one argument, the - percept, and returns an action. (What counts as a percept or action - will depend on the specific environment in which the agent exists.) - Note that 'program' is a slot, not a method. If it were a method, - then the program could 'cheat' and look at aspects of the agent. - It's not supposed to do that: the program can only look at the - percepts. An agent program that needs a model of the world (and of - the agent itself) will have to build and maintain its own model. - There is an optional slot, .performance, which is a number giving - the performance measure of the agent in its environment.""" - - def __init__(self, program=None): - self.alive = True - self.bump = False - self.holding = [] - self.performance = 0 - if program is None or not isinstance(program, collections.Callable): - print("Can't find a valid program for {}, falling back to default.".format( - self.__class__.__name__)) - - def program(percept): - return eval(input('Percept={}; action? '.format(percept))) - - self.program = program - - def can_grab(self, thing): - """Returns True if this agent can grab this thing. - Override for appropriate subclasses of Agent and Thing.""" - return False - - -def TraceAgent(agent): - """Wrap the agent's program to print its input and output. This will let - you see what the agent is doing in the environment.""" - old_program = agent.program - - def new_program(percept): - action = old_program(percept) - print('{} perceives {} and does {}; performance is {}'.format(agent, percept, action, agent.performance)) - return action - agent.program = new_program - return agent - -# ______________________________________________________________________________ - - -def TableDrivenAgentProgram(table): - """This agent selects an action based on the percept sequence. - It is practical only for tiny domains. - To customize it, provide as table a dictionary of all - {percept_sequence:action} pairs. [Figure 2.7]""" - percepts = [] - - def program(percept): - percepts.append(percept) - action = table.get(tuple(percepts)) - return action - return program - - -def RandomAgentProgram(actions): - """An agent that chooses an action at random, ignoring all percepts.""" - return lambda percept: random.choice(actions) - -# ______________________________________________________________________________ - - -def SimpleReflexAgentProgram(rules, interpret_input): - """This agent takes action based solely on the percept. [Figure 2.10]""" - def program(percept): - state = interpret_input(percept) - rule = rule_match(state, rules) - action = rule.action - return action - return program - - -def ModelBasedReflexAgentProgram(rules, update_state, model): - """This agent takes action based on the percept and state. [Figure 2.12]""" - def program(percept): - program.state = update_state(program.state, program.action, percept, model) - rule = rule_match(program.state, rules) - action = rule.action - return action - program.state = program.action = None - return program - - -def rule_match(state, rules): - """Find the first rule that matches state.""" - for rule in rules: - if rule.matches(state): - return rule - -# ______________________________________________________________________________ - - -loc_A, loc_B = (0, 0), (1, 0) # The two locations for the Vacuum world - - -def RandomVacuumAgent(): - """Randomly choose one of the actions from the vacuum environment.""" - return Agent(RandomAgentProgram(['Right', 'Left', 'Suck', 'NoOp'])) - - -def TableDrivenVacuumAgent(): - """[Figure 2.3]""" - table = {((loc_A, 'Clean'),): 'Right', - ((loc_A, 'Dirty'),): 'Suck', - ((loc_B, 'Clean'),): 'Left', - ((loc_B, 'Dirty'),): 'Suck', - ((loc_A, 'Clean'), (loc_A, 'Clean')): 'Right', - ((loc_A, 'Clean'), (loc_A, 'Dirty')): 'Suck', - # ... - ((loc_A, 'Clean'), (loc_A, 'Clean'), (loc_A, 'Clean')): 'Right', - ((loc_A, 'Clean'), (loc_A, 'Clean'), (loc_A, 'Dirty')): 'Suck', - # ... - } - return Agent(TableDrivenAgentProgram(table)) - - -def ReflexVacuumAgent(): - """A reflex agent for the two-state vacuum environment. [Figure 2.8]""" - def program(percept): - location, status = percept - if status == 'Dirty': - return 'Suck' - elif location == loc_A: - return 'Right' - elif location == loc_B: - return 'Left' - return Agent(program) - - -def ModelBasedVacuumAgent(): - """An agent that keeps track of what locations are clean or dirty.""" - model = {loc_A: None, loc_B: 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': - return 'NoOp' - elif status == 'Dirty': - return 'Suck' - elif location == loc_A: - return 'Right' - elif location == loc_B: - return 'Left' - return Agent(program) - -# ______________________________________________________________________________ - - -class Environment: - """Abstract class representing an Environment. 'Real' Environment classes - inherit from this. Your Environment will typically need to implement: - percept: Define the percept that an agent sees. - execute_action: Define the effects of executing an action. - Also update the agent.performance slot. - The environment keeps a list of .things and .agents (which is a subset - of .things). Each agent has a .performance slot, initialized to 0. - Each thing has a .location slot, even though some environments may not - need this.""" - - def __init__(self): - self.things = [] - self.agents = [] - - def thing_classes(self): - return [] # List of classes that can go into environment - - def percept(self, agent): - """Return the percept that the agent sees at this point. (Implement this.)""" - raise NotImplementedError - - def execute_action(self, agent, action): - """Change the world to reflect this action. (Implement this.)""" - if action != "": - raise NotImplementedError - - def default_location(self, thing): - """Default location to place a new thing with unspecified location.""" - return None - - def exogenous_change(self): - """If there is spontaneous change in the world, override this.""" - pass - - def is_done(self): - """By default, we're done when we can't find a live agent.""" - return not any(agent.is_alive() for agent in self.agents) - - def step(self): - """Run the environment for one time step. If the - actions and exogenous changes are independent, this method will - do. If there are interactions between them, you'll need to - override this method.""" - if not self.is_done(): - actions = [] - for agent in self.agents: - if agent.alive: - actions.append(agent.program(self.percept(agent))) - else: - actions.append("") - for (agent, action) in zip(self.agents, actions): - self.execute_action(agent, action) - self.exogenous_change() - - def run(self, steps=1000): - """Run the Environment for given number of time steps.""" - for step in range(steps): - if self.is_done(): - return - self.step() - - def list_things_at(self, location, tclass=Thing): - """Return all things exactly at a given location.""" - return [thing for thing in self.things - if thing.location == location and isinstance(thing, tclass)] - - def some_things_at(self, location, tclass=Thing): - """Return true if at least one of the things at location - is an instance of class tclass (or a subclass).""" - return self.list_things_at(location, tclass) != [] - - def add_thing(self, thing, location=None): - """Add a thing to the environment, setting its location. For - convenience, if thing is an agent program we make a new agent - for it. (Shouldn't need to override this.)""" - if not isinstance(thing, Thing): - thing = Agent(thing) - if thing in self.things: - print("Can't add the same thing twice") - else: - thing.location = location if location is not None else self.default_location(thing) - self.things.append(thing) - if isinstance(thing, Agent): - thing.performance = 0 - self.agents.append(thing) - - def delete_thing(self, thing): - """Remove a thing from the environment.""" - try: - self.things.remove(thing) - except ValueError as e: - print(e) - print(" in Environment delete_thing") - print(" Thing to be removed: {} at {}".format(thing, thing.location)) - print(" from list: {}".format([(thing, thing.location) for thing in self.things])) - if thing in self.agents: - self.agents.remove(thing) - - -class Direction: - """A direction class for agents that want to move in a 2D plane - Usage: - d = Direction("down") - To change directions: - d = d + "right" or d = d + Direction.R #Both do the same thing - Note that the argument to __add__ must be a string and not a Direction object. - Also, it (the argument) can only be right or left.""" - - R = "right" - L = "left" - U = "up" - D = "down" - - def __init__(self, direction): - self.direction = direction - - def __add__(self, heading): - if self.direction == self.R: - return{ - self.R: Direction(self.D), - self.L: Direction(self.U), - }.get(heading, None) - elif self.direction == self.L: - return{ - self.R: Direction(self.U), - self.L: Direction(self.D), - }.get(heading, None) - elif self.direction == self.U: - return{ - self.R: Direction(self.R), - self.L: Direction(self.L), - }.get(heading, None) - elif self.direction == self.D: - return{ - self.R: Direction(self.L), - self.L: Direction(self.R), - }.get(heading, None) - - def move_forward(self, from_location): - x, y = from_location - if self.direction == self.R: - return (x + 1, y) - elif self.direction == self.L: - return (x - 1, y) - elif self.direction == self.U: - return (x, y - 1) - elif self.direction == self.D: - return (x, y + 1) - - -class XYEnvironment(Environment): - """This class is for environments on a 2D plane, with locations - labelled by (x, y) points, either discrete or continuous. - - Agents perceive things within a radius. Each agent in the - environment has a .location slot which should be a location such - as (0, 1), and a .holding slot, which should be a list of things - that are held.""" - - def __init__(self, width=10, height=10): - super().__init__() - - self.width = width - self.height = height - self.observers = [] - # Sets iteration start and end (no walls). - self.x_start, self.y_start = (0, 0) - self.x_end, self.y_end = (self.width, self.height) - - perceptible_distance = 1 - - def things_near(self, location, radius=None): - """Return all things within radius of location.""" - if radius is None: - radius = self.perceptible_distance - radius2 = radius * radius - return [(thing, radius2 - distance_squared(location, thing.location)) - for thing in self.things if distance_squared( - location, thing.location) <= radius2] - - def percept(self, agent): - """By default, agent perceives things within a default radius.""" - return self.things_near(agent.location) - - def execute_action(self, agent, action): - agent.bump = False - if action == 'TurnRight': - agent.direction += Direction.R - elif action == 'TurnLeft': - agent.direction += Direction.L - elif action == 'Forward': - agent.bump = self.move_to(agent, agent.direction.move_forward(agent.location)) -# elif action == 'Grab': -# things = [thing for thing in self.list_things_at(agent.location) -# if agent.can_grab(thing)] -# if things: -# agent.holding.append(things[0]) - elif action == 'Release': - if agent.holding: - agent.holding.pop() - - def default_location(self, thing): - return (random.choice(self.width), random.choice(self.height)) - - def move_to(self, thing, destination): - """Move a thing to a new location. Returns True on success or False if there is an Obstacle. - If thing is holding anything, they move with him.""" - thing.bump = self.some_things_at(destination, Obstacle) - if not thing.bump: - thing.location = destination - for o in self.observers: - o.thing_moved(thing) - for t in thing.holding: - self.delete_thing(t) - self.add_thing(t, destination) - t.location = destination - return thing.bump - - def add_thing(self, thing, location=(1, 1), exclude_duplicate_class_items=False): - """Adds things to the world. If (exclude_duplicate_class_items) then the item won't be - added if the location has at least one item of the same class.""" - if (self.is_inbounds(location)): - if (exclude_duplicate_class_items and - any(isinstance(t, thing.__class__) for t in self.list_things_at(location))): - return - super().add_thing(thing, location) - - def is_inbounds(self, location): - """Checks to make sure that the location is inbounds (within walls if we have walls)""" - x, y = location - return not (x < self.x_start or x >= self.x_end or y < self.y_start or y >= self.y_end) - - def random_location_inbounds(self, exclude=None): - """Returns a random location that is inbounds (within walls if we have walls)""" - location = (random.randint(self.x_start, self.x_end), - random.randint(self.y_start, self.y_end)) - if exclude is not None: - while(location == exclude): - location = (random.randint(self.x_start, self.x_end), - random.randint(self.y_start, self.y_end)) - return location - - def delete_thing(self, thing): - """Deletes thing, and everything it is holding (if thing is an agent)""" - if isinstance(thing, Agent): - for obj in thing.holding: - super().delete_thing(obj) - for obs in self.observers: - obs.thing_deleted(obj) - - super().delete_thing(thing) - for obs in self.observers: - obs.thing_deleted(thing) - - def add_walls(self): - """Put walls around the entire perimeter of the grid.""" - for x in range(self.width): - self.add_thing(Wall(), (x, 0)) - self.add_thing(Wall(), (x, self.height - 1)) - for y in range(self.height): - self.add_thing(Wall(), (0, y)) - self.add_thing(Wall(), (self.width - 1, y)) - - # Updates iteration start and end (with walls). - self.x_start, self.y_start = (1, 1) - self.x_end, self.y_end = (self.width - 1, self.height - 1) - - def add_observer(self, observer): - """Adds an observer to the list of observers. - An observer is typically an EnvGUI. - - Each observer is notified of changes in move_to and add_thing, - by calling the observer's methods thing_moved(thing) - and thing_added(thing, loc).""" - self.observers.append(observer) - - def turn_heading(self, heading, inc): - """Return the heading to the left (inc=+1) or right (inc=-1) of heading.""" - return turn_heading(heading, inc) - - -class Obstacle(Thing): - """Something that can cause a bump, preventing an agent from - moving into the same square it's in.""" - pass - - -class Wall(Obstacle): - pass - -# ______________________________________________________________________________ - - -try: - from ipythonblocks import BlockGrid - from IPython.display import HTML, display - from time import sleep -except: - pass - - -class GraphicEnvironment(XYEnvironment): - def __init__(self, width=10, height=10, boundary=True, color={}, display=False): - """Define all the usual XYEnvironment characteristics, - but initialise a BlockGrid for GUI too.""" - super().__init__(width, height) - self.grid = BlockGrid(width, height, fill=(200, 200, 200)) - if display: - self.grid.show() - self.visible = True - else: - self.visible = False - self.bounded = boundary - self.colors = color - - def get_world(self): - """Returns all the items in the world in a format - understandable by the ipythonblocks BlockGrid.""" - result = [] - x_start, y_start = (0, 0) - x_end, y_end = self.width, self.height - for x in range(x_start, x_end): - row = [] - for y in range(y_start, y_end): - row.append(self.list_things_at([x, y])) - result.append(row) - return result - - """ - def run(self, steps=1000, delay=1): - "" "Run the Environment for given number of time steps, - but update the GUI too." "" - for step in range(steps): - sleep(delay) - if self.visible: - self.reveal() - if self.is_done(): - if self.visible: - self.reveal() - return - self.step() - if self.visible: - self.reveal() - """ - - def run(self, steps=1000, delay=1): - """Run the Environment for given number of time steps, - but update the GUI too.""" - for step in range(steps): - self.update(delay) - if self.is_done(): - break - self.step() - self.update(delay) - - def update(self, delay=1): - sleep(delay) - if self.visible: - self.conceal() - self.reveal() - else: - self.reveal() - - def reveal(self): - """Display the BlockGrid for this world - the last thing to be added - at a location defines the location color.""" - self.draw_world() - self.grid.show() - self.visible = True - - def draw_world(self): - self.grid[:] = (200, 200, 200) - world = self.get_world() - for x in range(0, len(world)): - for y in range(0, len(world[x])): - if len(world[x][y]): - self.grid[y, x] = self.colors[world[x][y][-1].__class__.__name__] - - def conceal(self): - """Hide the BlockGrid for this world""" - self.visible = False - display(HTML('')) - - -# ______________________________________________________________________________ -# Continuous environment - -class ContinuousWorld(Environment): - """Model for Continuous World""" - - def __init__(self, width=10, height=10): - super().__init__() - self.width = width - self.height = height - - def add_obstacle(self, coordinates): - self.things.append(PolygonObstacle(coordinates)) - - -class PolygonObstacle(Obstacle): - - def __init__(self, coordinates): - """Coordinates is a list of tuples.""" - super().__init__() - self.coordinates = coordinates - -# ______________________________________________________________________________ -# Vacuum environment - - -class Dirt(Thing): - pass - - -class VacuumEnvironment(XYEnvironment): - - """The environment of [Ex. 2.12]. Agent perceives dirty or clean, - and bump (into obstacle) or not; 2D discrete world of unknown size; - performance measure is 100 for each dirt cleaned, and -1 for - each turn taken.""" - - def __init__(self, width=10, height=10): - super().__init__(width, height) - self.add_walls() - - def thing_classes(self): - return [Wall, Dirt, ReflexVacuumAgent, RandomVacuumAgent, - TableDrivenVacuumAgent, ModelBasedVacuumAgent] - - def percept(self, agent): - """The percept is a tuple of ('Dirty' or 'Clean', 'Bump' or 'None'). - Unlike the TrivialVacuumEnvironment, location is NOT perceived.""" - status = ('Dirty' if self.some_things_at( - agent.location, Dirt) else 'Clean') - bump = ('Bump' if agent.bump else'None') - return (status, bump) - - def execute_action(self, agent, action): - if action == 'Suck': - dirt_list = self.list_things_at(agent.location, Dirt) - if dirt_list != []: - dirt = dirt_list[0] - agent.performance += 100 - self.delete_thing(dirt) - else: - super().execute_action(agent, action) - - if action != 'NoOp': - agent.performance -= 1 - - -class TrivialVacuumEnvironment(Environment): - - """This environment has two locations, A and B. Each can be Dirty - or Clean. The agent perceives its location and the location's - status. This serves as an example of how to implement a simple - Environment.""" - - def __init__(self): - super().__init__() - self.status = {loc_A: random.choice(['Clean', 'Dirty']), - loc_B: random.choice(['Clean', 'Dirty'])} - - def thing_classes(self): - return [Wall, Dirt, ReflexVacuumAgent, RandomVacuumAgent, - TableDrivenVacuumAgent, ModelBasedVacuumAgent] - - def percept(self, agent): - """Returns the agent's location, and the location status (Dirty/Clean).""" - return (agent.location, self.status[agent.location]) - - 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 - agent.performance -= 1 - elif action == 'Suck': - if self.status[agent.location] == 'Dirty': - agent.performance += 10 - self.status[agent.location] = 'Clean' - - def default_location(self, thing): - """Agents start in either location at random.""" - return random.choice([loc_A, loc_B]) - -# ______________________________________________________________________________ -# The Wumpus World - - -class Gold(Thing): - - def __eq__(self, rhs): - """All Gold are equal""" - return rhs.__class__ == Gold - pass - - -class Bump(Thing): - pass - - -class Glitter(Thing): - pass - - -class Pit(Thing): - pass - - -class Breeze(Thing): - pass - - -class Arrow(Thing): - pass - - -class Scream(Thing): - pass - - -class Wumpus(Agent): - screamed = False - pass - - -class Stench(Thing): - pass - - -class Explorer(Agent): - holding = [] - has_arrow = True - killed_by = "" - direction = Direction("right") - - def can_grab(self, thing): - """Explorer can only grab gold""" - return thing.__class__ == Gold - - -class WumpusEnvironment(XYEnvironment): - pit_probability = 0.2 # Probability to spawn a pit in a location. (From Chapter 7.2) - # Room should be 4x4 grid of rooms. The extra 2 for walls - - def __init__(self, agent_program, width=6, height=6): - super().__init__(width, height) - self.init_world(agent_program) - - def init_world(self, program): - """Spawn items in the world based on probabilities from the book""" - - "WALLS" - self.add_walls() - - "PITS" - for x in range(self.x_start, self.x_end): - for y in range(self.y_start, self.y_end): - if random.random() < self.pit_probability: - self.add_thing(Pit(), (x, y), True) - self.add_thing(Breeze(), (x - 1, y), True) - self.add_thing(Breeze(), (x, y - 1), True) - self.add_thing(Breeze(), (x + 1, y), True) - self.add_thing(Breeze(), (x, y + 1), True) - - "WUMPUS" - w_x, w_y = self.random_location_inbounds(exclude=(1, 1)) - self.add_thing(Wumpus(lambda x: ""), (w_x, w_y), True) - self.add_thing(Stench(), (w_x - 1, w_y), True) - self.add_thing(Stench(), (w_x + 1, w_y), True) - self.add_thing(Stench(), (w_x, w_y - 1), True) - self.add_thing(Stench(), (w_x, w_y + 1), True) - - "GOLD" - self.add_thing(Gold(), self.random_location_inbounds(exclude=(1, 1)), True) - - "AGENT" - self.add_thing(Explorer(program), (1, 1), True) - - def get_world(self, show_walls=True): - """Returns the items in the world""" - result = [] - x_start, y_start = (0, 0) if show_walls else (1, 1) - - - if show_walls: - x_end, y_end = self.width, self.height - else: - x_end, y_end = self.width - 1, self.height - 1 - - for x in range(x_start, x_end): - row = [] - for y in range(y_start, y_end): - row.append(self.list_things_at((x, y))) - result.append(row) - return result - - def percepts_from(self, agent, location, tclass=Thing): - """Returns percepts from a given location, - and replaces some items with percepts from chapter 7.""" - thing_percepts = { - Gold: Glitter(), - Wall: Bump(), - Wumpus: Stench(), - Pit: Breeze()} - - """Agents don't need to get their percepts""" - thing_percepts[agent.__class__] = None - - """Gold only glitters in its cell""" - if location != agent.location: - thing_percepts[Gold] = None - - result = [thing_percepts.get(thing.__class__, thing) for thing in self.things - if thing.location == location and isinstance(thing, tclass)] - return result if len(result) else [None] - - def percept(self, agent): - """Returns things in adjacent (not diagonal) cells of the agent. - Result format: [Left, Right, Up, Down, Center / Current location]""" - x, y = agent.location - result = [] - result.append(self.percepts_from(agent, (x - 1, y))) - result.append(self.percepts_from(agent, (x + 1, y))) - result.append(self.percepts_from(agent, (x, y - 1))) - result.append(self.percepts_from(agent, (x, y + 1))) - result.append(self.percepts_from(agent, (x, y))) - - """The wumpus gives out a loud scream once it's killed.""" - wumpus = [thing for thing in self.things if isinstance(thing, Wumpus)] - if len(wumpus) and not wumpus[0].alive and not wumpus[0].screamed: - result[-1].append(Scream()) - wumpus[0].screamed = True - - return result - - def execute_action(self, agent, action): - """Modify the state of the environment based on the agent's actions. - Performance score taken directly out of the book.""" - - if isinstance(agent, Explorer) and self.in_danger(agent): - return - agent.bump = False - if action == 'TurnRight': - agent.direction += Direction.R - agent.performance -= 1 - elif action == 'TurnLeft': - agent.direction += Direction.L - agent.performance -= 1 - elif action == 'Forward': - agent.bump = self.move_to(agent, agent.direction.move_forward(agent.location)) - agent.performance -= 1 - elif action == 'Grab': - things = [thing for thing in self.list_things_at(agent.location) - if agent.can_grab(thing)] - if len(things): - print("Grabbing", things[0].__class__.__name__) - if len(things): - agent.holding.append(things[0]) - agent.performance -= 1 - elif action == 'Climb': - if agent.location == (1, 1): # Agent can only climb out of (1,1) - agent.performance += 1000 if Gold() in agent.holding else 0 - self.delete_thing(agent) - elif action == 'Shoot': - """The arrow travels straight down the path the agent is facing""" - if agent.has_arrow: - arrow_travel = agent.direction.move_forward(agent.location) - while(self.is_inbounds(arrow_travel)): - wumpus = [thing for thing in self.list_things_at(arrow_travel) - if isinstance(thing, Wumpus)] - if len(wumpus): - wumpus[0].alive = False - break - arrow_travel = agent.direction.move_forward(agent.location) - agent.has_arrow = False - - def in_danger(self, agent): - """Checks if Explorer is in danger (Pit or Wumpus), if he is, kill him""" - for thing in self.list_things_at(agent.location): - if isinstance(thing, Pit) or (isinstance(thing, Wumpus) and thing.alive): - agent.alive = False - agent.performance -= 1000 - agent.killed_by = thing.__class__.__name__ - return True - return False - - def is_done(self): - """The game is over when the Explorer is killed - or if he climbs out of the cave only at (1,1).""" - explorer = [agent for agent in self.agents if isinstance(agent, Explorer)] - if len(explorer): - if explorer[0].alive: - return False - else: - print("Death by {} [-1000].".format(explorer[0].killed_by)) - else: - print("Explorer climbed out {}." - .format( - "with Gold [+1000]!" if Gold() not in self.things else "without Gold [+0]")) - return True - - - # TODO: Arrow needs to be implemented -# ______________________________________________________________________________ - - -def compare_agents(EnvFactory, AgentFactories, n=10, steps=1000): - """See how well each of several agents do in n instances of an environment. - Pass in a factory (constructor) for environments, and several for agents. - Create n instances of the environment, and run each agent in copies of - each one for steps. Return a list of (agent, average-score) tuples.""" - envs = [EnvFactory() for i in range(n)] - return [(A, test_agent(A, steps, copy.deepcopy(envs))) - for A in AgentFactories] - - -def test_agent(AgentFactory, steps, envs): - """Return the mean score of running an agent in each of the envs, for steps""" - def score(env): - agent = AgentFactory() - env.add_thing(agent) - env.run(steps) - return agent.performance - return mean(map(score, envs)) - -# _________________________________________________________________________ - - -__doc__ += """ ->>> a = ReflexVacuumAgent() ->>> a.program((loc_A, 'Clean')) -'Right' ->>> a.program((loc_B, 'Clean')) -'Left' ->>> a.program((loc_A, 'Dirty')) -'Suck' ->>> a.program((loc_A, 'Dirty')) -'Suck' - ->>> e = TrivialVacuumEnvironment() ->>> e.add_thing(ModelBasedVacuumAgent()) ->>> e.run(5) - -""" diff --git a/aima-data b/aima-data deleted file mode 160000 index c81e89079..000000000 --- a/aima-data +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c81e8907917c60bfaedccc720c6b8ce07fabb222 diff --git a/csp.ipynb b/csp.ipynb deleted file mode 100644 index 2192352cf..000000000 --- a/csp.ipynb +++ /dev/null @@ -1,1174 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# CONSTRAINT SATISFACTION PROBLEMS\n", - "\n", - "This IPy notebook acts as supporting material for topics covered in **Chapter 6 Constraint Satisfaction Problems** of the book* Artificial Intelligence: A Modern Approach*. We make use of the implementations in **csp.py** module. Even though this notebook includes a brief summary of the main topics familiarity with the material present in the book is expected. We will look at some visualizations and solve some of the CSP problems described in the book. Let us import everything from the csp module to get started." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from csp import *\n", - "from notebook import psource, pseudocode\n", - "\n", - "# Needed to hide warnings in the matplotlib sections\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Overview\n", - "* Graph Coloring\n", - "* N-Queens\n", - "* Backtracking Search\n", - "* Tree CSP Solver\n", - "* Graph Coloring Visualization\n", - "* N-Queens Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OVERVIEW\n", - "\n", - "CSPs are a special kind of search problems. Here we don't treat the space as a black box but the state has a particular form and we use that to our advantage to tweak our algorithms to be more suited to the problems. A CSP State is defined by a set of variables which can take values from corresponding domains. These variables can take only certain values in their domains to satisfy the constraints. A set of assignments which satisfies all constraints passes the goal test. Let us start by exploring the CSP class which we will use to model our CSPs. You can keep the popup open and read the main page to get a better idea of the code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(CSP)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The __ _ _init_ _ __ method parameters specify the CSP. Variable can be passed as a list of strings or integers. Domains are passed as dict where key specify the variables and value specify the domains. The variables are passed as an empty list. Variables are extracted from the keys of the domain dictionary. Neighbor is a dict of variables that essentially describes the constraint graph. Here each variable key has a list its value which are the variables that are constraint along with it. The constraint parameter should be a function **f(A, a, B, b**) that **returns true** if neighbors A, B **satisfy the constraint** when they have values **A=a, B=b**. We have additional parameters like nassings which is incremented each time an assignment is made when calling the assign method. You can read more about the methods and parameters in the class doc string. We will talk more about them as we encounter their use. Let us jump to an example." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GRAPH COLORING\n", - "\n", - "We use the graph coloring problem as our running example for demonstrating the different algorithms in the **csp module**. The idea of map coloring problem is that the adjacent nodes (those connected by edges) should not have the same color throughout the graph. The graph can be colored using a fixed number of colors. Here each node is a variable and the values are the colors that can be assigned to them. Given that the domain will be the same for all our nodes we use a custom dict defined by the **UniversalDict** class. The **UniversalDict** Class takes in a parameter which it returns as value for all the keys of the dict. It is very similar to **defaultdict** in Python except that it does not support item assignment." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['R', 'G', 'B']" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s = UniversalDict(['R','G','B'])\n", - "s[5]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For our CSP we also need to define a constraint function **f(A, a, B, b)**. In this what we need is that the neighbors must not have the same color. This is defined in the function **different_values_constraint** of the module." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(different_values_constraint)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The CSP class takes neighbors in the form of a Dict. The module specifies a simple helper function named **parse_neighbors** which allows to take input in the form of strings and return a Dict of the form compatible with the **CSP Class**." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%pdoc parse_neighbors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The **MapColoringCSP** function creates and returns a CSP with the above constraint function and states. The variables our the keys of the neighbors dict and the constraint is the one specified by the **different_values_constratint** function. **australia**, **usa** and **france** are three CSPs that have been created using **MapColoringCSP**. **australia** corresponds to ** Figure 6.1 ** in the book." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(MapColoringCSP)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(,\n", - " ,\n", - " )" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "australia, usa, france" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## N-QUEENS\n", - "\n", - "The N-queens puzzle is the problem of placing N chess queens on a N×N chessboard so that no two queens threaten each other. Here N is a natural number. Like the graph coloring, problem NQueens is also implemented in the csp module. The **NQueensCSP** class inherits from the **CSP** class. It makes some modifications in the methods to suit the particular problem. The queens are assumed to be placed one per column, from left to right. That means position (x, y) represents (var, val) in the CSP. The constraint that needs to be passed on the CSP is defined in the **queen_constraint** function. The constraint is satisfied (true) if A, B are really the same variable, or if they are not in the same row, down diagonal, or up diagonal. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(queen_constraint)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The **NQueensCSP** method implements methods that support solving the problem via **min_conflicts** which is one of the techniques for solving CSPs. Because **min_conflicts** hill climbs the number of conflicts to solve the CSP **assign** and **unassign** are modified to record conflicts. More details about the structures **rows**, **downs**, **ups** which help in recording conflicts are explained in the docstring." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(NQueensCSP)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The _ ___init___ _ method takes only one parameter **n** the size of the problem. To create an instance we just pass the required n into the constructor." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "eight_queens = NQueensCSP(8)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Helper Functions\n", - "\n", - "We will now implement a few helper functions that will help us visualize the Coloring Problem. We will make some modifications to the existing Classes and Functions for additional book keeping. To begin we modify the **assign** and **unassign** methods in the **CSP** to add a copy of the assignment to the **assignment_history**. We call this new class **InstruCSP**. This will allow us to see how the assignment evolves over time." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import copy\n", - "class InstruCSP(CSP):\n", - " \n", - " def __init__(self, variables, domains, neighbors, constraints):\n", - " super().__init__(variables, domains, neighbors, constraints)\n", - " self.assignment_history = []\n", - " \n", - " def assign(self, var, val, assignment):\n", - " super().assign(var,val, assignment)\n", - " self.assignment_history.append(copy.deepcopy(assignment))\n", - " \n", - " def unassign(self, var, assignment):\n", - " super().unassign(var,assignment)\n", - " self.assignment_history.append(copy.deepcopy(assignment))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we define **make_instru** which takes an instance of **CSP** and returns a **InstruCSP** instance. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def make_instru(csp):\n", - " return InstruCSP(csp.variables, csp.domains, csp.neighbors, csp.constraints)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now use a graph defined as a dictonary for plotting purposes in our Graph Coloring Problem. The keys are the nodes and their corresponding values are the nodes they are connected to." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "neighbors = {\n", - " 0: [6, 11, 15, 18, 4, 11, 6, 15, 18, 4], \n", - " 1: [12, 12, 14, 14], \n", - " 2: [17, 6, 11, 6, 11, 10, 17, 14, 10, 14], \n", - " 3: [20, 8, 19, 12, 20, 19, 8, 12], \n", - " 4: [11, 0, 18, 5, 18, 5, 11, 0], \n", - " 5: [4, 4], \n", - " 6: [8, 15, 0, 11, 2, 14, 8, 11, 15, 2, 0, 14], \n", - " 7: [13, 16, 13, 16], \n", - " 8: [19, 15, 6, 14, 12, 3, 6, 15, 19, 12, 3, 14], \n", - " 9: [20, 15, 19, 16, 15, 19, 20, 16], \n", - " 10: [17, 11, 2, 11, 17, 2], \n", - " 11: [6, 0, 4, 10, 2, 6, 2, 0, 10, 4], \n", - " 12: [8, 3, 8, 14, 1, 3, 1, 14], \n", - " 13: [7, 15, 18, 15, 16, 7, 18, 16], \n", - " 14: [8, 6, 2, 12, 1, 8, 6, 2, 1, 12], \n", - " 15: [8, 6, 16, 13, 18, 0, 6, 8, 19, 9, 0, 19, 13, 18, 9, 16], \n", - " 16: [7, 15, 13, 9, 7, 13, 15, 9], \n", - " 17: [10, 2, 2, 10], \n", - " 18: [15, 0, 13, 4, 0, 15, 13, 4], \n", - " 19: [20, 8, 15, 9, 15, 8, 3, 20, 3, 9], \n", - " 20: [3, 19, 9, 19, 3, 9]\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to create an InstruCSP instance for our problem. We are doing this for an instance of **MapColoringProblem** class which inherits from the **CSP** Class. This means that our **make_instru** function will work perfectly for it." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "coloring_problem = MapColoringCSP('RGBY', neighbors)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "coloring_problem1 = make_instru(coloring_problem)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BACKTRACKING SEARCH\n", - "\n", - "For solving a CSP the main issue with Naive search algorithms is that they can continue expanding obviously wrong paths. In backtracking search, we check constraints as we go. Backtracking is just the above idea combined with the fact that we are dealing with one variable at a time. Backtracking Search is implemented in the repository as the function **backtracking_search**. This is the same as **Figure 6.5** in the book. The function takes as input a CSP and few other optional parameters which can be used to further speed it up. The function returns the correct assignment if it satisfies the goal. We will discuss these later. Let us solve our **coloring_problem1** with **backtracking_search**." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "result = backtracking_search(coloring_problem1)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "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": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result # A dictonary of assignments." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us also check the number of assignments made." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coloring_problem1.nassigns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us check the total number of assignments and unassignments which is the length ofour assignment history." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(coloring_problem1.assignment_history)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us explore the optional keyword arguments that the **backtracking_search** function takes. These optional arguments help speed up the assignment further. Along with these, we will also point out to methods in the CSP class that help make this work. \n", - "\n", - "The first of these is **select_unassigned_variable**. It takes in a function that helps in deciding the order in which variables will be selected for assignment. We use a heuristic called Most Restricted Variable which is implemented by the function **mrv**. The idea behind **mrv** is to choose the variable with the fewest legal values left in its domain. The intuition behind selecting the **mrv** or the most constrained variable is that it allows us to encounter failure quickly before going too deep into a tree if we have selected a wrong step before. The **mrv** implementation makes use of another function **num_legal_values** to sort out the variables by a number of legal values left in its domain. This function, in turn, calls the **nconflicts** method of the **CSP** to return such values.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(mrv)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(num_legal_values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(CSP.nconflicts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another ordering related parameter **order_domain_values** governs the value ordering. Here we select the Least Constraining Value which is implemented by the function **lcv**. The idea is to select the value which rules out the fewest values in the remaining variables. The intuition behind selecting the **lcv** is that it leaves a lot of freedom to assign values later. The idea behind selecting the mrc and lcv makes sense because we need to do all variables but for values, we might better try the ones that are likely. So for vars, we face the hard ones first.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(lcv)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, the third parameter **inference** can make use of one of the two techniques called Arc Consistency or Forward Checking. The details of these methods can be found in the **Section 6.3.2** of the book. In short the idea of inference is to detect the possible failure before it occurs and to look ahead to not make mistakes. **mac** and **forward_checking** implement these two techniques. The **CSP** methods **support_pruning**, **suppose**, **prune**, **choices**, **infer_assignment** and **restore** help in using these techniques. You can know more about these by looking up the source code." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us compare the performance with these parameters enabled vs the default parameters. We will use the Graph Coloring problem instance usa for comparison. We will call the instances **solve_simple** and **solve_parameters** and solve them using backtracking and compare the number of assignments." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "solve_simple = copy.deepcopy(usa)\n", - "solve_parameters = copy.deepcopy(usa)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AL': 'B',\n", - " 'AR': 'B',\n", - " 'AZ': 'R',\n", - " 'CA': 'Y',\n", - " 'CO': 'R',\n", - " 'CT': 'R',\n", - " 'DC': 'B',\n", - " 'DE': 'B',\n", - " 'FL': 'G',\n", - " 'GA': 'R',\n", - " 'IA': 'B',\n", - " 'ID': 'R',\n", - " 'IL': 'G',\n", - " 'IN': 'R',\n", - " 'KA': 'B',\n", - " 'KY': 'B',\n", - " 'LA': 'G',\n", - " 'MA': 'G',\n", - " 'MD': 'G',\n", - " 'ME': 'R',\n", - " 'MI': 'B',\n", - " 'MN': 'G',\n", - " 'MO': 'R',\n", - " 'MS': 'R',\n", - " 'MT': 'G',\n", - " 'NC': 'B',\n", - " 'ND': 'B',\n", - " 'NE': 'G',\n", - " 'NH': 'B',\n", - " 'NJ': 'G',\n", - " 'NM': 'B',\n", - " 'NV': 'B',\n", - " 'NY': 'B',\n", - " 'OH': 'G',\n", - " 'OK': 'G',\n", - " 'OR': 'G',\n", - " 'PA': 'R',\n", - " 'RI': 'B',\n", - " 'SC': 'G',\n", - " 'SD': 'R',\n", - " 'TN': 'G',\n", - " 'TX': 'R',\n", - " 'UT': 'G',\n", - " 'VA': 'R',\n", - " 'VT': 'R',\n", - " 'WA': 'B',\n", - " 'WI': 'R',\n", - " 'WV': 'Y',\n", - " 'WY': 'B'}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "backtracking_search(solve_simple)\n", - "backtracking_search(solve_parameters, order_domain_values=lcv, select_unassigned_variable=mrv, inference=mac)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "460302" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solve_simple.nassigns" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "49" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solve_parameters.nassigns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TREE CSP SOLVER\n", - "\n", - "The `tree_csp_solver` function (**Figure 6.11** in the book) can be used to solve problems whose constraint graph is a tree. Given a CSP, with `neighbors` forming a tree, it returns an assignement that satisfies the given constraints. The algorithm works as follows:\n", - "\n", - "First it finds the *topological sort* of the tree. This is an ordering of the tree where each variable/node comes after its parent in the tree. The function that accomplishes this is `topological_sort`, which builds the topological sort using the recursive function `build_topological`. That function is an augmented DFS, where each newly visited node of the tree is pushed on a stack. The stack in the end holds the variables topologically sorted.\n", - "\n", - "Then the algorithm makes arcs between each parent and child consistent. *Arc-consistency* between two variables, *a* and *b*, occurs when for every possible value of *a* there is an assignment in *b* that satisfies the problem's constraints. If such an assignment cannot be found, then the problematic value is removed from *a*'s possible values. This is done with the use of the function `make_arc_consistent` which takes as arguments a variable `Xj` and its parent, and makes the arc between them consistent by removing any values from the parent which do not allow for a consistent assignment in `Xj`.\n", - "\n", - "If an arc cannot be made consistent, the solver fails. If every arc is made consistent, we move to assigning values.\n", - "\n", - "First we assign a random value to the root from its domain and then we start assigning values to the rest of the variables. Since the graph is now arc-consistent, we can simply move from variable to variable picking any remaining consistent values. At the end we are left with a valid assignment. If at any point though we find a variable where no consistent value is left in its domain, the solver fails.\n", - "\n", - "The implementation of the algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(tree_csp_solver)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now use the above function to solve a problem. More specifically, we will solve the problem of coloring the map of Australia. At our disposal we have two colors: Red and Blue. As a reminder, this is the graph of Australia:\n", - "\n", - "`\"SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: \"`\n", - "\n", - "Unfortunately as you can see the above is not a tree. If, though, we remove `SA`, which has arcs to `WA`, `NT`, `Q`, `NSW` and `V`, we are left with a tree (we also remove `T`, since it has no in-or-out arcs). We can now solve this using our algorithm. Let's define the map coloring problem at hand:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "australia_small = MapColoringCSP(list('RB'),\n", - " 'NT: WA Q; NSW: Q V')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will input `australia_small` to the `tree_csp_solver` and we will print the given assignment." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Q': 'R', 'NT': 'B', 'NSW': 'B', 'WA': 'R', 'V': 'R'}\n" - ] - } - ], - "source": [ - "assignment = tree_csp_solver(australia_small)\n", - "print(assignment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`WA`, `Q` and `V` got painted with the same color and `NT` and `NSW` got painted with the other." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GRAPH COLORING VISUALIZATION\n", - "\n", - "Next, we define some functions to create the visualisation from the assignment_history of **coloring_problem1**. The reader need not concern himself with the code that immediately follows as it is the usage of Matplotib with IPython Widgets. If you are interested in reading more about these visit [ipywidgets.readthedocs.io](http://ipywidgets.readthedocs.io). We will be using the **networkx** library to generate graphs. These graphs can be treated as the graph that needs to be colored or as a constraint graph for this problem. If interested you can read a dead simple tutorial [here](https://www.udacity.com/wiki/creating-network-graphs-with-python). We start by importing the necessary libraries and initializing matplotlib inline.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import networkx as nx\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib\n", - "import time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The ipython widgets we will be using require the plots in the form of a step function such that there is a graph corresponding to each value. We define the **make_update_step_function** which return such a function. It takes in as inputs the neighbors/graph along with an instance of the **InstruCSP**. This will be more clear with the example below. If this sounds confusing do not worry this is not the part of the core material and our only goal is to help you visualize how the process works." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def make_update_step_function(graph, instru_csp):\n", - " \n", - " def draw_graph(graph):\n", - " # create networkx graph\n", - " G=nx.Graph(graph)\n", - " # draw graph\n", - " pos = nx.spring_layout(G,k=0.15)\n", - " return (G, pos)\n", - " \n", - " G, pos = draw_graph(graph)\n", - " \n", - " def update_step(iteration):\n", - " # here iteration is the index of the assignment_history we want to visualize.\n", - " current = instru_csp.assignment_history[iteration]\n", - " # We convert the particular assignment to a default dict so that the color for nodes which \n", - " # have not been assigned defaults to black.\n", - " current = defaultdict(lambda: 'Black', current)\n", - "\n", - " # Now we use colors in the list and default to black otherwise.\n", - " colors = [current[node] for node in G.node.keys()]\n", - " # Finally drawing the nodes.\n", - " nx.draw(G, pos, node_color=colors, node_size=500)\n", - "\n", - " labels = {label:label for label in G.node}\n", - " # Labels shifted by offset so as to not overlap nodes.\n", - " label_pos = {key:[value[0], value[1]+0.03] for key, value in pos.items()}\n", - " nx.draw_networkx_labels(G, label_pos, labels, font_size=20)\n", - "\n", - " # show graph\n", - " plt.show()\n", - "\n", - " return update_step # <-- this is a function\n", - "\n", - "def make_visualize(slider):\n", - " ''' Takes an input a slider and returns \n", - " callback function for timer and animation\n", - " '''\n", - " \n", - " def visualize_callback(Visualize, time_step):\n", - " if Visualize is True:\n", - " for i in range(slider.min, slider.max + 1):\n", - " slider.value = i\n", - " time.sleep(float(time_step))\n", - " \n", - " return visualize_callback\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally let us plot our problem. We first use the function above to obtain a step function." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "step_func = make_update_step_function(neighbors, coloring_problem1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we set the canvas size." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "matplotlib.rcParams['figure.figsize'] = (18.0, 18.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally our plot using ipywidget slider and matplotib. You can move the slider to experiment and see the coloring change. It is also possible to move the slider using arrow keys or to jump to the value by directly editing the number with a double click. The **Visualize Button** will automatically animate the slider for you. The **Extra Delay Box** allows you to set time delay in seconds upto one second for each time step." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nTLPjAKijILMDAJ6QnZ2t6667zuwYF5SWlqbXX3/d7BgAAABwk+nTp6t58+Zq06aN1q5dq169ep3z\ntddff70mTpyotLS0X3x87dq1uu666/TYY49p8ODBatKkibtjAz7rfF+DAKyDFZzwC1ZZwWm321nB\nCQAA4MN69eqlpKQk2Wy2C7727rvv/lW5KUk9evRQz549VV5ervXr17sjJgAAlkLBCZ/ncDi0b98+\nJSYmmh3lgi699FI5HA7t37/f7CgAAADwYsHBwZKkoCA25QEAQMEJn5eXl6fExERL/OHPZrNxDicA\nAADOa8+ePfrss88UERGh7t27mx0HAADTUXDC51lle3o1Ck4AAACcS1lZmYYOHaqysjJNmTJFsbGx\nZkcCAMB0FJzweosXL9a4cePUrVs3RUdHy2az6c477zzve6qqqvT666+re/fuuvPOO7Vs2TK1atVK\n6enpysnJ8VDyurHb7crMzDQ7BgAAALxMVVWVhg0bpi+//FLp6el69NFHzY4EAIBX8P49u/B7zz33\nnDZv3qyoqCg1b95cO3fuPO/ri4uLNXDgQK1evVqpqalKTExUQkKC4uLilJGRoZycHCUnJ3sofe2l\npaXpqaeeMjsGAAAAvEhVVZXuvPNOLVq0SLfffrvefffdGl1UBACAP2AFJ7ze9OnTlZOTo6KiIs2c\nOfOCrx81apRWr16tWbNmadOmTYqJidHkyZP1zjvv6IcfftBvf/tbD6Suu+TkZB04cEDHjh0zOwoA\nAAC8QEVFhYYMGaL58+frjjvu0Pvvv2+J8+UBAPAUCk54vV69eikpKalG36HOzMzU+++/r/T0dI0a\nNUoul+tXZ3BW3zjprQIDA5WSkqKsrCyzowCAz5k4caL69OmjFi1aKDw8XBdffLHS0tL09NNP6/Dh\nw2bHA4BfKS8v1+DBg7Vo0SINHz5c77zzjgIDA82OBQCAV+HbfvAp77//viRpyJAhKiws1HvvvafS\n0lJ9+OGH6tOnj9q0aWNywpqpvmioZ8+eZkcBAJ8yffp02e12XXfddWrUqJFOnDihjRs3asqUKZo9\ne7Y2btyoFi1amB0TACSdvFDo1ltv1fLlyzVixAjNnj1bAQGsUQGMtGTJEi1ZskSStH//fknShg0b\ndPfdd0uS4uLiNG3aNLPiAaghCk74lG+++UaStGfPHrVu3frUapzRo0fLZrNpzJgxevXVV73+u95p\n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\nI0eO6OjRo8rLy9N7772nu+666xcrdy699FK98cYbGjp0qJ5//nnFx8frlltukcPhMPGzqLu0tDRl\nZmaaHQMAPObQoUO6//77T/369+KLLyo3N1ddu3Y96+sDAgL03HPPaf369br66qsVHh5+ztuMbTab\noqKi1Lx5c73xxhvKysrS0KFDddttt6m8vNydnxYAC/ryyy/VtWtXPfTQQ5o+fbrHV3rfd999WrRo\nkQoLCz36XMBKPvroI+3YsUMTJ040OwoAD7C5uKUEFnbnnXeqZ8+euu+++2r8nsmTJ+vrr7/Wxx9/\nrLvuukvFxcX64IMPFBoa6sakxsvNzVXfvn21Z88es6MAgFuVlZXplVde0bPPPiun06nbbrtNf/3r\nXxUXF1erOTt37tS7776rtWvXavv27XI4HAoKClLLli3VtWtXDRo0SL169Tq1hc3pdOrWW29VXFyc\n5syZw9Y2AJKk999/X+PHj9fbb7+t66+/3rQc6enp6tatmx588EHTMgDeqri4WFdccYXefPNN9erV\ny+w4ADyAghOW1rJlS61cuVJt27at8XsqKyvVt29f9ezZU5MnT9bvfvc7VVVVadGiRQoODnZjWmM5\nnU41aNBA+fn5atiwodlxAMBwLpdLixcv1vjx41VaWqpLL71Ur7/+ujp16uSxDMXFxbr22mt1zz33\naPz48R57LgDv43K59Mwzz+iNN97Q0qVL1aFDB1PzrFmzRg888IC2bdvGN2CAMzz66KMqKCjQ22+/\nbXYUAB7CFnVY1k8//aSSkhIlJyfX6n1BQUGaN2+e5syZo88//1zz5s2T0+nUkCFDVFFR4aa0xgsI\nCFBqairncALwSV999ZU6d+6sMWPGqLS0VNOmTVNmZqZHy03p5IV1H330kV544QWtWLHCo88G4D3K\nyso0bNgwLVu2TBs3bjS93JSkHj16yOVyKSMjw+wogFfZvHmz3n77bU2bNs3sKAA8iIITlrVu3Tp1\n7dq1Tt+xbtKkid59913dddddOnjwoBYtWqTS0lINGzZMlZWVbkjrHtykDsDX/PjjjxoyZIh++9vf\naufOnRoyZIh27dqle++9VwEB5vyxJSEhQYsXL9bw4cO1c+dOUzIAMM+hQ4fUt29flZWVac2aNYqP\njzc7kqSTZwePHj2ay4aA0zidTo0ePVpTp05Vo0aNzI4DwIMoOGFZGRkZ57xYoiZ69eqlBx98UOnp\n6QoICNAHH3ygo0eP6u6771ZVVZWBSd2HghOArygqKtITTzyh9u3ba82aNWrfvr3WrVunv//974qN\njTU7nq699lq9+OKLGjBggI4cOWJ2HAAesnPnTl1zzTXq2rWrFixY8IsLLL3B8OHDtWLFCh04cMDs\nKIBXmD17tgIDA3XvvfeaHQWAh1FwwrLWrVunbt261WvGpEmTFB0drSeeeEJhYWFasmSJ9u3bp/vu\nu09Op9OgpO5jt9u5SR2ApVVWVmr27Nlq06aNFi5cqMjISP3tb39TRkaGUlJSzI73C3fffbduvvlm\nDR482FJHmgCom9WrV6tHjx564okn9Pzzz5u2ivx8GjRooEGDBul//ud/zI4CmG7//v364x//qH/+\n859e+fUKwL24ZAiWdPToUV166aU6cuRIvS8GOnz4sOx2u1599VUNHDhQJ06cUP/+/ZWcnOz1vzlW\nVFQoJiZGBQUFioqKMjsOANTKypUrNWHCBJWVlenw4cMaOXKknnzySV100UVmRzunqqoq3XTTTUpI\nSNCMGTPMjgPATd544w09/vjjmj9/vtffwPzdd9/p1ltv1e7duxUYGGh2HMA0d9xxhxISEvT888+b\nHQWACby3uQHOY/369ercubMht543bNhQ8+fP1/3336/8/HxFRkZq2bJl2rFjhx588EF58/cAgoOD\ndfnll2vLli1mRwGAGvv+++/Vr18/jRgxQsXFxWrVqpU2bNigF154wavLTUkKDAzUvHnztHbtWgpO\nwAc5nU5NmjRJf/7zn7V27VqvLzcl6corr1Tjxo3173//2+wogGk++eQTbdiwQU899ZTZUQCYhIIT\nllTf8zfP1KVLFz3xxBMaPHiwHA6HoqKitHz5cm3atEkPP/ywV5ecbFMHYBUFBQUaM2aMunfvrgMH\nDigoKEgvv/yyVq5cqXbt2pkdr8aio6O1dOlSPfPMM1q1apXZcQAYpKSkROnp6crIyNDGjRst9evS\nmDFjuGwIfqu0tFRjx47Va6+95nXn5ALwHApOWJIR52+e6eGHH1ZCQoIeeeQRSSf/ArtixQpt2LBB\njz76qNeWnFw0BMDbORwO/eUvf9Fll12mrVu3yuVy6cYbb9T27dt1yy23yGazmR2x1lq1aqX58+dr\n6NChys3NNTsOgHrav3+/evXqpdDQUH322WeKi4szO1KtpKen66uvvlJ+fr7ZUQCPe/7555WWlqb+\n/fubHQWAiSg4YTkOh0NZWVnq3LmzoXNtNpvmzp2rlStXav78+ZKkmJgYffLJJ/r88881adIkryw5\nKTgBeCuXy6X58+erXbt2Wrp0qaKjo9WwYUN9++23euaZZyy/yqJnz5567rnnNGDAAB07dszsOADq\naNu2bbrmmmvUv39/vfPOOwoNDTU7Uq1FRERo2LBhmj17ttlRAI/auXOnZs6cqVdeecXsKABMxiVD\nsJyMjAw98sgj+vrrr90yPysrS9ddd50yMjJObU06fPiwevfurYEDB+qZZ55xy3PrqqSkRHFxcTp2\n7JhCQkLMjgMAkqQNGzZowoQJKi4uVoMGDbR//3698sorPrm64uGHH9bOnTu1bNkyBQUFmR0HQC2s\nXLlSw4YN0/Tp0zV06FCz49RLdna2unfvrh9//NGSJS1QWy6XS7169dKgQYM0btw4s+MAMBkrOGE5\nRp+/eabU1FRNnTpVt912m0pKSiSdvIho1apV+vDDD/Xss8+67dl1ERERocTERH3//fdmRwEA5efn\nKz09XYMHD1Z8fLz27dun/v37a9u2bT5ZbkrSX//6V0nSo48+anISALUxc+ZM3X333frXv/5l+XJT\nktq2bav27dvrww8/NDsK4BFvv/22Tpw4obFjx5odBYAXoOCE5bjj/M0z3XfffUpLS9PYsWNPbUu/\n5JJL9Nlnn+n999/XX/7yF7c+v7bYpg7AbIWFhZo4caI6deqkwMBABQUFKSQkRJs2bdKkSZN8ejVR\nUFCQFixYoBUrVmjOnDlmxwFwAVVVVfr973+vV155RevWrdO1115rdiTDcNkQ/MXhw4c1ceJEzZo1\nS4GBgWbHAeAFKDhhKVVVVVq/fr3b/yBqs9k0a9YsffPNN5o7d+6pjzdu3FirV6/W3LlzT63Y8QYU\nnADMUllZqRkzZqht27batWuXUlJStHnzZs2dO1cLFixQixYtzI7oEQ0aNNDSpUv15JNPau3atWbH\nAXAOxcXFuuWWW7R582Zt2LBBrVu3NjuSoQYOHKi8vDxt27bN7CiAW/3hD39Qenq6rrzySrOjAPAS\nFJywlG3btik+Pl6NGjVy+7MiIyO1ePFiPf7449q8efOpjzdp0kSrV6/2qsOs7Xa7MjMzzY4BwI+4\nXC4tX75cKSkpWrhwofr166c1a9ZowIABysrKUu/evc2O6HFJSUl67733lJ6ert27d5sdB8AZ/vOf\n/6hbt25q1KiRVqxYodjYWLMjGS44OFj33XefZs2aZXYUwG0yMjL0ySefeN3RYQDMRcEJS3H3+Ztn\nuuyyy/Tyyy9r8ODBKioqOvXx5s2ba/Xq1XrllVc0Y8YMj+U5l9TUVG3ZskVVVVVmRwHgB7Zs2aLf\n/va3mjBhgm688Ubt2rVLTqdTW7du1YQJExQcHGx2RNP07dtXTz31lAYMGPCL3zcAmCszM1NdunTR\nkCFDNGfOHJ++mHHkyJF6//33VVxcbHYUwHDl5eUaPXq0Xn75ZUVHR5sdB4AXoeCEpXji/M0zDR06\nVL1799aIESNOnccpSZdeeqlWr16tF198UbNnz/ZopjPFxsYqLi5OeXl5puYA4Nv279+v+++/X9dd\nd506deqkxo0b69NPP9X8+fP11ltv/R97dx5W49r2D/zbSCVD2tohc4gKaaDaJGxCiUTIUIaKIkUy\nyzxXJNUuJbSlomSKECWhFKXJNkTIkAyNqnX//tivfs/aptJa3WvV+TmO53iPp3v69ry1tM51XecJ\nRUVFtiMKhIULF2Lo0KGYOnUqffBEiACIiorCqFGj4OHhARcXF4iIiLAdia86duyIoUOHIiQkhO0o\nhPDc7t270bVrV0ycOJHtKIQQAUMFTiI0GIZp8BWcX3h4eODhw4fw8vLi+nqXLl1w6dIlbNy4EYGB\ngQ2e63/RNnVCCL+UlZVh8+bNUFVVhZSUFCZOnAh/f39YWFggOTm5UQ3o4BVPT0+Ul5fD1dWV7SiE\nNFkMw8Dd3R0LFizAmTNnYGZmxnakBvNl2ND/fjhPiLB79OgRdu/eDS8vr0b/QQUhpO6owEmExpMn\nT8AwDLp169bgz27evDnCwsKwceNG3Lx5k+tY9+7dcenSJaxZswaHDx9u8Gxf0KAhQgivcTgcHDly\nBL169UJaWhpcXFwQFhYGDoeDzMxM2NnZ0eTS75CQkEBYWBgiIyMRFBTEdhxCmpyqqiosWLAAgYGB\nSExMhLa2NtuRGtSIESPw6dOnr/5uJURYMQyDhQsXwsXFBV26dGE7DiFEAImzHYCQ2vqyepOtT+u6\nd+8OX19fTJkyBSkpKWjbtm3NsZ49e+LixYsYPnw4xMXFMXXq1AbPN2DAAHh4eDT4cwkhjVN8fDyc\nnJwgKiqKdevWwd/fH8+ePUN0dDQ0NTXZjicU5OTkcOrUKQwdOhTKysq00pWQBvLhwwdMnjwZoqKi\nSEhIaJJ9+kRFRWFrawtvb28MGjSI7TiE1FtYWBjy8/OxZMkStqMQQgQUreAkQoON/pv/NWHCBJiZ\nmWHmzJngcDhcx1RUVHDhwgU4OTkhLCyswbN92aJOW5EIIfXx8OFDTJo0CZaWlpg7dy769euHVatW\nYd68eUhMTKTiZh2pqKggODgY5ubmyMvLYzsOIY3ekydPoKenhx49eiA6OrpJFje/sLKywqlTp1BY\nWMh2FELq5cOHD1iyZAl8fX2b9CBDQsiPUYGTCA22+m/+17Zt21BUVIQdO3Z8dUxVVRXnz5+Hg4MD\nIiMjGzSXoqIiJCQk8OzZswZ9LiGkcSgqKoKzszN0dHQwYMAAODs7Y82aNZCSkkJ2djasra0hKkp/\nNvyK0aNHw8XFBSYmJjTVmBA+unnzJnR1dTFv3jx4eXlBXLxpb1Zr27YtTExMWO8TT0h9rV69GmPH\njoWuri7bUQghAozeqRCh8ObNG7x48QLq6upsR4GEhARCQ0Ph4eGBq1evfnW8X79+OHv2LGxsbHD6\n9OkGzUZ9OAkhdVVZWYm9e/eiV69eKC4uRlBQECIiIhAREYHY2Fh4enqidevWbMcUeosXL4a2tjYs\nLS2/2gFACKm/sLAwjBs3Dr6+vli8eDENIPk/dnZ28PHxodcdIrRu376N8PBwbNu2je0ohBABRwVO\nIhSuX7+OwYMHC8wwCyUlJQQFBWHatGl49erVV8c1NDRw+vRpWFtb4/z58w2WS0NDgwqchJBaYRgG\np06dgqqqKs6cOYPjx4+joqICtra2WLZsGeLi4gTiQ6XGQkREBPv378e7d++wevVqtuMQ0mgwDIOt\nW7fC2dkZFy9ehLGxMduRBMqgQYPQokULxMbGsh2FkDqrqqqCjY0Ndu7cCTk5ObbjEEIEHBU4iVAQ\nhP6b/zV69GhYW1tj2rRpqK6u/uq4lpYWoqKiMHPmTFy8eLFBMg0YMAB37txpkGcRQoRXamoqhg8f\njhUrVmD37t0wMjKCubk5FBQUkJWVhalTp9LqJz6QlJREREQEjh07hqNHj7IdhxCh9/nzZ1hbWyM8\nPBxJSUno378/25EEjoiICOzs7HDgwAG2oxBSZ15eXpCTk8P06dPZjkIIEQIiDE0kIUJAR0cHO3bs\nwNChQ9mOwqW6uhp//vkndHV1sXHjxm+ek5CQgIkTJyI0NBTDhg3ja56HDx/CwMCA+nASQr7pxYsX\nWL16Nc6dO4d169ahR48ecHR0RPv27bF371707t2b7YhNQkZGBgwNDREdHQ0dHR224xAilN69e4eJ\nE89By5MAACAASURBVCeiVatWCAkJgYyMDNuRBFZxcTE6deqEe/fuoWPHjmzHIaRW8vPz0b9/fyQm\nJqJnz55sxyGECAFawUkEXklJCTIyMqCtrc12lK+IiYkhJCQEgYGB392Krq+vj7CwMEyZMgXXrl3j\na56uXbvi48ePePPmDV+fQwgRLiUlJXBzc4OamhoUFBRw+fJlxMXFYe7cudi4cSNiYmKouNmAVFVV\ncfDgQUycOJE+kCLkF/zzzz8YPHgwBg4ciBMnTlBx8ydatGiBqVOn4q+//mI7CiG1tmjRItjb21Nx\nkxBSa1TgJALv5s2b6NevH6SkpNiO8k0KCgoICQnB7Nmzv/tGdejQofj7778xadIkJCYm8i2LqKgo\nDRoihNTgcDgICgpCr169kJ2djcTERLRs2RL6+vro2bMnMjMzMWHCBNqOzoJx48bB0dER48ePR0lJ\nCdtxCBEa8fHx0NfXh5OTE3bv3i0w/dkFnZ2dHfz9/VFZWcl2FEJ+Kjo6GhkZGXB1dWU7CiFEiFCB\nkwg8Qey/+V9DhgyBo6MjpkyZ8t0/HIcPH47Dhw/D1NQUt27d4lsWKnASQgAgLi4Ompqa8PPzQ3h4\nOGbNmgVjY2MkJSXh9u3b2LBhA6SlpdmO2aQtXboUampqmD17Nk04JqQWjhw5AjMzMwQHB8PGxobt\nOEJFVVUV3bp1w6lTp9iOQsgPlZSUwMHBAT4+PmjevDnbcQghQoQKnETgffmkXtC5uLigbdu2P/yk\ncdSoUQgKCoKxsTFSUlL4koMKnIQ0bbm5uTA1NYWVlRVcXV1x5MgRbNu2DQ4ODvDw8EBUVBS6devG\ndkyCf4d/+Pn54fnz59iwYQPbcQgRWAzDYO3atVizZg2uXLmCP//8k+1IQomGDRFh4Obmhj/++AOG\nhoZsRyGECBkqcBKBVlVVhZs3b0JPT4/tKD8lKiqKQ4cOISIiAidPnvzueWPGjMFff/2FsWPHIi0t\njec5NDQ0aJI6IU3Qu3fv4OjoCD09Pejq6uLOnTvIzMyEtrY2dHR0kJGRgTFjxrAdk/xHs2bNcPLk\nSQQFBeH48eNsxyFE4JSXl2P69Om4cOECkpKS0LdvX7YjCS0zMzOkp6cjNzeX7SiEfNO9e/cQFBSE\n3bt3sx2FECKEqMBJBFpaWho6deoEOTk5tqPUipycHI4fPw4bGxs8fPjwu+eZmJhg//79MDIyQnp6\nOk8z9O7dG8+fP8enT594el9CiGD6/Pkz3N3d0atXL1RWVuL+/fvo2bMnNDQ0kJWVhdTUVKxYsQLN\nmjVjOyr5DgUFBURFRWHhwoVITk5mOw4hAuPNmzcYPnw4qqurceXKFSgoKLAdSag1a9YMVlZW8PHx\nYTsKIV/hcDiwsbHB5s2b0a5dO7bjEEKEEBU4iUAThv6b/6WtrY01a9bA3Nwc5eXl3z3PzMwMHh4e\nGDVqFDIzM3n2fHFxcfTt2xd3797l2T0JIYKHYRicPHkSffv2RWxsLK5evYpFixZh5syZWLVqFQIC\nAhAaGgolJSW2o5Ja6NevH/z8/DBhwgS8ePGC7TiEsC4rKwuDBg3CsGHD8PfffwvssElhY2Njg+Dg\nYJSVlbEdhRAuf/31F0RFRTFnzhy2oxBChBQVOIlAE5b+m/9lb2+PHj16wNHR8YfnTZkyBTt37sTI\nkSORk5PDs+fTNnVCGreUlBQYGBhg3bp18Pb2RmhoKA4dOgQ9PT38+eefSEtLo95VQmjChAmwtbWF\nqakpFR9Ik3bp0iUMHToUa9euxaZNmyAqSm9ZeKVr167Q0dFBaGgo21EIqfHq1SusWbMGPj4+9PtO\nCPll9OpBBBbDMEK5ghP4d3CEv78/Ll++jKNHj/7w3OnTp2Pz5s0YMWIE/vnnH548nwYNEUEXHh4O\nBwcH/PHHH2jZsiVERERgaWn53fM/ffqEVatWoXfv3mjevDnatGmDUaNG4dKlSw2Ymn35+fmYOXMm\njI2NMWPGDNy5cweFhYVQUVFBQUEB0tPT4eTkBAkJCbajkl+0cuVK9OjRA9bW1mAYhu04hDQ4f39/\nTJs2DcePH8esWbPYjtMo0bAhImicnJxgZWUFNTU1tqMQQoQYFTiJwHrw4AGaNWuGTp06sR3ll7Rs\n2RLh4eFwdHT86Rb02bNnY926dRg+fDgePXpU72dTgZMIuk2bNsHLywtpaWno0KHDD88tKirCoEGD\nsGXLFoiLi8PW1hZmZma4c+cORowYgYCAgAZKzZ7i4mKsXbsW/fr1Q6dOnZCTkwMdHR2MGDEC27dv\nx7Fjx3Do0CEoKiqyHZXUk4iICAICAvDw4UNs2bKF7TiENBgOh4Ply5dj+/btiI+Ph4GBAduRGi0j\nIyO8evUKKSkpbEchBLGxsUhMTMTatWvZjkIIEXJU4CQCS1hXb/4vdXV1bN++Hebm5igpKfnhuXPn\nzoWrqysMDQ2Rl5dXr+eqqakhNzcXFRUV9boPIfzi7u6O3NxcfPz48aerSNavX4/MzExMnDgRaWlp\n8PDwgL+/P+7fvw8lJSU4ODggPz+/gZI3rOrqagQEBKBnz554/Pgx0tLSsHTpUqxZswbDhw/HlClT\nkJycDD09PbajEh6SkpJCVFQUfHx8cPLkSbbjEMJ3paWlMDc3x40bN5CUlISePXuyHalRExMTw/z5\n82kVJ2FdeXk5FixYAC8vL8jIyLAdhxAi5KjASQSWsPbf/C8rKytoaWnB1tb2p9sN7ezs4OzsDEND\nQzx79uyXnyklJYXu3bsjIyPjl+9BCD8NGzYMysrKEBER+em5Xwo8GzZsgLi4eM3X27VrBycnJ5SV\nleHgwYN8y8qW2NhYaGhoICgoCFFRUTh06BAuXboEFRUVlJWVITMzE3Z2dhATE2M7KuEDRUVFREZG\nwsbGBmlpaWzHIYRvXr58iaFDh0JGRgYXL15E27Zt2Y7UJMyZMwcRERF4//4921FIE7Z161aoq6tj\n7NixbEchhDQCVOAkAqsxrOAE/t1u6O3tjbS0NPj7+//0fAcHByxcuBCGhoZ4/vz5Lz+XtqmTxqKg\noAAA0K1bt6+OfflaY+rFmZ2dDWNjY9jY2GDt2rW4du0aREVFoaenBx8fH0RHR8PX1xfy8vJsRyV8\nNnDgQOzfvx/jx4/Hq1ev2I5DCM/du3cPgwYNwvjx43Ho0CE0a9aM7UhNhoKCAkaNGoXg4GC2o5Am\nKicnB97e3vD09GQ7CiGkkaACJxFIBQUFKCwsRJ8+fdiOwhPS0tIIDw/HypUra1V0dHJywty5czF8\n+PCa4k5dUYGTNBZfCnmPHz/+6tiXnrU5OTkNmokf3r59C3t7e/zxxx8YNmwYMjMzYWBgADs7O4wd\nOxbz5s1DYmIiNDU12Y5KGpC5uTmsrKwwYcIElJeXsx2HEJ45e/ZsTR/h1atX12pFP+EtOzs7+Pj4\n0EAz0uAYhoGtrS1Wr179017shBBSW1TgJAIpISEBenp6EBVtPD+ivXr1wr59+2Bubo4PHz789Pzl\ny5fD0tIShoaGeP36dZ2fp6GhgTt37vxKVEIEypdtS+vWrUN1dXXN19+8eQN3d3cA/w4iElYVFRXY\ntWsXVFRUICoqiqysLCxevBiBgYFQUVFBs2bNkJ2dDWtr60b1mkhqb+3atejYsSNsbGyoEEEaBS8v\nL8yZMwdRUVGwsLBgO06TNWTIEIiIiODq1atsRyFNzOHDh/Hx40fY29uzHYUQ0ojQOyUikBISEhpF\n/83/srCwwKhRo2BtbV2rN6mrV6+Gubk5RowYgbdv39bpWf3790d6ejpXQYgQYbRhwwYoKSkhPDwc\n/fv3h6OjI+bNm4e+fftCTk4OAISy8McwDMLCwqCiooL4+HgkJCRg7969yM3NhZaWFv7++2/ExsbC\n09MTrVu3ZjsuYZGoqCiCgoKQkZGBnTt3sh2HkF9WXV2NRYsWwdvbG9evX8fgwYPZjtSkiYiIwNbW\nloYNkQZVWFgIFxcX+Pr6Uh9xQghPCd87QtIkxMfHN4r+m9+yZ88e5OXl1brfzPr16zFu3DiMHDkS\n7969q/VzWrVqBQUFBeTm5v5qVEIEgqKiIm7fvo2FCxfi06dP8Pb2xpkzZzBlyhSEhYUB+HfgkDC5\nefMm9PX1sWXLFgQEBCAqKgqtWrXC7NmzMXnyZCxbtgxxcXFQV1dnOyoRENLS0oiKioKnpyeio6PZ\njkNInX369Anjx49HZmYmEhMTv9lXmTS8mTNn4sKFC7/cEomQunJ1dcXkyZOp5Q4hhOeowEkEzqdP\nn5CTk4OBAweyHYUvmjVrhrCwMGzZsgU3btz46fkiIiLYvHkzRowYgT///LNO0y5pmzppLBQUFODl\n5YUnT57g8+fPePHiBfbt24enT58CALS0tFhOWDtPnz7F9OnTMXHiRMybNw/JycnQ19eHh4cH1NTU\noKCggKysLEydOpX60ZGvdOzYESdOnMCcOXOQnp7OdhxCau3Zs2f4448/0L59e5w7d45WpQuQVq1a\nYdKkSQgICGA7CmkCEhIScO7cOWzatIntKISQRogKnETg3LhxAwMHDmzUkzS7du0Kf39/TJkypVZb\nz0VERLBjxw7o6+tj1KhRterhCdCgIdL4fZn+Om3aNJaT/NjHjx+xcuVKDBgwAMrKysjJycHs2bNx\n7do1DBgwAGfPnkV8fDy2b98OWVlZtuMSAaajowMPDw+YmJjgzZs3bMch5KdSUlIwePBgWFpawtfX\nFxISEmxHIv9hZ2cHPz8/amtE+Orz58+wtbWFh4cHWrZsyXYcQkgjRAVOInAaa//N/zIxMYGFhQVm\nzJgBDofz0/NFRETg7u4OLS0tjBkzBp8+ffrpNVTgJI0Bh8NBcXHxV18/fPgwgoODoaurC1NTUxaS\n/VxVVRX8/PzQq1cvvHjxAvfu3cP69evx/v17WFhYwMrKChs3bkRMTAx69+7NdlwiJKZNm4Zp06bB\nzMwMnz9/ZjsOId8VGRmJ0aNHY9++fVi6dCmtTBdQGhoa+P3333H27Fm2o5BGbM+ePejUqRPMzMzY\njkIIaaREGBrHSQTMsGHDsHz5cowePZrtKHxXWVkJQ0NDjB49GqtWrarVNRwOB3Z2dsjKysK5c+cg\nIyPz3XNfvXoFFRUVFBYW0psKIlAiIyMRGRkJACgoKEBMTAy6detW03tXXl4eu3btAgAUFxdDQUEB\nI0eORPfu3SEqKorr16/jxo0bUFFRQWxsLNq3b8/a9/I9MTExcHZ2xm+//Ybdu3dDQ0MDFRUV2LNn\nD3bv3o2FCxdi+fLlkJaWZjsqEUIcDgdmZmZo27Yt/vrrL3qNJwKFYRjs3r0b7u7uiIqKol57QiAo\nKAjHjx+nIifhi8ePH0NLSwu3b99G165d2Y5DCGmkqMBJBMrnz58hJyeH58+fo1WrVmzHaRDPnz+H\npqYmQkJCMGzYsFpdw+FwMG/ePDx+/BinT5/+YYGkffv2SExMRJcuXXiUmJD6W79+Pdzc3L57vHPn\nznjy5AmAfz8IsLW1RUJCAvLz8wEAysrKmDx5MhwdHQWuQHj//n0sXboUDx8+xM6dO2FiYgIRERGc\nP38eixYtgoqKCtzd3WnABqm34uJi6OnpwcrKCo6OjmzHIQTAv6/Z9vb2SEpKwunTp6GkpMR2JFIL\nZWVlUFJSogIU4TmGYTB27FgMGTIErq6ubMchhDRiVOAkAiUpKQm2trZIS0tjO0qDunjxImbNmoWU\nlBQoKirW6prq6mpYWVmhoKAAp06dQvPmzbmOh4eH4+rVqzh69CjKy8tRVlaG6dOn48iRI1/d69mz\nZ9i6dStSUlKQl5eHoqIitG3bFt27d4e1tTUsLS2pZxYhP/H69WusW7cOERERWL16NWxtbSEpKYnH\njx9jyZIluH//Pjw9PTFmzBi2o5JGJC8vD4MHD0ZAQACMjIzYjkOauPfv38Pc3BySkpI4duwY9RQW\nMs7OzpCQkMC2bdvYjkIakfDwcKxfvx6pqan0foIQwlfUg5MIlISEhJotqk3JyJEjMX/+fEydOhVV\nVVW1ukZMTAyBgYGQl5fHhAkTUFFRwXV806ZN8PLyQklJyU9XuD18+BBHjx5Fq1atYGpqCmdnZxgb\nGyMvLw/W1tYYNWpUrXMR0tSUl5dj27Zt6NOnD6SkpJCdnY1Fixahuroa69evh5aWFnR0dJCRkUHF\nTcJznTt3RlhYGGbNmoWsrCy245Am7PHjx9DV1YWKigqioqKouCmEbG1tERgY+NXflIT8qo8fP8LR\n0ZEGjBFCGgQVOIlAiY+PbxIDhr5lzZo1kJCQwNq1a2t9jZiYGIKDg9GiRQtMmjSJa9iEu7s7cnNz\nERISAmVl5R/eR1dXF0VFRbhw4QJ8fHywZcsW+Pr64uHDhzAwMMCVK1dw4sSJX/7eCGmMGIbBsWPH\n0Lt3b9y6dQs3btzAnj170KZNG0RGRqJPnz7IyspCamoqVqxYgWbNmrEdmTRSenp62LFjB4yNjVFY\nWMh2HNIE3bhxA7q6urCzs8PevXshLi7OdiTyC5SVlaGuro6IiAi2o5BGYvXq1TAyMoKenh7bUQgh\nTQAVOInA4HA4uH79epMtcIqJieHo0aMIDg6uU4N3cXFxhISEQFxcHBYWFqisrATw77AmZWVlaGho\n4MGDBz+8h6SkJERFv345kJCQqJlO/bN7ENKUfHkzv2vXLgQHB+PEiRNQVlZGTk4OjIyMsGrVKgQE\nBCA0NJT6z5EGMXv2bEyYMAHm5uY1/w4Q0hBCQ0NhYmICf39/ODg4sB2H1JOdnR0OHDjAdgzSCCQn\nJ+P48ePU8oAQ0mCowEkERnZ2Nlq2bIkOHTqwHYU17dq1w7Fjx2BlZYWnT5/W+joJCQmEhoaisrIS\n06dP59pO3qVLF5SXl/9Snurq6ppiq7q6+i/dg5DG5PHjx5gyZQomT56MBQsW4NatWxgyZAiKi4vh\n6uoKfX19jBo1CmlpaTA0NGQ7Lmlitm3bBmlpaSxatAjUYp3wG8Mw2LRpE1xcXBAbG4uxY8eyHYnw\ngImJCR49eoT09HS2oxAhVlVVBRsbG+zYsQNt27ZlOw4hpImgAicRGE21/+Z/6evrY+nSpZg8eTLX\nlvOfkZSURHh4OD59+oSZM2eiuroaACAiIvLTLepfvH37FuvXr8e6deuwYMEC9O7dGxcuXMC0adNg\nbGz8S98PIY3Bhw8fsHz5cmhpaUFNTQ05OTmYMWMGREREcOzYMaioqODly5dIT0/HkiVLqM8UYYWY\nmBhCQkIQHx8Pb29vtuOQRqyiogKzZ89GZGQkkpKS0K9fP7YjER4RFxfHvHnzaBUnqZf9+/ejVatW\nmDFjBttRCCFNCE1RJwJjxowZGDJkCObNm8d2FNYxDIPx48ejW7du8PDwqNO1ZWVlMDExgaKiIgID\nAyEmJobJkycjLCzsu1PUv8jOzoaKikrNfxcREYGzszO2bNlCBRvSJFVVVcHPzw8bNmzAuHHjsHHj\nRigqKgIA0tPT4eDggA8fPsDLy4v6SxGB8ejRI+jq6uLIkSMYMWIE23FII1NYWIiJEyeibdu2OHz4\nMGRkZNiORHjs+fPnUFNTQ15eHg2LInWWn5+P/v374/r16+jVqxfbcQghTQit4CQCg1Zw/n8iIiI4\ndOgQoqKiEB4eXqdrpaSkEBUVhfz8fMybNw8cDqfWKzh79+4NhmFQVVWFvLw8uLu7w8/PD0OGDMG7\nd+9+5VshRCgxDIOzZ89CXV0dJ06cQExMDPz9/aGoqIj379/D0dERw4cPx5QpU5CcnEzFTSJQunXr\nhtDQUEyfPh25ublsxyGNSG5uLgYNGgQdHR2Eh4dTcbOR6tChAwwMDHD06FG2oxAh5OjoiIULF1Jx\nkxDS4KjASQRCfn4+iouL6R/C/9GmTRuEhYXBzs6uzgN+pKWlER0djX/++Qd2dnbo0aNHna4XExND\np06dsHjxYvj6+iIpKalO090JEWb37t3DqFGj4OzsjJ07d+LixYvo168fOBwOgoKCoKKigrKyMmRm\nZsLOzg5iYmJsRybkK0OHDsXmzZthbGyMoqIituOQRuDq1asYMmQIXFxcsGPHjm8OJySNx5dhQ7TZ\nj9TFmTNncO/ePaxYsYLtKISQJoj+MiECISEhAfr6+hAREWE7ikDR1NSEm5sbzM3NUVZWVqdrZWRk\ncObMGWRkZCAyMhIAfmmyrpGREQAgLi6uztcSIkwKCgowb948jBw5EuPHj8e9e/cwduxYiIiIICUl\nBXp6evDx8UF0dDR8fX0hLy/PdmRCfmju3LkwMjKChYUF1/A5Qurq0KFDMDc3x5EjR6iVUBMxfPhw\nlJaW4saNG2xHIUKipKQE9vb28Pb2RvPmzdmOQwhpgqjASQRCfHw89PX12Y4hkOzs7KCiooJFixbV\n+VpZWVmcO3euZovir2wzf/78OYB/m84T0hiVlZVh8+bNUFVVRZs2bZCTk4OFCxdCQkIChYWFsLW1\nxdixYzFv3jwkJiZCU1OT7ciE1NquXbtq+ikTUlccDgerV6+Gm5sbrl69Sj1dmxBRUVHY2trSsCFS\naxs2bICuri69ThBCWEMFTiIQqP/m94mIiMDPzw/x8fEIDg6u8/UtW7bEzp07Afw7FOVbW43u3LlT\nM3X9fxUXF2Px4sUAgLFjx9b52YQIMg6HgyNHjqBXr164e/cubt26hR07dqB169aorq6Gj48PVFRU\n0KxZM2RnZ8Pa2pq2ZBKhIy4ujmPHjiEmJgZ+fn5sxyFCpKysDNOmTcPly5eRlJTENYSQNA2zZ89G\ndHQ03r59y3YUIuDS09MRGBiIPXv2sB2FENKE0RR1wrr3799DSUkJ7969o0ndP5Ceng5DQ0NcuXIF\nqqqqPz0/MjKyZmt6QUEBYmJiICoqir59+0JDQwPy8vLYtWsXAMDU1BTXr1+Hrq4uOnXqBGlpaTx7\n9gznzp3D+/fvoauri5iYGLRo0YKv3yMhDSU+Ph5OTk4QFRXFnj17uIYEJSYmwt7eHrKysti3bx/U\n1dVZTEoIbzx48AD6+voIDQ2FgYEB23GIgHv9+jXGjx+PLl26IDAwkLabNmGzZs2Cqqoqli1bxnYU\nIqA4HA709fUxa9Ys2NjYsB2HENKEUYGTsO7s2bPYvXs3Ll26xHYUgRcUFITt27fj9u3bPy02rl+/\nHm5ubt893rlzZzx58gTAvw3B//77b9y6dQuvXr1CaWkp2rRpA3V1dUyePBnW1ta0RZ00Cg8fPsTy\n5ctx+/ZtbNu2DVOmTKlZlVlQUABXV1fExsZi586dsLCwoL7ApFG5dOkSpk+fjsTERHTr1o3tOERA\n3b9/H+PGjcPMmTOxfv16eh1s4pKSkmBpaYnc3FzaxUC+yc/PD0FBQUhISKCfEUIIq6jASVi3YsUK\nSEpK/rAYR/6/OXPmoKysDEePHq3Tm47y8nK0adMG2dnZGDNmDKZOnYrVq1fzMSkhdZecnIwLFy7g\n6tWrePToEaqrq9GmTRsMHjwYQ4YMgbGxMaSkpOp836KiImzatAmHDh2Cs7MzHB0da+5TWVmJ/fv3\nY/PmzbC2tsbq1ashKyvL62+NEIHg7e2N/fv348aNG2jZsiXbcYiAuXjxIqZPn47du3djxowZbMch\nAoBhGGhoaGDbtm0YNWoU23GIgHn9+jVUVVURGxtLO14IIayjAidh3R9//IF169ZRQ+paKisrw6BB\ng2BnZwdbW9s6XduvXz/4+/tDSUkJBgYGsLa2houLC5+SElJ7J06cwMqVK5Gfn4/Pnz+jsrKS67iI\niAhatGgBhmEwd+5cuLm51ao4U1lZCR8fH2zcuBETJkzAhg0boKCgUHP8ypUrcHBwQPv27bF37170\n7t2b598bIYJm4cKFePLkCU6dOgUxMTG24xAB4efnh7Vr1+L48eMYMmQI23GIAPHz88PZs2drWh8R\n8sWMGTOgqKiIHTt2sB2FEEKowEnYVV5eDnl5eRQUFFB/xzrIzc2Fnp4ezp8/j4EDB9b6utmzZ0NX\nVxfz58/HixcvMHToUCxYsABLlizhY1pCvq+wsBAzZ85EXFwcSktLa3VN8+bN0aJFCxw7dgzDhw//\n5jkMwyA6OhrLli1Dly5dsHv3bq7etfn5+Vi6dCmSkpLg7u4OU1NT2oZJmozKykoYGRmhf//+Nb2Y\nSdNVXV2N5cuXIzo6GqdPn4aysjLbkYiAKS4uRufOnZGWlgYlJSW24xABcenSJcyZMwf379+HjIwM\n23EIIYSmqBN2JScnQ0VFhYqbddSzZ094e3vD3NwcRUVFtb5OQ0MDqampAID27dvj8uXL8PLywr59\n+/gVlZDvevHiBTQ0NBAbG1vr4ibw7wcjb9++hbGxMQ4fPvzV8dTUVAwfPhwrVqyAp6cnYmJiaoqb\nFRUV2Lp1K/r3749evXohMzMTEyZMoOImaVIkJCRw/PhxREVFITAwkO04hEUlJSUwMzNDSkoKbty4\nQcVN8k0tWrTAtGnT8Ndff7EdhQiI8vJy2NnZYd++fVTcJIQIDCpwElbFx8dDX1+f7RhCydzcHOPG\njYOVlRVquxB7wIABuHPnTs1/V1JSwuXLl7Fnzx74+PjwKyohXyktLYW+vj5evHiBz58//9I9ysrK\nYGNjgwsXLgD4t2BqbW2NMWPGYPLkybh79y5Gjx5dc/758+ehpqaGpKQk3Lp1C25ubpCWlubJ90OI\nsJGTk0N0dDSWL1+OhIQEtuMQFrx48QJDhgxB69atERMTAzk5ObYjEQFma2sLf3//r1rIkKZp27Zt\nUFVVhbGxMdtRCCGkBhU4CasSEhLwxx9/sB1DaO3cuRMvXrzAnj17anV+v379kJGRgaqqqpqvde7c\nGZcuXcKWLVvg7+/Pr6iEcFm2bBkKCgq4fhZ/RVlZGSwsLODq6go1NTUoKCggJycHtra2EBcXBwA8\nfvwYpqamcHBwgIeHB6KiomiCNCEAevfujeDgYJibm+PJkydsxyENKC0tDYMGDYKZmRkCAwMhUfeV\nvQAAIABJREFUKSnJdiQi4Pr27QtlZWVERUWxHYWwLCcnB15eXti7dy/bUQghhAv14CSsqa6uhry8\nPLKzs7mGfpC6ycvLg7a2Nk6cOAE9Pb2fnq+srIzIyEj07duX6+sPHjyAoaEhNm3ahFmzZvErLiFI\nT0/HoEGD6rQt/We6d++O2NhYdOnSpeZrZWVl2L59O7y8vODs7AwnJyc0a9aMZ88kpLHw9PREQEAA\nrl+/DllZWbbjED47c+YMZs+ejf3792Py5MlsxyFC5NixY/Dz88Ply5fZjkJYwjAMRowYAWNjYzg6\nOrIdhxBCuNAKTsKa+/fvo127dlTcrKfOnTvj4MGDsLCwwJs3b356voaGBtc29S+UlZURGxuLlStX\n4ujRo/yISgiAf1ceV1RU8PSeL168QNu2bQH8+8d3ZGQk+vTpg6ysLKSmpmLFihVU3CTkOxYtWgQd\nHR1YWlqCw+GwHYfwCcMw2Lt3L+bNm4fo6GgqbpI6mzhxIjIzM5Gdnc12FMKSo0ePoqioCPb29mxH\nIYSQr1CBk7CG+m/yztixY2FpaQlLS0tUV1f/8NwBAwbUDBr6r169euHixYtYtmwZQkND+RGVNHEV\nFRUICwv76c9pXYmKiiIsLAw5OTkwMjLCqlWrEBAQgNDQUJr4SshPiIiIYP/+/Xj//j1Wr17NdhzC\nB1VVVXBwcICvry8SExMxaNAgtiMRISQpKQlra2vq295EvXv3DsuWLYOvr29NGyBCCBEkVOAkrKH+\nm7y1ceNGlJeXY/PmzT8870cFTgDo06cPYmJi4OjoiIiICF7HJE1ceno6X3q9lZSUYPfu3dDX18eo\nUaOQlpYGQ0NDnj+HkMZKUlISERERCA0NxZEjR9iOQ3jo48ePMDExQW5uLhITE7laeRBSV/Pnz8fh\nw4d52maGCAdXV1eYmZlBS0uL7SiEEPJNVOAkrGAYhlZw8pi4uDiOHTsGHx8fXLp06bvnfSlw/qj9\nrpqaGs6dO4cFCxZQM3nCU3fu3Kn3YKHvefbsGdLT07FkyRJISEjw5RmENGby8vI4deoUnJyckJSU\nxHYcwgNPnz6Fvr4+OnXqhDNnzqBVq1ZsRyJCrkuXLhg8eDCOHTvGdhTSgK5fv44zZ878dCEFIYSw\niQqchBV5eXmorq5G9+7d2Y7SqCgqKuLIkSOwtLTEixcvvnlOu3bt0KJFCzx+/PiH9+rfvz/Onj2L\n+fPn48yZM/yIS5qgd+/e8bz/5hfNmjXD77//zpd7E9JU9O3bFwcPHoSZmRmePXvGdhxSD7dv38bg\nwYNhZWWFAwcO0Ac/hGfs7Oxw4MABtmOQBlJZWQlbW1u4u7vThySEEIFGBU7Cii+rN0VERNiO0ugY\nGhpiwYIFsLCw+O5KuZ9tU/9i4MCBOHXqFKysrBATE8PrqKQJEhUV5dvvvago/ZNGCC+MGzcOS5Ys\nwfjx41FSUsJ2HPILIiIiMGbMGHh7e2PJkiX09xbhqdGjR+PNmzdITk5mOwppAHv27EHHjh1hbm7O\ndhRCCPkhejdIWEH9N/lr1apVkJaW/u6wiO9NUv8WHR0dREZGYsaMGT/c+k5IbXTs2BFSUlJ8uXeL\nFi1QWFjIl3sT0tQ4OztDXV0ds2bNosnqQoRhGOzYsQOLFy9GTEwMxo8fz3Yk0giJiYnBxsaGVnE2\nAU+ePMHOnTuxf/9++qCEECLwRJgfNeIjhE/69OmDI0eOQENDg+0ojdbbt2+hoaEBb29vjBs3rubr\npaWl2LZtG44dO4a+ffuirKwMLVu2hI6ODjQ1NaGnp/fNyYjx8fEwMzPD8ePHYWBg0IDfCRF2VVVV\nuHPnDuLi4hAdHY2EhAS+PKdDhw74+PEj2rVrBy0tLWhra0NLSwsaGhqQlpbmyzMJacwqKipgaGiI\nESNGwM3Nje045CcqKythZ2eHlJQUREdHo2PHjmxHIo3Y69ev0atXLzx69Aht2rRhOw7hA4ZhYGxs\nDD09PaxYsYLtOIQQ8lNU4CQN7u3bt+jevTsKCwu/WUgjvJOYmIgJEybg5s2bkJCQwObNm3Ho0CGI\nioqiuLiY61xJSUk0a9YMEhISsLe3h7OzM1q2bMl1zpUrVzBlyhScOHGCBkSR76qqqkJqairi4uJw\n5coVXL9+HZ07d4aBgQGGDh2KefPmoaioiKfPlJWVRUhICIyMjJCTk4Nbt27h9u3buHXrFu7fv4+e\nPXvWFD21tbXRt29fev0hpBZevXoFHR0dbN++HVOmTGE7DvmOoqIiTJo0CTIyMggJCUGLFi3YjkSa\ngKlTp2LQoEFYvHgx21EIH0RERGDt2rVITU2FpKQk23EIIeSnqMBJGlxUVBS8vb2pp2MD2b17N7y8\nvPDmzRt8/vwZlZWVP72mefPmaNGiBUJCQjBy5EiuY7GxsZg2bRqioqIwePBgfsUmQqSqqgppaWk1\nBc2EhAR06tQJBgYGGDZsGIYMGQJ5efma893c3LBt2zaUl5fzLIO8vDwKCgogJib21bGKigrcvXsX\nt27dqil8Pnv2DP37969Z5amtrY1u3brR9itCvuHu3bsYMWIEzp07B01NTbbjkP94+PAhxo0bh9Gj\nR2PXrl3ffB0khB+uXbsGGxsbZGZm0r+fjczHjx/Rt29fhISEUFsxQojQoAInaXDLli1Dq1atvtsf\nkvAOwzCwtbVFQEAAqqur63y9lJQUtm/fDgcHB66vnz9/HjNnzsTp06ehra3Nq7hESFRXV39V0OzY\nsSNXQfO333777vXZ2dlQU1P77hCsupKRkcHmzZvrtILkw4cPSE5OrlnleevWLZSVlXEVPLW0tKCg\noMCTjIQIu8jISDg4OODmzZto374923HI/7l+/TomTZqENWvWYMGCBWzHIU0MwzBQU1PDvn37MGzY\nMLbjEB5avHgxiouLERAQwHYUQgipNSpwkgY3aNAgbNu2jfo4NgBnZ2f4+PigtLT0l+8hJSWFAwcO\nYNasWVxfP336NObMmYNz585RL9VGrrq6Gnfv3q0paMbHx6NDhw5cBc127dr99D4MwyAkJARLly5F\n3759cePGjXr9bAL/Tk5XV1dHcnJyvVctvXjxoqbgefv2bdy+fRstW7bkKnoOHDgQsrKy9XoOIcJq\ny5YtiIyMxNWrV/k2LIzUXkhICBwdHREcHIzRo0ezHYc0Ufv378fVq1dx/PhxtqMQHklJScHYsWNx\n//59tG3blu04hBBSa1TgJA2qtLQUv/32G968eUNDP/js6tWrMDIyQllZWb3vJSMjg4yMDHTp0oXr\n65GRkbC1tUVMTAz69etX7+cQwVBdXY179+5xFTQVFRW5Cpp1Xdn46NEj2NnZoaCgAH5+ftDW1oa5\nuTnOnTv3y0VOERERtG7dGsnJyejWrdsv3eNHOBwO/vnnH66i5927d9GlS5eaXp5aWlpQV1en3lSk\nSWAYBpaWluBwOAgJCaEtqSxhGAYbN27EwYMHER0dDTU1NbYjkSbs48eP6Ny5MzIzM6GoqMh2HFJP\n1dXV0NHRgYODw1eLGwghRNBRgZM0qCtXrmDlypW4ceMG21EataqqKnTq1AkvX77kyf3ExMSgq6uL\na9eufXUsPDwcDg4OuHjxIlRVVXnyPNKwOBzOVwVNBQWFmoLm0KFDf3mrdmVlJfbs2YOdO3fCxcUF\nS5YsgYSERM2x4cOHIyEhAXX9p0hSUhKysrK4du0a+vTp80vZfkVlZSXS09O5trY/evQIampqXEOM\nlJWVISoq2mC5CGkoZWVlMDAwgLGxMbWaYUFFRQXmzp2LnJwcnDp1Cr///jvbkQiBjY0NlJSU6DWh\nEdi3bx8iIiJw5coV+hCLECJ0qMBJGtTGjRvx6dMn7Nixg+0ojdqJEycwe/ZsfPr0iWf3lJKSQkpK\nClRUVL469vfff8PZ2RmXLl365nEiWDgcDtLT02sKmteuXUO7du24Cpq8eNN88+ZNzJ8/H7///jsO\nHDjAtcoyPz8fS5cuxY0bN2BkZIQjR46gsrISnz9//ul9ZWRkMGzYMBw8ePCHvT4bSnFxMe7cucM1\nub2oqAiamppc29s7dOjAdlRCeOLly5fQ0dGBh4cHJk6cyHacJuPt27eYMGECFBQUEBwcTDthiMBI\nS0uDiYkJHj16BHFxcbbjkF/0/Plz9O/fH/Hx8ejduzfbcQghpM6owEka1J9//gl7e3uYmJiwHaVR\n09PTQ2JiIk/vKS4uDhsbG3h5eX3z+OHDh7FixQpcvnwZPXv25OmzSf1wOBxkZGQgLi4OcXFxuHr1\nKuTl5WFgYFDzH15uK/v48SNWrVqF8PBw7N69G1OnTq1ZBVBRUQF3d3fs2rULCxcuxPLlyyEtLY3n\nz5/Dw8MDvr6+AP7dIvVl67q4uDhkZGRQXl4OfX19uLq6YsSIETzLyw+vX79GcnIy1+R2SUlJrlWe\nmpqaaN26NdtRCfklKSkpGD16NC5cuIABAwawHafRy8nJwdixY2Fubo7NmzfTCnEicAYPHgxXV1eM\nHz+e7SjkF5mbm6N3797YuHEj21EIIeSXUIGTNJiqqirIycnh8ePH1LCajzgcDqSlpVFRUcHze/fs\n2RM5OTnfPX7w4EGsW7cOcXFx6N69O8+fT2qHw+Hg/v37XAVNOTk5roImv6Ygf5m0/Oeff2Lnzp2Q\nk5OrOXb+/HksWrQIKioqcHd3/2bfzM+fPyM9PR3JycnIzMyEj48P3Nzc0L9/f2hqakJeXp4vufmN\nYRg8efKEa5XnnTt30KFDB65Vnv3790fz5s3ZjktIrYSFhWHp0qW4efMmbZXmoytXrsDCwgJbt26F\ntbU123EI+abg4GCEhITg/PnzbEchv+Ds2bNYtGgR0tPTaYgcIURoUYGTNJiUlBTMnDkT9+/fZztK\no5adnQ1NTU2UlJTw/N4SEhIoKSmp6aH4LX5+fti8eTPi4uLQtWtXnmcgX+NwOMjMzOQqaLZu3Zqr\noMnv7dH5+flwcHBAZmYmfH19YWBgUHPs8ePHWLJkCe7fvw9PT0+MGTOmVvcsLi6GgoICX36WBUFV\nVRWysrK4VnlmZ2dDRUWFa4iRiopKvSfEE8Ivbm5uOH/+PK5cuULFeT4IDAyEq6srjh07hmHDhrEd\nh5DvKi8vh5KSEpKSkuhDbiFTWlqKvn37ws/PDyNHjmQ7DiGE/DIqcJIG4+npiaysLPj4+LAdpVG7\nevUqxo8fjw8fPvD83s2bN8ezZ89+uopu//792LVrF65evYpOnTrxPEdTxzDMVwXNli1bchU0O3bs\n2CBZqqurceDAAbi5uWHBggVYsWJFTZGjrKwM27dvh5eXF5ydneHk5IRmzZrV+t4VFRWQlZWtVV/O\nxqK0tBRpaWlcQ4wKCgowcOBAru3tnTp1oub/RCBwOBxYWFigefPmOHToEP1c8giHw8GqVatw/Phx\nnDlzhvrhEaGwdOlSiIqKUq99IePq6oqnT58iJCSE7SiEEFIvVOAkDWbSpEkwNTWFpaUl21Eatbi4\nOJiamvKtwJmXl4d27dr99FxPT0/s27cPcXFxDVZsa6wYhkFWVlZNQTMuLg6ysrJcBU0lJaUGz3Xv\n3j3Mnz8fEhIS8PX1rZlmzjAMoqKisGTJEmhra2PXrl2/lI/D4UBMTAwcDqdJF03evXtX08/z9u3b\nuHnzJjgcDtcqTy0tLaHdvk+EX2lpKf744w9MmTIFLi4ubMcRemVlZZg5cyZevnyJyMhI+t0mQuPB\ngwfQ09PD06dPaUW3kMjIyIChoSHu3btHrUYIIUKPCpykQTAMA0VFRdy8eROdO3dmO06jlpWVBW1t\nbRQXF/P83hISEiguLoakpGStzt+1axf8/PwQFxfHt56PjRHDMMjOzuYqaMrIyHAVNNlcGVtaWooN\nGzYgICAAW7ZswZw5c2oGXuTk5GDx4sV49uwZ9u3bB0NDw3o9S0xMDBUVFTSV9X8wDIP8/HyuVZ4p\nKSmQl5fnWuU5YMAAyMjIsB2XNBH5+fkYNGgQvL29aZBgPbx69QomJibo0aMHAgICqEhEhM6ff/6J\nmTNn0oIGIcDhcDBkyBBYWlrC1taW7TiEEFJvVOAkDeLBgwcwNDTE06dPm/RKrIZQXV0NGRkZvgwZ\nUlZWRm5ubp2u2bp1K4KDgxEXFwcFBQWeZ2oMGIZBTk4OV0FTSkqKq6ApKB8MXLhwAXZ2dtDS0oKH\nh0fNp/3FxcXYtGkTAgICsHLlStjb2/+wV2ttNW/eHEVFRdTw/ic4HA5ycnK4hhhlZGRAWVmZa4hR\n3759efL/F0K+5datWxg3bhwuXboENTU1tuMInYyMDIwbNw5WVlZYu3Yt/b1EhNLJkyexa9cuXL9+\nne0o5Cf8/f3h7++PxMTEmg+qCSFEmFGBkzSIwMBAXLx4kXq7NJDBgwcjKSmJp/cUFxfHvHnz4O3t\nXedrN2zYgNDQUMTFxeG3337jaS5hxDAMcnNzuQqakpKSGDZsWE1Bs0uXLmzH5PL69Ws4OTkhISEB\nBw4cgJGREYB/v5fQ0FAsW7YMhoaG2L59O0+3OMnKyuL58+do2bIlz+7ZVFRUVODevXtcQ4zy8vLQ\nv39/rqJn9+7dqZBCeCYkJASrVq3CrVu3Gvz1/syZM/D09ERmZiYKCwuhqKiIgQMHwsnJCYMHD27Q\nLHUVExODGTNmwN3dHdOnT2c7DiG/rKqqCl26dMHZs2ehrq7OdhzyHa9fv4aqqiouXryIfv36sR2H\nEEJ4ggqcpEFYW1tDU1MTCxYsYDtKkxAeHg4rKyueblOXkpJCcnJyTZ/FulqzZg1OnTqFy5cvo23b\ntjzLJQwYhsGDBw+4Cpri4uJfFTQFscjEMAyCgoKwfPlyzJw5E25ubjXbntPT0+Hg4IAPHz7Ay8sL\nenp6PH++nJwcHjx40OR+Zvjl48ePSElJqSl63rp1C6WlpdDU1OTq6Ul9uEh9rFq1CteuXcOlS5dq\n3dKkvpYvX44dO3agbdu2MDU1hby8PP755x+cOnUKVVVVCA4OFtgts18GtYWHh0NfX5/tOITUm5ub\nGwoKCnDgwAG2o5DvmDlzJtq1a4ddu3axHYUQQniGCpykQfTs2RMRERG0Za2BVFZWQklJCa9eveLJ\n/cTExKCjo1Ov7UYMw2DFihW4cOECLl26hDZt2vAkmyBiGAb//PMPV0FTVFSUq6DZtWtXgSxo/q/c\n3FzY2Njg06dP8PPzg4aGBgDg/fv3WL9+PUJCQuDm5ob58+dDTEyMLxkUFBRw9+5dKrjx0cuXL2u2\ntX/5v7KyslwFz4EDB9IqWlJrHA4HZmZmkJOTg7+/P99f6woKCtChQwf89ttvuHfvHtcgvCtXrsDQ\n0BBdu3bFo0eP+Jqjrqqrq7Fs2TKcPXsWZ86cQffu3dmORAhPPH/+HKqqqnj69ClkZWXZjkP+4/Ll\ny7CyssL9+/fRokULtuMQQgjPUIGT8F1BQQFUVFRQWFhI/V0a0OXLlzFu3DiUlZXV+17S0tJIT09H\nt27d6nUfhmGwdOlSXLt2DRcvXkTr1q3rnU0QMAyDhw8fchU0AXAVNLt16ybwBc0vPn/+jO3bt8PT\n0xOrV6+Gvb09xMXFweFwEBwcjBUrVsDExASbN2/m+3RfJSUlJCYmsjIlvqn6UqD/36JnWloaOnfu\nzFX0VFdXR7NmzdiOSwRUcXEx9PX1MWvWLCxZsoSvz7p58yYGDRoEExMTREVFfXW8ZcuWYBgGnz59\n4muOuiguLsa0adNQXFyMiIiIRv2hH2mazMzMMGLECNjZ2bEdhfyPiooKqKurY+fOnTQQjhDS6FCB\nk/BdREQEAgMDcfr0abajNDmLFi1CQEAASktLf/keIiIi0NfXx+XLl3kyyZphGDg6OuLmzZu4cOGC\nUK4KYxgGjx8/xpUrV2oKmhwOh6ugKax9DRMSEjB//nx0794d+/fvr5nWnpKSAnt7ezAMAy8vL2hq\najZInm7duuHixYu0solllZWVyMjI4Jrc/s8//0BNTY1rcnvPnj3pgyxSIy8vD4MHD0ZAQEBN315+\nePfuHRQVFSEnJ4f09HSuD16uXbuGoUOHwtTUFCdPnuRbhrrIz8+HsbExNDQ0cODAgQbbxk9IQ4qN\njYWTkxPu3r0rlH8PNVYbNmxAamqqwLweEkIIL1GBk/Cdo6Mjfv/9d7i6urIdpcnhcDiYO3cujh8/\njpKSkjpfLy0tXdNLTVxcHKGhoTX9F+uDYRgsXLgQ9+7dw/nz5wV+ewzDMHjy5AlXQbOqqoqroNmj\nRw+h/gP+/fv3WL58OU6fPg1PT0+YmZlBREQEhYWFWLVqFaKiorBlyxbMmjWrQQtYvXr1QlRUFHr3\n7t1gzyS1U1JSgjt37nBtbS8sLKzp5/ml8NmhQweh/t0g9ZOYmAhTU1PExcX9cg/n2vDw8ICTkxPk\n5eVhamqKtm3b4uHDhzh16hSGDBmCI0eOcG1dZ0tqaipMTExgb28PFxcX+t0gjRaHw4GKigoOHjzI\nlx7dpO4ePHiAwYMHIzU1lXbGEEIaJSpwEr7T1NSEp6cn/XHDEoZh8Ndff8HJyQkVFRWoqqr66TXN\nmjWDjIwMjhw5AiMjI1RWVmL+/Pm4f/8+Tp8+zZM3iRwOBzY2NsjNzcXZs2d5UjjlpSdPniAuLq6m\nqPn582eugqaysnKjeGPKMAyOHz+OJUuWYPz48di6dStat26N6upq/PXXX1i3bh0sLCzg5ubGSksB\nVVVV/P3339S/V0i8efMGycnJXEOMJCQkuFZ5ampq0nbcJubQoUPYuHEjbt68ydeBYZGRkbC2tkZR\nUVHN13r06AE3NzdMmzaNb8+trVOnTmHOnDk4cOAAJk2axHYcQvjO3d0dKSkpOHLkCNtRmjyGYTBy\n5EiMGTMGTk5ObMchhBC+oAIn4atPnz5BUVERhYWF1KuNZU+fPsWGDRsQEhICCQkJlJSUoLq6uua4\nqKgoJCQk0Lx5c9ja2sLV1ZWroMUwDNatW4eQkBCcP38ePXr0qHcmDoeDOXPm4OnTpzh9+jSkpKTq\nfc9flZeXx1XQLC8v5ypo9uzZs1EUNP9XXl4eFixYgLy8PPj5+UFXVxfAvyuu7O3tISsri3379kFd\nXZ21jAMGDEBAQEDNgCMiXBiGQV5eHtcqzzt37kBRUZFrlWf//v1Z/f0n/Ofi4oLbt2/jwoULkJCQ\n4Pn9d+zYgZUrV2LRokWwt7fH77//juzs7JrhdsuWLcOOHTt4/tzaYBgGHh4e2LVrF06ePAltbW1W\nchDS0N69e4fu3bsjNzcXv/32G9txmrSjR49i165duH37Nk9aThFCiCCiAifhq4sXL2Ljxo24du0a\n21HI//n06ROuXLmCW7duITU1FWVlZZCVlUXLli2RlZWFxMTEH/YD8/X1xfr16xEZGQkdHZ1656mu\nrsasWbPw5s0bREVFoXnz5vW+Z208ffqUq6BZWloKAwODmqJmr169Gl1B84uqqirs3bsXW7ZswZIl\nS7Bs2TJISkqioKAArq6uiI2Nxc6dO2FhYcH6/wba2trYt28fT37WiGCorq5GVlZWzQrP27dvIysr\nC7179+YaYtSnTx+IiYmxHZfwSHV1NUxNTdGhQwccOHCAp68tcXFxGDZsGCZMmIATJ05wHSstLUXP\nnj3x8uVLPHjwoN7D8uqqqqoKDg4OSEhIwOnTp9G5c+cGfT4hbLOysoKKigpcXFzYjtJkFRUVoU+f\nPoiKiqIPWAghjRp9fEP4Kj4+Hvr6+mzHIP9DVlYWJiYmX01OLCwsRNeuXX/aX9HGxgbt27fHuHHj\nEBgYiHHjxtUrj5iYGIKCgmBpaQkzMzOcOHGCL6t9nz17xlXQLC4urilouri4oHfv3qwX8xpCSkoK\n5s+fj1atWuHGjRtQVlZGZWUlPDw8sHnzZlhbWyMrKwuysrJsRwUASEhIoLKyku0YhIfExMSgqqoK\nVVVVWFtbAwDKysqQlpaG27dv4/Lly9i2bRtevnwJDQ0Nru3tnTt3bhK/p42RmJgYjh49Cl1dXezf\nvx/29vY8u/eXIYbDhg376pi0tDS0tbVx8uRJpKamNmiB88OHD5g8eTJERUVx/fp1oRyqR0h92dnZ\nwcLCAkuXLqUhdCxxdXXFxIkTqbhJCGn0qMBJ+CohIQHLli1jOwaphbZt26Jz585ITU2FlpbWD881\nNjbGmTNnMH78eLi5uWH+/Pn1era4uDgOHz6MqVOnYvLkyQgLC6v3VNn8/HyugubH/8fencfVmPf/\nA3+1LxQlO9lSWijt0nLKHSGy1ISxTIMWS2EYkXXGkhhLosi+NHVXliIxbbSniBQRIWur9r3z+2O+\nc373GVvLqavl/Xw8PB73fc65rut1Zkad63U+S0kJp9Bcu3YtFBUVu1RRUlZWhi1btuDixYtwc3PD\nwoULwcfHh8jISKxcuRIDBgxAdHR0u9vMhwrOrkFMTAzjxo3DuHHjOI8VFRVx1vP08fGBk5MT6urq\nuEZ5amlp0bTHDkRSUhJBQUHQ09ODgoICTE1NeXLe6upqAH+vAfsl/zzelruVv3z5Eubm5jAyMsKh\nQ4doSijpsrS0tCAlJYWbN29i8uTJTMfpcuLi4nDt2jVkZGQwHYUQQlodTVEnraampga9evVCTk4O\nI5uTkKZbvnw5hg8fjl9++aVRr8/KyoKZmRnmzp2L3377rcWFYU1NDaysrCAoKAhfX98mrdP29u1b\nrkKzuLgYRkZGnCnnSkpKXarQ/F/Xr1/HsmXLYGRkhD/++AO9e/fGmzdvsHbtWiQkJODAgQOYMWNG\nu/znY2pqinXr1mHixIlMRyEMY7PZePv2LWctz6SkJCQnJ6NXr15cozzV1dXb3aZlhNudO3dgZWWF\n6OhoyMvLt/h8//3vf2FtbY2+ffsiJSUFAwcO5Dx348YNTJ06FSIiInjz5k2rbnL0j8TERMycORPr\n16+Ho6Nju/zZSkhbOnHiBIKCghAUFMR0lC6ltrYWGhoacHFxgbW1NdNxCCGk1VHBSVon/rcmAAAg\nAElEQVRNYmIi7OzskJqaynQU0kh+fn7w8fHB1atXG31Mbm4uzM3NoaysjOPHj7d484jq6mrMmjUL\n3bt3x8WLF7866uXdu3eIiorilJpFRUWfFZpdfSrU+/fv4eTkhHv37sHLywv/+c9/UF1djQMHDmDf\nvn1Yvnw51q9fD3FxcaajftXUqVPh4ODQ4qUQSOfU0NCAp0+fcm1ilJaWBjk5Oa5NjFRUVFplYxvS\nfCdOnMDevXuRkJAAKSmpFp2roaEBkyZNQlhYGCQkJDBz5kz069cPjx8/xrVr1zib/Dg5OfEo/df5\n+/tj2bJlOHXqFKZNm9bq1yOkIygvL4esrCzu378PWVlZpuN0GXv37kVYWBhCQ0PpixZCSJdABSdp\nNfv27cPLly/h4eHBdBTSSO/fv4eysjLy8/ObVA6Wl5fD2toadXV18Pf3b/H6jVVVVbCwsICMjAzO\nnTsHAQEBvHv3Drdv3+YUmgUFBVyFprKycpcvNP/R0NCA48ePY/PmzbC1tcWmTZsgJiaG0NBQODo6\nQlFREQcOHGjzzTaaY8aMGVi0aBFmzpzJdBTSQVRXVyMtLY1rE6OXL19CVVWVa3q7nJwc3fAxbPXq\n1Xj06BFu3LjR4inctbW1OHLkCHx9fZGRkYGKigpIS0tDW1sbjo6OrT4KnM1mw9XVFUePHkVQUBDG\njh3bqtcjpKNxdHSEpKQkduzYwXSULuHVq1fQ0NBAYmIiRowYwXQcQghpE1RwkkZhs9k4ceIETpw4\ngfT0dLDZbCgqKmLJkiWwtbX9YrE0Y8YMzJ07l6ZEdDDy8vIIDAzE6NGjm3RcXV0dli1bhpSUFFy/\nfh39+vVrUY4XL17AwsICNTU1YLPZyM/P5yo0VVRUqND8gvT0dNja2nJKztGjRyM7OxurV69Geno6\nDh06hClTpjAds9GsrKxgZWWFH374gekopAMrKSnBvXv3uErP0tJSzjqe/5Se/fv3Zzpql1JXVwdz\nc3PIy8vD3d2d6TjNVlNTA3t7e6SmpiI4OJhrijwh5G8ZGRmYMGECXr161abr4XZFbDYb06dPh66u\nLlxcXJiOQwghbYbaAdIo8+fPh62tLV6+fIm5c+diyZIlqKiogIODA3766afPXs9msxETE0M7qHdA\nhoaGuHPnTpOPExQUxLFjx2BhYQE9PT1kZmY26fgPHz7Az88PDg4OGDVqFDQ1NTFkyBDU19dDRUUF\nubm5uHz5MhwdHTFmzBgqN/+lqqoKmzdvBovFwo8//ojY2FjIyclh27Zt0NLSgo6ODh49etShyk2A\nNhkivCEpKQkWi4Vff/0VAQEBePXqFTIyMrBixQrw8/Pj6NGjUFZWxuDBgzF79my4uroiIiICJSUl\nTEfv1AQFBeHn54e//voLx44dYzpOsxQWFmLSpEkoKChAdHQ0lZuEfIWSkhIUFBRw5coVpqN0epcv\nX8bz589po1dCSJdDWzqS77p8+TJ8fHwwbNgwJCUlQUZGBsDfIxZmz56N8+fPY8aMGZg1axbnmCdP\nnkBSUpI+6HdAhoaGuHbtGpYvX97kY/n4+LBlyxYMHjwYRkZGuHTpEvT09L742o8fP3JNOf/w4QMM\nDQ3BYrFgZ2eH0aNHQ0BAAGVlZZg8eTJWrlyJo0eP0pTSL4iMjOT8M0tNTcWAAQNw9epVrF69Gtra\n2rh//z4GDx7MdMxmoYKTtJZ+/fph2rRpnHUS2Ww2nj9/zlnLc/PmzXjw4AEGDx7Mmdqura2NMWPG\nQEREhOH0nUePHj0QFBQEfX19yMvLw9jYmOlIjZaVlYWpU6fC3Nwcbm5uEBAQYDoSIe2ag4MDPD09\naVZGKyotLYWTkxMuXrxII2UJIV0OTVEn37Vw4UKcP38eHh4en5VeqampGDt2LIyNjREREcF53Nvb\nG9HR0Th37lxbxyUt9PLlS+jq6uL9+/ctKhNv3LiBhQsX4vjx45g5cyZyc3O5Cs3379/DwMAALBYL\nxsbGGDNmzFdvDktLSzFx4kRoamrC3d2dSs7/U1BQgLVr1yI8PBweHh6YPn06MjMz4eTkhJycHBw+\nfBgmJiZMx2yRJUuWQEdHB0uXLmU6CumCamtrkZ6ezrVz+7Nnz6CiosK1iZGCggKNKm+hiIgIzJs3\nD7GxsR1ivbjo6GhYWVlh27ZtsLe3ZzoOIR1CTU0NZGVlERkZCUVFRabjdEqrVq1CSUkJTp06xXQU\nQghpc/RpnHzXhw8fAOCLG5L881h0dDRqamo4j0dHR8PAwKBtAhKeGjJkCISFhfHs2bMWnUdTUxNr\n167F/Pnz0b9/f8jLy+PcuXMYPnw4Lly4gPz8fAQFBWHNmjUYO3bsN0e+SEhIIDQ0FImJifjll1/Q\n1b+XYbPZuHDhApSVlSEpKYn09HSYmJjA2dkZ+vr6mDRpElJTUzt8uQnQCE7CLCEhIaipqWHp0qXw\n9vbGgwcPkJeXh/3792P48OEIDQ2Fubk5pKSkOH8HAwMDkZOT0+V/TjWViYkJtm7dimnTpqG4uJjp\nON904cIFzJ49G+fOnaNyk5AmEBYWxuLFi+Hl5cV0lE7p3r17+PPPP+Hm5sZ0FEIIYQRNUSff9c+U\n9Ozs7M+ee/HiBYC/Nwp48eIFRo0aBQCIiYnBhg0b2i4k4Rk+Pj7OOpzy8vKNPi4/P58zQjMqKgo5\nOTnQ19eHo6MjfHx8sGDBAri6ujZ7lFOPHj1w8+ZN/Oc//4GzszNcXV275EjO58+fw8HBAbm5uQgO\nDoampib8/Pywbt06mJiYIC0trcUbPLUnVHCS9qZbt27Q19fnWmM6Pz8fycnJSEpKwunTp+Hg4AAB\nAQHOCE9tbW1oampCWlqaweTtn4ODAx49eoS5c+ciODi43U35ZrPZ2LZtG86dO4fIyEgoKyszHYmQ\nDsfW1hbq6urYtWsXunXrxnScTqO+vh52dnZwdXXl3LsRQkhXQyM4yXdNnToVALB//34UFhZyHq+t\nrcXWrVs5/7+oqAgA8PbtW5SWlnLKTtLxNGajofz8fFy6dImz6c+IESNw6tQpyMrK4vTp08jPz8e1\na9ewe/dupKSkIDo6GgsXLuQa6dtUUlJSuHXrFm7evInNmzd3qRFStbW1cHV1hY6ODiZOnIjk5GSI\niorC2NgYe/bsga+vL86ePdupyk2ACk7SMcjIyMDMzAxbtmzBtWvX8PHjRyQkJGDBggUoKSnBrl27\nMGTIEIwcORI//vgjDh48iLi4OFRWVjIdvd05ePAgampq8OuvvzIdhUtVVRV+/PFH3Lx5EwkJCVRu\nEtJMQ4YMgZ6eHnx9fZmO0ql4enpCXFz8i5u/EkJIV0FrcJLvqq+vx9SpU3Hz5k307dsXFhYWEBUV\nRVhYGN6/fw8JCQm8fv0aCQkJ0NHRgZ+fH/7880/aJbEDy8zMxKRJk/Dy5UvOYwUFBbhz5w5nhObL\nly8xfvx4zhqaY8eOhaDg1weFV1RUYN68eSgrK0NgYCB69OjR7Hx5eXkwNjaGlZUVV8neWSUkJMDW\n1hYDBw7E0aNHISUlhW3btsHHxwfbt2+Hra1tuxvpxCsbNmyAhIQENm7cyHQUQlqkvr4eT5484azl\neffuXWRkZEBBQYEzylNLSwtKSkrf/FnaFRQWFkJXVxfOzs74+eefmY6DvLw8zJgxAwMHDsTZs2ch\nJibGdCRCOrSQkBBs2bIFycnJTEfpFN69ewdVVVXcuXOH1jYlhHRpNIKTfJeAgACCg4Ph6uqK3r17\n4+zZszh79ixGjhyJuLg4SEhIAAD69OkDgNbf7Azk5eVRUVGB48ePY9WqVVBTU8OwYcNw/PhxDBgw\nAMePH0dBQQFCQkLw66+/QktL67s35OLi4ggMDIS8vDwMDQ3x7t27Zufr3bs3wsPD4evri127djX7\nPO1dSUkJVqxYgZkzZ2LDhg24du0abt++DUVFRVRWViIjI4MzFbazohGcpLMQEBCAsrIybGxs4Onp\nieTkZBQWFsLT0xMqKiqIioqClZUVpKSkYGhoiF9++QV+fn7Izs7uUqPVAUBaWhpBQUFwdnZGTEwM\no1keP34MXV1dsFgs+Pr6UrlJCA9MmjQJhYWFuHv3LtNROoVVq1bBzs6Oyk1CSJdHIzhJi1RVVaFH\njx6QlJREXl4eAEBNTQ3Hjh2Djo4Ow+lIUxQVFXGN0Hz06BEUFRUxb948sFgsaGhoQEhIqMXXYbPZ\n2LNnD7y8vBASEgIlJaVmn+v9+/dgsVhYsmQJ1q1b1+Js7cnly5excuVKmJmZwc3NDdnZ2VixYgXY\nbDY8PDygqanJdMQ28fvvv6O6uho7duxgOgohbeLTp0+c9Tzv3r2LxMRE1NTUcI3y1NLS4nyp2Jnd\nunULixYtQnx8PIYOHdrm1w8PD8e8efOwZ88emvZJCI/t2bMHmZmZtNt3C924cQMrVqzAo0eP6AsY\nQkiXRwUnaZEzZ87AxsYGK1euhLu7Oz59+oTBgwejoKAAwsLCTMcj3/Dp0yeuQjMrKwvjxo0Di8UC\ni8VCYmIi0tPT4e3t3SrXP3/+PNauXQt/f38YGho2+zxv376FkZERVqxYgVWrVvEwITPevHmDFStW\n4MmTJzh+/DiUlZXh4uKCq1evYteuXVi0aFGzN2rqiFxdXVFUVIQ9e/YwHYUQxrx9+xZ3797lTG9P\nTk6GlJQU1yZG6urq6N69O9NRec7d3R0nTpxAbGwsZ8ZIWzhx4gRcXFzg5+cHFovVZtclpKvIy8uD\nvLw8Xrx4ASkpKabjdEgVFRVQUVGBp6cnJk2axHQcQghhXNde5Ik0WklJCSQlJbkeS01Nxbp16yAl\nJQVnZ2cAQHx8PLS0tKjcbIc+ffqE6OhoTqH59OlTTqH5z4jA//33Ji4uDk9Pz1bLs2DBAvTr1w+W\nlpY4cuQIrKysmnWegQMHIiIiAiwWC0JCQli+fDmPk7aN+vp6HD16FNu3b8eKFSvg4+ODc+fOwcrK\nCnPmzMHjx4/Rs2dPpmO2OZqiTsjfP+cGDhyIGTNmAAAaGhrw7NkzzijPgIAAPHz4ECNGjOCM8tTW\n1sbo0aN5MvKeSStXrsSjR48wf/58XL58udW/4GloaMCGDRtw6dIlREdHQ15evlWvR0hX1bt3b0yZ\nMgVnz57tFF9QM2HHjh3Q1tamcpMQQv4PFZykUUxNTSEmJgYVFRVISEjg8ePHuH79OsTExBAcHIwB\nAwYA+Hv9TX19fYbTEgAoLi7mKjQzMzM564i5u7t/t4hWUVFBbm4uPnz40Go7c5uamuLWrVswNzfH\n27dvm/0BV1ZWFhERETAyMoKQkBBsbW15nLR1PXjwALa2thAVFUVMTAwKCwuhr68PCQkJ/PXXXxgz\nZgzTERlDBSchn+Pn54eCggIUFBSwYMECAEBNTQ3S0tKQlJSExMREeHh4IDs7G2PGjOGa3i4nJ9eh\nRoHz8fHBw8MDEydOhIuLC3bv3t1q16qoqMCCBQuQl5eH+Ph4yMjItNq1CCGAg4MDFi9eDCcnJ/Dx\n8TEdp0P5Z5bVw4cPmY5CCCHtBhWcpFEsLS3h6+uLCxcuoLKyEgMHDoStrS02bNiAQYMGcV4XExOD\nzZs3M5i06yopKeEqNJ88eQIdHR2wWCwcPHgQ2traTRpZKyAgAH19fURHRzd7dGVjqKmpITY2FmZm\nZsjJycHevXubdfM9dOhQREREwNjYGIKCgu1i593vqaiowPbt23H69Gns3r0bkydPxsaNGxEWFoa9\ne/dizpw5Xf4DPxWchDSOsLAwNDQ0oKGhAQcHBwBAaWkpUlJScPfuXVy5cgUuLi4oLi7mrOP5T/HZ\nv39/htN/m7CwMAICAqCjowMlJSVOqfslZWVlKCkpgaCgIGRkZBr9++T9+/eYPn06FBUV4ePjAxER\nEV7FJ4R8xfjx4yEsLIyIiAhMmDCB6TgdRkNDA+zt7bF9+/Z2//ObEELaEq3BSXimuroavXr1wvv3\n79t0nayuqqSkBDExMZxC8/Hjx9DW1uasoamtrd3iG7S9e/fi9evXOHz4cLOOLygowOXLl3H9+nWk\npaXh7du3EBYWxujRo2FjYwMbGxvOzWdhYSEsLCwwcOBA2Nvbw83NDQkJCaisrMTIkSPx888/Y+XK\nld/dMfzp06cwMTHBrl27sHDhwmblbgs3b96Eg4MDdHV14ebmhoCAAOzcuRM///wzNm3aRH+H/s+J\nEycQHx+PkydPMh2FkE7h48ePuHv3LteanmJiYlxT2zU1NdGjRw+mo34mPT0dxsbGCAoKgq6uLoC/\nb/Rv3boFT09PJCYmoqCgAEJCQmhoaAAAjBo1CpaWlrC1tf3qxkwPHz7EtGnTsHTpUri4uHT5L5YI\naUtHjx5FREQEAgICmI7SYZw8eRLHjx9HXFzcdz8XE0JIV0IFJ+GZ2NhYODk5ITk5mekonVJpaSlX\noZmenv5ZoSkqKsrTayYlJWHp0qV48OBBs4738vKCg4MD+vfvD2NjY8jKyuLjx4+4dOkSiouLMXv2\nbPj7+3NuJquqqmBiYoL4+Hh069YN1tbWkJaWRnBwMDIzM2FpaQl/f//vXvfJkycwMTHBvn37MG/e\nvGZlby25ublYvXo14uLi4OnpCREREaxcuRIDBgyAu7s7Ro0axXTEduXs2bMIDw/HuXPnmI5CSKfE\nZrORnZ3NKTvv3r2L+/fvY9CgQVxT21VVVXn+O6Y5rl+/DltbW8THx+Px48ewsbFBaWkpysrKvnqM\nqKgo2Gw2Fi5ciP3793NtxhQSEoJFixbB3d0dc+fObYu3QAj5HyUlJRgyZAjS09M5S16Rr8vLy4OK\nigpu3rwJNTU1puMQQki7QgUn4RlXV1d8+PABBw8eZDpKp1BWVsZVaD569AhaWlqcQlNHR6fVbzZr\na2vRq1cvvHz5EtLS0k0+PiIiAuXl5Zg6dSrXNMEPHz5AW1sbOTk5CAgIwOzZswH8/SFXTk4OBQUF\nGDp0KKKiojB48GCu4vPPP//EnDlzvnvt9PR0/Oc//4G7u3urTrFvLDabjVOnTmHDhg1YtGgRli5d\nii1btiAhIQEHDhzAjBkzaNTQF/z555+4evUqfH19mY5CSJdRV1eH9PR0rlGeT58+hbKyMtfUdgUF\nBUZGD+3Zswd79uxBVVUVKisrG32cqKgoevTogevXr0NDQwNHjhzBjh07EBgYCD09vVZMTAj5Fnt7\newwYMABbtmxhOkq7t2jRIsjIyOCPP/5gOgohhLQ7tAYn4ZmYmBjY2NgwHaPDKisrQ1xcHCIjIxEV\nFYW0tDRoamqCxWLB1dUVurq6bT56RkhICLq6uoiNjcW0adOafLyJickXH+/Xrx/s7e3h4uKCqKgo\nTsEZEBCAvLw8LFy4EKNHj4aenh5CQkIwevRo7NixAxMmTICnp2ejCk5lZWWEhoZi0qRJEBQUxMyZ\nM5ucn1cyMzNhZ2eH8vJyXLt2DREREdDT08Py5ctx6tQpiIuLM5atvaM1OAlpe4KCglBVVYWqqiqW\nLFkC4O81g+/fv4+kpCTcunULO3bsQG5uLjQ0NLhGeg4ePLhVv6ypra1FeHg4SkpKUF9f36Rjq6qq\nUFVVBSMjI0ydOhVpaWmIjY3F8OHDWyktIaQxHBwcYG5ujo0bN0JQkG5PvyYyMhKRkZHIyMhgOgoh\nhLRL9BuE8ERDQwNiY2NpnbwmKC8v5yo0Hz58CA0NDbBYLOzatQu6uroQExNjOiYMDQ1x+/btZhWc\n3yIkJAQAXB9kIyIiAABmZmaYO3cuBg4ciAkTJsDPzw+GhoYQFxdHXFwcqqurG7W+qKqqKkJCQjB5\n8mQICgry/D18T3V1Nfbs2QN3d3ds3rwZcnJymD9/PhQVFZGUlEQ31Y1ABSch7YO4uDjGjx+P8ePH\ncx4rKChAcnIykpKScObMGSxbtgx8fHxcozy1tLSaNQPga1avXo3Y2Ngml5v/q7y8HIGBgcjIyKCf\nw4S0A6qqqhg8eDCuXbuGGTNmMB2nXaquroaDgwPc3d25ltkghBDy/1HBSXgiPT0dvXv3Rt++fZmO\n0m5VVFRwFZoPHjyAuro6WCwWduzYAV1d3XY5ks/Q0BBr167l6Tnr6uo4ayqamZlxHs/MzAQAyMvL\nAwDmzp2Lfv36wdraGocOHcKwYcOQnp6OFy9eQFFRsVHXUldXx7Vr1zB16lScPXsWkydP5ul7+Zro\n6GjY2tpCXl4eV69exd69e+Hh4YFDhw5hypQpbZKhM6CCk5D2q1evXpg0aRImTZoE4O+lOHJycjhr\nebq6uiIlJQV9+vTh2sRo7Nixzfp9FxMTg1OnTjVpWvrX8PPzw8nJCSEhIbQ8CCHtgIODAzw9Pang\n/Ao3NzcoKCjQPx9CCPkGKjgJT0RHR0NfX5/pGO1KRUUF4uPjOYVmamoq1NTUYGxsjN9++w3jxo1r\nl4Xmv2lrayM9PR2lpaU829nb2dkZjx49wpQpUzg3xgBQXFwMAFy79xobGyM8PJxrHc9Pnz416Xpa\nWloICgrC9OnTceHCBUycOJEH7+LLioqKsH79eoSEhGDv3r148uQJLCws8Msvv8DPz6/FO9t3NVRw\nEtJx8PHxQVZWFrKysrC0tAQA1NfXIzMzk7OWp4+PD9LT0yEvL881ylNZWfm7U1Pt7e15Um4Cf091\nj46ORmxsLH1+IaQdsLKywpo1a5CVlQU5OTmm47Qrz549w6FDh3Dv3j2moxBCSLtGBSfhiZiYGJia\nmjIdg1GVlZVcheb9+/ehqqoKY2NjbNu2DePGjUO3bt2YjtlkoqKi0NDQQHx8PE+KQXd3d/zxxx8Y\nNWoUzp8/36hjRo8ejdjYWCgoKABAs6Ym6urq4vLly5g5cyZ8fX2/uj5oc7HZbPj5+WHNmjWYMWMG\n9uzZg40bN0JbWxv379/H4MGDeXq9roIKTkI6NgEBASgpKUFJSQk//fQTgL/Xwnzw4AHu3r2LO3fu\nYN++fXjz5g3Gjh3LNb192LBhnNGV9+/fR3Z2Nk+zVVRUYN++fVRwEtIOiIqK4qeffsKxY8ewd+9e\npuO0G2w2G8uWLcOGDRsgKyvLdBxCCGnXaBd10mJsNhuysrKIiIjAyJEjmY7TZiorK5GQkMApNO/d\nu4cxY8bA2NgYLBYLenp6HbLQ/JJNmzYBAHbs2NGi83h4eGDlypVQUlJCeHg4+vXrx/W8lpYWkpOT\nkZycDA0Njc+OV1RUxJMnT2BqaoqrV682a43S27dvw8rKCgEBATA0NGz2e/lfL1++xLJly5CTkwMX\nFxecOXMGOTk5OHz4MM+L1K4mNjYW69atQ1xcHNNRCCGt6NOnT0hJSeFMb09KSkJVVRWn8Hz48CGC\ngoLQ0NDA0+sKCQmhrKwMwsLCPD0vIaTpsrKyMG7cOOTk5LT5xprtlY+PD9zc3JCcnEwbMBFCyHfw\nMx2AdHyvX79GbW1tp59OUlVVhaioKGzbtg1GRkbo3bs3Nm7ciLq6OmzatAkfPnxAXFwcdu7cCVNT\n005TbgKAkZER7ty506JzHDx4ECtXroSKigoiIyM/KzcBcEZoPn369LPn6urq8Pr1awgKCqJHjx4w\nNTVFYWFhk3MYGRnB19cXlpaWiI2Nbfob+Vemffv2QVNTE9ra2jAzM8PKlSsxadIkpKamUrnJAzSC\nk5CuoWfPnpgwYQI2bNiAS5cu4c2bN3j48CHs7e1RV1eH8PBwnpebwN+jxtLT03l+XkJI08nJyUFd\nXR3+/v5MR2kXioqK8Msvv8DLy4vKTUIIaQQqOEmL/bP+ZmdbpL+qqgq3b9/G9u3bwWKxICMjA2dn\nZ1RXV2Pjxo348OED4uPjsWvXLkycOLFT72g4btw43Lt3D1VVVc06fs+ePVi9ejXU1NQQGRmJPn36\nfPF1/xSCoaGhnz13584dVFRUQE9PD35+ftDV1cX48ePx6tWrJucxMTHBhQsXMHPmTCQkJDT5eABI\nTk6GtrY2QkNDsWnTJpw8eRK5ublIS0vD6tWrObvEk5ahgpOQrmvAgAGwsLDAzp07W+0zBpvNpoKT\nkHZk2bJl8PT0ZDpGu7Bx40bMmDEDurq6TEchhJAOgQpO0mIxMTEwMDBgOkaLVVdX486dO/jtt99g\nbGwMGRkZ/Prrr6isrISzszPev3+PhIQE7N69G5MmTerUhea/de/eHcrKykhKSmrysb///jucnZ2h\noaGB8PBwyMjIfPW1lpaWkJGRga+vL5KTkzmPV1VVcabJOzg4gJ+fH/v27YO9vT3Gjx+P1NTUJuea\nOHEizpw5AwsLC65rfU9ZWRlWr14Nc3NzzJ49G7W1tTh79ix8fX1x9uzZL45MJc0nLCyMmpoapmMQ\nQhhWXV3dKuetr69HeXl5q5ybENJ0U6dORU5ODh48eMB0FEYlJCTg6tWr2L17N9NRCCGkw6Cx7qTF\noqOjsXTpUqZjNFl1dTWSkpIQFRWFyMhIJCUlQUlJCcbGxvj1118xfvx4SEpKMh2z3TA0NMTt27eb\ntG7l2bNnsWXLFggICMDAwADu7u6fvWbo0KGcjSckJSXh7e0NS0tLsFgszJkzB9LS0ggKCkJmZiYs\nLS1hbW3NOdbJyQkDBw6EqakpfHx8mrzR1ZQpU3DixAlMnToVoaGhGDt27DdfHxwcjBUrVmD8+PGw\nsLDAoUOHsH37dtja2kJAQKBJ1yaNQyM4CSHA3z8LWqPk5Ofnh4iICM/PSwhpHkFBQdja2sLT0xNe\nXl5Mx2FEbW0t7Ozs8Mcff6Bnz55MxyGEkA6DCk7SIgUFBcjJyYGqqirTUb6rpqbms0Jz1KhRYLFY\nWLt2LfT19anQ/AZDQ8MvFpTf8s+Ot/X19Th48OAXX2NkZMQpOAFgxowZuH37Nnbu3InAwEBUVVVB\nTk4O+/fvh6Oj42fTFC0tLdG3b19YWlpi3759WLBgQZMyTps2DZ6enpg8eTJu3bqFMWPGfPaa9+/f\nw9HREampqbC2tsb58+cxffp0ZGRkfHNEKmk5KjgJIQAwbNgwpKWl8fy89fX16MELenEAACAASURB\nVN69O9hsdqdbaoeQjmrJkiVQUlKCm5tbl/xsfujQIfTt2xdz5sxhOgohhHQotIs6aZSXL1/i0qVL\niIqKQlpaGiorKyEiIoJevXqhtLQU169fh7y8PNMxudTU1ODu3bucQjMxMREKCgpgsVgwNjaGvr4+\nevTowXTMDqOoqAiysrIoLCxsl+tLZmRkYMqUKbCzs4Ozs3OTb1T9/PywevVqhIWFQUlJCQDQ0NCA\nY8eOYcuWLZg+fToePXoEPj4+eHh4QFNTszXeBvmXN2/eQEdHB2/fvmU6CiGEQQ4ODjh27Bh4/bGV\nj4+Ps7SIgYEB54+KigqNzCeEQVZWVmCxWFi+fDnTUdrUq1evoKGhgYSEhE6/gSshhPAajeAk35SW\nlgZHR0ckJCSAzWZ/Nj3s9evXEBAQgKqqKlRVVXHo0CHo6OgwkrWmpgbJycmIiopCVFQUEhISMHLk\nSLBYLKxatQr6+vo0zaMFpKSkMHz4cNy7d4+xf8ffoqSkhLi4OEyePBk5OTk4fPhwk25Ora2tUVdX\nB1NTU4SHh6Ourg52dnaora2FsbExQkJCsGvXLixatAj8/LR8cVuhEZyEkIqKCnTv3h18fHw8LzgN\nDAwQFRWF7OxsREdHIzo6GocPH0Zubi709PQ4haempiZNZSekDTk4OMDR0RHLli3rMqOr2Ww2Vq5c\nCScnJyo3CSGkGWgEJ/mihoYG/Pbbb3Bzc0NVVVWjbyjExMRgZ2cHNze3Vh/lV1tby1VoxsfHQ05O\njjNC08DAgApNHlu5ciVkZWWxbt06pqN8VUlJCWbNmoVu3brhzz//hLi4eJOO9/b2xpo1ayAkJAQz\nMzOEhYVh7ty52L59O/33xIDCwkKMGDECRUVFTEchhLSxjIwMHDt2DBcuXMC4ceOQlJSEvLw8np2/\ne/fu8PPzw5QpUz577uPHj4iJieGUnpmZmdDQ0OAUnnp6epCQkOBZFkIINzabDUVFRXh7e3eKzUwb\n4/Lly9iwYQMePHhAX6gQQkgzUMFJPlNfXw9ra2vcuHEDFRUVTT5eTEwMenp6CAkJgbCwMM9y1dbW\nIiUlhVNoxsXFYcSIEVyFppSUFM+uRz4XEBCAs2fPIjg4mOko31RTU4PFixcjKysLwcHBjV4nMyIi\nAnZ2dhAQEMDz588xduxYnDhx4ovrcpK2UVpaiv79+6OsrIzpKISQNlBTU4NLly7By8sLmZmZWLx4\nMZYuXYohQ4bg8uXLmD9/frM+m/wbPz8/xowZg5SUlEaNyi8pKUF8fDyn8ExJScGoUaM4hae+vj76\n9OnT4lyEkP/v4MGDSEpKgo+PD9NRWl1paSmUlJRw/vx5sFgspuMQQkiHRAUn+YyDgwPOnTvXohsI\nMTExTJ06Ff7+/s0+R11d3WeF5rBhw7gKTWlp6WafnzTdx48fMWrUKOTn57f7tcnYbDY2btyIwMBA\nhIaGYvjw4V99bX5+PtauXYuwsDAoKCggMzMTkyZNQnh4OKKiojB06NC2C064VFVVoUePHq2yezIh\npP14+fIljh07hlOnTkFZWRkODg6wsLD47IvSGTNmIDQ0tMU/E8TFxZGamoqRI0c26/jq6mrcvXuX\nU3jGxcWhX79+XOt4Dh06tMtMrSWkNRQVFWHYsGF4+vRpp/8CYc2aNSgsLMSZM2eYjkIIIR0WFZyE\nS0REBMzNzVFZWdnic3Xr1g3nzp3DrFmzGvX6uro63Lt3j1NoxsbGYujQoVyFZq9evVqci7TMqFGj\n4OfnB1VVVaajNMqRI0ewc+dOBAUFfbYxEJvNxoULF7Bu3TooKCggPT0dixcvxqZNmyAhIQEPDw/s\n378ft2/fxuDBgxl6B11bfX09hISEUF9fT0UBIZ1MfX09QkJC4OXlhcTERCxYsAB2dnYYNWrUV48p\nLS2Frq4unj9/3uySU0xMDBcvXsTMmTObG/0z9fX1SEtL4xSe0dHREBAQ4Co8lZWVaQ1nQpro559/\nhry8PJydnZmO0mru378PMzMzpKenN3rWESGEkM9RwUk4GhoaICsry9Pdinv27IkPHz58cR2Zuro6\n3L9/n1NoxsTEYMiQIWCxWGCxWDAyMqJCsx2ytbWFiooKHB0dmY7SaFeuXMHSpUtx7tw5TJ48GQCQ\nlZUFe3t7vHr1Cg0NDRgxYgTc3d0/u7E+cOAAjh49iqioKAwcOJCJ+F2egIAAqqurIShI++IR0hl8\n+PABJ06cwPHjx9G/f384ODjA2toaYmJijTq+uLgYkydPxsOHD1FeXt7o6woKCkJERAQ+Pj6YPn16\nc+M3CpvNxvPnz7kKz4KCAowfP55TeGpoaPB0KR9COqO7d+/ihx9+QFZWVrufPdQc9fX1GDduHOzt\n7fHzzz8zHYcQQjo0KjgJR2hoKKysrHi61l337t1x7NgxzJs3D/X19Z8VmoMHD+YqNOlby/bvwoUL\nuHLlCgICApiO0iRxcXGYNWsWfvvtNxQUFGDv3r2QlZVFUVERDh48iBkzZnx1hKCbmxtOnjyJqKgo\n9O/fv42TE1FRURQVFTW6/CCEtD9sNhuRkZHw9PREWFgYrKysYG9vD3V19Wadr6GhAUeOHOGM6vrW\nsjr8/PwQFRWFhoYGLl68yNiI/Pfv33NtXJSVlQVNTU0YGBjA0NAQurq66N69OyPZCGnPNDU18dtv\nv31xQ7CO7siRI/Dz80NUVBSN8CaEkBaigpNwmJub4/r16zw/r6ysLMaMGYPo6GgMGjSIq9Ds3bs3\nz69HWtfr16+hqamJjx8/drgpw76+vli4cCEkJSVRV1cHJycnrF+/vlE7re/cuRMXL15EZGQk+vbt\n2wZpyT8kJCTw9u1bSEpKMh2FENJEhYWFOHv2LLy8vCAkJAQHBwfMnz8fPXr04Mn5i4uLcfbsWRw5\ncgTZ2dkQExPj/G6qqqpCbW0tJk6ciN9///2zZUqYVlxcjLi4ONy5cwfR0dFITU2FkpIS18ZF9MUv\nIcDJkydx5cqVdr/JZVO9e/cOqqqqiIqKgrKyMtNxCCGkw6OCk3DIyMigoKCA5+cVEBDAxYsXYWxs\n3OkXCO8qhg4ditDQ0G+uk9aeFBcXY8OGDfDz8+NMdzYzM8PFixebNO1527ZtCAwMRGRkJN10tiFp\naWk8e/aMlqwgpINgs9lISkqCp6cnrly5gqlTp8LBwQHjx49v1S/Gqqur8fjxYxQXF0NISAjDhw/H\ntm3bIC8vjzVr1rTadXmlqqoKSUlJnBGe8fHxGDhwINc6nkOGDGE6JiFtrry8HLKysrh3716n+jsw\nZ84cDB8+HLt27WI6CiGEdApUcBIAf4+w6N+/P2pqanh+7m7duiE1NRVycnI8PzdhxsKFC6Gvrw9b\nW1umo3wTm83GpUuXsGLFCoiIiICfnx8eHh4wMDCAlZUVBAUF4efnh27dujX6fJs2bcL169cREREB\naWnpVn4HBAD69u2LBw8eoF+/fkxHIYR8Q1lZGXx8fODl5YXi4mLY2dnBxsaG0dkagYGBOHnyJEJC\nQhjL0Fx1dXV4+PAh1zqeIiIiXIWnoqIiTWslXYKTkxO6d++OnTt3Mh2FJ27evIlly5YhLS2tUTOJ\nCCGEfB8VnAQA8Pz5c6ipqfF0/c1/9OjRA3/99Re0tLR4fm7CjJMnTyIyMhIXLlxgOspX5eTkwMHB\nAYmJiaipqYGzszPWrFnD2fCqtrYWtra2ePToEa5fv97o0cVsNhvr169HeHg4wsLCICUl1ZpvgwAY\nNGgQ4uPjaSd7QtqpR48ewdPTE3/++SeMjIxgb28PU1PTdlG8FRUVYciQIcjLy/vihocdCZvNxrNn\nz7gKz+LiYq6Ni9TV1SEkJMR0VEJ47vHjxzA2Nsbr1687/OZclZWVUFFRwZEjR2BmZsZ0HEII6TSo\n4CQAgJcvX0JFRaVJu5E2lqCgIKZNmwZlZWX07dsX/fr1Q9++fTl/JCUlO9xajl3ds2fPYGJigtev\nX7e7f3f19fU4fPgwtmzZAgEBAUyYMAEHDhz4YjnGZrOxdetW+Pj4IDQ0tNGjjNlsNtasWYPY2Fj8\n9ddfPFtLjnzZsGHDEB4ejuHDhzMdhRDyf6qrqxEQEABPT09kZ2djyZIlWLp0KQYNGsR0tM9oa2vD\nzc0NLBaL6Sg89/btW66Ni168eAFtbW1O4amrq9voWQqEtHcmJiaws7ODtbU101FaxMXFBVlZWfDz\n82M6CiGEdCpUcBIAf9+oSEhIoLa2lufnFhQUxK5du1BRUYGPHz/i48eP+PDhA+d/19bWcsrOf5ef\n/368R48e7a5Q64rYbDYGDBiA+Ph4DB06tNnnKSkpwf379/HixQvU1tZCUlISqqqqkJeXh4CAQJPP\nl5qaioULF+LNmzeQlpbG8ePHYWJi8t3jjh8/jq1bt+LKlSvQ0dFp1LXYbDYcHR2RkpKCmzdvQkJC\nosl5SePIy8sjODgYCgoKTEchpMt7/vw5jh07hjNnzkBNTQ329vaYNm1aux416OLiAj4+PuzYsYPp\nKK2uqKgIsbGxnMLzwYMHGD16NNfGRbS8Cumo/P39ceTIEURFRTEdpdkyMjJgZGSEBw8eYMCAAUzH\nIYSQToUKTsIhJyeH58+f8/y8UlJSKCws/OrzXys+//3nw4cPqKmpQZ8+fb5Yfv77j5SUFJWhrcja\n2hpTpkzBokWLmnRcTU0NAgICsGfPHjx+/Bji4uKoq6sDm82GgIAA2Gw26uvrMWfOHKxZswYqKirf\nPWd5eTlcXFzg7e0Nfn5+bN++HStXrmzSDfe1a9dgY2ODU6dOYdq0aY06hs1mw8HBAenp6bhx4wa6\nd+/e6OuRxlNWVoafn1+j/lsghPBeXV0drl27Bi8vL6SkpOCnn36Cra0tRo4cyXS0RomKisL69euR\nmJjIdJQ2V1lZicTERE7hmZCQAFlZWa51PGn5D9JR1NbWYsiQIQgLC4OSkhLTcZqsoaEBLBYLP/zw\nA1asWMF0HEII6XSo4CQcq1atwtGjR3k6ipOPjw+CgoKcTV1mzZrVop3UKysrv1h8fqkQrays/KwM\n/VopKi0tTWVoEx05cgT37t3DyZMnG31MYmIifvjhBxQWFn53vVcBAQEICwtj3rx5OHjw4FfLwxs3\nbuCnn35CaWkpzM3N4e7u3uzNaJKSkmBhYYFt27bBzs6uUcc0NDRg6dKlePHiBa5fv04LxbeCsWPH\n4uTJk1BXV2c6CiFdytu3b3HixAl4e3tjyJAhsLe3h5WVFURFRZmO1iTV1dXo3bs3Xr161eXXTa6r\nq0NqairXOp7dunXjKjxHjRpFn4lIu7V582YUFxfD3d2d6ShNdurUKXh6eiIhIaFZM5UIIYR8GxWc\nhCMrKwujR49GVVUVz84pLi6OmzdvIjc3F/7+/rhx4wbU1dU5ZWffvn15dq1/q6qq+uZo0P/9/+Xl\n5ejdu/dXR4P+bykqLS3dLjZOYFpaWhpmzZqFZ8+eNer1+/fvx6ZNm1BZWdmk64iKikJaWhrR0dFc\nazB+/PgRP/30E6KiojBgwACcO3cO48ePb9K5vyQrKwtmZmaYO3cufvvtt0bd5NXX18PGxgbv3r1D\ncHAwxMTEWpyD/H/a2to4fPhwo5cPIIQ0X0NDA8LDw+Hl5YXIyEjMmTMHdnZ2UFVVZTpai0yePBlL\nly7FrFmzmI7SrrDZbGRmZnIVnmVlZdDX14eBgQEMDQ2hpqYGQUFBpqMSAuDvTSRVVVXx+vXrDjVz\nJj8/H8rKypx7IUIIIbxHBSfhMm3aNNy6dQs1NTUtPpeAgAC0tLQQHx/PeayyshKhoaHw9/dHSEgI\nxo4dyyk7mzvqjheqq6uRm5v7zRGh/zxeWlqK3r17f3eKfN++fSEjI9Npy9CGhgbIyMjg0aNH311D\naP/+/di8eTMqKiqadS1+fn5IS0sjJSUFgwYNgoeHB5ydnQEAu3fvxooVK3j6TXhubi7Mzc2hpKQE\nb2/vRk11r6+vx4IFC1BYWIgrV650uBFO7dn48eOxZ88e6OvrMx2FkE6roKAAp0+fxrFjx9CtWzc4\nODhg3rx5nWZ94f379+PZs2fw9PRkOkq79+bNG0RHR+POnTuIjo7G69evoauryxnhqaOjQ1/kEUZZ\nWFjA3NwcS5cuZTpKo9nY2KBnz544cOAA01EIIaTTooKTcPn48SNGjhyJ0tLSFp9LXFwcjx49wrBh\nw774fGVlJW7evAl/f39cv34dampqsLKywuzZsxktO7+npqaGU4Z+b5p8cXExZGRkvjtF/p8ytKNN\nV7GwsMC8efO+uZtlUlISWCxWk0du/puAgAAUFBRQV1eH7OxsTJs2DceOHYOMjEyLzvs15eXlsLa2\nRm1tLQICAhp1k19XV4d58+ahoqICly5dgrCwcKtk62pYLBa2bt0KY2NjpqMQ0qmw2WzEx8fD09MT\nwcHBsLCwgL29PXR1dTvdFOWHDx9i1qxZyMrKYjpKh1NQUMC1cVFaWhpUVVU5hef48eO7/NR/0rZC\nQ0OxceNGpKSkdIifVbdv38aCBQuQnp7eab40IoSQ9ogKTvKZ0NBQzJo1q0WFlJiYGE6ePIm5c+c2\n6vVVVVVcZeeYMWM4ZWf//v2bnYNptbW1n5WhXytFP336BGlp6e/uJP9PGdoepovt378fz58/x5Ej\nR774fE1NDUaOHInXr1/z7JpSUlK4ceNGm0xXrqurw7Jly5CcnIyQkJBGFe+1tbWwtrYGm83Gf//7\n33a9s3BHYWpqinXr1mHixIlMRyGkUygtLcWFCxfg5eWFyspK2NvbY9GiRejVqxfT0VoNm81G//79\nER8f/9UvXknjlJeXc21clJiYiGHDhnGt4zlw4ECmY5JOrKGhASNHjoSPj0+7X76muroaampq2LVr\nF2bOnMl0HEII6dSo4CRfFBQUhLlz56KyshJN/U9ETEwMR48exU8//dSsa1dVVeHWrVsICAhAcHAw\nVFRUOGVnZ/7AXFdXh7y8vEZNky8qKoKUlFSjpsn36dOn1crQ5ORk2NjYIC0t7YvP+/r6YunSpd/d\nUKgpevbsidzc3DYrDtlsNnbs2IHTp0/jxo0bUFBQ+O4xNTU1sLS0hIiICP788892UUZ3ZFOmTMHy\n5csxdepUpqMQ0qE9ePAAnp6e8PPzw4QJE2Bvbw8TE5NOu5TKv82fPx9GRkYdalprR1BbW4v79+9z\nCs+YmBhISkpyFZ7y8vIdYqQd6Tjc3NyQkZGBM2fOMB3lm3bs2IGkpCRcvXqV/g4QQkgro4KTfNXj\nx4/xww8/4OXLl40qqLp164a+ffsiICAAY8eO5UmG6upq/PXXX/D390dwcDCUlJRgZWUFS0vLTl12\nfk9dXR3y8/O/O0X+48ePKCgoQM+ePRs1Tb5Pnz5NKg7r6urQq1cvvHjx4osjf8aOHYvU1FRevnVI\nSEjg9OnTmD17Nk/P+z2nT5/Ghg0bEBgY2KjNjKqrqzFz5kz06NED58+fp5KzBSwsLGBjY4MZM2Yw\nHYWQDqeyshL+/v7w9PTEmzdvYGtri8WLF3937eTO6MyZMwgJCcF///tfpqN0ag0NDXjy5AnXxkVV\nVVWcjYsMDAygqqpKvxdJi+Tl5WHkyJF48eIFpKWlmY7zRVlZWdDV1UVKSgqGDBnCdBxCCOn0qOAk\n31RfX4/AwEDs2bMH6enpEBERQWVlJWprayEoKAhxcXHU1NRg+PDhWL9+PebMmdNq6w5WV1cjLCwM\n/v7+CAoKgqKiIqfsHDRoUKtcszOor6/nKkO/VYrm5+ejR48e391J/p8yVFhYGGZmZrC3t/+sfCot\nLUWvXr1QW1vL8/c0b948XLx4kefn/Z7Q0FAsWLAAx48fb9Q0o6qqKkyfPh19+/bFmTNnOtwaq+2F\npaUlrK2tYWVlxXQUQjqMZ8+ewcvLC+fOnYOmpibs7e0xderULl0qvX37FqqqqsjNze0yo1bbi1ev\nXnEVnm/fvsW4ceM4hae2tjZtzkeabP78+VBXV8eaNWu4Hg8ICMDt27eRmpqKBw8eoLS0FD/++CMu\nXLjQqPMuWbIEJ0+eBPD3z1I5ObkmZ2Oz2Zg0aRJnmR1CCCGtjwpO0mi5ublISUnBo0ePUFlZCVFR\nUSgqKkJDQ6PNR4LU1NRwlZ0KCgqcsnPw4MFtmqUzaWhoQEFBwTdHhP7zXF5eHiQkJCAgIAARERHo\n6+tzlaH5+fn4/fffUV5ezvOcI0aMYGyjiJSUFEyfPh0bN27E8uXLv/v6iooKmJubY8iQITh58iTd\nVDfD3LlzMW3aNMybN4/pKIS0a7W1tQgKCoKnpyfS0tJgY2MDW1tbDB8+nOlo7YaSkhLOnz8PDQ0N\npqN0afn5+YiJieEUnhkZGVBTU+MUnnp6eujZsyfTMUk7FxsbCxsbGzx58oTr85WamhoePHiA7t27\nY9CgQXjy5EmjC87g4GBMnz4d3bt3R1lZWbMLTl9fX+zatQspKSm0HjshhLQRKjhJh1dTU4Pw8HD4\n+/vj6tWrkJeX55SdsrKyTMfrtBoaGlBYWIgbN25gx44d2Lp1K1cRmpKSgvT0dDQ0NPD82qKioi3e\nlb0lsrOzYWZmhpkzZ2LXrl3fLS3Ly8sxZcoUKCgowMvLi0rOJlq0aBGMjY2bva4vIZ1dTk4OvL29\nceLECcjJycHBwQGzZs2CiIgI09HaHUdHRwwYMADOzs5MRyH/o6ysDAkJCZzC8+7duxgxYgTXOp4d\nedNJ0jrYbDZUVVWxf/9+/Oc//+E8HhkZiUGDBkFOTg63b9+GsbFxowrOvLw8jB49GiwWCx8+fMDt\n27ebVXB++vQJSkpKCAwMxLhx45r13gghhDQdFZykU6mpqUFERASn7JSTk+OUnbT2Teuorq5Gr169\n8O7dO0hKSnIeP3nyJJycnFplBKeQkBBqamp4ft6myM/Px/Tp0zF8+HCcOnXqu0szlJaWwszMDKqq\nqjhy5AgtNN8ES5YsgY6ODm0MQsj/aGhowK1bt+Dp6Yno6Gj8+OOPsLOzg4qKCtPR2rXg4GAcOnQI\nYWFhTEch31BTU4N79+5xbVwkLS3NVXjKycnR71ICT09PhIWFITAw8IvPR0VFNbrgnDlzJuLj45Ge\nno7Zs2c3u+BctmwZGhoa4OXl1aTjCCGEtAwNIyKdyj9rQp48eRLv37/H9u3b8fjxY2hoaEBHRwf7\n9u3Dy5cvmY7ZqYiIiEBTUxNxcXFcj0tKSrbaSEVxcfFWOW9TyMjIICwsjDM6s7i4+Juvl5CQwI0b\nN3Dv3j2sWrUK9N1S4wkJCbXKWq6EdES5ubnYs2cP5OTk4OLigmnTpuH169c4fPgwlZuNwGKxkJiY\nyOgsAPJ9wsLC0NXVxbp16xAUFIT8/HxcuXIF2traCAsLg7GxMQYMGIAffvgBhw8fRmpqKurr65mO\nTRgwf/58RERE4O3bty06z5kzZ3DlyhUcO3bsixtnNlZiYiIuX76M3bt3tygPIYSQpqOCk3RaQkJC\nmDRpEk6cOIH379/j999/R2ZmJrS0tKCtrY29e/ciOzub6ZidgpGREe7cucP1mKqqaqtMTwf+XkOt\nPRAXF0dAQAAUFBRgaGj43Q/XkpKSCA0NRVxcHNatW0clZyNRwUm6OjabjejoaMybNw/y8vLIzMyE\nn58fkpOTsWTJEnTv3p3piB2GhIQEVFVVER0dzXQU0gT8/PxQUVGBg4MDfHx8kJOTg7i4OJibm+Ph\nw4eYM2cOevXqhSlTpmD37t2IiYlBdXU107FJG5CQkMCcOXNw4sSJZp/j1atXcHJywvz582FhYdHs\n89TV1cHOzg779u2DlJRUs89DCCGkeajgJF2CkJAQJk6cCG9vb7x79w47d+5EVlYWdHR0oKWlBTc3\nN7x48YLpmB2WoaHhZwWnnJxcqxR4goKCMDY25vl5m0tAQAAeHh6YO3cu9PT0kJ6e/s3X9+zZEzdv\n3kR4eDg2btxIJWcjUMFJuqri4mJ4eHhg9OjRsLW1hY6ODrKzs3Hq1CloaWnR9NxmMjU1pSnqHRwf\nHx+GDRuGhQsXwtvbG0+ePMHTp0+xZMkS5ObmYtWqVejVqxcMDQ3h4uKC0NBQlJSUMB2btBIHBwd4\ne3ujrq6uycc2NDRg0aJF6N69O9zd3VuU49ChQ+jduzdtikgIIQyhgpN0OUJCQjA1NcWxY8fw7t07\nuLq64sWLF9DV1YWGhgZcXV3x/PlzpmN2KLq6ukhNTeWa8sfPz4/58+dDUFCQp9cSEhJqd5vN8PHx\nwdnZGTt27ICJiclnZe+/SUtLIywsDNevX8fWrVvbKGXHRQUn6WpSUlKwdOlSDB06FNHR0fDw8EBG\nRgacnJxoVBAPmJqa4q+//mI6BuGxPn36YNasWThw4ACSk5Px/v17bNq0Cfz8/HB1dcWAAQOgrq4O\nJycnBAQE4OPHj0xHJjwyZswYDB06FMHBwU0+9sCBA7h9+za8vb1b9PP19evX2L17N44ePUpfPhFC\nCEOo4CRdmqCgICZMmAAvLy+8e/cOe/fuxatXr6Cnpwd1dXXs3r0bWVlZTMds97p164bRo0cjISGB\n6/FVq1ZBSEiIZ9fh4+ODuro6Ro4cybNz8tKCBQtw4cIFWFpawt/f/5uv7dWrF2dR/N9//72NEnZM\nVHCSrqCiogKnT5+GtrY2Zs2ahWHDhuHx48fw8/MDi8WiG2Ye0tLSQnZ2NnJzc5mOQlqRhIQEJk6c\niN9//x1RUVEoKCiAh4cHBgwYgDNnzmDUqFGQl5fH4sWLcebMGTx//pxmVXRgDg4O8PT0bNIxT58+\nhYuLC2xsbDBlypQWXd/R0RGOjo7t9jMqIYR0BVRwEvJ/BAUFYWJiAk9PT7x79w5//PEHcnJyoK+v\nj7Fjx2LXrl149uwZ0zHbrS9NU1dUVMSiRYsgJibGk2uIiorC29ubJ+dqLaamprh16xZWr16NgwcP\nfvO1ffr0QXh4OC5evAhXV9c2StjxUMFJOrPHjx9j1apVkJWVRWBgILZu+dXTeAAAIABJREFU3YoX\nL15g48aN6NevH9PxOiUhISEYGRkhIiKC6SikDYmIiEBPTw/r16/HtWvXUFBQgICAAKirq+PGjRsw\nMDDAoEGDMGfOHBw5cgQPHz5stbXECe9ZWloiNTW1SZ/VMzIyUF1djdOnT4OPj4/rz+3btwEAI0eO\nBB8fH65cufLV81y9ehVPnjzB+vXrW/w+CCGENB9v544S0kkICAjA2NgYxsbGOHz4MKKjo+Hv7w8D\nAwP069cPVlZWsLKygry8PNNR2w1DQ0Ps37//s8f/+OMPhISE4M2bNy26URAXF8eWLVugqKjYkpht\nQk1NDbGxsZg8eTJycnKwd+/er+4o369fP0RERMDIyAhCQkL45Zdf2jht+yckJISKigqmYxDCMzU1\nNbh8+TK8vLzw+PFjLF68GCkpKRgyZAjT0bqMf6apz5kzh+kohCH8/PwYM2YMxowZg+XLl4PNZuPF\nixeIjo5GdHQ0Dh06hLy8PIwfPx4GBgYwMDCApqYmhIWFmY5OvkBERAQ2Njbw8vLCH3/80ahjhg4d\nisWLF3/xuevXr+PDhw+wsrKCpKQkhg4d+sXXlZWVYeXKlTh79ixERESaG58QQggP8LFpLgYhjVZf\nX4+YmBj4+/v/P/buPK7mtHEf+HXaJJUtS7SI7BpLtvbdEpmJsu+Rso0xY4xtmLHMM2OMsYwK2Zeo\nkCVatYesIZOUFGHKFmlT5/fH89XvMYMR55zPOXW9X6/5Y/Q5930Z80rnOveC4OBgNG3atKrsbN++\nvdDxBPX06VPo6+vj0aNH//jh/86dO+jduzcePXqEioqKao+toaGB8ePHK9y5Ro8fP8bnn3+Oli1b\n/usPvrm5ubC1tcXs2bPx5ZdfyjCl/FuzZg3u3bv31gKdSJFkZ2djy5Yt8Pf3R8eOHeHt7Y0vvviC\nhYkA/vzzT/Tr1w937txRqL9XSLYePHiAhISEqtLz5s2b6NmzZ1XhaWZmBi0tLaFj0v/JyspC7969\nkZubW7V7KCYmBnZ2dhgzZgz27NnzwWPZ2toiNjYWGRkZMDY2fudzX3/9NfLz87Fr165Pzk9ERJ+G\nBSfRR6qoqEBiYmJV2amjo1NVdnbo0EHoeILo3r07Nm3aBDMzs3987d69e3B1dUVaWhqKioo+aDyR\nSAR1dXUsXboU3377rUK+CS0pKcHYsWNRUFCAw4cPv/cA+zt37sDW1hbz5s3D9OnTZZhSvq1fvx4Z\nGRnYsGGD0FGIqq2iogKnTp2Cj48PkpOTMW7cOHh5edXavyfkhVgshoGBAaKiorgbgz7Ys2fPkJyc\nXFV4Xrx4ER06dKgqPC0tLdG0aVOhY9ZqAwcORNu2bVFYWAjgvyV1WFgYWrduDSsrKwCAjo4Ofv31\n1/eO8yEF5+XLl9GvXz9cu3aNf+5ERHKABSeRBFRWVr5RdjZq1Kiq7FSELdWSMmfOHOjq6r7zDKLK\nykps2rQJS5cuRXl5OZ4/f/7W51RVVaGsrIyePXti8+bNCv/fsKKiAnPnzkVUVBROnjwJfX39dz6b\nlZUFOzs7LF68GFOnTpVhSvnl4+ODK1euwNfXV+goRB/swYMH2LZtGzZv3oxmzZrBy8sLI0aMgIaG\nhtDR6P9MnjwZpqammDFjhtBRSEGVlJTg/PnzVYVnYmIidHV1qwpPa2trGBoaKuQHtIrq6NGjmD59\nOu7du/fOZwwNDZGdnf3ecf6t4KyoqIC5uTmmTp2KKVOmfGpsIiKSABacRBJWWVmJpKSkqrKzQYMG\nVWVnp06dhI4nVYcOHYK/vz9OnDjx3udevXqFEydO4NChQ0hOTsa9e/dQUVEBDQ0NdOrUCfb29hg/\nfvx7twQpGrFYjN9++w2///47QkNDYWJi8s5nb926BTs7OyxfvhwTJ06UXUg5tXXrViQnJ8Pf31/o\nKETvJRaLERMTA19fX4SHh8PNzQ1eXl4wNTUVOhq9xb59+3Dw4MH3Xh5CVB0VFRVITU2tKjzj4+Oh\nqqpaVXhaWVmhU6dO7zyXmz5dRUUFjIyMEBISgu7du0ttHh8fH+zduxdxcXH88yQikhMsOImkqLKy\nEmfOnEFgYCCCgoKgpaUFd3d3DB8+HJ07dxY6nsTl5+ejbdu2ePToEZSVlYWOI5cCAgIwe/ZsBAQE\nwN7e/p3Ppaenw97eHj///DPGjh0rw4TyZ+fOnYiKiuL5ViS3njx5gl27dsHX1xdKSkrw9vbGuHHj\nUL9+faGj0Xv89ddfaNeuHQoKCqCiwns3SfLEYjFu3br1RuH55MmTNy4u6tGjB8/hlbAVK1YgJycH\nmzdvlsr4Dx48gImJCWJiYmrkz/NERIqKBSeRjFRWVuLs2bNVZaempmbVys7OnTvXmO1LnTp1wp49\ne9CjRw+ho8it06dPY8SIEVi3bh1GjRr1zufS0tLg6OiI3377rVbf9Ltv3z4cO3YM+/fvFzoKURWx\nWIyUlBT4+vri8OHDGDhwILy9vWFpaVljvp/XBt26dYOPj89bz44mkoa8vLw3Li7KzMxEr1693ri4\nqF69ekLHVGgPHjxAx44dkZ2dLZUPmkaNGoVWrVrhp59+kvjYRET08VhwEgmgsrIS586dqyo7NTQ0\n4ObmBnd3d5iYmCj0m+PXl2fMmTNH6Chy7erVqxg0aBBmzZqFb7755p1/5teuXYOTkxM2bNgANzc3\nGaeUD4GBgThw4ACCgoKEjkKEoqIi7Nu3D76+vnjy5AmmTZuGSZMm8YIJBfXNN99AW1sb33//vdBR\nqJZ6+vQpkpKSqgrPy5cvo1OnTm9cXKSjoyN0TIUzfPhwWFtbY+bMmRIdNzw8HNOmTcP169d5pjIR\nkZxhwUkkMLFYXFV2BgYGQl1dvWpl52effaZwZee+ffsQFBSEQ4cOCR1F7t29excDBw6EnZ0d1q5d\n+85t/ZcvX8aAAQPg5+eHzz//XMYphXfkyBFs374dISEhQkehWuz69evw9fXFvn37YGlpCW9vb/Tr\n149nrym4sLAwrFy5EnFxcUJHIQIAFBcXIyUlBXFxcYiPj0dycjL09PRgbW1dVXoaGBgIHVPunT59\nGjNnzsS1a9ck9rN0cXExTExMsH79ejg7O0tkTCIikhwWnERy5PWWx9dlp5qaWlXZ2bVrV4UoO3Nz\nc9G9e3fk5+crRF6hPX36FK6urmjUqBH27NmDunXrvvW5CxcuwNnZGf7+/hg8eLCMUworNDQUGzdu\nRGhoqNBRqJYpLS1FcHAwfH19cevWLUyZMgVTp06Fvr6+0NFIQl6+fIlmzZohLy8PWlpaQsch+odX\nr17hypUrb5zjWbdu3TcuLurYsSN/5vobsViMTp06wc/PD9bW1hIZc/HixUhPT0dgYKBExiMiIsli\nwUkkp8RiMc6fP19VdqqoqFSVnd26dZPrH2Rbt26N48eP1/hb4yWltLQUEydORG5uLo4ePYpGjRq9\n9blz585h8ODB2LVrFwYMGCDjlMKJiIjAzz//jMjISKGjUC2RlZUFPz8/bN++HZ999hm8vb0xZMgQ\nqKqqCh2NpMDe3h5z586tdR8ekWISi8W4efPmG4VnYWEhLC0tqwrP7t278/sVgHXr1uHMmTMSOcP7\nxo0bsLKyQmpqKlq0aCGBdEREJGncV0Ukp0QiEXr16oVffvkFWVlZ2L9/PyoqKjBs2DC0bdsWCxYs\nwMWLFyGPn1HY2Nhwu1811KlTB3v37oWZmRksLCyQnZ391ud69+6NkJAQjB8/vlaVfaqqqigvLxc6\nBtVwr169QkhICAYOHIg+ffrg1atXSEhIQGRkJIYNG8ayoAZzcnKqVd9TSbGJRCK0b98eU6ZMwc6d\nO5GVlYUrV65g5MiRyMrKwpQpU9C4cWM4Ojrihx9+QHR0NF6+fCl0bEFMmDABp06dwsOHDz9pHLFY\nDC8vLyxdupTlJhGRHOMKTiIFIxaLcfHixaqVnQCqVnb26NFDLlZ2bt++HREREdi3b5/QURTOunXr\n8Msvv+D48ePo3r37W5+Jj4/HsGHDcPDgQdja2so2oAASExMxb948JCUlCR2FaqC8vDxs3boVW7Zs\ngb6+Pry8vODu7v7O4yKo5jl//jwmTJiA69evCx2FSCKePHmCxMTEqhWeV65cgYmJyRsXF71rt0hN\n4+HhAWNjYyxYsOCjx9ixYwf++OMPnDlz5p3npRMRkfBYcBIpMLFYjMuXL1eVnRUVFVVlp6mpqWBl\nZ2ZmJmxsbJCbmysXhauiCQoKwvTp07F37144OTm99ZmYmBgMHz4cwcHBsLKyknFC2Tp37hxmzJiB\nlJQUoaNQDVFZWYno6Gj4+PggOjoaI0aMgLe3N7p27Sp0NBJARUUFmjZtitTUVLRs2VLoOEQS9/Ll\nS5w9e7aq8Dx79iwMDQ3fOMdTT09P6JhSceHCBQwbNgyZmZkfVU4WFBSgc+fOCA0NhampqRQSEhGR\npLDgJKohxGIxrly5UlV2lpeXV5WdPXv2lGnRKBaLoaenh7i4OLRp00Zm89Yk8fHxcHNzw+rVqzF+\n/Pi3PhMZGYnRo0fjyJEjMDc3l3FC2bl06RImTZqEy5cvCx2FFNyjR4+wY8cO+Pn5QV1dHd7e3hgz\nZgy0tbWFjkYCc3d3h4uLyzu/3xLVJK9evcKlS5eqCs+EhARoamq+UXi2b9++xnxI3bt3byxduhSD\nBg2q9msnT54MLS0trFu3TgrJiIhIklhwEtVAYrEYqampVWVnaWkp3Nzc4O7ujt69e8vkB9ZRo0ah\nX79+mDRpktTnqqnS0tLg7OwMT09PLFiw4K1/bmFhYRg3bhyOHz+O3r17C5BS+q5du4YRI0Zw+yh9\nFLFYjDNnzsDHxwdHjx7FkCFD4OXlBTMzsxrz5p0+3ebNmxEfH4/du3cLHYVI5sRiMf788883Li56\n+fLlGxcXdevWDSoqKkJH/Sjbt29HcHAwjh8/Xq3XxcXFYcyYMbh+/To/CCMiUgAsOIlqOLFYjKtX\nr1aVncXFxVVlZ58+faT2Bt/Hxwfnzp3D9u3bpTJ+bZGXlwdnZ2eYmZlh48aNb91edfz4cXh4eNTY\n7VPp6elwcXHBzZs3hY5CCuT58+fYu3cvfH198eLFC3h5eWHixInQ0dEROhrJoaysLFhYWCAvL4/F\nNxGA3NzcNwrPnJwc9O3bt6rw7NOnj8KcVfzy5UsYGBjg/PnzaNWq1Qe9pqysDN26dcPy5csxbNgw\n6QYkIiKJYMFJVIuIxWJcu3atquwsKip6o+xUUlKS2FzXr1/HkCFDkJmZKbExa6vCwkIMGzYMGhoa\n2L9/PzQ0NP7xzJEjRzBt2jSEhYWhW7duAqSUnqysLDg4OOD27dtCRyEFkJqaCh8fHxw4cAB2dnbw\n8vKCg4ODRL+/Uc3Upk0bhISEoEuXLkJHIZI7jx49QmJiIuLi4hAfH49r166ha9eusLa2hpWVFSws\nLNCgQQOhY77TV199BXV1daxcuRK3bt3C5cuX8fjxYygrK8PQ0BCmpqZo3Lhx1fMrV65EcnIyjh07\nxg89iIgUBAtOolpKLBbj+vXrVWXn8+fPq8rOvn37fnIZUFlZiaZNm+Ly5cs19uB6WSorK4OHhwdu\n3bqFY8eOvXUVWlBQEGbOnImIiAiYmJgIkFI67t69iz59+uDevXtCRyE5VVJSgsDAQPj4+CAnJwee\nnp7w8PDghTFULV5eXmjfvj2++uoroaMQyb2ioiKcOXOmaoXnuXPn0Lp16zfO8WzRooXQMauEhYXh\niy++qNoJo6SkhFevXkEkEkFVVRXFxcUwMDDAN998A3Nzc9jZ2VVrxScREQmPBScRAcAbZeezZ8+q\nyk4zM7OPLjuHDh0Kd3d3jBo1SsJpayexWIyFCxciODgYp06dQuvWrf/xTEBAAObOnYvIyEh06tRJ\ngJSS9/DhQ5iYmOCvv/4SOgrJmYyMDPj5+WHnzp0wNTWFl5cXBg8erLDnxJGwgoKCsG3bNoSGhgod\nhUjhlJeX4+LFi29cXNSgQYM3Cs+2bdvKfDVkaWkpFi1ahE2bNqGkpAT/9ta3Xr16KCsrw/jx47F1\n61YZpSQiIklgwUlE/5CWllZVdj59+hTDhg2Du7s7zM3Nq1V2/v7770hPT4ePj48U09Y+mzZtwooV\nK3D06FH07NnzH1/fs2cP5s+fj+joaLRv316AhJL1+PFjtGnTBk+ePBE6CsmB8vJyHDt2DD4+Prhy\n5QomTZoET09PtGnTRuhopOAeP36MVq1aoaCgAGpqakLHIVJolZWVuHHjxhvneJaVlb1xcVHXrl3f\nera4pDx8+BBWVla4d+8eXr58Wa3XamhowNvbG6tXr+YWdSIiBcGCk4je68aNG1Vl5+PHj6vKTgsL\ni38tOy9evIhx48bx9mspOHLkCKZOnYpdu3Zh4MCB//j69u3b8f333+P06dMwNjYWIKHkPH/+HLq6\nunjx4oXQUUhAd+/exZYtW7B161a0bt0a3t7eGDZsGOrUqSN0NKpBevfujdWrV8PGxkboKEQ1zp07\nd94oPO/duwczM7OqwrN3795QV1eXyFyPHj2Cqakp8vLyUF5e/lFj1KtXD56envjtt98kkomIiKSL\nBScRfbA///yzquwsKCh4o+x82yfwFRUVaNy4MTIyMtCkSRMBEtdsSUlJGDp0KFatWoXJkyf/4+tb\ntmzBihUrEBMTAyMjIwESSkZJSQnq16+P0tJSoaOQjFVWViIiIgI+Pj6Ii4vD6NGjMW3atBp1xizJ\nl4ULF0JJSQkrVqwQOgpRjZefn4+EhISqwjMtLQ09evSoKjzNzc1Rv379ao8rFosxaNAgREVFoays\n7JMyamhoICAgAC4uLp80DhERSR8LTiL6KOnp6QgKCkJgYCAePnxYdd6mlZXVG2Wns7MzpkyZgqFD\nhwqYtuZKT0/HwIEDMWHCBHz//ff/2Ea1adMmrF69GjExMTA0NBQo5aepqKiAqqoqKisrhY5CMpKf\nn4/t27fDz88P9evXh7e3N0aNGgVNTU2ho1ENd/r0aSxYsABnzpwROgpRrfPixQskJydXFZ4pKSlo\n27btG+d4Nm/e/F/HCQwMxMSJE6u9Lf1dGjZsiNu3b39U2UpERLLDgpOIPtnNmzerys779+9XlZ3W\n1tZYvXo1Hjx4gN9//13omDXWgwcPMGjQIPTo0QM+Pj7/uGBl/fr1WLduHWJjYxX2RnslJSWUl5dL\n9awuEpZYLEZiYiJ8fHxw4sQJuLq6wtvbG7169eL5ZyQzpaWlaNKkCe7cuYOGDRsKHYeoVisrK8OF\nCxeqCs/ExEQ0btz4jcKzTZs2b/wdIRaL0aZNG9y+fVtiOTQ0NLB8+XLMnTtXYmMSEZHkseAkIonK\nyMioKjvv3bsHc3NzXLt2DTdu3ODNxlL0/PlzuLu7Q1lZGQcOHPjHSrc1a9bA19cXsbGxaNGihUAp\nP16dOnXw7NkziZ3NRfKjsLAQu3fvhq+vL8rLy+Hl5YXx48ejUaNGQkejWmrAgAHw9PTkzgMiOVNZ\nWYnr16+/cY5nRUXFG4VnYWEhnJ2dUVRUJNG5dXV1ce/ePX7gRkQkx1hwEpHU3Lp1CwEBAVi6dCka\nNWpUdWanjY0Ny04pKC8vx7Rp03D16lWcOHECTZs2fePr//nPf7Bjxw7ExMR80BYveaKpqYn79+9D\nS0tL6CgkIZcuXYKPjw8CAwPh5OQEb29v2Nra8s0jCW7NmjXIzMzEpk2bhI5CRO8hFouRnZ2N+Ph4\nxMXFIT4+HtnZ2Z987ubbaGho4OrVq2jdurXExyYiIslgwUlEUufg4IDRo0ejoKAAgYGByMnJgaur\nK9zd3WFra8uyU4LEYjGWLl2Kffv24eTJk2jbtu0bX1++fDkCAgJw+vTpfxSg8qxRo0bIyMhA48aN\nhY5Cn6C4uBgHDhyAj48PHjx4AE9PT0yePBm6urpCRyOqkpqaimHDhiEjI0PoKERUTb1790ZKSorE\nx9XS0oK/vz/c3d0lPjYREUmGktABiKjms7a2RkZGBubPn4/z58/jzJkzaNOmDRYsWIAWLVrA09MT\nERERePXqldBRFZ5IJMKPP/6Ib7/9FtbW1jh79uwbX1+yZAmGDRsGR0dHFBQUCJSy+lRVVVFeXi50\nDPpI6enp+Oqrr6Cvr4/AwEAsWbIEWVlZWLRoEctNkjtdunRBYWEhsrOzhY5CRNV07949qYxbXFyM\nzMxMqYxNRESSwYKTiKTO2toacXFxVf/eunVrfPvtt0hJScHZs2fRtm3bqqJj6tSpCA8PZ5n1iTw9\nPbFlyxYMHjwYx44de+NrP/zwAwYNGgQnJyc8fvxYoITVw4JT8ZSVlSEwMBD29vawsbFB3bp1kZKS\nghMnTmDw4MG8MIrklpKSEhwdHREZGSl0FCKqJml9WF5RUcEP4omI5BwLTiKSuj59+iA1NfWtB74b\nGRlh3rx5OHfuHFJSUtC+fXssWbIEurq6mDJlCsLCwlhsfaTBgwfjxIkT8PT0hJ+fX9Wvi0QirFq1\nCg4ODujXrx+ePn0qYMoPw4JTceTk5GDx4sUwNDTEH3/8gWnTpiEnJwerVq2CkZGR0PGIPoiTkxMi\nIiKEjkFE1fT3SxYlpU6dOqhfv75UxiYiIslgwUlEUqehoYGuXbvizJkz732uVatW+Oabb3D27Flc\nuHABnTp1wrJly6CrqwsPDw+cOnWKJVc19e7dG/Hx8Vi9ejUWL16M18cui0QirF69GpaWlhgwYAAK\nCwsFTvp+LDjlW0VFBUJDQ+Hi4oLu3bvj+fPniI6ORkxMDEaMGAE1NTWhIxJVi6OjI6KiolBZWSl0\nFCKqhp49e0plXDU1NXTt2lUqYxMRkWSw4CQimfj7NvV/Y2hoiLlz5yI5ORkXL15Ely5d8OOPP6J5\n8+aYPHkyQkNDpXJLZk1kbGyMpKQkhIeHY9KkSVVFoUgkwtq1a9GjRw8MHDgQz58/Fzjpu7HglE8P\nHz7ETz/9BGNjYyxduhSurq7IycnBunXr0LFjR6HjEX00PT09NGnSBJcvXxY6ChFVg52dHTQ0NCQ+\nbklJCbp37y7xcYmISHJYcBKRTFS34PxfBgYG+Oqrr5CUlITLly/js88+w8qVK6Grq4uJEyfixIkT\nLDv/RdOmTXH69Gk8evQIgwcPriozRSIRNm7ciE6dOmHQoEFvPUZAHrDglB9isRixsbEYOXIkOnTo\ngMzMTAQGBiIlJQWTJ09GvXr1hI5IJBHcpk6keNzc3FBRUSHRMUUiERwdHaGlpSXRcYmISLJYcBKR\nTFhYWCAlJQWlpaWfNI6+vj7mzJmDxMREXLlyBd27d8dPP/2E5s2bY8KECTh+/Pgnz1FT1atXD4cP\nH4ahoSFsbGxw//59AP+9UMPPzw9t2rSBi4sLXr58KXDSf2LBKbynT59i/fr16Ny5M7y9vWFhYYHb\nt29j69atUtsSSCQkR0dHFpxECkZHRweff/45VFRUJDamhoYGvv32W4mNR0RE0sGCk4hkQltbGx06\ndMD58+clNqaenh6+/PJLJCQk4OrVqzA1NcXPP/8MXV1djB8/HseOHWPZ+TcqKirw8/ODq6srzM3N\n8eeffwL4b8m5detWtGzZEl988QVKSkpklikoKAizZs2ClZUVtLW1IRKJMHbs2DeeeV1wZmdnQyQS\nvfOfkSNHyix3bZGSkgIPDw8YGRkhOTkZvr6+uH79OmbNmoUGDRoIHY9IamxtbXH27FkUFxcLHYWI\nqmHt2rVQV1eXyFhqampwcHCAjY2NRMYjIiLpkdxHW0RE/+L1NnULCwuJj92yZUvMnj0bs2fPRl5e\nHoKDg7F69WqMHz8egwcPhru7O/r16yexH3gVmUgkwpIlS6CnpwdbW1sEBwfDwsICysrK2L59O8aN\nGwdXV1ccOXIEderUkXqeFStW4MqVK9DU1ISenl5V6fq/1NTU3jiGoGvXrvjiiy/+8VyXLl2kmrW2\nKCoqQkBAAHx8fPDo0SNMmzYN6enpaNq0qdDRiGRGW1sbXbt2RUJCApycnISOQ0QfqEWLFvjyyy+x\ncuXKTxpHJBJBS0sL/v7+EkpGRETSJBK/vlKXiEjKjhw5Aj8/P5w8eVJmc96/fx/BwcEIDAxEamoq\nBg0aBHd3d/Tv359lJ4BTp05h3Lhx2Lx5M1xdXQEAr169wsiRI1FWVoagoCCp34B9+vRp6OnpwdjY\nGLGxsbCzs8OYMWOwZ8+eqmecnJwwb948tGvXDkZGRpgwYQJ27Ngh1Vy1UVpaGnx9fbF3715YWFjA\n29sb/fv3h5ISN3xQ7bRs2TK8fPkSv/zyi9BRiOgD7d+/H19++SVcXFwQEBDwUUfviEQiaGtrIyEh\ngR+eEhEpCL5jISKZsbS0RFJSEl69eiWzOXV1dTFz5kzExsYiLS0NZmZmWLt2LXR1dTFmzBgcOXKk\nVm8/HDBgAE6dOoUZM2Zg48aNAP67jX3//v1QUlLCyJEjpX72pZ2dHdq2bQuRSPTOZ3gGp/SUlpZi\n//79sLGxgYODA+rXr49Lly7h6NGjGDhwIMtNqtWcnJwQGRkpdAwi+gBisRg///wzvvvuO0RHR8Pf\n3x8bN25EvXr1qnUmp4aGBjp06ICUlBSWm0RECoTvWohIZnR0dKCvr4/Lly8LMr+uri5mzJiBmJgY\n3LhxA5aWlli/fj10dXUxevRoHD58uFaWnaampkhMTMSGDRswf/58VFZWQlVVFQcOHEBZWRnGjBkj\n01L6bf5ecObl5cHPzw+rVq2Cn58fUlNTBUynmG7fvo0FCxbAwMAA/v7+mDVrFnJycrB8+XIYGBgI\nHY9ILvTu3RtZWVnIz88XOgoRvcerV68wY8YM7Nu3D0lJSVXF5KRJk5CWlob+/fujTp067z16R1NT\nE9ra2li0aBFSU1PRtm1bWcUnIiIJYMFJRDL1+hxOoTVv3hze3t6Ijo5Geno6rK2tsXHjRujq6mLU\nqFEIDg6Wy9vEpcXIyAiJiYmIj4/H+PHjUVZWhjp16iAoKAiFhYU0Pm+aAAAgAElEQVSYMGECKioq\nBMv394IzIiICXl5eWLRoEby8vNC1a1fY2dkhJydHsIyKoKKiAkePHoWzszN69eqF0tJSxMXFITIy\nEm5ublBVVRU6IpFcUVVVhbW1NaKiooSOQkTvUFRUhKFDh+LWrVuIj49Hy5Yt3/i6gYEBjh8/jszM\nTCxduhQODg7Q0dGBuro6NDQ0ULduXdja2mLLli3Iz8/HwoULJXoLOxERyQYLTiKSKXkpOP9Xs2bN\n4OXlhaioKNy8eRO2trbw8fFBixYtMGLECAQFBdWKslNHRweRkZEoKirCwIED8ezZM6irq+Pw4cP4\n66+/MHnyZMFKztcFp4aGBpYsWYILFy7gyZMnePLkSdW5nTExMXBwcEBRUZEgGeXZ/fv3sWLFChgZ\nGeGnn37CiBEjkJubi99++w3t27cXOh6RXOM2dSL59fDhQ9jZ2aFx48Y4ceIEtLW13/lsy5YtsWDB\nAkRGRiI/Px/FxcUoKirCtGnT4OzsjJEjR0r93HEiIpIeFpxEJFPW1taIj49HZWWl0FHeqmnTppg2\nbRoiIyORkZEBBwcH+Pn5QVdXF8OHD0dgYGCNLtA0NDQQFBSEDh06wNraGvfu3UPdunUREhKCnJwc\neHp6CvJn97rgbNq0KX788Uf06NEDDRo0QIMGDWBtbY3w8HD06dMHt27dwtatW2WeTx6JxWJERUXB\n3d0dnTp1wt27dxESEoLk5GRMmDABdevWFToikUJwcnJCREQEeC8nkXxJT0+HmZkZnJ2dsW3bto/e\nhdClSxdcvXpVwumIiEjWWHASkUy1aNECjRo1QlpamtBR/lWTJk3g6emJiIgIZGZmwsnJCVu2bEGL\nFi3g7u6OgwcP1siyU1lZGRs3bsSoUaNgbm6O69evQ0NDA8eOHcPNmzcxffp0mb/R/7dLhlRUVDBl\nyhQAkLsVwrL2+PFjrF27Fh06dMCcOXNgZ2eHO3fuwNfXF927dxc6HpHCad++PSoqKpCRkSF0FCL6\nP4mJibCxscHixYuxbNmy915U+G9MTExYcBIR1QAsOIlI5uRxm/q/0dHRwdSpUxEeHo7MzEz0798f\n/v7+aNGiBdzc3HDgwAG8ePFC6JgSIxKJ8N1332HFihWwt7dHbGwsNDU1ERoaitTUVMyaNUumJeeH\n3KLepEkTAKiRpfO/EYvFOHPmDCZOnIg2bdrg4sWL2LZtG1JTUzF9+vT3btkjovcTiUTcpk4kR4KC\nguDq6oqdO3di8uTJnzxe586dkZ6eLviFikRE9GlYcBKRzFlbWyM2NlboGB9NR0cHU6ZMQVhYGLKy\nsjBw4EBs374dLVu2xLBhwxAQEFBjys5x48Zh7969VStWtbS0cPLkSaSkpGDu3LkyKznV1NRQVlb2\n3mfOnDkDAGjdurUsIsmFFy9ewM/PDz169MDYsWPRuXNnZGRkYPfu3bCwsPikFS1E9P+93qZORMJa\nu3Yt5syZg/DwcPTv318iY9arVw8tWrTArVu3JDIeEREJgwUnEcnc6xWcNeE8s8aNG8PDwwOnTp3C\n7du3MWjQIOzcuRMtW7bE0KFDsX//fjx//lzomJ/E0dER4eHhmDt3Ln7//XfUr18fYWFhiIuLw/z5\n82Xy5/h6BefFixffegZoVFQU1q5dCwAYO3as1PMI7erVq5gxYwYMDAwQFhaGn3/+GTdv3sS8efOg\no6MjdDyiGsfBwQExMTFc4UUkkIqKCsyZMwf+/v5ISkpCt27dJDo+z+EkIlJ8InFNaBiISKGIxWIY\nGBggOjoabdu2FTqOVDx+/BhHjx5FYGAgEhISYG9vD3d3d7i4uEBLS0voeB/lzp07GDhwIAYMGIBf\nf/0VT58+hb29PQYNGoQVK1Z89GrBI0eO4MiRIwCABw8eICwsDK1bt4aVlRWA/66YVVFRqSpWMzIy\nYG5uDj09PQBAamoqoqOjAQDLly/H4sWLJfC7lT8lJSUICgqCr68vbt++jalTp2LKlClV/x2ISLq6\ndu0KPz8/9O3bV+goRLVKcXExxo4di8ePH+Pw4cNo0KCBxOdYsmQJRCIRfvzxR4mPTUREssGCk4gE\nMWbMGNjb28PDw0PoKFL35MmTqrIzPj4ednZ2VWWnop2N+PjxY3zxxRfQ1dXFrl278Pz5c9jZ2WHY\nsGFYtmzZR425bNky/PDDD+/8uqGhIcaNGwdVVVW0bNkShw8fxrVr11BQUIDy8nI0a9YMZmZmmDlz\nZlUpWpPcunULfn5+2LlzJ7p37w4vLy+4uLhARUVF6GhEtco333yD+vXrY8mSJUJHIao1CgoKMGTI\nEBgZGWHbtm2oU6eOVOY5ePAgAgICcOjQIamMT0RE0sct6kQkCEW8aOhjNWzYEBMmTMDx48dx584d\nDB06FAEBAdDT08OQIUOwe/duPHv2TOiYH6RRo0YIDw9HZWUl+vfvD2VlZURFReHgwYNYuXLlR425\nbNkyiMXid/6TnZ1dtUXdw8MDx48fR3Z2Nl68eIHS0lLk5OTgwIEDNarcfPXqFQ4fPoz+/fvD3Nwc\nIpEISUlJCAsLg6urK8tNIgE4OjryHE4iGcrMzIS5uTlsbW2xe/duqZWbAG9SJyKqCVhwEpEgalPB\n+b8aNGiA8ePH49ixY8jNzYW7uzsCAwOhr68PFxcX7Nq1C0+fPhU65nupq6vjwIED6NatG6ysrFBa\nWoqoqCjs2rULv/zyi1Tm/JBb1GuCe/fuYdmyZWjVqhXWrFmDcePGIScnB7/88guMjY2FjkdUq1lb\nW+PSpUs15hI5Inl29uxZWFpaYu7cuVi1ahWUlKT7ttXY2Bj37t1DUVGRVOchIiLpYcFJRILo0KED\nioqKkJOTI3QUwdSvXx/jxo3D0aNHkZubixEjRiA4OBgGBgYYPHgwdu7cKbdlp5KSEtauXYtJkybB\n3Nwc+fn5iI6OxubNm6su+5GkmlxwVlZWIjw8HEOHDoWJiQny8/MRGhqKhIQEjB07Furq6kJHJCIA\nGhoa6NWrF2JjY4WOQlSjhYSEYPDgwdiyZQu8vLxkMqeqqiratWuHtLQ0mcxHRESSx4KTiAQhEolg\nbW2N+Ph4oaPIhfr162Ps2LEICQnB3bt3MWrUKBw+fBgGBgYYNGgQduzYgSdPnggd8w0ikQhff/01\nVq9eDUdHR6SnpyM6OhobNmzAhg0bJDpXTSw4CwoKsHr1arRr1w7z58/HgAEDcOfOHfzxxx/47LPP\nhI5HRG/BbepE0vXHH3/A29sboaGhGDx4sEznNjExwbVr12Q6JxERSQ4LTiISjLW1NVfCvIW2tjbG\njBmDI0eO4O7duxgzZgxCQkLQqlUrODs7Y/v27XJVdo4cORIHDx7EyJEjkZCQgOjoaKxZswa+vr4S\nm6OmFJxisRiJiYkYO3YsjI2Ncf36dezZswcXL16Ep6cntLS0hI5IRO/h5OSEyMhIoWMQ1TiVlZX4\n9ttvsWHDBiQmJqJXr14yz8BzOImIFBsLTiISTG09h7M6tLW1MXr0aBw+fBh3797FuHHjcOzYMbRq\n1QoDBw7Etm3b8PjxY6FjwtbWFlFRUfjuu+9w8OBBREZGYtWqVdi6datExldTU0NZWZlExhJCYWEh\nNm3ahK5du2Ly5MkwNTVFVlYWduzYgb59+0IkEgkdkYg+QI8ePXD//n3k5eUJHYWoxigpKcHo0aOR\nlJSExMREGBkZCZKjS5cuLDiJiBQYC04iEoyJiQkePHiAhw8fCh1FIWhpaWHUqFE4dOgQ7t27h4kT\nJyI0NBRGRkYYMGAA/P398ejRI8HymZiYICkpCbt378b69esRHh6OZcuWYefOnZ88tqKu4Lx8+TKm\nTZsGQ0NDnD59GmvXrsWff/6Jr776Co0aNRI6HhFVk7KyMuzs7LiKk0hCHj9+jP79+6OyshKRkZFo\n3LixYFm4gpOISLGx4CQiwSgrK8PS0pLncH4ETU1NjBgxAkFBQbh37x4mT56MU6dOoXXr1ujfvz+2\nbt2KgoICmefS09NDfHw8rl69ikWLFuH48eNYuHAh9u3b90njKlLBWVxcjJ07d6Jv374YMmQI9PX1\nkZaWhsDAQDg4OHC1JpGCc3Jy4jmcRBKQnZ0NS0tL9OzZEwEBAYJfqqenp4eSkhLk5+cLmoOIiD4O\nC04iEhS3qX86TU1NDB8+HIGBgcjLy8OUKVMQHh6ONm3aoF+/ftiyZYtMf1hv0KABTp06BTU1Ncyc\nORMHDx7E119/jYMHD370mIpQcN68eRNz586Fvr4+Dhw4gEWLFiErKwuLFy+Grq6u0PGISEJen8Mp\nFouFjkKksC5cuAALCwt4eXlhzZo1UFIS/m2pSCTiRUNERApM+L9JiKhWY8EpWfXq1YO7uzsOHjyI\nvLw8eHp6IjIyEsbGxnB0dISfn59Mys46depg7969MDMzg4eHB7Zt24bZs2fj0KFDHzWevBac5eXl\nCAoKgoODA6ysrFCnTh2kpKQgNDQULi4uUFFREToiEUlY69atUbduXVy/fl3oKEQKKTQ0FAMGDMDG\njRsxe/ZsoeO8gedwEhEpLr7zIiJBmZqaIjMzE0+ePEHDhg2FjlOj1KtXD25ubnBzc8PLly9x8uRJ\nBAYGYv78+TA1NYW7uzuGDh2Kpk2bSmV+JSUlrF69Gvr6+pg6dSrWrl0Lb29vqKioYMiQIdUaS94K\nztzcXGzevBn+/v5o27YtvL294erqijp16ggdjYhk4PU29S5duggdhUihbNmyBd9//z2OHj0KMzMz\noeP8g4mJCS5duiR0DCIi+ghcwUlEglJVVUXfvn2RmJgodJQaTUNDA8OGDUNAQADy8vIwY8YMxMbG\nol27drC3t4ePj4/ULnuaPXs21q1bh9mzZ2PJkiWYOnUqQkNDqzWGPBScFRUVOHnyJIYMGYJu3brh\n2bNniIyMRGxsLEaOHMlyk6gWeb1NnYg+jFgsxuLFi/Hzzz8jLi5OLstNANyiTkSkwERiHiBERAJb\nvnw5CgsLsXr1aqGj1DrFxcU4deoUAgMDERoaiu7du1et7GzevLlE54qPj4ebmxu8vLzg4+ODPXv2\noF+/fh/02tOnT+OHH35ATEyMRDN9iL/++gvbtm2Dn58fGjduDG9vb4wcORL16tWTeRYikg+PHj2C\nkZERCgoKoKamJnQcIrlWVlaGKVOm4ObNmzh27BiaNGkidKR3evLkCQwNDfH06VO5OBeUiIg+HL9r\nE5HgeA6ncOrWrQtXV1fs27cP9+/fx5dffonExER06NABtra2+OOPP/DgwQOJzGVlZYWYmBjs3LkT\nrq6uGDt2LKKioj7otbJewSkWixEXF4dRo0ahffv2yMjIQGBgIM6fPw8PDw+Wm0S1XOPGjdG+fXsk\nJycLHYVIrj179gzOzs4oLCxEdHS0XJebANCwYUNoa2vjzp07QkchIqJq4gpOIhJccXExdHR08PDh\nQ2hqagodhwCUlJQgLCwMQUFBOH78OD777DO4u7tj2LBhn3wjeF5eHpydnWFoaIjk5GQEBgbCxsbm\nH8+lpKRg3759iI+Px59//omXL19CU1MTxsbGsLa2xogRI9C3b1+IRKJPyvO/nj17hl27dsHX1xdi\nsRheXl4YP348GjRoILE5iKhmWLhwIZSVlbF8+XKhoxDJpdzcXDg7O8PW1ha///47lJWVhY70QQYO\nHAhvb+9qnxdORETC4gpOIhJc3bp10aNHD66EkSPq6ur4/PPPsXv3bjx48ADffPMNzp07h86dO8Pa\n2hobNmxAXl7eR43dokULxMXF4eXLlzA2NoabmxsSEhKqvh4dHY0OHTrAzs4O69evx4ULF1BUVASx\nWIznz5/j0qVL2LBhA5ycnNCuXTuEhYV98u/3woULmDJlClq1aoXExERs2rQJ169fx+zZs1luEtFb\nOTo6IiIiQugYRHIpNTUV5ubmmDhxItavX68w5SbAcziJiBQVV3ASkVxYtGgRlJSUuBJGzpWWliIi\nIgKBgYE4duwYOnfuXLWys2XLltUa6/WZXOfOncOjR48QHByMHTt2ICAgAMXFxR88joaGBoYOHYrN\nmzejbt26H/y6ly9fIiAgAD4+PsjPz8e0adMwefJkNGvWrFq/DyKqnUpLS6Gjo4OcnBw0bNhQ6DhE\nciMiIgJjxozBhg0bMGLECKHjVNvu3bsRGhqK/fv3Cx2FiIiqgQUnEcmFsLAwrFq1CrGxsUJHoQ9U\nWlqKyMhIBAYG4ujRo+jYsSPc3d3h5uYGPT29DxpDLBZj0aJF2LFjB/Lz86GsrIzS0tJqZ1FXV4eJ\niQliYmKgoaHx3mdv3LgBX19f7NmzB+bm5vD29kb//v0VanUJEcmHAQMGYNq0aXB1dRU6CpFc2LFj\nB+bPn4+goCBYWVkJHeejXLp0CePGjeMqTiIiBcOCk4jkwvPnz6Grq4uCggKoq6sLHYeqqays7I2y\ns3379lVlp76+/r++vmvXrkhNTf2kDOrq6rC1tUVoaOg/zuUsKyvD4cOH4ePjg/T0dHh4eGDq1Kkw\nNDT8pDmJqHb79ddfkZWVhU2bNgkdhUhQYrEYy5cvx/bt2xEaGoqOHTsKHemjlZSUoGHDhnj27BnU\n1NSEjkNERB+IZ3ASkVzQ0tJCp06dkJKSInQU+ghqampwdnbG9u3bcf/+fSxZsgRXr15Ft27dYGZm\nht9++w05OTlvfW1QUBBu3br1yRlKSkoQHx+PvXv3Vv1adnY2Fi5cCAMDA/j5+WHGjBm4c+cOVqxY\nwXKTiD6Zk5MTz+GkWq+8vBxTp05FSEgIkpOTFbrcBP77gWmrVq2Qnp4udBQiIqoGFpxEJDesra25\nRb0GUFNTw8CBA7Ft2zY8ePAAS5cuxfXr19GjRw/07dsXa9aswZ07dwD8d2Wlp6cnXr58KZG5i4qK\nMH36dBw6dAiDBg1Cz549UVxcjJiYGERHR8Pd3Z2rMYhIYkxMTFBYWIjs7GyhoxAJ4vnz53BxccH9\n+/cRGxuL5s2bCx1JIkxMTHD16lWhYxARUTWw4CQiuWFtbY24uDihY5AEqaqqYsCAAfD398f9+/fx\nww8/4MaNGzA1NUWfPn3g4eGBsrIyic754sULzJs3D+7u7sjNzcXatWvRoUMHic5BRAQASkpKcHR0\nRGRkpNBRiGQuLy8P1tbWMDQ0REhICDQ1NYWOJDFdunRhwUlEpGBYcBKR3LC0tMSZM2dQXl4udBSS\nAlVVVfTv3x9bt27F/fv3sXz5ckRGRqKoqEii84jFYujo6GDixInVulWdiOhjODo6cps61TrXr1+H\nubk53N3d4evrCxUVFaEjSRRXcBIRKR4WnEQkNxo1aoRWrVrh0qVLQkchKVNVVYWTk5PEy83XUlNT\nUVlZKZWxiYj+l5OTE6Kiovg9h2qNmJgY2NvbY8WKFVi4cOE/LvarCUxMTHiLOhGRgmHBSURyhdvU\na48HDx5IbbWukpJS1TmfRETSpKenhyZNmuDy5ctCRyGSun379mH48OHYv38/xo4dK3QcqWndujUK\nCgpQWFgodBQiIvpALDiJSK6w4Kw9nj17BlVVVamMraKigmfPnkllbCKiv+M2darpxGIx/vOf/+C7\n775DdHQ07O3thY4kVUpKSujYsSNXcRIRKRAWnEQkV6ytrZGQkMCtfrWAiooKxGKxVMYWi8U17jww\nIpJfTk5OvGiIaqxXr15hxowZ2L9/P5KTk9GlSxehI8kEz+EkIlIsLDiJSK40b94cTZo04SfmtYCe\nnh5KSkqkMnZJSQlatWollbGJiP7O1tYWZ86cQXFxsdBRiCSqqKgIrq6uuHXrFuLj49GyZUuhI8kM\nz+EkIlIsLDiJSO5YW1sjNjZW6BgkZerq6jAwMJDK2M2aNYOmpqZUxiYi+jttbW189tlnSEhIEDoK\nkcQ8fPgQdnZ20NHRwYkTJ6CtrS10JJniCk4iIsXCgpOI5A7P4aw9Pv/8c6ipqUl8XENDQzx58kTi\n4xIRvQu3qVNNkp6eDjMzMzg7O2Pbtm1SOzNbnnXp0gVXr16V2nE6REQkWSw4iUjuvC44+QNlzTdr\n1iwoKUn2ryI1NTU0bNgQRkZGGD9+PBISEvj/EhFJnZOTEy8aohohMTERNjY2WLx4MZYtWwaRSCR0\nJEE0a9YMSkpKuH//vtBRiIjoA7DgJCK5Y2hoCHV1ddy8eVPoKCRlRkZGcHFxQZ06dSQynpqaGvr1\n64djx47h1q1b6N69O6ZOnYrOnTvj999/x6NHjyQyDxHR3/Xu3RuZmZnIz88XOgrRRwsKCoKrqyt2\n7tyJyZMnCx1HUCKRiOdwEhEpEBacRCSXuE299vD19YWGhoZExlJXV4e/vz8AQEdHB1999RXS0tLg\n5+eHCxcuoE2bNhgzZgxiY2O5qpOIJEpVVRU2NjaIjo4WOgrRR1m7di3mzJmD8PBw9O/fX+g4coHn\ncBIRKQ4WnEQkl1hw1h6NGjVCSEjIJ5ecdevWxaFDh9C0adM3fl0kEsHKygq7d+9GVlYWevfujenT\np6Njx45Ys2YNCgoKPmleIqLXuE2dFFFFRQXmzJkDf39/JCUloVu3bkJHkhuvz+EkIiL5x4KTiOSS\njY0NC85axMrKCsePH4empiZUVFSq9VplZWXUq1cPR44cgYODw3ufbdSoEb788ktcu3YN/v7+SE1N\nhbGxMUaNGoXTp09zVScRfRJHR0dERETwewkpjOLiYri7u+PKlStISEiAgYGB0JHkCldwEhEpDhac\nRCSX2rZti9LSUty5c0foKCQjdnZ2SEtLQ9++fT/4ZnWRSISePXvi2rVr6Nev3wfPJRKJYGFhgZ07\nd+L27dswNzfH7Nmz0b59e6xevRp//fXXx/42iKgW69ChAyoqKnDr1i2hoxD9q4KCAjg4OKBu3bo4\ndeoUGjRoIHQkudO5c2f8+eefqKioEDoKERH9CxacRCSXRCIRrK2tERsbK3QUkiF9fX1ER0ejQYMG\n6NOnD1RVVaGtrQ1NTU3UrVsX9erVg7a2NlRUVODg4IAOHTpgzpw5aNWq1UfP2bBhQ8yaNQupqanY\nuXMn0tLS0K5dO4wYMQJRUVGorKyU3G+QiGo0kUjEbeqkEDIzM2Fubg5bW1vs3r1bYpf91TRaWlpo\n1qwZMjMzhY5CRET/ggUnEcktnsNZOx0+fBjt2rXDmTNnUFhYiMjISGzcuBG//fYbNm7ciIiICDx/\n/hyRkZFYs2YNVqxYIZESUiQSwczMDNu3b0d2djasra0xd+5ctGvXDj///DMePnwogd8dEdV0r7ep\nE8mrs2fPwtLSEl9//TVWrVoFJSW+JXwfblMnIlIMIjEPCSIiOZWamgo3NzfcvHlT6CgkI2KxGH36\n9MHChQvxxRdffNDzvXv3xoIFCzB06FCp5ElJScHmzZsRHBwMR0dHeHp6wsHBgW8IieitHj58iA4d\nOiA/P7/aZwoTSVtISAimTJmC7du3Y/DgwULHUQiLFi2Cqqoqli1bJnQUIiJ6D747IyK51aVLFxQU\nFOD+/ftCRyEZSUhIwJMnT+Di4vJBz4tEIixZsgTLly+XyqUeIpEIvXv3xtatW3Hnzh04ODjg22+/\nhbGxMVatWsX/N4noH5o1awYDAwOcP39e6ChEb/jjjz/g7e2NkydPstysBhMTE1y7dk3oGERE9C9Y\ncBKR3FJSUoKlpSXi4+OFjkIysmbNGnz11VdQVlb+4Ne4uLhALBbj+PHjUkwGaGtrw8vLCxcvXsTB\ngweRnZ2NTp06YejQoTh16hTP6iSiKtymTvKksrIS3377LTZs2IDExET07NlT6EgKhVvUiYgUAwtO\nIpJrPIez9rh58yaSkpIwceLEar1OJBJh8eLFUlvF+bb5evbsic2bNyMnJwcDBgzA4sWL0bp1a6xY\nsQJ5eXlSz0BE8s3JyQmRkZFCxyBCSUkJRo8ejaSkJCQmJsLIyEjoSAqnXbt2yMnJQXFxsdBRiIjo\nPVhwEpFcs7GxYcFZS6xduxbTpk2DhoZGtV87dOhQFBUVITw8XArJ3k1LSwuenp44f/48goODcffu\nXXTu3BlffPEFQkNDUVFRIdM8RCQfrKyscPHiRbx48ULoKFSLPX78GP3790dlZSUiIyPRuHFjoSMp\nJFVVVbRt2xZpaWlCRyEiovdgwUlEcq179+7Izs7G48ePhY5CUpSfn4+AgADMmDHjo16vpKSExYsX\n48cff5TJKs63MTU1ha+vL3JzczF48GAsW7YMRkZG+PHHH3H37l1BMhGRMOrVq4eePXsiNjZW6ChU\nS2VnZ8PCwgK9evVCQEAA1NXVhY6k0HgOJxGR/GPBSURyTUVFBWZmZjyHs4bz8fHBsGHD0Lx5848e\nY/jw4SgoKMDp06clmKz6NDU1MWXKFJw7dw4hISF48OABPvvsMwwZMgTHjx/Hq1evBM1HRLLBbeok\nlAsXLsDCwgLTp0/Hr7/+CiUlvuX7VDyHk4hI/vFvOyKSezyHs2YrKSnBpk2bMHfu3E8aR1lZGYsW\nLcLy5csllOzTde/eHZs2bUJubi5cXV2xcuVKGBkZYdmyZcjJyRE6HhFJkZOTEy8aIpkLDQ3FgAED\nsHHjRsyaNUvoODUGC04iIvnHgpOI5B4Lzpptz5496NGjBzp16vTJY40ePRo5OTlyt+K3Xr16mDRp\nEpKTk3HixAk8evQI3bt3x+DBg3H06FGu6iSqgXr06IG8vDxePEYys2XLFnh4eODo0aNwdXUVOk6N\n0qVLFxacRERyTiQW6rAyIqIPVFJSAh0dHdy/fx9aWlpCxyEJqqysROfOnfHHH3/A3t5eImNu3boV\nBw8elPmFQ9X18uVLBAYGYvPmzcjOzoaHhwc8PDxgaGgodDQikhA3Nzd8/vnnGDdunNBRqAYTi8VY\nsmQJAgICcPLkSbRt21boSDWOWCxGgwYNkJWVxcuaiIjkFFdwEpHcU1dXh6mpKZKSkoSOQhJ28uRJ\nqKurw87OTmJjjh8/Hunp6Th79qzExpQGDQ0NTJgwAYmJifVgDeQAACAASURBVAgLC8OzZ89gamoK\nZ2dnHD58GOXl5UJHJKJPxG3qJG1lZWWYMGECIiMjkZyczHJTSkQiEbp06cKLhoiI5BgLTiJSCNym\nXjOtWbMGX3/9NUQikcTGVFNTw3fffSdXZ3H+my5dumDdunXIzc3FqFGj8Ntvv8HQ0BCLFi3C7du3\nhY5HRB/J0dERkZGR4IYpkoZnz55h4MCBKCwsRHR0NJo0aSJ0pBqN53ASEck3FpxEpBBsbGxYcNYw\nFy9eREZGBkaMGCHxsSdNmoTLly/jwoULEh9bmurWrYtx48YhPj4ekZGRePnyJXr16oX+/fsjODiY\nqzqJFEybNm2grq6OtLQ0oaNQDZObmwtLS0t06tQJwcHB0NDQEDpSjcdzOImI5BsLTiJSCGZmZrh0\n6RKKi4uFjkISsmbNGsyePRuqqqoSH1tdXR3z5s3DihUrJD62rHTq1Alr167F3bt3MX78eKxfvx76\n+vpYsGABMjMzhY5HRB+I29RJ0q5cuQJzc3NMnDgR69evh7KystCRagUTExNuUScikmMsOIlIIdSr\nVw9dunSR+3MV6cPk5ubi5MmTmDp1qtTmmDp1Ks6cOYPU1FSpzSEL6urqGDNmDGJjYxETE4Py8nKY\nmZnByckJgYGBKCsrEzoiEb2Ho6MjC06SmIiICDg5OUnliBd6v9cFJ4+cICKSTyw4iUhh8BzOmmP9\n+vWYOHEiGjRoILU5NDQ08PXXXyv0Ks6/69ChA3799Vfk5ubCw8MDmzZtgr6+PubPn4+MjAyh4xHR\nW9jb2yM+Pp4fRtAn27FjB8aOHYvg4GAMHz5c6Di1TqNGjaCpqYmcnByhoxAR0Vuw4CQihcGCs2Yo\nLCzEtm3b8OWXX0p9Li8vL8TGxuLGjRtSn0uW6tSpg5EjR+L06dOIj4+HWCyGpaUlHBwccODAAZSW\nlgodkYj+T+PGjdG+fXucOXNG6CikoMRiMX788Uf88MMPiImJgZWVldCRai2ew0lEJL9YcBKRwrCw\nsMDZs2e5CkbBbd26FU5OTjA0NJT6XJqampgzZw5Wrlwp9bmE0q5dO/zyyy/IycnBtGnTsGXLFujr\n62PevHm4efOm0PGICNymTh+vvLwcU6dOxdGjR5GcnIyOHTsKHalW403qRETyiwUnESmMhg0bok2b\nNrh48aLQUegjlZeXY926dfjmm29kNueMGTMQFhZW47dw16lTB8OHD0dkZCSSkpKgrKwMa2tr2Nra\nYt++fSgpKRE6IlGt5eTkhMjISKFjkIJ5/vw5XFxccP/+fcTExKB58+ZCR6r1eNEQEZH8YsFJRAqF\n29QVW1BQEFq1aoWePXvKbE5tbW3MnDkTq1atktmcQjM2NsZ//vMf5OTkYObMmdixYwf09fUxd+7c\nGrddn0gRmJub49q1a3j69KnQUUhB5OXlwdraGoaGhggJCYGmpqbQkQhcwUlEJM9YcBKRQrGxsWHB\nqaDEYnHVra+yNnv2bBw7dgy3b9+W+dxCUlNTg5ubG8LDw3H27Fmoq6vD3t4e1tbW2LNnD4qLi4WO\nSFQrqKurw9zcHKdPnxY6CimA69evw9zcHO7u7vD9f+zde1zP9///8fv7nXQmijmUjpbU29lQekfk\nbNhyHD5hcibFLGTmzJQhQzkzZ3OYYuRQKYfJFCEUlUPIMZRK798f3/HbwZzq/X6+D/frn9TrdWuX\nXdCj52HZMpQpU0Z0Ev3J2dkZV65cQWFhoegUIiL6Bw44iUijeHh4ID4+Hi9fvhSdQh8oNjYWubm5\n6NSpk8rfXaFCBQwdOhSzZ89W+bvVhb29PWbNmoXMzEz4+/tjw4YNsLa2hr+/P1JSUkTnEWk9blOn\n93H06FF4eXlhxowZmDhxIiQSiegk+gsjIyPUqFEDqampolOIiOgfOOAkIo1SuXJlVKlSBcnJyaJT\n6APNnz8fAQEBkErF/NXj7++P7du3IzMzU8j71YW+vj6++OIL7N+/H7///jtMTU3h7e2N5s2bY926\ndVzVSaQk3t7evGiI3mrjxo3o0aMHNm3ahL59+4rOof/AcziJiNQTB5xEpHF4DqfmuXTpEk6dOoX+\n/fsLa7C0tMTgwYMxb948YQ3qxs7ODjNmzEBGRgbGjRuHLVu2wMrKCqNHj+YZY0SlTCaT4dGjR8jI\nyBCdQmpGoVBgzpw5CAoKwuHDh+Hl5SU6id6C53ASEaknDjiJSONwwKl5FixYgKFDh8LIyEhoR2Bg\nIDZu3Ihbt24J7VA3+vr66Nq1KyIjI3HmzBlUqFAB7du3h5ubG9asWYPnz5+LTiTSeFKpFK1bt+Y2\ndfqboqIijBgxAps2bUJCQgJcXV1FJ9E7uLq6csBJRKSGJAqFQiE6gojoQ2RlZaFBgwa4e/cuz6bS\nAHfv3oWTkxNSU1NRuXJl0TkYO3YsgP8butJ/Kyoqwr59+xAeHo6EhAT07t0bgwcPRt26dUWnEWms\n1atX47fffsPmzZtFp5AaePbsGXr16oUXL15g+/btKFeunOgkeg+XL19G27Ztde7iQiIidccBJxFp\nJDs7O0RFRcHZ2Vl0Cr3D1KlTcevWLYSHh4tOAQDcunULrq6uuHTpkloMXDVBVlYWVq1ahRUrVqB6\n9erw8/NDz549YWJiIjqNSKO8+gHdnTt3hJ1HTOrhzp076Ny5M1xcXBAeHg59fX3RSfSeXr58iXLl\nyiE7OxtmZmaic4iI6E/8lxURaSRuU9cMeXl5WLp0KQICAkSnvFatWjX06dMHISEholM0hrW1Nb77\n7jtcv34dwcHB2L17N6ytrTFs2DD88ccfovOINIa1tTUsLCyQlJQkOoUESk1NRbNmzdChQwesWrWK\nw00No6enB2dnZ6SkpIhOISKiv+CAk4g0kqenJwecGmD9+vX47LPPUKtWLdEpfzNhwgREREQgJydH\ndIpG0dPTQ8eOHbF7924kJyejWrVq6Nq1Kxo3boyIiAjk5uaKTiRSe7xNXbfFx8fD09MTkydPxtSp\nU3nUjobiOZxEROqHA04i0khyuRwxMTHgKRvqq7i4GCEhIQgMDBSd8i/W1tbw8fHBjz/+KDpFY1lZ\nWSE4OBjp6emYNm0aoqKiUKNGDQwZMgSJiYmi84jUVuvWrTng1FHbt29Ht27dsHbtWgwcOFB0DpUA\nb1InIlI/HHASkUZycHBAcXExD3hXY5GRkTA1NYWnp6folDcKCgrCsmXL8PDhQ9EpGk1PTw/t27fH\nzp07kZKSgho1asDHxwcNGzbE8uXL8eTJE9GJRGqlRYsWOHHiBPLy8kSnkAotWLAA/v7+OHDgANq2\nbSs6h0pIJpPh/PnzojOIiOgvOOAkIo0kkUh4DqeaCwkJwbhx49R2+52dnR06d+6MRYsWiU7RGtWq\nVcOkSZOQlpaGWbNm4cCBA7CxscHgwYPx+++/c8U1EYDy5cujTp06iI+PF51CKvDy5Uv4+/tj5cqV\nSEhIQL169UQnUSl4tYKTf68REakPDjiJSGNxwKm+Tp8+jfT0dPj4+IhOeauJEyciLCyMqwxLmVQq\nRdu2bbFjxw5cuHAB9vb26NWrFxo0aIClS5fi8ePHohOJhOI2dd2Ql5eH7t27IykpCceOHUONGjVE\nJ1EpqVKlCoqLi3Hnzh3RKURE9CcOOIlIY3HAqb5CQkIwZswYtb8ZtmbNmmjbti2WLFkiOkVrVa1a\nFUFBQbhy5Qp++OEHHDlyBLa2thg0aBBOnjzJ1S+kk7y9vREdHS06g5QoJycHrVq1grGxMfbv3w9z\nc3PRSVSKJBIJz+EkIlIzEgW/syAiDVVcXIxKlSohOTkZ1atXF51Df8rIyECDBg1w7do1lCtXTnTO\nO128eBEtWrRAWloaTE1NRefohDt37mDt2rUIDw+HsbEx/Pz80LdvXw4ASGcUFhbC0tISaWlpsLS0\nFJ1DpSwtLQ3t27eHj48PZsyYAamUa0q00ahRo2Bvb4+xY8eKTiEiInAFJxFpMKlUCg8PD8TFxYlO\nob9YuHAhBgwYoBHDTQBwdnaGp6cnli1bJjpFZ3zyySf45ptvcPnyZfz44484duwYbG1t4evri4SE\nBK7qJK2nr68PuVyOQ4cOiU6hUnby5Ek0b94cgYGBmDVrFoebWowrOImI1Av/xiUijebp6clt6mrk\n8ePHWLNmDUaPHi065YNMnjwZISEheP78uegUnSKVSuHl5YXNmzfjypUrcHV1ha+vL2QyGRYtWsQb\n7kmrcZu69tm9ezc6deqEiIgIDBkyRHQOKZmrqysHnEREaoQDTiLSaDyHU71ERESgffv2GneRQp06\nddC0aVNERESITtFZlSpVwrhx45CamoqwsDCcOHECdnZ26N+/P44dO8ZVnaR1vL29cfDgQf6/rSWW\nLFmCYcOGYd++fejUqZPoHFIBV1dXXLhwAS9fvhSdQkRE4BmcRKThioqKYGFhwXPM1EBhYSHs7e2x\ne/duNGjQQHTOB0tMTESXLl1w9epVGBoais4h/N8lHevWrUN4eDikUin8/PzQr18/WFhYiE4jKjGF\nQgErKyscPXoUNWvWFJ1DH6m4uBjffvst9uzZg3379sHOzk50EqmQra0toqOj4ejoKDqFiEjncQUn\nEWm0MmXKwM3NjedwqoGtW7fC0dFRI4ebANCwYUPUq1cPq1evFp1Cf7K0tERAQAAuXryIZcuW4fTp\n03BwcEDfvn0RGxvLlW+k0SQSCbepa7j8/Hz06dMHx48fR3x8PIebOojncBIRqQ8OOIlI43GbungK\nhQIhISEYN26c6JQSCQ4Oxpw5c1BQUCA6hf5CIpFALpdjw4YNSE9PR+PGjTF06FA4OzsjNDQUOTk5\nohOJPsqrbeqkeR48eIC2bduiuLgYBw8e5MpyHcVzOImI1AcHnESk8TjgFO/IkSPIy8tD+/btRaeU\nSJMmTeDk5IR169aJTqH/ULFiRYwZMwYpKSlYuXIlkpKS4OjoiN69e+PIkSNc1UkapVWrVjhy5AiK\niopEp9AHuH79Otzd3dG4cWNs3ryZx5roMK7gJCJSHxxwEpHGa9SoEVJTU/H48WPRKTorJCQEAQEB\nkEo1/6+VKVOmYPbs2Rw4qDmJRAJ3d3esXbsW165dg5ubG0aNGgUnJyf88MMPuHfvnuhEoneqUqUK\nrK2tkZiYKDqF3lNiYiLc3d0xfPhwzJ8/Xyv+3qOPJ5PJcP78edEZREQEDjiJSAsYGBigcePGSEhI\nEJ2iky5evIjExET069dPdEqpaN68OWrUqIGNGzeKTqH3VKFCBYwaNQrnzp3D2rVrceHCBdSsWRM9\ne/bEoUOHUFxcLDqR6D9xm7rmiIqKQrt27RAWFoZRo0aJziE14OTkhOvXryM/P190ChGRzuOAk4i0\ngqenJ7epCxIaGorhw4dr1Ra94OBgzJw5Ey9fvhSdQh9AIpGgWbNmWL16Na5fvw65XI6xY8fi008/\nxdy5c3Hnzh3RiUT/0rp1aw44NUBERAQGDhyIPXv2oFu3bqJzSE2ULVsWDg4OuHjxougUIiKdxwEn\nEWkFnsMpxp07d7B9+3YMGzZMdEqpatmyJSwtLbF161bRKfSRzM3NMWLECCQlJeHnn3/G5cuXUatW\nLXTv3h0HDx7kqk5SG3K5HGfOnMHTp09Fp9AbKBQKTJ48GXPnzkVcXByaNWsmOonUDM/hJCJSDxxw\nEpFWaNq0KZKSkvD8+XPRKTplyZIl6NmzJypVqiQ6pVRJJBJMmTIFM2bM4CBMw0kkEjRp0gQrV67E\n9evX4eXlhW+++QaOjo6YPXs2srOzRSeSjjMxMUGjRo34Qzo1VFBQgP79+yM6OhrHjx9HzZo1RSeR\nGuI5nERE6oEDTiLSCsbGxqhTpw5OnDghOkVnPH/+HMuWLcPYsWNFpyhFmzZtYGJigl9++UV0CpWS\n8uXLY9iwYThz5gy2bt2Ka9euwdnZGV9++SV+++03DrNJGG5TVz+PHz9G+/btkZubi8OHD2vdD/Ko\n9HAFJxGReuCAk4i0Brepq9batWvRrFkzODk5iU5RColEguDgYMyYMQMKhUJ0DpUiiUSCRo0aITw8\nHJmZmWjbti0mTpwIe3t7zJw5E7du3RKdSDrG29sb0dHRojPoT1lZWWjevDlq166NHTt2wNjYWHQS\nqTFXV1cOOImI1AAHnESkNTjgVJ3i4mIsWLAAgYGBolOUqlOnTpBIJPj1119Fp5CSmJmZwc/PD4mJ\nidixYweysrLg6uqKbt26Yd++fbxoilSiYcOGuHnzJm7fvi06ReclJSXBzc0Nvr6+WLRoEfT09EQn\nkZqzsbHBkydP8PDhQ9EpREQ6jQNOItIa7u7uOHXqFAoKCkSnaL1ff/0V5ubm8PDwEJ2iVK9WcU6b\nNo2rOHVAw4YNsWzZMmRmZqJjx4747rvvYG9vj2nTpuHGjRui80iL6enpoWXLllzFKdjBgwfh7e2N\nkJAQBAYGQiKRiE4iDSCVSuHi4sJzOImIBOOAk4i0Rvny5fHpp5/i9OnTolO03vz583Xmm7+uXbvi\nxYsX2L9/v+gUUhFTU1N8/fXXOHXqFHbt2oXs7GzUqVMHn3/+Ofbu3ctVnaQU3KYu1po1a9C3b1/s\n2LEDPXr0EJ1DGobncBIRiccBJxFpFU9PT25TV7JTp04hKysLX375pegUlZBKpZg8eTJXceqo+vXr\n46effkJWVha6du2KGTNmwNbWFlOnTkVWVpboPNIi3t7eOHjwIP+cUTGFQoFp06bh+++/x9GjR7V+\nZwIpB8/hJCISjwNOItIqPIdT+UJCQuDv748yZcqITlEZHx8fPHz4EIcOHRKdQoKYmJhg4MCBOHHi\nBPbu3YucnBzUrVsXnTp1wp49e1BUVCQ6kTScvb09DAwMcOHCBdEpOqOwsBBff/019uzZg+PHj8PZ\n2Vl0EmkoruAkIhJPouCPiYlIi9y7dw+Ojo64f/++Tg3gVOXatWto1KgRrl+/DjMzM9E5KrV+/Xqs\nWLECMTExolNITTx79gzbtm1DeHg4MjIyMGjQIAwaNAg2Njai00hD+fn5wcXFBWPGjBGdovVyc3PR\nvXt36OnpYcuWLTA1NRWdRBosJycHjo6OePjwoU4c30NEpI64gpOItEqlSpVgZWWFpKQk0SlaaeHC\nhRg0aJDODTcBoHfv3rh58yYHnPSaiYkJfH19kZCQgP379+PRo0do0KABOnTogF27dqGwsFB0ImmY\nV9vUSblu3boFuVwOGxsb7N69m8NNKjFLS0sYGRnxQjoiIoE44CQircNt6srx8OFDrFu3DqNHjxad\nIkSZMmUwceJETJ8+XXQKqSGZTIZFixbhxo0b6N27N0JCQmBjY4PJkyfj2rVrovNIQ3h5eSEuLg4F\nBQWiU7RWSkoK3Nzc0KNHDyxbtoy7PajU8BxOIiKxOOAkIq3DAadyhIeHo2PHjrCyshKdIky/fv1w\n9epVHD9+XHQKqSkjIyP069cPcXFxiI6OxrNnz9C4cWO0a9cOO3bs4KpOeisLCwvUrFkTJ0+eFJ2i\nlY4ePQovLy/MmDEDQUFB3EpMpYrncBIRicUBJxFpHblcjri4OBQXF4tO0RoFBQVYvHgxAgMDRacI\npa+vj6CgIK7ipPdSu3ZtLFiwADdu3EC/fv2waNEiWFtbIygoCGlpaaLzSE1xm7pybNy4ET169MCm\nTZvQt29f0TmkhWQyGc6fPy86g4hIZ3HASURap3r16jA3N8fFixdFp2iNLVu2oFatWqhXr57oFOF8\nfX1x7tw5nD59WnQKaQhDQ0N89dVXiImJwZEjR1BQUICmTZvC29sb27Zt43Zk+pvWrVtzwFmKFAoF\n5syZg6CgIBw+fBheXl6ik0hLcQUnEZFYvEWdiLTSwIED0bhxYwwbNkx0isZTKBSoX78+Zs+ejfbt\n24vOUQuLFy9GdHQ0du/eLTqFNFR+fj527tyJ8PBwXLhwAb6+vhg8eDAcHR1Fp5Fg+fn5qFSpEm7c\nuIHy5cuLztFoRUVFGDVqFBISEhAVFYXq1auLTiIt9vz5c1hYWODJkyfQ19cXnUNEpHO4gpOItBLP\n4Sw9hw4dQmFhIdq1ayc6RW18/fXX+P3335GUlCQ6hTSUoaEhevfujSNHjiA2NhbFxcVwc3NDq1at\nsGXLFrx48UJ0IgliaGgINzc3HDlyRHSKRnv27Bm6deuGtLQ0xMXFcbhJSmdsbAwrKytcuXJFdAoR\nkU7igJOItJJcLkdMTAy4SL3kQkJCEBAQwMsY/sLIyAjjxo3DjBkzRKeQFnBycsIPP/yArKws+Pn5\nITw8HNbW1hg/fjwuX74sOo8E4Db1krlz5w5atGiBSpUqITIyEuXKlROdRDqC53ASEYnDAScRaSU7\nOztIpVJe5FFC58+fx9mzZ/HVV1+JTlE7Q4YMQWxsLFJSUkSnkJYwMDBAz549cejQISQkJEBPTw9y\nuRwtW7bEpk2bkJ+fLzqRVMTb2xvR0dGiMzRSamoqmjVrhk6dOmHlypXcKkwqxXM4iYjE4YCTiLSS\nRCLhNvVSEBoaihEjRsDQ0FB0itoxMTHB2LFjMXPmTNEppIUcHR0xZ84cZGZmYsSIEVi1ahWsra0R\nGBiIS5cuic4jJatTpw4ePnyIzMxM0SkaJT4+Hp6enggODsZ3333HnQekcq6urhxwEhEJwgEnEWkt\nDjhLJjs7Gzt37uRFTW8xYsQIREdHIzU1VXQKaamyZcvCx8cHBw8exIkTJ1C2bFm0bNkScrkcP//8\nM1d1aimpVIpWrVpxm/oH2L59O7p164Z169ZhwIABonNIR3EFJxGROBxwEpHW4oCzZMLCwtCnTx9Y\nWFiITlFbZmZmGDVqFGbNmiU6hXSAg4MDZs+ejczMTPj7+2P9+vWwsrLC2LFjceHCBdF5VMq4Tf39\nLViwAP7+/jhw4ADatGkjOod0mKOjI27fvo1nz56JTiEi0jkSBW/gICItpVAoULlyZZw5cwbW1tai\nczTKs2fPYGtri+PHj8PR0VF0jlp79OgRHB0dcerUKdjb24vOIR1z7do1rFy5EqtWrYK9vT38/PzQ\nvXt3GBkZiU6jEsrMzESjRo2QnZ0NqZRrEt7k5cuXCAwMRHR0NKKiolCjRg3RSURo0KABli1bhs8+\n+0x0ChGRTuG/lohIa706hzMuLk50isZZs2YNmjdvzuHmezA3N8fw4cMxe/Zs0Smkg+zs7DBjxgxk\nZGRg3Lhx2Lx5M6ysrDB69Gje5KvhatSogQoVKiApKUl0ilrKy8tD9+7dkZSUhGPHjnG4SWqD53AS\nEYnBAScRaTVuU/9wL1++xIIFCzBu3DjRKRrD398fv/zyCzIyMkSnkI7S19dH165dERUVhTNnzsDc\n3Bxt27aFm5sb1qxZg+fPn4tOpI/AbepvlpOTAy8vLxgbG2P//v0wNzcXnUT0Gs/hJCISgwNOItJq\ncrkcMTExojM0yu7du2FpaQk3NzfRKRqjYsWKGDx4MObOnSs6hQg2NjaYNm0aMjIy8O2332L79u2w\ntrbGyJEjuRpQw3h7e/OioX+4evUq3Nzc0LJlS6xbtw4GBgaik4j+RiaTcQU9EZEAPIOTiLTay5cv\nYWFhgcuXL6Ny5cqiczSCu7s7/P390b17d9EpGuXu3buoVasWzp07h+rVq4vOIfqbzMxMrFq1CitX\nrkT16tXh5+eHnj17wsTERHQavcXjx49hZWWFe/fuwdDQUHSOcCdPnkTXrl0xdepUDBkyRHQO0Rvd\nvHkTDRo0wJ07d0SnEBHpFK7gJCKtpqenB3d3d57D+Z6OHz+O27dvo1u3bqJTNE7lypUxYMAAzJs3\nT3QK0b/UqFEDU6dOxbVr1zB58mTs2rUL1tbWGD58OM6ePSs6j/5D+fLlIZPJEB8fLzpFuN27d6Nz\n585YsWIFh5uk1qpVq4aCggLcvXtXdAoRkU7hgJOItB7P4Xx/ISEh8Pf3R5kyZUSnaKRx48Zh/fr1\nyM7OFp1C9EZlypRBp06dsGfPHiQnJ6Nq1aro0qULPvvsM6xYsQJPnz4VnUj/wG3qwJIlSzBs2DBE\nRUWhY8eOonOI3koikfAcTiIiATjgJCKtxwHn+0lPT8fRo0cxcOBA0Skaq2rVqujbty9CQkJEpxC9\nk5WVFYKDg5Geno7vv/8ekZGRsLa2xpAhQ5CYmCg6j/7UunVrnR1wFhcX45tvvsHixYsRHx+PRo0a\niU4iei88h5OISPV4BicRab2CggJYWFggKyuLN62+xejRo2FiYoLZs2eLTtFoN27cQJ06dZCamopK\nlSqJziH6ILdu3cLq1asREREBCwsL+Pn5oXfv3ihXrpzoNJ1VWFgIS0tLpKWlwdLSUnSOyuTn58PX\n1xc3b97Erl27YGFhITqJ6L0tW7YMp0+fxooVK0SnEBHpDK7gJCKtV7ZsWTRp0oRnmL3FgwcPsGHD\nBowaNUp0isazsrJCjx49sGDBAtEpRB+sWrVqmDRpEtLS0jBr1iwcOHAANjY2GDx4MH7//Xfw5+Kq\np6+vD7lcjsOHD4tOUZkHDx6gbdu2KC4uxsGDBzncJI3j6urKLepERCrGAScR6QRuU3+75cuXo3Pn\nzqhWrZroFK3w7bffYvny5Xjw4IHoFKKPoqenh7Zt22LHjh24cOEC7O3t0bNnTzRo0ABLly7F48eP\nRSfqFF3apn79+nW4u7ujcePG2Lx5M2+PJ43k6uqKlJQUFBcXi04hItIZHHASkU6Qy+WIiYkRnaGW\nCgoKEBYWhsDAQNEpWsPW1hZdu3bFokWLRKcQlVjVqlURFBSEq1evYt68eTh8+DBsbW0xaNAgnDx5\nkqs6VeDVRUPa/t86MTER7u7uGD58OObPnw+plN+qkGYyNzdHxYoVcf36ddEpREQ6g/9qICKd0KRJ\nE5w7d443BL/Bpk2b4OLigjp16ohO0SpBQUEICwvjSjfSGlKpFN7e3ti2bRsuXbqETz/9FF999RXq\n1auHJUuW4NGjR6ITtZazszMKCwuRlpYmOkVpoqKioWIe2wAAIABJREFU0K5dO4SFhfG4FNIKvEmd\niEi1OOAkIp1gZGSE+vXr48SJE6JT1IpCoUBISAhXbyqBo6Mj2rdvj7CwMNEpRKXuk08+wYQJE3D5\n8mWEhoYiNjYWtra2GDBgAI4fP671Kw1VTSKRvNc29UOHDqFbt26oUqUKDAwMUK1aNbRt2xZRUVEq\nKv04ERERGDRoEH799Vd069ZNdA5RqeA5nEREqsUBJxHpDJ7D+W+vtjy2adNGdIpWmjRpEhYuXIjc\n3FzRKURKIZVK0apVK2zZsgWXL19G7dq10b9/f8hkMixatAgPHz4Unag1vL29ER0d/Z+//80336B1\n69Y4ffo0Pv/8cwQGBqJjx464d+8ejh49qrrQD6BQKDB58mTMmzcPcXFxaNq0qegkolLDFZxERKol\nUfBH7ESkI/bv3485c+ao7Td6IrRt2xa9e/eGr6+v6BSt1atXLzRo0ADffPON6BQilVAoFIiJiUF4\neDiioqLw+eefw8/PD+7u7pBIJKLzNFZ2djZq166Ne/fuQU9P72+/FxERAT8/P/zvf/9DeHg4ypYt\n+7ffLywshL6+vipz36mgoACDBg3ClStX8Ouvv6JSpUqik4hKVVJSEvr06YOUlBTRKUREOoEDTiLS\nGbm5uahatSru378PAwMD0TnCJScno127drh27Rr/eyjRuXPn4O3tjfT0dBgbG4vOIVKpnJwcrFu3\nDuHh4ZBKpfDz80P//v1RsWJF0WkaSSaTYcWKFWjSpMnrX3vx4gWsra1hZGSEK1eu/Gu4qY4eP36M\nL774AmZmZti4cSP/bCSt9OLFC5ibm+PRo0f8dxYRkQpwizoR6QwzMzM4Ozvj999/F52iFkJDQzFy\n5Ej+o1vJZDIZ3N3dER4eLjqFSOUsLS0REBCAixcvYtmyZTh9+jTs7e3Rt29fxMbG8qzOD/SmbeoH\nDx7EvXv38MUXX0AqlSIyMhJz587FwoULcfz4cUGl/y0rKwvNmzdH7dq1sWPHDg43SWsZGBjA3t4e\nly5dEp1CRKQTOOAkIp3Cczj/z61bt7Bnzx4MHTpUdIpOmDx5Mn744Qfk5+eLTiESQiKRQC6XY8OG\nDUhLS0OjRo0wdOhQODs7IzQ0FDk5OaITNYK3t/e/Lhp69UM7Q0ND1K9fH506dcK3334Lf39/uLm5\nwdPTE/fu3ROR+y9JSUlwc3ODr68vFi1a9K+t9kTahhcNERGpDgecRKRT5HI5YmJiRGcIt3jxYnz1\n1VfcJqoi9evXR4MGDbBy5UrRKUTCWVhYwN/fHykpKVixYgXOnj0LR0dH9OnTB0ePHuWqzreQy+VI\nTEzE06dPX//a3bt3AQA//PADJBIJ4uLikJubi+TkZLRp0waxsbHo3r27qOTXDh48CG9vb4SEhCAw\nMJDnsZJOkMlkOH/+vOgMIiKdwAEnEemU5s2b4/jx4ygqKhKdIszTp08REREBf39/0Sk6JTg4GHPn\nzsWLFy9EpxCpBYlEgubNm2PdunVIT09H06ZNMXLkSDg5OWH+/Plqs+pQnZiYmKBhw4aIi4t7/WvF\nxcUAgDJlymDPnj1o3rw5TE1NIZPJsHPnTlhZWSEmJkbodvU1a9agX79+2LFjB3r06CGsg0jVeJM6\nEZHqcMBJRDrFwsICNjY2+OOPP0SnCLN69Wq0aNECDg4OolN0ymeffYbatWtj7dq1olOI1E7FihUx\nevRonDt3DmvWrMH58+dRs2ZN9OrVC4cPH349xKN/b1M3NzcH8H8rxW1tbf/2scbGxmjbti0A4NSp\nUyprfEWhUGDatGmYNm0ajh49Cg8PD5U3EInEAScRkepwwElEOkeXz+F8+fIlFixYgMDAQNEpOik4\nOBizZ89GYWGh6BQitSSRSODm5oY1a9bg+vXr8PDwgL+/P5ycnDBv3rzX27F1WevWrf824HRycgLw\n/wed/1ShQgUAQF5envLj/qKwsBBff/019uzZg4SEBNSqVUul7ydSB7a2tnjw4AEePXokOoWISOtx\nwElEOkeXB5w7d+5ElSpV0KxZM9EpOsnd3R329vb4+eefRacQqT1zc3OMGDECSUlJ2LBhA1JTU+Hk\n5ITu3bvj4MGDOruqs1GjRrh58yays7MBAK1atYJEIsGFCxfe+N/k1fl/dnZ2KmvMzc1F586dkZ2d\njaNHj6JKlSoqezeROpFKpXBxcUFKSoroFCIirccBJxHpHLlcjri4OJ385jgkJATjxo0TnaHTgoOD\nMXPmTJ0+B5boQ0gkEjRp0gQrV67E9evX4eXlhfHjx8PR0RGzZ89+PejTFXp6emjZsiWio6MBADY2\nNujcuTMyMzOxcOHCv33sgQMH8Ntvv8Hc3Bzt2rVTSd+tW7cgl8thY2OD3bt3w9TUVCXvJVJX3KZO\nRKQaHHASkc6pWrUqLC0tde6n6QkJCbh37x66dOkiOkWneXp6okqVKtiyZYvoFCKNU758eQwbNgx/\n/PEHtmzZgvT0dDg7O+PLL7/Eb7/9pjM/uPrnNvUlS5bA2toaAQEBaN26NcaPHw8fHx906NABenp6\nWLFiBcqXL6/0rpSUFLi5uaFHjx5YtmwZypQpo/R3Eqk7DjiJiFSDA04i0km6uE19/vz58Pf3h56e\nnugUnSaRSF6v4tSVYQxRaZNIJGjcuDEiIiKQkZGBNm3aICgoCA4ODpg5cyZu3bolOlGpXl00pFAo\nAABWVlZITEzEyJEjceXKFSxcuBBHjx5F586dER8fjy+//FLpTUeOHIGXlxdmzJiBoKAgSCQSpb+T\nSBO4urpywElEpAISxat/GRER6ZB169Zh79692Lp1q+gUlbh69SqaNWuG69evw8TERHSOzlMoFGjW\nrBkCAwPRvXt30TlEWiMxMRHh4eHYunUrWrRoAT8/P7Rp00brfrCjUChgb2+PyMhI1K5dW3QONm7c\nCH9/f2zevBleXl6ic4jUyt27d1GrVi3cv3+fg38iIiXiCk4i0kmvVnDqys94fvzxR/j5+XG4qSZe\nreKcPn06V3ESlaKGDRti+fLlyMzMRIcOHTBlyhTY29tj+vTpuHnzpui8UiORSP61TV0EhUKBOXPm\nICgoCIcPH+Zwk+gNKleuDH19fa1fWU5EJBoHnESkk2xsbFC2bFlcuXJFdIrS3b9/Hz///DNGjhwp\nOoX+okOHDtDX18eePXtEpxBpHTMzMwwePBi///47du3ahdu3b0Mmk6FLly6IjIzEy5cvRSeW2Ktt\n6qIUFRVh+PDh2Lx5MxISEuDq6iqshUjd8RxOIiLl44CTiHSSRCLRmXM4ly1bhm7duqFq1aqiU+gv\n/rqKU1dWEhOJUL9+ffz000/IzMxEly5dMG3aNNja2mLq1KnIysoSnffRvLy8EBcXh8LCQpW/+9mz\nZ+jWrRvS0tIQGxuL6tWrq7yBSJPwHE4iIuXjgJOIdJYuDDhfvHiBsLAwBAQEiE6hN/j8889RWFiI\nqKgo0SlEWs/U1BQDBw7EyZMnsXfvXuTk5KBu3bro1KkT9uzZg6KiItGJH8TS0hKOjo44ceKESt97\n584dtGjRApUqVUJkZCTKlSun0vcTaSKZTIbz58+LziAi0moccBKRzvL09NT6AefPP/+MunXrcuug\nmpJKpZg8eTJXcRKpWN26dREWFoasrCz4+Phgzpw5sLW1xZQpU5CRkSE6772pept6amoqmjVrhk6d\nOmHlypXQ19dX2buJNBm3qBMRKR8HnESksz799FPk5eVp1DezH0KhUCA0NBTjxo0TnUJv8eWXX+LJ\nkyeIjo4WnUKkc0xMTODr64uEhATs27cPjx49QoMGDdChQwfs2rVLyPbvD+Ht7a2yPzuOHTsGT09P\nBAcH47vvvuNt0EQfwMXFBZcuXdK4leJERJqEA04i0lmvzuGMi4sTnaIUv/32G/T09NCqVSvRKfQW\nenp6mDRpEqZNm8ZVnEQCyWQyLFq0CFlZWejVqxfmz58PGxsbTJ48GdevXxed90bu7u44d+4cHj9+\nrNT3bNu2DV988QXWrVuHAQMGKPVdRNrIxMQEVatWxdWrV0WnEBFpLQ44iUinyeVyxMTEiM5Qivnz\n5yMwMJCrbDRAz549kZ2drbX/LxJpEmNjY/Tv3x/Hjh3DwYMH8fTpUzRq1Ajt2rXDL7/8olarOg0N\nDdGsWTMcOXJEKc9/tRNg7NixOHDgANq0aaOU9xDpAm5TJyJSLg44iUinaetFQ2fPnsXFixfRq1cv\n0Sn0HsqUKYNJkyZh+vTpolOI6C9cXFzw448/IisrC3379sWPP/6IGjVqYOLEiUhPTxedB0B529Rf\nvnwJf39/rFq1CgkJCahXr16pv4NIl/CiISIi5eKAk4h0mqurK+7evYvs7GzRKaUqNDQUo0ePRtmy\nZUWn0Hv66quvcO3aNcTHx4tOIaJ/MDIyQt++fREbG4vDhw8jPz8fTZo0QZs2bbBt2zYUFBQIa2vd\nunWpXzSUl5eH7t2749y5czh27Bhq1KhRqs8n0kVcwUlEpFwccBKRTtPT00Pz5s216hzOGzduYO/e\nvfDz8xOdQh9AX18f3377LVdxEqk5Z2dnhIaGIisrC76+vvjpp59gbW2NCRMmCDlfr27dunj48CEy\nMzNL5Xk5OTnw8vKCsbEx9u3bB3Nz81J5LpGuc3V15YCTiEiJOOAkIp2nbdvUFy9ejH79+qFChQqi\nU+gD/e9//8OFCxdw6tQp0SlE9A6Ghobo06cPjhw5gtjYWBQXF8PNzQ2tW7fGli1b8OLFC5V0SKVS\ntGrVqlS2qV+9ehVubm5o2bIl1q9fDwMDg1IoJCIAqFmzJm7evIlnz56JTiEi0koccBKRzvP09NSa\nAWdubi5WrlwJf39/0Sn0EQwMDDBhwgSu4iTSME5OTvjhhx+QlZWFwYMHIzw8HNbW1hg/fjwuX76s\n9Pd7e3uXeJv6yZMn4eHhgcDAQMyaNYsX1BGVMn19fXz66ae4ePGi6BQiIq3EAScR6bz69evj2rVr\nePDggeiUElu1ahW8vLxgZ2cnOoU+0qBBg3DmzBn88ccfolOI6AMZGBigZ8+eOHToEOLj4yGVSuHh\n4YGWLVti06ZNSlvV2bhxY0RGRmLUqFFo3rw5GjZsCA8PDwQEBGDr1q148uTJWz9/9+7d6Ny5M1as\nWIEhQ4YopZGIeA4nEZEySRQKhUJ0BBGRaG3atMGoUaPQuXNn0SkfraioCI6OjtiyZQuaNGkiOodK\nYMGCBTh27Bh27NghOoWISqigoAC7d+9GeHg4zp49i/79+2Pw4MGoVatWiZ997do1TJo0CTt37nw9\nPP3rP+0lEglMTU1RVFSEXr16Yfr06ahevfrfnhEWFoZZs2Zhz549aNSoUYmbiOi/zZ07F3fu3EFo\naKjoFCIircMVnERE+L9zOGNiYkRnlMgvv/wCa2trDje1wJAhQxAfH89VHkRaoGzZsujevTsOHjyI\nEydOoGzZsmjRogU8PT3x888/Iz8//4OfqVAosHjxYri6umLr1q3Iz8+HQqHAP9ctKBQK5ObmIi8v\nD+vXr0etWrWwatUqKBQKFBcXY/z48QgLC0N8fDyHm0QqwBWcRETKwxWcREQAYmNjMW7cOI293EWh\nUKBJkyaYOHEiunbtKjqHSsG8efNw5swZbN68WXQKEZWygoIC/PrrrwgPD0diYiL69euHwYMHo3bt\n2u/83OLiYgwaNAhbt27F8+fPP/jdxsbGGDhwIO7evYtbt25h165dsLCw+Jgvg4g+UFZWFj777DPc\nvn1bdAoRkdbhgJOICEB+fj4sLCyQnZ0NMzMz0TkfLC4uDgMHDsSlS5egp6cnOodKQW5uLhwcHBAb\nG1sqW1mJSD1du3YNK1aswOrVq+Hg4AA/Pz/4+PjAyMjojR/v7++PiIiIjxpuviKVSuHs7IzTp0/D\n0NDwo59DRB9GoVCgQoUKuHr1KiwtLUXnEBFpFW5RJyICYGhoiIYNG+L48eOiUz5KSEgIAgICONzU\nImZmZhgzZgxmzZolOoWIlMjOzg4zZ85ERkYGAgMDsXHjRlhbW2PMmDE4f/783z42JiamxMNN4P9W\ngaanp+PChQsleg4RfRiJRAJXV1duUyciUgIOOImI/iSXyxEbGys644NdvnwZCQkJ+N///ic6hUrZ\nyJEjERUVhatXr4pOISIl09fXR9euXbFv3z6cPn0a5cqVQ9u2beHm5oY1a9YgNzcXffr0KfFw85W8\nvDz07t37X+d2EpFy8RxOIiLl4ICTiOhPnp6eGjngXLBgAYYMGQJjY2PRKVTKypcvjxEjRmD27Nmi\nU4hIhWxtbTF9+nRkZGTg22+/xfbt21GtWjXcu3evVN9z8+ZNHDt2rFSfSURvJ5PJ/rU6m4iISo5n\ncBIR/enp06eoUqUKcnJyNOZMspycHNSsWROXLl3CJ598IjqHlODBgweoWbMmEhMTYWtrKzqHiARx\nc3Mr9WNUJBIJvvjiC2zfvr1Un0tE/y0uLg7ffPONxh6LRESkrriCk4joT6ampnBxcdGom9SXLl2K\nL7/8ksNNLVaxYkUMGTIEc+bMEZ1CRIIoFAokJycr5blcwUmkWq6urkhJSUFxcbHoFCIircIBJxHR\nX8jlcsTExIjOeC/5+flYsmQJAgICRKeQko0dOxZbt27FjRs3RKcQkQBZWVlKG4Y8ePAAjx8/Vsqz\niejfKlSogHLlyiEjI0N0ChGRVuGAk4joLzTpoqENGzagYcOGqF27tugUUrJKlSph0KBBmDdvnugU\nIhLg3r170NfXV8qzDQwMkJOTo5RnE9Gb8RxOIqLSxwEnEdFfNG/eHCdOnEBhYaHolLcqLi5GaGgo\nAgMDRaeQigQGBmLDhg24ffu26BQiUjGJRKLRzyeiv+NN6kREpY8DTiKiv6hQoQLs7e1x5swZ0Slv\ntW/fPhgYGKBly5aiU0hFqlSpgn79+mH+/PmiU4hIxapVq4YXL14o5dn5+fmoXLmyUp5NRG/m6urK\nAScRUSnjgJOI6B80YZt6SEgIxo0bx1U3Ouabb77B6tWrcffuXdEpRKRCVapUgZGRkdKebWpqqpRn\nE9GbcQUnEVHp44CTiOgfPD091XrA+ccff+DKlSvo0aOH6BRSserVq6NXr14IDQ0VnUJEKubp6Vnq\nP9TS09ND69atS/WZRPRuzs7OSEtLQ0FBgegUIiKtwQEnEdE/eHh44NixY3j58qXolDcKCQnB6NGj\nlXbhBKm3CRMmICIiAvfv3xedQkQqNHbsWJiYmJTqM4uLi2FjY8MhC5GKGRoawtbWFqmpqaJTiIi0\nBgecRET/8Mknn+CTTz5Ry9sts7KyEBUVhcGDB4tOIUFsbGzQrVs3LFy4UHQKEamQXC5HtWrVSu15\nenp6cHZ2xvHjx+Hg4ICFCxfi2bNnpfZ8Ino7nsNJRFS6OOAkInoDuVyOmJgY0Rn/smjRIvj6+sLc\n3Fx0CgkUFBSEn376CY8ePRKdQkQqsmPHDty/fx9lypQplecZGBjg119/xW+//YZdu3YhLi4O9vb2\nmDFjBh4+fFgq7yCi/8ZzOImIShcHnEREb6COFw09efIEq1atwpgxY0SnkGAODg7o2LEjFi9eLDqF\niJQsJycHPXv2xKRJk/Drr79i3rx5MDY2LtEzjY2NsWTJEtjb2wMAGjZsiO3btyMmJgZpaWlwdHTE\nhAkTkJ2dXRpfAhG9gUwmU8vdQkREmooDTiKiN3g14FQoFKJTXluxYgW8vb1hY2MjOoXUwMSJE7Fo\n0SLk5uaKTiEiJfnll18gk8lgbW2Ns2fPolmzZhg7diyCgoI+eshpZGSEuXPnwtfX91+/V6tWLaxe\nvRp//PEH8vLyULt2bQwfPhzXrl0r4VdCRP/EFZxERKVLolCn796JiNSIra0t9u/fj1q1aolOQVFR\nERwcHLBjxw40atRIdA6piT59+qBu3bqYMGGC6BQiKkX379/HyJEjcfr0aaxZswbu7u7/+pioqCj0\n69cPz58/R35+/jufaWRkhPLly2PTpk1o0aLFe3XcvXsXCxcuxPLly9G+fXt8++23cHFx+dAvh4je\n4OXLlyhXrhxu376NcuXKic4hItJ4XMFJRPQf1Gmb+vbt22Fra8vhJv3NpEmTEBoayotBiLTIrl27\nIJPJUKVKFSQlJb1xuAkAHTp0QFpaGoKCgmBhYQEzMzMYGRn97WPKlCkDMzMzfPLJJ/juu+9w5cqV\n9x5uAkDlypUxc+ZMpKWlwcXFBa1atULXrl1x8uTJknyJRIT/u+irdu3a3KZORFRKuIKTiOg/rFy5\nEkeOHMGGDRuEdigUCjRu3BhTpkzB559/LrSF1I+Pjw/c3NwQEBAgOoWISuD+/fsYPXo0Tp48idWr\nV8PDw+O9P7eoqAinT59GYmIi/vjjDzx//hw5OTm4ffs2Vq1ahYYNG0IqLfm6hry8PKxatQo//PAD\nHBwcEBQUhFatWkEikZT42US6aODAgWjatCn8/PxEpxARaTwOOImI/sOVK1fg5eWFzMxMod+8xcTE\nwM/PDxcvXiyVb1BJu5w9e/b1Sq5/rt4iIs2wZ88eDBs2DD4+Ppg1axZMTExK/MyLFy+iS5cuuHz5\ncikU/l1hYSE2bdqEOXPmwNTUFEFBQejSpQv/jiL6QAsWLEB6ejovDSQiKgX8VwgR0X9wdHREUVER\nMjIyhHaEhIQgICCA3zjSG9WrVw+NGzfGihUrRKcQ0Qd6+PAh+vfvj7Fjx2Ljxo1YuHBhqQw3AcDe\n3h6ZmZkoLCwslef9lb6+Pvr374/z588jKCgIs2bNgqurK9atW6eU9xFpK1dXV140RERUSvjdMhHR\nf5BIJJDL5YiJiRHWcOnSJZw8eRL9+/cX1kDqLzg4GPPmzcOLFy9EpxDRe9q7dy9kMhnKly+P5ORk\neHp6lurzDQwMYGVlhfT09FJ97l9JpVJ069YNp06dwqJFi7B27VrUrFkTS5YsQV5entLeS6QtXt2k\nzk2VREQlxwEnEdFbiL5oaMGCBRg2bBi3HtNbNWrUCDKZDGvWrBGdQkTv8OjRI/j6+mL06NHYsGED\nFi9eXGqrNv/p008/VcoW9X+SSCRo3bo1Dh06hC1btuDgwYOws7PDnDlz8PjxY6W/n0hTffLJJ5BK\npcjOzhadQkSk8TjgJCJ6C5EDznv37mHbtm0YPny4kPeTZgkODsbs2bO5PZRIjUVFRUEmk8HExATJ\nyckfdKP5x1DVgPOvmjRpgl27diE6Ohrnz5+Hg4MDJk2ahLt376q0g0gTSCSS16s4iYioZDjgJCJ6\nCxcXF9y/fx+3bt1S+bt/+ukn+Pj4oHLlyip/N2meZs2awdHREevXrxedQkT/8OjRIwwcOBAjRozA\n2rVrsWTJEpiamir9vSIGnK+4urpiw4YNOHXqFB48eIBatWph9OjRyMzMFNJDpK54DicRUenggJOI\n6C2kUik8PDwQFxen0vfm5eXhp59+QkBAgErfS5ptypQpmDVrFoqKikSnENGf9u/fD5lMBgMDAyQn\nJ8PLy0tl73ZyckJqaqrK3vcm9vb2WLp0KVJSUmBkZIT69etjwIABuHTpktAuInXBFZxERKWDA04i\nonfw9PRU+Tb19evX47PPPkOtWrVU+l7SbHK5HNWrV8emTZtEpxDpvMePH+Prr7/G0KFDsXr1aixd\nuhRmZmYqbRC5gvOfqlatirlz5+Lq1auwt7eHp6cnfHx8kJiYKDqNSCiZTIbz58+LziAi0ngccBIR\nvYOqz+EsLi5GaGgoAgMDVfZO0h7BwcGYOXMmXr58KTqFSGcdOHAAMpkMenp6SE5ORuvWrYV0VK9e\nHY8ePUJubq6Q979JhQoVEBwcjPT0dHh4eKBr165o27YtYmJieJM06SQXFxdcvHiRf28TEZUQB5xE\nRO9Qr149ZGZm4v79+yp5X2RkJExNTeHp6amS95F2adWqFSpUqIDt27eLTiHSOU+ePIGfnx8GDx6M\nFStWYPny5ShXrpywHqlUipo1a+LKlSvCGv6LiYkJxowZg7S0NPTs2RODBw+Gu7s79u7dy0En6RQz\nMzNUrlwZaWlpolOIiDQaB5xERO9QpkwZ2NnZoX///vDw8EC5cuUgkUjQt2/f//ycFy9eYMmSJfjs\ns89gaWkJU1NTODs7Y/To0cjIyHjr+0JCQhAYGAiJRFLaXwrpAIlEgilTpmD69OkoLi4WnUOkM6Kj\noyGTyaBQKJCcnIw2bdqITgKgHudwvk3ZsmUxcOBAXLx4Ef7+/ggODkbdunWxadMmnidMOoPncBIR\nlRwHnERE7+HOnTuIiorC2bNnUb169bd+bFFREVq1aoWRI0ciNzcXvXv3xtChQ1G5cmUsXrwYdevW\nxYULF974uadPn0Z6ejp8fHyU8WWQjmjXrh2MjIywa9cu0SlEWi83NxdDhw7FwIEDsXz5ckRERKB8\n+fKis15Tp3M430ZPTw89evTAmTNnMG/ePCxduhROTk4IDw/HixcvROcRKRXP4SQiKjkOOImI3kNQ\nUBBcXFzw5MkTLF269K0fu3PnTsTHx6NVq1ZISUnB4sWLMX/+fMTExGDKlCl4/Pgx5s+f/8bPDQkJ\ngb+/P/T19ZXxZZCOkEgkmDx5MmbMmMGtnkRKdOjQIchkMhQWFuLcuXNo166d6KR/0ZQB5ysSiQTt\n2rVDbGws1q5di927d8Pe3h4hISF4+vSp6DwipeAKTiKikuOAk4joPQwZMgTXr19/r4sa0tPTAQAd\nO3aEVPr3P2a7dOkCALh3796/Pi8zMxMHDhzA119/XQrFpOs+//xzFBcXIzIyUnQKkdZ5+vQphg8f\nDl9fX/z0009YuXKlWq3a/CtNG3D+VfPmzREZGYnIyEj8/vvvsLOzw9SpU1V2JjaRqri6unLASURU\nQhxwEhG9BwMDAzRq1AgJCQnv/FgXFxcAwL59+/51BuLevXsB4I036i5cuBADBgwQeiEFaY9Xqzin\nTZvGVZxEpejIkSOQyWTIy8vDuXPn0KFDB9Hq8WGpAAAgAElEQVRJb/Xpp58iNTVVo/8cqFevHjZv\n3oyEhATcvHkTNWvWRGBgIG7evCk6jahUODk5ITMzE3l5eaJTiIg0FgecRETvydPTE7Gxse/8uI4d\nO+KLL77AwYMHIZPJMGbMGIwfPx5eXl6YMWMGRo0ahREjRvztcx4/fozVq1dj9OjRysonHfTFF1/g\n2bNnOHDggOgUIo339OlTjBw5Ev369UNYWBhWr14Nc3Nz0VnvVLFiRRgYGODOnTuiU0qsZs2aiIiI\nQHJyMhQKBWQyGfz8/HD16lXRaUQloq+vj5o1a+LixYuiU4iINBYHnERE70kul7/XgFMikWD79u34\n7rvvkJqaikWLFmH+/Pk4cuQI5HI5+vTpgzJlyvztcyIiItC+fXvUqFFDWfmkg6RSKVdxEpWCmJgY\n1K1bF7m5uTh37hw6duwoOumDaPI29TexsrJCaGgoLl++jKpVq6JZs2bo3bs3kpKSRKcRfTSew0lE\nVDIccBIRvaemTZvi7Nmz77zNNT8/Hz179kRISAiWLFmC27dv4/Hjx4iKikJGRgbkcjl27979+uML\nCwuxcOFCBAYGKvtLIB3Uo0cP5OTk4MiRI6JTiDTOs2fPMGbMGPTp0wc//vgj1q5diwoVKojO+mDa\nNuB8xdLSEt9//z3S09PRsGFDtG/fHp06dUJ8fLzoNKIPxnM4iYhKhgNOIqL3ZGJiAplMhgsXLrz1\n4+bMmYNt27Zh5syZGDJkCKpUqYJy5cqhffv22L59OwoLCzFmzJjXH79161Y4OjqiQYMGyv4SSAfp\n6elh4sSJmD59uugUIo0SFxeHunXr4v79+zh37hw6d+4sOumjOTk5ITU1VXSG0piZmWHcuHFIT09H\n586d0a9fP3h6emL//v1cvU4agys4iYhKhgNOIqIPIJfL37kF7tVFQi1btvzX79WtWxcVKlRARkYG\n7t+/D4VCgZCQEIwbN04pvUQA0KdPH2RmZiIuLk50CpHae/78OcaOHft6Jf6GDRtQsWJF0Vkloq0r\nOP/J0NAQQ4YMweXLlzFkyBCMHz8eDRs2xLZt2/Dy5UvReURvJZPJcP78edEZREQaiwNOIqIPIJfL\nkZyc/NaPebWF/d69e2/8vdzcXABA2bJlcfToUeTl5aF9+/alH0v0J319fQQFBXEVJ9E7xMfHo169\nerhz5w7OnTuHLl26iE4qFboy4HylTJky6NOnD5KSkvD9998jNDQUtWvXxqpVq1BQUCA6j+iNatSo\ngadPn+LBgweiU4iINBIHnEREH8Dd3f2dN1x6eHgAAGbNmvWv8zqnTp2KoqIiNG7cGGZmZggJCUFA\nQACkUv5xTMrVv39/pKam4uTJk6JTiNROXl4eAgMD4ePjg7lz52Ljxo2wsLAQnVVqHBwccO3aNRQV\nFYlOUSmpVIrOnTsjISEBy5cvx5YtW+Do6IiFCxfi2bNnovOI/kYikcDFxYXb1ImIPpJEwYNpiIje\nadeuXdi1axcA4JdffkFubi7s7e1fDzMtLS0xf/58AMDNmzfRtGlT3LhxA7a2tmjXrh2MjIwQHx+P\nU6dOwcjICIcOHYK5uTlatmyJ69evw9DQUNjXRrpj6dKliIyMfH2MAhEBCQkJGDBgAOrXr4+wsDBY\nWlqKTlIKOzs7REdHw8HBQXSKUKdPn8bs2bNx7NgxjBo1CiNGjNDIi6NIOw0ZMgQymQwjR44UnUJE\npHG4ZIiI6D2cPXsWa9euxdq1a19vMU9PT3/9a9u3b3/9sdWrV8eZM2cQGBgIQ0NDrF69GmFhYcjO\nzoavry/OnDmDZs2aITQ0FMOHD+dwk1RmwIABOHv2LBITE0WnEAmXl5eH8ePH48svv8SsWbOwefNm\nrR1uAv+3TV2bLxp6X40aNcKOHTtw9OhRXL16FY6OjpgwYQKys7NFpxHxHE4iohLgCk4iog/0yy+/\nYOXKlYiMjPzoZ9y5cwe1atXC5cuXUalSpVKsI3q7hQsX4ujRo9i5c6foFCJhTpw4AV9fX9SpUwdL\nlizRiT+HR40aBQcHB/j7+4tOUSsZGRmvL5Pq1asXxo8fDzs7O9FZpKNiYmIwceJExMfHi04hItI4\nXMFJRPSBPDw8EB8fX6IbWZcsWYJevXrpxDfVpF4GDx6MEydOvPOyLCJtlJ+fjwkTJqBr166YPn06\ntm7dqjN/DuvaRUPvy8bGBosWLcKlS5dgbm6Oxo0bo1+/fkhJSRGdRjrI1dUV58+fB9cgERF9OA44\niYg+UKVKlVCtWjUkJSV91Oc/f/4cy5Ytw9ixY0u5jOjdjI2NERgYiBkzZohOIVKpU6dOoUGDBkhL\nS0NycjK6d+8uOkmlnJycOOB8i8qVK2PWrFlIS0uDi4sLWrVqha5du/JiNlIpCwsLmJiYIDMzU3QK\nEZHG4YCT/h97dx5Xc9r/D/x12qgQBimyVFooWiwtypCdqcGUGTMY+zqjZClLjKXIOjEyGUszYzuW\nsSVrEUmFtBJlX8LYaa/z+2O+t9899wxaTl2nzuv5eNz/cLo+L3PP6PQ61/W+iKgMnJ2dERUVVaav\n/fXXX2Fvbw8TExM5pyIqmfHjx+P06dO4cuWK6ChEFS4vLw++vr747LPP4Ofnh127dqFRo0aiY1U6\nzuAsGR0dHfj4+ODGjRvo3r07PDw84OLigpMnT3JXHVUKzuEkIiobFpxERGVQ1oKzuLgYK1euxLRp\n0yogFVHJ1KpVC1OmTMHixYtFRyGqUPHx8bCxsUF6ejqSkpLw5ZdfQiKRiI4lhIGBAf7880+8fftW\ndJQqQUtLC5MnT0ZGRgaGDRuGyZMno1OnTti3bx+Ki4tFx6NqzNLSEsnJyaJjEBFVOSw4iYjKwMnJ\nCVFRUaXezXHw4EHUrVsXnTt3rqBkRCUzefJkHD16FNevXxcdhUju8vLyMHv2bPTv3x+zZ8/Gnj17\noKurKzqWUKqqqjAyMkJGRoboKFWKuro6hg8fjtTUVPj6+mLx4sWwtLTEb7/9hoKCAtHxqBqysLBg\nwUlEVAYsOImIysDAwAB16tQp9RHfFStWwNvbW2l3EJHiqFOnDiZPngx/f3/RUYjk6uLFi2jfvj1S\nU1ORmJiIIUOG8O/c/8M5nGWnoqKCAQMGIC4uDqtXr8bmzZvRqlUr/PTTT8jJyREdj6oR7uAkIiob\nFpxERGXUpUuXUh1Tj4uLw507dzBo0KAKTEVUct9//z0OHDiAmzdvio5CVG75+fmYO3cu+vTpg5kz\nZ+KPP/5A48aNRcdSKJzDWX4SiQQ9evRAREQEduzYgWPHjsHQ0BBLly7Fq1evRMejaqB169a4fv06\ndwgTEZUSC04iojIq7RzOFStWwNPTE2pqahWYiqjk6tWrhwkTJmDJkiWioxCVy6VLl9C+fXskJiYi\nMTER33zzDXdt/gsTExPu4JQjOzs77N+/H8ePH0dycjIMDQ0xZ84cPHnyRHQ0qsI0NTXRrFkz/rdK\nRFRKLDiJiMrI2dkZp0+fLtEczlu3buHkyZMYNWpUJSQjKjlPT0/s2rULd+7cER2FqNTy8/Mxb948\n9O7dG9OmTcP+/fuhp6cnOpbCYsFZMSwsLPD7778jLi4OT58+hampKaZMmcK/V6nMOIeTiKj0WHAS\nEZWRoaEhAODGjRsffe3q1asxcuRI1K5du6JjEZVKgwYNMHr0aAQGBoqOQlQqly9fRseOHXHx4kVc\nvnwZw4YN467NjzA1NUV6enqpL8ijkjE0NERwcDBSU1NRo0YNWFtbY+TIkRwLQKXGOZxERKXHgpOI\nqIwkEkmJjqm/ePECv/76K77//vtKSkZUOt7e3ti2bRsePHggOgrRRxUUFOCHH35Ajx494OnpiYMH\nD0JfX190rCrhk08+gUQiwZ9//ik6SrWmp6eHwMBAZGRkoGXLlnBycoK7uzsuXbokOhpVEZaWlkhJ\nSREdg4ioSmHBSURUDiUpOENCQtCvXz80bdq0klIRlY6uri6GDx+OZcuWiY5C9EFJSUno1KkTYmNj\nkZCQgG+//Za7NktBIpHwmHolqlevHubOnYubN2/C0dERrq6u6N27d4nH25Dy4g5OIqLSk8j43ZWI\nqMxSU1Ph6uqK+Ph43Lx5E4WFhdDR0YGxsTHU1NSQn58PQ0NDHDp0CFZWVqLjEr3XgwcPYGFhgatX\nr6JRo0ai4xD9TUFBAZYsWYKgoCAsXboUI0aMYLFZRsOGDUPXrl0xYsQI0VGUTl5eHn7//XcsWbIE\njRo1gq+vL/r168d/l+kfioqKUKdOHWRlZXG8ERFRCXEHJxFRGSUmJiIwMBA3b95E48aN0a1bN/Tq\n1QsdOnSAtrY2rKysMGHCBLRq1YrlJik8fX19fPXVV1ixYoXoKER/k5ycDDs7O0RHR+PSpUsYOXIk\nC6FyMDU15Q5OQWrUqIFRo0bh6tWrmDJlCubOnQsrKyts374dhYWFouORAlFVVYWZmRlSU1NFRyEi\nqjJYcBIRldL9+/fh4uICe3t7bN26FTKZDAUFBXj16hVevnyJN2/eID8/H4mJidiyZQvOnz+PTZs2\n8TgaKbyZM2diw4YNnM9HCqGwsBCLFy9Gt27dMGHCBISHh8PAwEB0rCrPxMSEl94IpqqqCg8PD1y6\ndAlLlixBcHAwzMzMEBISgry8PNHxSEFwDicRUemw4CQiKoWwsDCYmZkhKioKOTk5KCoq+uDri4uL\nkZubi++//x49e/bE27dvKykpUek1a9YMX3zxBVavXi06Cim51NRU2Nvb4/Tp07h48SJGjx7NXZty\nwhmcikMikaBPnz6IiorC5s2bsW/fPhgaGmLFihV48+aN6HgkGOdwEhGVDgtOIqIS2r9/P9zd3fHm\nzZtSHyV7+/Ytzp49C2dnZ2RnZ1dQQqLy8/HxQXBwMJ4/fy46CimhwsJCBAQE4NNPP8WYMWNw9OhR\nNGvWTHSsasXY2BiZmZkf/YCOKpeTkxMOHz6MQ4cOIS4uDoaGhpg/fz6ePn0qOhoJwoKTiKh0WHAS\nEZXAtWvXMGTIEOTk5JR5jdzcXKSlpWHMmDFyTEYkX4aGhnB1dUVQUJDoKKRk0tLS4ODggJMnT+LC\nhQsYO3Ysd21WAG1tbTRs2BB3794VHYX+hbW1NXbu3Ino6Gjcv38frVq1gre3N+7fvy86GlUyCwsL\nJCcnc8QREVEJseAkIvqIoqIiDB48GLm5ueVeKzc3F/v27cORI0fkkIyoYsyaNQtr167Fq1evREch\nJVBYWIilS5fC2dkZI0eOxPHjx9G8eXPRsao1zuFUfK1atcKGDRuQlJSE4uJiWFpaYuzYscjIyBAd\njSqJnp4eiouL8fjxY9FRiIiqBBacREQfcfjwYWRkZKC4uFgu62VnZ+O7777jJ/KksFq1aoWePXvi\np59+Eh2FqrmrV6+ic+fOOHr0KOLj4zF+/Hju2qwEnMNZdTRt2hSrVq3CtWvX0LhxY9jb2+Orr75C\nUlKS6GhUwSQSCY+pExGVAgtOIqKPWLp0qdyH/T98+BCxsbFyXZNInmbPno1Vq1bxoguqEEVFRVi2\nbBk6d+6MYcOG4cSJE2jZsqXoWEqDBWfV06BBAyxYsAA3btyAjY0Nevfujf79++PcuXOio1EFYsFJ\nRFRyLDiJiD7gzZs3iIuLk/u62dnZ2Llzp9zXJZKX1q1b49NPP8X69etFR6FqJj09HU5OTggLC0Nc\nXBwmTpwIFRW+Ja1MLDirrtq1a2P69Om4ceMG+vfvj2+++QZdunTB0aNHeTKkGvrPHE4iIvo4vpsk\nIvqAy5cvQ1NTU+7rymQynDlzRu7rEsnTnDlzsGLFinJdrkX0H0VFRVixYgUcHR0xZMgQREREwNDQ\nUHQspWRqasoZnFVczZo1MX78eFy7dg3jxo3DtGnTYGtri927d6OoqEh0PJITS0tLpKSkiI5BRFQl\nsOAkIvqAq1evorCwsELWzszMrJB1ieSlbdu2sLOzw4YNG0RHoSru2rVrcHZ2xv79+xEbG4vJkydz\n16ZAzZs3R1ZWFj+8qAbU1NQwZMgQJCYmYv78+Vi+fDlat26NTZs2IT8/X3Q8KicLCwukpaXJbQ48\nEVF1xneWREQfkJubW2FvKvmDB1UFc+bMQWBgIHJzc0VHoSqouLgYq1evhoODAwYPHoxTp07ByMhI\ndCylp6amhpYtW/KDtmpERUUFrq6uiImJwfr167Fjxw4YGxsjKCgI2dnZouNRGdWpUwcNGjTAjRs3\nREchIlJ4LDiJiD5AS0sLqqqqFbJ2jRo1KmRdInmytbVFu3btsHnzZtFRqIrJyMhAly5dsGfPHpw/\nfx7ff/89d20qEM7hrJ4kEgm6du2KY8eOYe/evTh9+jRatmyJxYsX48WLF6LjURlwDicRUcnwXSYR\n0Qe0adOmwgpOU1PTClmXSN7mzp2LJUuWcNcxlUhxcTGCgoJgZ2eHQYMG4dSpUzA2NhYdi/4H53BW\nf+3bt8eePXtw6tQpXL9+HUZGRvDx8UFWVpboaFQKnMNJRFQyLDiJiD6gbdu2FTajrEmTJiyMqEqw\ns7ODqakpfv31V9FRSMFlZmaia9eu2LlzJ86dOwdPT88K+5CIyoc7OJWHubk5tmzZgkuXLuHt27do\n3bo1Jk2ahFu3bomORiVgaWnJHZxERCXAgpOI6AM0NTXx6aefyn1ddXV1ZGZmQk9PDyNGjEB4eDjL\nTlJoc+fORUBAQIVdukVVW3FxMdauXYtOnTrBzc0NUVFRMDExER2LPoAFp/Jp3rw51qxZgytXrkBH\nRwe2trYYNmwYUlNTRUejD2DBSURUMiw4iYg+YsaMGdDW1pbrmmZmZkhISEBSUhKsrKywaNEi6Onp\nYdSoUTh69CgKCgrk+jyi8nJycoKBgQG2bdsmOgopmBs3bsDFxQVbt25FdHQ0pk6dyl2bVQALTuWl\nq6sLf39/3LhxA+bm5nBxccGAAQMQFxcnOhr9C1NTU9y6dYuX/RERfQQLTiKij3BxcYGNjQ3U1NTk\nsp6mpiaCg4MB/HVMfcqUKYiOjsbly5dhYWGB+fPnQ09PD2PGjMHx48e5Y44Uhp+fHxYvXoyioiLR\nUUgBFBcXY926dejYsSP69euHs2fPcrZwFaKrq4v8/Hw8e/ZMdBQSREdHB76+vu8+pHB3d0f37t1x\n8uRJyGQy0fHo/2hoaMDIyAhXrlwRHYWISKGx4CQi+giJRIKtW7eiZs2a5V5LU1MTI0eOhKOj4z9+\nz8DAAF5eXoiJicHFixdhZmaGOXPmQF9fH+PGjcPJkydZdpJQXbt2RYMGDSCVSkVHIcFu3bqFHj16\n4Ndff8WZM2cwbdo07tqsYiQSCXdxEgBAS0sLkydPRkZGBoYOHYrJkyfDzs4O+/btQ3Fxseh4BF40\nRERUEiw4iYhKwMDAAIcOHYKWllaZ19DU1ISjoyNWrVr10dc2b94c3t7eiI2NRVxcHIyNjeHj44Mm\nTZpgwoQJiIyM5C46qnQSiQRz587FokWL+EOvkpLJZFi/fj06dOiAXr164ezZszA3Nxcdi8qIBSf9\nN3V1dQwfPhypqamYOXMmFi1aBEtLS/z2228cnSMY53ASEX0cC04iohLq0qULjh07hvr166NGjRql\n+lo1NTUMHDgQYWFhUFdXL9XXtmjRAtOnT0d8fDxiYmLQokULTJs2DU2aNMGkSZNw+vRplp1UaXr1\n6gVtbW3s3btXdBSqZLdv30bPnj2xadMmnD59GjNmzJDb6A4SgwUn/RsVFRUMHDgQ8fHxWL16NTZt\n2gQTExOsW7cOOTk5ouMpJQsLCxacREQfwYKTiKgUHB0dkZmZiUGDBqFGjRofLTpr166NBg0aQFtb\nG15eXtDQ0CjX8w0NDTFz5kxcvHgRZ8+eRdOmTeHp6YmmTZviu+++w5kzZ7izjirUf+/i5Iw25SCT\nyRASEoL27dvDxcUF586dQ+vWrUXHIjkwNTVFenq66BikoCQSCXr06IHIyEhs27YNR44cgaGhIZYu\nXYpXr16JjqdUuIOTiOjjWHASEZVS3bp1sXXrVmRkZGDq1KkwMzODuro6tLS0oK2tDQ0NDdSvXx+9\nevXC1q1bkZWVhaCgIIwZM0auMzSNjY3h6+uLhIQEnD59Go0bN8bkyZNhYGDw7uIilp1UEfr37w+J\nRIKDBw+KjkIV7M6dO+jVqxdCQkIQGRkJHx8f7tqsRriDk0rK3t4eBw4cwLFjx5CUlARDQ0PMmTMH\nT548ER1NKTRv3hyvXr3C8+fPRUchIlJYEhm3XxARlVtBQQGysrJQWFgIHR0d1K9f/2+/L5PJ0KNH\nD/Tt2xdTp06t0CxXr17Frl27IJVK8fz5c7i7u8PDwwOdOnWCigo/1yL52Lt3L/z9/REfHw+JRCI6\nDsmZTCbDxo0b4evrCy8vLx5Hr6Zev34NXV1dvHnzht8fqFQyMzOxbNkySKVSDB06FNOmTYOBgYHo\nWNWavb09AgMD4eTkJDoKEZFCYsFJRFRJMjIyYGdnhwsXLqBFixaV8sy0tDTs2rULO3fuxJs3b96V\nnR07dmQpReVSXFyMdu3aITAwEH369BEdh+To3r17GD16NJ48eYItW7bA0tJSdCSqQPr6+oiNjWU5\nRWXy4MEDrFq1Cps2bYKbmxtmzpwJU1NT0bGqpTFjxsDa2hoTJ04UHYWISCHxo1oiokpibGwMb29v\nTJw4sdJmF7Zu3Rrz5s1DWloawsPDUatWLQwfPhwtW7Z8d3ERP+eislBRUcHs2bOxYMEC/jtUTchk\nMmzatAnW1tZwdHTE+fPnWW4qAc7hpPLQ19fHsmXLcP36dbRo0QJOTk5wd3fHpUuXREerdjiHk4jo\nw1hwEhFVomnTpuHu3buQSqWV/uw2bdrghx9+wJUrV3Dw4EHUrFkTX3/99d8uLmJRRaXh7u6O58+f\n4+TJk6KjUDndv38f/fr1w5o1a3Dy5EnMnTsX6urqomNRJeAcTpKH+vXrw8/PDzdu3ICDgwNcXV3R\nu3dvREVF8b2FnFhaWiIlJUV0DCIihcWCk4ioEqmrq2PDhg3w8vISNiheIpHA0tISCxcuRHp6Ovbt\n2wc1NTUMHjz4bxcX8QcS+hhVVVXMnj0bCxcuFB2FykgmkyE0NBTW1tbo1KkT4uLi0LZtW9GxqBKx\n4CR5qlWrFry8vJCZmQl3d3eMGjUKnTt3RlhYGN9XlJOFhQWSk5P5z5GI6D04g5OISIDJkycjLy8P\nGzZsEB3lHZlMhsuXL0MqlUIqlUJFRQUeHh7w8PBA27ZtObOT/lVhYSHMzMywadMmODs7i45DpfDg\nwQOMHTsWd+/eRWhoKKysrERHIgEOHjyI4OBgHD58WHQUqoaKioqwe/duBAQEQCaTwcfHB+7u7ry0\nrIwaN26M+Ph4zswlIvoX3MFJRCSAv78/wsPDERUVJTrKOxKJBNbW1ggICEBGRgZ27NiBwsJCfP75\n5zAzM8PcuXO5c4D+QU1NDbNmzeIuzipEJpPht99+g5WVFWxtbREfH89yU4lxBidVJFVVVQwePBgJ\nCQkICAjAunXrYGZmhg0bNiAvL090vCqHcziJiN6POziJiAT5448/4Ovri8TERNSoUUN0nPeSyWS4\ncOHCu52dWlpa73Z2tmnTRnQ8UgAFBQVo1aoVtm/fDnt7e9Fx6AMePnyIcePG4datW9iyZQtsbGxE\nRyLBCgoKULt2bbx8+VKhvxdR9XHmzBkEBAQgMTER3t7eGDt2LGrVqiU6VpUwdepUNG7cGDNmzBAd\nhYhI4XAHJxGRIAMGDIC5uTkCAgJER/kgiUSCDh06YNmyZe9KkTdv3qB3796wsLDAggULcOXKFdEx\nSSB1dXX4+PhwF6cCk8lk2Lp1K9q1a4d27drhwoULLDcJwF///TZr1gw3btwQHYWUhJOTEw4fPoxD\nhw4hNjYWhoaG+OGHH/Ds2TPR0RTef+/gfPr0KX755RcMGDAAxsbG0NTUhI6ODjp37oyNGzeiuLhY\ncFoiosrFHZxERALdu3cP1tbWiIqKgrm5ueg4pVJcXIzY2FhIpVLs2rUL9evXh4eHB9zd3WFqaio6\nHlWyvLw8GBkZYd++fWjfvr3oOPRfsrKyMH78eGRkZCA0NBS2traiI5GC6d+/P8aMGQM3NzfRUUgJ\nXbt2DYGBgdi7dy9GjhyJqVOnQl9fX3QshRQfH48xY8bg8uXLWL9+PSZMmAA9PT107doVzZo1w6NH\nj7B37168fPkSgwYNwq5duzhDnYiUBgtOIiLB1q5dC6lUilOnTkFFpWpurC8uLkZMTMy7srNRo0bv\nys5WrVqJjkeVZM2aNThx4gT2798vOgrhr12bO3bsgKenJ0aPHg0/Pz8eQaZ/5e3tDV1dXR57JaHu\n3buHFStWIDQ0FO7u7pgxYwaMjIxEx1Io2dnZ+OSTT/Dq1SucOXMGb9++Rb9+/f72/jErKwsdO3bE\n3bt3sXv3bgwaNEhgYiKiylM1f5ImIqpGJkyYgPz8fGzcuFF0lDJTUVGBo6MjfvzxR9y7dw9r1qzB\nw4cP4ezs/LeLi6h6Gz16NOLj45GYmCg6itJ79OgRBg0ahEWLFuHQoUNYvHgxy016LxMTE1y7dk10\nDFJyTZs2xapVq3Dt2jXo6uqiU6dOGDJkCJKSkkRHUxhaWlpo2rQpMjIy0K1bN3z22Wf/+HC8cePG\nGD9+PADg1KlTAlISEYnBgpOISDBVVVWEhIRg9uzZyMrKEh2n3FRUVODk5IQ1a9bg3r17WL16Ne7d\nuwdHR0fY2tpi6dKlnPVWTWlqasLb2xuLFi0SHUVpyWQy7Ny5E+3atYOpqSkuXryIDh06iI5FCo4F\nJymSBg0aYMGCBbhx4wasra3Ru3dvfPbZZzh37pzoaAqhJDepq6urAwDU1NQqIxIRkULgEXUiIgXh\n6+uLmzdvYseOHaKjVIiioiJERUVBKpViz549aN68+btj7C1atBAdj+Tk7du3MDQ0REREBNq0aSM6\njlJ5/PgxJk6ciNTUVGzZsgWdOnUSHf3MJQIAACAASURBVImqiPv378PW1rZafMhG1U9ubi62bNmC\npUuXonnz5vD19UXPnj2Vdrakn58fZDLZey/2KywshLW1NVJSUnDkyBH06tWrkhMSEYnBHZxERArC\nz88PFy5cwOHDh0VHqRCqqqro2rUrgoOD8eDBAyxZsgQZGRno0KEDOnXqhBUrVuDOnTuiY1I5aWtr\nw8vLC4sXLxYdRans2rULbdu2hZGRERISElhuUqno6+vjzZs3ePnypegoRP9Qs2ZNjB8/HtevX8eY\nMWPg7e2N9u3bY/fu3SgqKhIdr9J9bAenj48PUlJS0LdvX5abRKRUuIOTiEiBnDhxAqNHj0ZKSgpq\n1aolOk6lKCgowKlTpyCVSvHHH3+gVatW8PDwwBdffAEDAwPR8agMXr9+DUNDQ5w9exampqai41Rr\nT548waRJk5CUlIQtW7bAzs5OdCSqomxsbPDzzz9zpAEpvOLiYhw6dAj+/v548eIFZs6cia+//hoa\nGhqio1WKq1evon///v862zwoKAhTpkyBmZkZoqOjUb9+fQEJiYjE4A5OIiIF0r17dzg7O2PevHmi\no1QadXV19OjRAxs2bMDDhw8xf/58pKSkwMrK6t3FRffv3xcdk0qhdu3a+P777+Hv7y86SrW2Z88e\ntG3bFs2bN0dCQgLLTSoXzuGkqkJFRQWurq6IiYlBcHAwtm3bBmNjYwQFBSE7O1t0vApnbGyMBw8e\n4O3bt3/79bVr12LKlClo3bo1IiMjWW4SkdLhDk4iIgXz5MkTWFhY4PDhw7C1tRUdR5j8/HycPHkS\nUqkU+/fvR5s2beDh4YFBgwZBX19fdDz6iBcvXsDY2BhxcXEwNDQUHada+fPPPzF58mQkJCRg8+bN\ncHBwEB2JqgE/Pz9IJBL88MMPoqMQlVp8fDwCAgIQHR2N77//HpMmTULdunVFx6ow1tbW+Pnnn9Gx\nY0cAwOrVq+Hl5QULCwucPHkSjRo1EpyQiKjycQcnEZGCadiwIQIDAzF27FgUFhaKjiOMhoYG+vTp\ng82bN+Phw4fw8fHBhQsX0KZNG3Tp0gU//fQTL8RQYHXr1sWECRMQEBAgOkq18scff6Bt27Zo0qQJ\nLl++zHKT5MbU1BTp6emiYxCVSYcOHbB3715ERkbi2rVrMDIygo+PDx49eiQ6WoX47zmcS5cuhZeX\nF6ysrBAZGclyk4iUFndwEhEpIJlMhu7du6Nfv36YOnWq6DgKJS8vD8eOHYNUKsWhQ4dgZWUFDw8P\nDBw4ELq6uqLj0X95+vQpTExMcOnSJTRv3lx0nCrt6dOn+O677xAfH4/Nmzejc+fOoiNRNRMfH49x\n48bh0qVLoqMQldutW7ewfPlybNu2DV999RWmT5+OFi1aiI4lN8uWLcODBw9Qv359+Pn5wdbWFseO\nHeOxdCJSaiw4iYgUVEZGBuzs7HDhwoVq9aZcnnJzc3H06FFIpVKEhYXB1tb2XdnZsGFD0fEIf93m\n+urVK6xbt050lCpr//79mDBhAjw8PODv7w8tLS3RkagaevHiBZo2bYrXr19DIpGIjkMkF48ePcLq\n1asREhKCfv36wcfHB61btxYdq9yOHDkCb29vpKWlQVVVFd999x10dHT+8boWLVrg22+/rfyAREQC\nsOAkIlJg/v7+OHv2LMLCwvgD50fk5OTgyJEjkEqlCA8PR4cOHeDh4YEBAwagQYMGouMprcePH8PM\nzAzJyclo0qSJ6DhVyrNnzzBlyhTExMRg8+bNcHJyEh2JqjldXV0kJCRwzjFVOy9evMC6devw448/\nwsHBAb6+vu/mV1ZF9+7dg6mp6UcvVerSpQtOnTpVOaGIiATjDE4iIgU2bdo03L17F1KpVHQUhaep\nqYkBAwZg+/btePDgAcaPH48TJ07AyMgIvXr1wsaNG/Hs2TPRMZVOo0aNMGLECCxbtqxc69y7dw8j\nR46Evr4+atSogRYtWsDT0xPPnz+XU1LFcvDgQVhaWqJevXpITExkuUmVgnM4qbqqW7cuZs2ahZs3\nb6Jbt25wd3dH9+7dERERgaq436dJkybQ0NDAo0ePIJPJ3vs/lptEpEy4g5OISMHFxMRg0KBBSE1N\nRb169UTHqXLevn2LsLAwSKVSHD9+HA4ODvDw8MDnn3/Of56V5OHDh2jTpg3S0tLQuHHjUn99ZmYm\nHBwc8PjxY7i5ucHMzAxxcXGIjIyEqakpoqOj8cknn1RA8sr3/PlzeHp64uzZs9i0aRO6dOkiOhIp\nkdGjR6NDhw4YN26c6ChEFSo/Px/btm3DkiVLoKOjA19fX7i6ukJFpers/3F2dsb8+fPRrVs30VGI\niBRC1fkbnIhISdnb22PAgAGYOXOm6ChVkra2Njw8PLB7927cv38fw4cPx8GDB9G8eXP069cPoaGh\nePHiheiY1Zqenh6+/vprrFixokxfP3HiRDx+/BhBQUHYt28flixZgoiICHh5eSE9PR2zZ8+Wc2Ix\nwsLCYGlpidq1ayMxMZHlJlU6ExMTXLt2TXQMogqnoaGBb7/9FqmpqZgxYwYWLVoES0tL/P777ygs\nLBQdr0T++yZ1IiLiDk4ioirh5cuXaNOmDbZv386jqnLy+vVrHDx4EFKpFBEREejSpQs8PDzg6ur6\nr4P6qXzu3r2Ldu3aIT09vVQXQGVmZsLY2BgtWrRAZmbm33bXvH79Gnp6epDJZHj8+DG0tbUrInqF\ne/HiBby8vHD69Gls3LgRXbt2FR2JlNS+ffuwceNGHDx4UHQUokolk8lw/PhxBAQE4NatW5g+fTpG\njBgBTU1N0dHeKzg4GBcvXsQvv/wiOgoRkULgDk4ioipAR0cHa9aswdixY5GXlyc6TrVQu3ZtDBky\nBPv27cO9e/cwePBg7Nq1CwYGBnBzc8PWrVvx6tUr0TGrDQMDA3h4eGDVqlWl+rrIyEgAQM+ePf9x\ndLB27dpwdHREdnY2zp8/L7eslSk8PByWlpbQ1NREUlISy00SijM4SVlJJBL07NkTkZGR2LZtG44c\nOQJDQ0MEBgYq7HsB7uAkIvo7FpxERFXEgAEDYGpqiiVLloiOUu3UqVMH33zzDQ4cOIA7d+5g0KBB\n2L59O5o2bfru4qLXr1+Ljlnl+fj44Oeffy7VZU//KVtMTEz+9fdbtWoFAFXuWO3Lly8xatQoTJw4\nEaGhoVi3bh1q1aolOhYpOUNDQ9y5cwcFBQWioxAJY29vjwMHDuDYsWNITEyEoaEh5s6diydPnoiO\n9jcWFhZIS0tDcXGx6ChERAqBBScRURWydu1arFmzBlevXhUdpdqqW7cuhg0bhkOHDuH27dtwc3PD\nb7/9hqZNm2LQoEHYuXMn3r59KzpmldSiRQu4ubkhKCioxF/z8uVLAHjv2ID//HpVmqN69OhRWFpa\nQl1dHUlJSbwgghRGjRo10KRJE9y8eVN0FCLhLC0tsXXrVsTGxuLJkycwNTWFp6cn7t69KzoagL/e\nr9SrVw+3bt0SHYWISCGw4CQiqkKaNm2K+fPnY+zYsfzEvhLUq1cP3377LQ4fPoybN2+iX79+2Lx5\nM/T19d9dXJSdnS06ZpUya9YsrF279l1xqUxevXqFMWPGYOzYsdi4cSPWr1+P2rVri45F9De8aIjo\n74yMjLB+/XqkpKRAXV0d7dq1w6hRoxTivxMLCwseUyci+j8sOImIqpgJEyYgPz8fmzZtEh1FqdSv\nXx8jR47EkSNHcOPGDfTs2RMhISHQ09PDl19+ib179yInJ0d0TIVnbGyMPn36YO3atSV6/X92aL6v\nEP3Pr9etW1c+ASvI8ePHYWlpCYlEguTkZPTo0UN0JKJ/ZWpqqhDFDZGi0dfXx7Jly5CRkYHmzZuj\nc+fOcHd3x6VLl4Rl4hxOIqL/jwUnEVEVo6qqipCQEMyaNQtZWVmi4yilTz75BKNHj8axY8eQkZGB\nbt26Yd26ddDT03t3cVFubq7omApr9uzZ+PHHH0s019TU1BTA+2dsXr9+HcD7Z3SK9vr1a4wbNw6j\nRo1CSEgIQkJCUKdOHdGxiN7LxMSEFw0RfUD9+vXh5+eHGzduwMHBAa6urujduzeioqIgk8kqNYul\npSVSUlIq9ZlERIqKBScRURXUtm1bjBo1Cl5eXqKjKL2GDRti7NixOHHiBK5duwZnZ2cEBQWhcePG\n7y4uYtn5d2ZmZujWrRuCg4M/+tr/3Cp+7Nixf4xleP36NaKjo6GlpQU7O7sKyVoeJ06cgKWlJYqK\nipCcnIxevXqJjkT0UTyiTlQytWrVgpeXFzIzM/HFF19g1KhRcHJyQlhYWKUVndzBSUT0/0lklf0x\nExERyUVOTg4sLCywZs0a9O3bV3Qc+h9ZWVnYu3cvpFIpEhMT8dlnn8HDwwM9evRAjRo1RMcT7j/H\ntG/cuAEtLa0PvrZXr144duwYgoKC8N1337379alTp2LVqlUYN24c1q9fX9GRS+z169eYMWMGDh06\nhJCQEPTp00d0JKISu3PnDuzt7XH//n3RUYiqlKKiIuzevRv+/v6QSCTw8fGBu7s7VFVVK+yZeXl5\nqFu3Ll68eMH3FkSk9FhwEhFVYcePH8eYMWOQmpoKbW1t0XHoPR4+fIg9e/ZAKpUiJSUFrq6u8PDw\nQPfu3aGhoSE6njADBw6Es7MzPD09P/i6zMxMODg44PHjx3Bzc4O5uTliY2MRGRkJExMTnDt3Dp98\n8kklpf6wiIgIjBo1Cl27dsXKlSsVfjYo0f8qLi5G7dq18ejRI9SqVUt0HKIqRyaTITw8HP7+/sjK\nysLMmTMxbNiwCisgW7duje3bt6Ndu3YVsj4RUVXBgpOIqIobOnQodHV1sXz5ctFRqATu37//ruy8\ncuUK3Nzc4OHhARcXF6irq4uOV6kSEhLQv39/ZGZmombNmh987d27d+Hn54cjR47g6dOn0NPTw4AB\nAzBv3jzUq1evkhK/35s3bzBz5kzs378fISEh3FVNVVq7du2wefNm2NjYiI5CVKWdOXMG/v7+SE5O\nxtSpUzF27Fi5f3AwePBguLq64uuvv5brukREVQ0LTiKiKu7JkyewsLBAeHg4fxitYu7du4fdu3dD\nKpXi2rVr+Pzzz+Hh4YGuXbsqTdn52WefoXfv3pg0aZLoKGV2+vRpjBw5Ek5OTli1apVCFK5E5eHu\n7o5Bgwbhyy+/FB2FqFpISEhAQEAATp06hUmTJuG7775D/fr1y7XmixcvsG3bNgQFBeH+/fsoLCyE\nRCJB/fr1YWtriz59+mDIkCG82I6IlAYLTiKiaiA0NBRBQUGIjY2Fmpqa6DhUBnfu3HlXdmZmZmLA\ngAHw8PDAp59+Wq3/P42Li8MXX3yBjIyMKndc/+3bt/Dx8cHevXvx888/o3///qIjEcnF7NmzUaNG\nDfj5+YmOQlStpKenIzAwEPv27cOIESMwdepU6Ovrl2qNly9fYtq0afj999+hoqKC7Ozsf32dlpYW\niouL8e233yIwMBC1a9eWxx+BiEhh8RZ1IqJqYNiwYahbty7WrFkjOgqVUbNmzTB16lScP38e8fHx\nMDExwaxZs6Cvr4/x48cjIiIChYWFomPKXceOHdG6dWuEhoaKjlIqUVFRaNeuHV6+fInk5GSWm1St\nmJqa8iZ1ogpgamqKjRs34vLlyygsLISFhQXGjRuHzMzMEn19ZGQkjIyM8PvvvyM3N/e95SYAZGdn\nIzc3F1u2bIGxsTHOnDkjrz8GEZFC4g5OIqJq4vr167C3t8eFCxfQokUL0XFITm7evIldu3ZBKpXi\n7t27GDRoEDw8PODk5FShN7NWpujoaHzzzTe4du2awh/Nf/v2LWbNmoXdu3cjODgYrq6uoiMRyd35\n8+fx3XffIT4+XnQUomrtyZMnCAoKQnBwMHr27AkfHx+0bdv2X1+7b98+DBkyBDk5OWV6lpaWFnbt\n2sUZ0URUbbHgJCKqRvz9/REdHY1Dhw5BIpGIjkNylpmZ+a7sfPDgAb744gt4eHjA0dGxyped3bp1\nw7Bhw/Dtt9+KjvJeZ8+exYgRI9CpUycEBQWVe34akaJ69uwZWrZsiRcvXvB7CVElePXqFdavX4/V\nq1fD1tYWs2bNgr29/bvfj4+Px6effvrBHZsloaWlhXPnzvHGdSKqllhwEhFVI/n5+bCxsYGfnx88\nPDxEx6EKdP369Xdl5+PHj9+VnQ4ODlBRqXoTaCIjIzFu3DikpaUp3MzR7OxszJ49Gzt37sS6devw\n+eefi45EVOEaNGiA1NRU6Orqio5CpDRyc3OxefNmBAYGonnz5vD19YWzszPMzc1x+/btcq8vkUhg\nbGyM1NRUhT8xQURUWlXvJyAiInovDQ0NbNiwAZ6ennj+/LnoOFSBWrVqhVmzZuHy5cuIjIxEo0aN\nMHHiRBgYGMDT0xPnzp1DcXGx6Jgl9umnn0JXVxc7d+4UHeVvzp07BysrKzx69AjJycksN0lpcA4n\nUeWrWbMmJkyYgOvXr2P06NHw9vaGsbExsrKy5LK+TCbD/fv38fPPP8tlPSIiRcIdnERE1dCkSZNQ\nUFCAkJAQ0VGokl25cuXdzs6XL1/C3d0dHh4e6NSpk8IfNT127Bg8PT2RkpIifBdqTk4O5s6di61b\nt+Knn37CwIEDheYhqmwjRoyAo6MjRo8eLToKkdIqLCxEw4YN8eLFC7mua2BggNu3byv8+wIiotLg\nDk4iomrI398fhw8f5o2ZSsjc3Bx+fn5ISUnBkSNHUKdOHYwYMQItWrTAtGnTEBcXB0X9bLNHjx6o\nXbs29uzZIzRHTEwMrK2tce/ePSQnJ7PcJKVkYmLCHZxEgp0/fx5FRUVyX/f58+e4cOGC3NclIhKJ\nBScRUTWko6ODoKAgjB07Fnl5eaLjkCBt2rTB/PnzkZaWhrCwMGhpaWHo0KFo2bIlZsyYgQsXLihU\n2SmRSODn54eFCxcKOV6fm5uLGTNmYMCAAVi0aBF27NiBBg0aVHoOIkXAgpNIvLi4OOTn58t93aKi\nIsTHx8t9XSIikVhwEhFVUwMGDICpqSmWLFkiOgoJJpFIYGFhgQULFuDq1as4cOAANDQ08NVXX8HI\nyAg+Pj64dOmSQpSdffv2hbq6Og4cOFCpz42NjYW1tTVu3ryJpKQkfPHFF5X6fCJFwxmcROJFR0dX\nyAfVOTk5iImJkfu6REQicQYnEVE1dvfuXVhbW+Ps2bMwMzMTHYcUjEwmQ2JiIqRSKXbu3AmJRAIP\nDw94eHigXbt2wmZz/fHHH1i0aBEuXLhQ4Rlyc3Mxf/58bNmyBUFBQfDw8KjQ5xFVFTk5OahXrx7e\nvHkDNTU10XGIlFK3bt0QGRlZIWv37t0b4eHhFbI2EZEI3MFJRFSNGRgYYN68eRg3blyVulGbKodE\nIoGVlRX8/f2RkZEBqVSK4uJiDBw4EKamppgzZw6SkpIqfWenm5sbCgoKcPjw4Qp9Tnx8PGxtbXH9\n+nUkJiay3CT6L5qammjcuDFu374tOgqR0qrIDxc0NDQqbG0iIhFYcBIRVXMTJ05Ebm4uNm/eLDoK\nKTCJRAIbGxssWbIEmZmZ2LZtG/Lz8+Hq6vq3i4sqo+xUUVHBnDlzsHDhwn8+Tyb763/lkJeXh1mz\nZqF///6YO3cudu/eDV1d3XKtSVQdcQ4nkVht2rSpkJMMqqqqsLCwkPu6REQiseAkIqrmVFVVsWHD\nBvj6+uLRo0ei41AVIJFI0L59ewQGBuLmzZv49ddfkZ2djb59+/7t4qKKNGjQILx8+RKRBw4A69cD\nvXsDjRoBamqAigqgrQ3Y2gLTpwOlKGAuXLgAW1tbXLlyBYmJifjyyy+FHcUnUnQsOInEsrOzQ61a\nteS+rra2Njp27Cj3dYmIROIMTiIiJeHj44Pbt29j+/btoqNQFVVcXIy4uDhIpVJIpVLUrVv33cxO\nuc94zc1F2sCBMDx6FDU0NSF5+/bfX6eu/lfpaWMDbNoEmJj868vy8vKwcOFCbNiwAatWrcJXX33F\nYpPoI9asWYMrV65g3bp1oqMQKaUnT56gWbNmyM3Nleu6NWvWxIMHD1CvXj25rktEJBJ3cBIRKQk/\nPz/ExcVxoDyVmYqKCuzs7LBy5UrcuXMHISEhePbsGVxcXNC2bVssWrRIPru9EhMBExOYnz6NmsXF\n7y83AaCgAMjJAWJiACsr4Mcf//GSS5cuoX379khOTsbly5cxZMgQlptEJcAdnERiNWzYEL1795br\n9yyJRAJXV1eWm0RU7bDgJCJSElpaWli/fj0mTpyItx8qjIhKQEVFBQ4ODli9ejXu3r2LdevW4fHj\nx+jSpcu7i4uuX79e+oXj4oDOnYG7dyHJzi751xUX/1V0zpoFzJgBAMjPz4efnx/69OmDmTNnYt++\nfdDT0yt9JiIlxYKTSKz8/Hw0a9ZMrvOvJRIJoqOjsXv37kq/RJCIqCLxiDoRkZIZOnQodHV1sXz5\nctFRqBoqKipCdHQ0pFIpdu/eDX19fXh4eMDd3R1GRkYf/uIHDwBzc+DVq/KF0NLCnalT8dmBA2jW\nrBl+/vln6Ovrl29NIiVUVFSEWrVq4enTp9DS0hIdh0ipREREYNKkSTA0NETz5s0RGhqK7NJ88Pcv\ntLS04OvrCwcHB3h5eaFOnTpYtWoV2rdvL6fURETisOAkIlIyT548gYWFBcLDw2FjYyM6DlVjRUVF\nOHPmDKRSKfbs2QMDA4N3ZWfLli3//mKZDHBxAc6cAQoLy/3stwCOrFyJgZ6ePI5OVA4WFhbYunUr\n2rVrJzoKkVLIysrCtGnTcObMGfz4449wc3NDYWEhevTogdjY2DLP49TU1ISjoyPCw8OhpqaGoqIi\nbN68GX5+fujevTv8/f3RtGlTOf9piIgqD4+oExEpmYYNG2Lp0qUYO3YsCuVQJBG9j6qqKj799FOs\nW7cO9+/fR2BgIG7cuIFOnTqhY8eOWL58OW7fvv3Xi48f/+t4upz+ndRSVcWgM2dYbhKVE4+pE1WO\nwsJCrFmzBpaWljAwMEBaWho+//xzSCQSqKurIzw8HE5OTtDW1i712tra2ujatSsOHToENTU1AH99\njx49ejTS09NhYGCAdu3aYf78+RxjRERVFgtOIiIlNHz4cNSpUwdr1qwRHYWUhJqaGrp164b169fj\nwYMH8Pf3x7Vr12Braws7OzvcmTQJkOMPVZKiIiA8HHj8WG5rEikjFpxEFS82NhYdO3bE3r17cfr0\naQQEBPyjyNTU1MTRo0exbNkyaGtro2bNmh9dV1NTE9ra2li1ahUOHTqEGjVq/OM1tWvXxuLFi3Hp\n0iWkp6fD1NQUv/76K4qLi+X25yMiqgw8ok5EpKSuX78Oe3t7XLx4Ec2bNxcdh5RUQUEBzhw8CCd3\nd6jL+4cpTU1g+XJg4kT5rkukRDZt2oTTp08jNDRUdBSiaufZs2fw9fXFwYMHsWzZMgwZMqREJw8e\nPXqEkJAQBAUF4c2bN9DQ0Hh3KkdNTQ1v3rxBrVq1MHPmTIwZMwYNGzYscaaYmBh4eXmhqKgIK1eu\nhJOTU5n/fERElYkFJxGRElu8eDFiYmJw8OBBHuUlcSIigIEDgZcv5b+2uzsglcp/XSIlER0dDW9v\nb5w/f150FKJqo7i4GKGhofD19YW7uzsWLlyIunXrlnodmUyG+/fv4+LFi3j06BEkEgl0dXWRkJCA\ne/fuYcOGDWXOt2PHDvj6+qJDhw4IDAyEoaFhmdYiIqosLDiJiJRYfn4+bGxs4OfnBw8PD9FxSFmt\nXg34+AB5efJf29AQyMyU/7pESuLJkycwMTHBs2fP+EEYkRwkJSVh4sSJyM/PR3BwMGxtbeX+jNTU\nVLi6uiKznN//cnJysHLlSqxcuRKjRo3C7NmzoaOjI6eURETyxRmcRERKTENDAxs2bICXlxeeP38u\nOg4pq9evgfz8ilmblyUQlUuDBg0AAE+fPhWchKhqe/36Nby9vdG9e3cMHToUMTExFVJuAkDr1q2R\nnZ2NmzdvlmsdTU1NzJ49GykpKXj69ClMTU2xfv16XlJJRAqJBScRkZKzt7eHm5sbfHx8REchZaWu\nDqhU0FuS/7stlojKRiKR8KIhonKQyWSQSqUwNzfHs2fPkJKSgnHjxkFVVbXCnimRSODi4oKTJ0/K\nZT09PT1s3LgR4eHh2LlzJ6ysrHDs2DG5rE1EJC8sOImICAEBAQgLC8OZM2dERyFlZGwM/M9tsXLT\nqlXFrEukRExNTZGeni46BlGVc+3aNfTq1QsLFy7E9u3bsXnzZjRq1KhSnu3i4oITJ07IdU1ra2tE\nRERg0aJFmDRpEvr27YsrV67I9RlERGXFgpOIiKCjo4Mff/wR48aNQ15FzEEk+hBbW6AijrupqgJd\nush/XSIlwx2cRKWTk5MDPz8/ODg4oFevXrh06VKl30bu4uKCiIgIFBcXy3VdiUSCzz//HKmpqejR\nowecnZ0xefJk/Pnnn3J9DhFRabHgJCIiAMDAgQPRqlUrLF26VHQUUjYtWgCffCL3ZWU1awL9+8t9\nXSJlw4KTqOQOHz4MCwsLXL16FZcvX4a3tzfU1dUrPUezZs1Qt25dJCcnV8j6Ghoa8PLywpUrVyCR\nSGBubo6VK1civ6JmahMRfQQLTiIiAvDXJ/Jr165FUFAQrl69KjoOKROJBJg2DdDSkuuyt4qKcCgr\nCzKZTK7rEikbFpxEH3fnzh0MHDgQU6ZMwbp16yCVStG0aVOhmeQ5h/N9GjRogDVr1iAqKgonT55E\nmzZtsG/fPn7vJaJKx4KTiIjeMTAwgJ+fH8aNGyf3I01EHzRypFzncMq0tPDAywuzZ89G+/btsX//\nfv6wRVRGrVq1QkZGBoqKikRHIVI4+fn5CAwMhI2NDaysrJCcnIxevXqJjgUA6N69u9zncL6Pubk5\nwsLC8NNPP2HOnDno1q0bLl++XCnPJiICWHASEdH/mDRpEnJycrB582bRUUiZ1KoFbNsmn12cNWpA\n0q8fHP39kZCQgLlz5+KHH36Ail7rqwAAIABJREFUtbU19u7dy/KeqJS0tbXRoEED3L17V3QUIoVy\n+vRpWFtbIzIyErGxsfDz80PNmjVFx3qna9euOHv2bKUeG+/ZsycuX76MwYMHo3fv3hg1ahQePnxY\nac8nIuXFgpOIiP5GVVUVGzZsgK+vLx49eiQ6DimT7t2B6dPLV3JqaAAtWwK//AIAUFFRweeff46L\nFy9i4cKFCAgIgJWVFXbt2sWik6gUeEyd6P979OgRhg0bhqFDh2LhwoU4fPgwjIyMRMf6h/r168PE\nxARxcXGV+lw1NTWMHz8e6enp+OSTT2BhYYFFixYhJyenUnMQkXJhwUlERP/Qrl07jBgxAl5eXqKj\nkLKZPx/w9QU0NUv/tdragIUFcO4cUKfO335LIpHgs88+Q1xcHJYsWYIVK1bA0tISO3bs4LFbohJg\nwUkEFBUV4aeffoKFhQUaN26MtLQ0DBw4EBKJRHS093Jxcam0Y+r/S0dHB4GBgYiPj0diYiLMzMyw\nbds2jowhogrBgpOIiP7VvHnzEBsbi/DwcNFRSNnMmQOcOAE0afLX0fWPqVnzr0J09mwgLg6oV++9\nL5VIJOjbty9iYmKwatUqrFmzBhYWFti6dSsKCwvl+Icgql5MTU2Rnp4uOgaRMPHx8ejUqROkUilO\nnTqFwMBA1CrJ9yjBunfvXuEXDX2MoaEhdu3ahd9//x0rV66Evb09YmJihGYiouqHBScREf0rLS0t\nBAcHY+LEiXj79q3oOKRsHByAGzeAX37Bg8aNUaSi8teuzDp1gNq1AR0doEYNoGHDv461Z2b+tfNT\nVbVEy0skEvTs2RNnz57F2rVr8fPPP6N169YIDQ1l0Un0L7iDk5TV8+fPMWHCBLi6umLKlCk4deoU\n2rRpIzpWiTk6OuLy5ct48+aN6ChwcnJCXFwcJk6cCHd3d3z55Ze4ffu26FhEVE2w4CQiovfq2bMn\nHB0dMX/+fNFRSBlpaACDB8OtaVOcDQsDjh37a7ZmSAiwcydw5w7w+DGwYAGgp1emR0gkEri4uOD0\n6dMICQnBli1bYGZmhk2bNqGgoEDOfyCiqosFJykbmUyG0NBQmJubQ0VFBWlpaRg6dKhCH0f/N1pa\nWujQoQOioqJERwHw12zsYcOGIT09HWZmZrCxscGsWbPw+vVr0dGIqIqTyDgAg4iIPuDx48ewtLRE\neHg4bGxsRMchJfPo0SOYmpriyZMnUFdXr5RnRkVFYcGCBcjMzMSsWbMwfPhwaGhoVMqziRRVYWEh\natWqhRcvXijULdFEFSElJQUTJ05ETk4OgoOD0b59e9GRymXx4sV4+vQpVq5cKTrKP9y/fx+zZs3C\n8ePHsWDBAowYMQKqJTyNQUT037iDk4iIPqhRo0ZYunQpxo4dy6O7VOnCw8PRvXv3Sis3AcDZ2Rkn\nTpzA77//jt27d6NVq1ZYv3498vLyKi0DkaJRU1NDy5YtkZGRIToKUYV58+YNpk+fjq5du+Krr77C\n+fPnq3y5Cfx10ZDoOZzv06RJE4SGhuLAgQMIDQ2Fra0tIiIiRMcioiqIBScREX3U8OHDUadOHaxd\nu1Z0FFIyYWFh6Nevn5BnOzo64ujRo9i5cycOHjwIY2Nj/PTTT8jNzRWSh0g0HlOn6komk2HPnj0w\nNzfH48ePkZKSggkTJlSbnYTt27fH7du38fjxY9FR3qt9+/aIiorCnDlzMHr0aLi5ufHvGyIqFRac\nRET0URKJBOvXr8eiRYtw584d0XFISRQUFODEiRPo06eP0Bx2dnYICwvD3r17cfToURgbGyMoKAg5\nOTlCcxFVNhacVB1lZGSgb9++mDdvHrZu3YrQ0FDo6uqKjiVXampq6NKli8LvjJRIJPjiiy+QlpYG\nR0dHODg4wNPTE8+ePRMdjYiqABacRERUIiYmJvDy8sLEiRPB8c1UGaKjo2FsbIzGjRuLjgIA6NCh\nAw4cOIADBw4gMjISRkZGWLVqFbKzs0VHI6oULDipOsnNzcX8+fNhZ2eHbt26ISEhAc7OzqJjVZju\n3bsr7DH1/1WzZk3MmDEDaWlpyMvLg5mZGYKCgnj5HxF9EAtOIiIqsenTp+PWrVvYvXu36CikBMLC\nwtC3b1/RMf7BxsYGf/zxBw4fPozo6GgYGRlh+fLlePv2rehoRBXK1NQU6enpomMQlduRI0dgYWGB\nlJQUJCQkYPr06ZU661kEFxcXnDhxQnSMUmnUqBGCg4MRERGBsLAwWFpa4tChQ/ygnYj+FW9RJyKi\nUjl37hzc3d2RmpqKunXrio5D1Vjr1q2xZcsWdOzYUXSUD0pOTsaiRYtw6tQpeHl5YdKkSahdu7bo\nWERyl5WVBUtLSzx58kR0FKIyuXv3Lry8vJCQkIC1a9cKH4FSmWQyGZo0aYKzZ8/C0NBQdJxSk8lk\nCA8Ph7e3N5o2bYqVK1fC0tJSdCwiUiDcwUlERKXi4OAANzc3+Pj4iI5C1djNmzfx559/Vonbay0t\nLbFz505ERkYiKSkJRkZGWLx4MV69eiU6GpFc6erqIi8vj/PwqMopKCjA8uXLYW1t/W7npjKVm8Bf\n8y2r4i7O/5BIJOjbty+SkpLg5uaG7t27Y9y4cXj06JHoaESkIFhwEhFRqQUEBODQoUM4e/as6ChU\nTR0+fBh9+vSBikrVeavSunVrbNu2DVFRUbh69SqMjIywYMECvHjxQnQ0IrmQSCQwMTHB9evXRUch\nKrEzZ87A2toaJ06cQExMDObPnw9NTU3RsYSoSnM430ddXR2TJ0/G1atXoa2tjTZt2mDJkiXIzc0V\nHY2IBKs6PzUQEZHC0NHRwY8//oixY8ciLy9PdByqhsLCwtCvXz/RMcrEzMwMv/32G86dO4ebN2/C\n2NgY8+bN4643qhY4h5OqisePH+Pbb7/FkCFDMH/+fISHh6NVq1aiYwnl4uKCiIgIFBcXi45SbvXq\n1cPKlSsRExOD8+fPw9zcHFLp/2PvzsNqzvs/jr+OUso6Y8lkCalDCylbJUpli0ZhGCQMGUvZx77U\n2NcyaJTbMlnG3IYs2ZOlEpJ2hTCGlF1Toe38/rh/03XPPWMmnNPnLK/Hdfnjnjl9z7P7Gp3O+3w/\nn89P3J+TSINxwElERB/E09MTJiYmWLVqlegUUjOFhYWIjo5Gjx49RKd8FBMTE2zfvh2XL1/Gw4cP\nYWpqivnz5+PZs2ei04g+GE9SJ2VXWlqK4OBgWFhYoF69ekhPT8fAgQMhkUhEpwnXuHFjfPrpp0hO\nThadIjcmJiYIDw/Htm3bsHz5cjg4OODq1auis4hIAA44iYjog0gkEmzcuBFBQUG8m4fkKioqCtbW\n1mpziJWxsTG2bt2Kq1ev4smTJzA1NcWcOXN4UAupJA44SZnFx8ejc+fO2LNnDyIjI7FmzRoe+vY/\nXFxcVHYfzr/j5OSE+Ph4jB49Gp9//jm8vLzw4MED0VlEVIk44CQiog/WpEkTLFy4EOPGjeOSIJKb\niIgI9OnTR3SG3DVv3hxbtmxBQkICXr16hVatWuGbb77hAQmkUjjgJGX08uVLTJw4EX379sWkSZNw\n4cIFnrD9Ds7Oziq/D+e7aGlpYfTo0cjMzISRkRHatm2LhQsXIj8/X3QaEVUCDjiJiOijTJw4EYWF\nhdi+fbvoFFIDMplMpfffrAgjIyNs3rwZSUlJeP36NVq3bo1p06YhJydHdBrRP/r9kCF12MOPVJ9M\nJkNYWBhat26NsrIypKenw9vbm8vR/4aTkxNiYmJQVFQkOkVhatasiSVLluD69evIyspCq1atsGPH\nDv7cIlJzHHASEdFH0dLSQmhoKGbPns070eijpaenQyKRwMzMTHSKwjVu3BjfffcdUlNTUVZWBjMz\nM0yePBnZ2dmi04jeqWbNmqhduzYePnwoOoU0XFpaGhwdHREYGIhDhw4hODgYn376qegspffJJ59A\nKpUiLi5OdIrCNW3aFLt378b+/fuxZcsWdOjQARcuXBCdRUQKwgEnERF9tLZt22LUqFGYOnWq6BRS\ncb8vT9eku28MDQ0RGBiI9PR0aGtrw8LCApMmTeLeYaS0uEydRMrPz8esWbPg6OiIL774AleuXEHH\njh1FZ6kUFxcXtV2m/lc6d+6M2NhYzJw5EyNGjMCAAQOQlZUlOouI5IwDTiIikotFixYhLi4OJ06c\nEJ1CKkzdl6f/nYYNG2Lt2rXIyMiAvr4+2rRpg/Hjx+P+/fui04j+gANOEkEmk+HgwYMwNzdHdnY2\nUlJSMHHiRGhpaYlOUznOzs5qedDQ35FIJBgyZAhu3LgBGxsbdOrUCTNnzsSrV69EpxGRnHDASURE\ncqGvr4/g4GCMHz8eBQUFonNIBb148QLXr1+Hk5OT6BShGjRogFWrViEzMxN16tRBu3bt4OPjg3v3\n7olOIwIASKVSZGZmis4gDXLnzh307dsX8+bNw86dOxEWFoaGDRuKzlJZ9vb2SE5ORl5enuiUSqen\np4e5c+ciNTUVL168gFQqRXBwMEpKSkSnEdFH4oCTiIjkpmfPnrC3t8fixYtFp5AKOn36NBwcHKCv\nry86RSnUr18fy5cvx82bN2FgYID27dvjq6++4rI6Eo53cFJlefPmDb799lt07NgR3bp1Q2JiIhwd\nHUVnqTw9PT107NhRo/ejbNiwIbZu3YqTJ09i//79aNu2LVchEak4DjiJiEiu1q1bhx9++AHXr18X\nnUIq5vf9N+mP6tati2+//Ra3bt1CkyZN0KlTJ4wcORK3bt0SnUYaigNOqgynTp1CmzZtcP36dSQk\nJOCbb76Bjo6O6Cy14ezsrFH7cL5L27ZtcebMGSxfvhx+fn7o3bs30tPTRWcR0QfggJOIiOSqQYMG\nWLFiBcaOHYvS0lLROaQiysrKcPz4cY3df7MiPvnkEyxevBi3b9+GsbEx7Ozs4OXlhYyMDNFppGGa\nN2+OBw8eoKioSHQKqaGHDx/iiy++wNdff43169fjwIEDaNq0qegstePi4qJx+3C+i0Qigbu7O1JT\nU9GzZ084Ojpi4sSJePr0qeg0InoPHHASEZHcjRw5EjVr1sR3330nOoVURHx8POrXr49mzZqJTlF6\nderUwYIFC5CVlYXWrVuja9euGDp0KO84oUqjo6ODpk2bcrsEkqvi4mKsW7cObdu2RatWrZCWlsYP\nvRTIxsYGDx48QG5urugUpaGjo4MpU6bgxo0b0NLSQuvWrbF27Vq8fftWdBoRVQAHnEREJHcSiQRb\ntmzBkiVLeAI0VQiXp7+/WrVqYe7cucjKykLbtm3h5OSEL774AikpKaLTSANwmTrJU0xMDGxsbHD8\n+HHExsYiICAAenp6orPUmpaWFhwdHXH27FnRKUqnbt262LBhAy5evIioqCiYm5vj4MGDkMlkotOI\n6G9wwElERAphamqKKVOmYMKECfyFkP5RREQE79T5QDVr1sSsWbNw584ddOzYEa6urhgwYACSkpJE\np5Ea44CT5OHJkycYPXo0Bg8ejPnz5+PUqVMwNTUVnaUxnJ2duUz9b7Rq1QpHjx5FcHAwFi5cCCcn\nJyQkJIjOIqJ34ICTiIgU5ptvvsHdu3exf/9+0SmkxHJycpCVlQV7e3vRKSqtevXqmDFjBu7cuYMu\nXbqgd+/e6N+/P9+MkUJwwEkfo6ysDCEhITA3N0edOnWQnp6OL774AhKJRHSaRvl9H05+EP33XF1d\ncf36dQwdOhRubm4YNWoUsrOzRWcR0f/ggJOIiBRGR0cHISEhmDJlCl6+fCk6h5TU8ePH4erqiqpV\nq4pOUQv6+vqYOnUqsrKy4OzsDHd3d/Tr1w9Xr14VnUZqRCqVcsBJHyQhIQG2trbYuXMnTp8+jXXr\n1qFWrVqiszSSVCpFSUkJ99OtAG1tbfj4+CAzMxMGBgawtLTEt99+i8LCQtFpRPT/OOAkIiKFsre3\nh7u7O2bPni06hZQU999UDD09Pfj6+uL27dvo1asXPD090adPH8TFxYlOIzVgamqKzMxM0RmkQl6+\nfAlfX1/06dMH48aNw8WLF9G2bVvRWRpNIpHAxcUFkZGRolNURq1atbBixQrEx8cjNTUVrVq1wu7d\nu1FWViY6jUjjccBJREQKt3z5chw5cgTR0dGiU0jJFBUV4cyZM+jdu7foFLVVrVo1TJw4Ebdv34a7\nuzsGDx6Mnj17IiYmRnQaqTBDQ0Pk5+fj1atXolNIyclkMuzevRtmZmYoKipCWloaRo8ejSpV+FZU\nGXAfzg/TvHlz7Nu3D3v37kVQUBBsbW0RGxsrOotIo/FVhYiIFK5OnToICgqCj48P3r59KzqHlEhM\nTAxMTU1hYGAgOkXt6erq4uuvv8atW7cwaNAgeHl5wdnZGRcuXBCdRipIIpHAxMQEt27dEp1CSuzG\njRvo3r071qxZgwMHDmDLli2oW7eu6Cz6L87OzoiKiuIdiB/I3t4ecXFx8PX1xeDBgzF48GDcu3dP\ndBaRRuKAk4iIKsWAAQPQsmVLrFq1SnQKKREuT698Ojo6GDNmDDIzMzF8+HCMHj0ajo6OiIqK4kET\n9F64Dye9S0FBAebMmYOuXbvC09MTV69eRefOnUVn0V9o1KgR6tevj8TERNEpKqtKlSoYPnw4MjMz\nYW5uDhsbG8yZMwd5eXmi04g0CgecRERUKSQSCTZt2oSgoCDu20blIiIi4ObmJjpDI1WtWhWjRo1C\nRkYGRo8ejXHjxqFbt248UZcqjPtw0v+SyWQ4dOgQzM3Ncf/+fSQnJ8PX1xfa2tqi0+hvODs7cx9O\nOdDX18fChQuRnJyMR48eQSqVIjQ0FKWlpaLTiDQCB5xERFRpmjRpggULFmDcuHEcoBDu3LmD58+f\nw8bGRnSKRtPW1saIESOQnp6OcePGwdfXF/b29jh58iT/ntLfMjU15R2cVO7u3btwd3fHrFmzsG3b\nNuzevRufffaZ6CyqAB40JF+NGjXCjh07cPToUYSFhcHa2pr//xJVAg44iYioUk2aNAkFBQXYvn27\n6BQS7NixY+jduzcPmlAS2traGDZsGFJTU+Hn54dp06bB1tYWx44d46CT/hIHnAQAb9++xdKlS9Gh\nQwfY2dkhOTkZ3bt3F51F78HR0RGxsbHcJ13ObGxscP78eSxatAg+Pj5wd3fnXe9ECsR3FEREVKm0\ntLQQGhqKOXPm4PHjx6JzSCAuT1dOWlpaGDJkCFJSUjB9+nTMmjULHTp0wOHDhznopD/4fcDJ/y40\n15kzZ9CmTRtcvXoV8fHxmDNnDnR0dERn0XuqU6cOWrdujbi4ONEpakcikcDT0xPp6eno2rUrunTp\ngsmTJ+P58+ei04jUDgecRERU6aysrODt7Y2pU6eKTiFBCgoKEB0djR49eohOoXeoUqUKBg0ahKSk\nJMydOxcLFy6EtbU1Dh48yNN2CcB/hiL6+vp49OiR6BSqZNnZ2RgyZAjGjh2LNWvWIDw8HM2aNROd\nRR/B2dkZZ86cEZ2htnR1dTFjxgykp6ejuLgYrVq1QlBQEIqLi0WnEakNDjiJiEiIRYsW4dKlSzhx\n4oToFBIgKioK7du3R+3atUWn0D+oUqUKPD09cf36dfj7+2PJkiVo164d9u/fz0EncZm6hikpKUFg\nYCDatGmDli1bIi0tDf369ROdRXLAfTgrR/369bF582ZERUXh+PHjsLCwwJEjR3gnPJEccMBJRERC\nVK9eHcHBwZgwYQIKCgpE51Ali4iIQJ8+fURn0HuQSCRwd3dHfHw8li1bhlWrVqFNmzbYt28fT4jV\nYBxwao7Y2FjY2Njg6NGjiImJwZIlS6Cvry86i+TEzs4OKSkpyMvLE52iEczNzXHixAkEBQVh1qxZ\ncHV1RXJysugsIpXGAScREQnTs2dP2Nrawt/fX3QKVSKZTMb9N1WYRCKBm5sbLl++jDVr1iAwMBCW\nlpbYs2cPB50aSCqVcsCp5p4+fYoxY8Zg0KBBmDNnDk6fPg2pVCo6i+SsWrVq6NSpE86fPy86RaP0\n6tULycnJ8PT0hKurK8aOHYucnBzRWUQqiQNOIiISav369di5cycSExNFp1AlSUtLg5aWFlq3bi06\nhT6CRCJBr169EBsbi6CgIGzevBlmZmYICwtDSUmJ6DyqJKampjwVWE2VlZVh69atMDc3R40aNZCe\nno4hQ4ZAIpGITiMFcXFx4T6cAmhra2PChAnIzMxE7dq1YWFhgeXLl+PNmzei04hUCgecREQkVIMG\nDbBixQqMHTuWd39piN+Xp/NNsnqQSCRwdXXFxYsXERwcjK1bt6JVq1bYvn07D0/QAFyirp4SExNh\nb2+Pbdu24eTJkwgMDOSeyRrA2dmZ+3AKVKdOHaxZswZxcXG4evUqWrVqhX379nF/TqIK4oCTiIiE\nGzlyJGrUqIGNGzeKTqFKwOXp6kkikaB79+44f/48/vWvf2HXrl2QSqXYunUrioqKROeRghgbG+OX\nX37hMFtN5OXlYcqUKejZsyfGjBmD6OhoWFlZic6iSmJtbY3s7GwukRasZcuWOHDgAHbs2IGVK1ei\nS5cuuHLliugsIqXHAScREQknkUiwZcsWfPvtt7h//77oHFKgFy9eIDExEU5OTqJTSIG6deuGyMhI\n/PDDD/jpp59gamqKLVu24O3bt6LTSM50dXXRqFEj3Lt3T3QKfQSZTIYff/wRrVu3RkFBAdLS0vDV\nV1+hShW+XdQkWlpacHR05F2cSsLR0RHx8fEYO3YsPDw8MGzYMPz666+is4iUFl+xiIhIKZiammLK\nlCmYOHEil+KosVOnTqFr167Q09MTnUKVoEuXLjh16hT27t2L8PBwmJiYYPPmzdxXTM1wH07VlpGR\nARcXF6xYsQL79+9HaGgo6tWrJzqLBHFxceGAU4lUqVIFI0eORGZmJoyNjWFlZYUFCxYgPz9fdBqR\n0uGAk4iIlMY333yDO3fu4OeffxadQgry+/6bpFlsbW1x/Phx7N+/H8eOHUPLli3x3XffcdCpJrgP\np2oqLCzEvHnz0KVLF7i7uyM+Ph62trais0gwZ2dnnDlzhh82K5kaNWogICAAiYmJuHv3LqRSKbZv\n346ysjLRaURKgwNOIiJSGjo6OggJCcHkyZPx8uVL0TkkZ6WlpTh+/Dj339RgHTt2xNGjR3Ho0CGc\nOXMGxsbGCAwMRGFhoeg0+ggccKqeI0eOwNzcHHfu3EFycjImT54MbW1t0VmkBExNTSGTyXD79m3R\nKfQXmjRpgl27duHgwYPYunUr2rdvj/Pnz4vOIlIKHHASEZFSsbe3R79+/TBnzhzRKSRn8fHxMDAw\ngJGRkegUEszGxgaHDh3C0aNHceHCBRgbG2Pt2rUoKCgQnUYfgANO1XHv3j18/vnnmDFjBkJDQ7F3\n714YGhqKziIlIpFIyu/iJOXVsWNHREdHY9asWfD29oanpyeH0qTxOOAkIiKls2LFChw+fBjR0dGi\nU0iOuDyd/le7du1w4MABnDx5EpcvX4axsTFWrVrFvcVUjFQq5R6cSq6oqAjLly9H+/bt0bFjRyQn\nJ8PFxUV0FikpZ2dn7sOpAiQSCQYPHoyMjAx07NgRnTt3xowZMzRmFdT+/fvh6+sLBwcH1KpVCxKJ\nBMOHD//Lx44cORISieRv/zg7O1fyd0DyJpFxcw0iIlJC+/fvx6JFi3D9+nXo6OiIziE5sLGxwbp1\n69CtWzfRKaSk0tLSsGTJEpw9e7b80LFatWqJzqJ/UFZWhho1auDx48eoUaOG6Bz6H2fPnsXEiRPR\nsmVLbNiwAc2bNxedREouOzsblpaWePz4MbS0tETnUAXl5uZiwYIFOHToEBYuXIhx48ap9dYTVlZW\nSEpKQo0aNdC4cWNkZGRg2LBh2LVr158eGx4ejsTExL+8TlhYGO7cuYPVq1djxowZis4mBeKAk4iI\nlJJMJoO7uzs6deqE+fPni86hj/To0SOYm5sjNzcXVatWFZ1DSu7GjRtYunQpTp48CT8/P/j5+aF2\n7dqis+hvtGnTBjt37kS7du1Ep9D/e/ToEWbMmIGYmBhs2LAB7u7uopNIhZiZmSEsLAw2NjaiU+g9\nJScnY9q0acjOzsbatWvRu3dv0UkKERUVhcaNG6Nly5Y4f/48nJyc3jngfJeXL1/C0NAQpaWlePjw\nIerVq6fAYlI0LlEnIiKlJJFIsGnTJgQGBnLpoxo4fvw4XF1dOdykCmndujV27dqF6Oho3L59G8bG\nxli8eDFevHghOo3egftwKo+SkhJs2LABbdq0gZGREdLS0jjcpPfm4uLCZeoqqk2bNjh9+jRWrlyJ\nKVOmoFevXkhLSxOdJXdOTk4wMTGBRCL54GuEhYXh9evX8PT05HBTDXDASURESqtp06ZYsGABvv76\na3DBgWrj/pv0IaRSKXbu3Im4uDjcv38fJiYmWLBgAZ49eyY6jf4H9+FUDnFxcejQoQPCw8Nx4cIF\nLFu2DNWrVxedRSqIBw2pNolEgn79+iE1NRV9+vSBk5MTxo8fjydPnohOUyqhoaEAAB8fH8ElJA8c\ncBIRkVKbNGkS8vPzsWPHDtEp9IGKiooQGRmptkukSPFatmyJbdu24cqVK8jJyYGpqSnmzp2Lp0+f\nik6j/8c7OMV69uwZfHx84OnpiZkzZyIyMhKtW7cWnUUqzNHREZcuXcKbN29Ep9BHqFq1Kvz8/JCR\nkQFdXV2YmZlh9erVePv2reg04S5duoSUlBSYmprCyclJdA7JAQecRESk1LS0tBASEoLZs2fj8ePH\nonPoA0RHR0MqlaJBgwaiU0jFtWjRAqGhoUhISMDz588hlUoxa9Ys/mxQAhxwilFWVoZt27bBzMwM\n1apVw40bNzB06NCPWrJJBAC1a9eGubk5Ll26JDqF5ODTTz9FYGAgoqOjcfHiRZiZmeHnn3/W6BVS\nISEhAICxY8cKLiF54YCTiIiUXrt27eDt7Y2pU6eKTqEPwOXpJG9GRkb4/vvvkZiYiPz8fLRq1Qoz\nZsxATk6O6DSN9fuAU5N48AUoAAAgAElEQVTfLFe25ORkODg4YMuWLTh+/Dg2bNjAw7hIrrgPp/qR\nSqU4fPgwQkJCEBAQAEdHR1y7dk10VqV79eoVfvrpJ+jo6GDkyJGic0hOOOAkIiKVsGjRIly6dAkn\nT54UnULvKSIiAm5ubqIzSA01adIEmzZtQkpKCoqKimBmZoYpU6YgOztbdJrGqVu3LrS1tXk3bSXI\ny8vDtGnT4OrqipEjR+LSpUuwtrYWnUVqiPtwqi9nZ2ckJCTAy8sL/fr1w8iRIzXqtXPXrl0oLCzk\n4UJqhgNOIiJSCdWrV8fmzZsxfvx4FBQUiM6hCsrKysLLly/55psUqlGjRtiwYQPS0tIgkUhgYWEB\nX19fPHjwQHSaRuEydcWSyWT46aefYGZmhlevXiE1NRVjx45FlSp8S0eKYWtri7S0NLx69Up0CimA\nlpYWxowZg8zMTBgaGqJNmzYICAhAYWGh6DSF+/1woXHjxgkuIXniqyEREamMXr16wdbWFv7+/qJT\nqIKOHTuGPn368A04VYrPPvsM69evR3p6OqpVq4Y2bdpgwoQJuH//vug0jcABp+LcvHkTPXv2xJIl\nS7Bv3z7861//Qv369UVnkZqrVq0abG1tce7cOdEppEA1a9bEsmXLEB8fj/T0dEilUoSFhaGsrEx0\nmkJcvnwZSUlJMDU1haOjo+gckiO+2yAiIpWyfv167NixA4mJiaJTqAK4/yaJ0LBhQ6xevRoZGRmo\nVasW2rVrh3HjxuHevXui09QaB5zy9/r1ayxYsAB2dnbo3bs3EhISYG9vLzqLNIizszP34dQQzZo1\nw48//oh9+/Zh48aN6Ny5M2JiYkRnyd3vhwv5+PgILiF5k8i4EzgREamYbdu2ITg4GHFxcdDS0hKd\nQ+9QUFCAhg0b4sGDBzz4goR6+vQp1q9fj++//x4eHh6YO3cuWrRoITpL7fz8888ICwtDeHi46BS1\nEBERAV9fX3To0AHr1q1Do0aNRCeRBrp27RpGjBiBtLQ00SlUicrKyrB3717MmTMHnTt3xsqVK9G8\neXPRWX8QHh5e/nqTk5ODkydPokWLFnBwcAAA1KtXD2vWrPnD1+Tl5cHQ0BAlJSV48OAB999UM7yD\nk4iIVM6oUaNQo0YNbNq0SXQK/Y2zZ8+iQ4cOHG6ScPXq1cPSpUtx69YtGBoaomPHjhg1ahRu3bol\nOk2t8A5O+bh//z48PDwwdepUfP/999i3bx+HmySMlZUVcnJyNOoAGgKqVKmCYcOGISMjA5aWlmjf\nvj1mz56NvLw80WnlEhMTsXPnTuzcubP8ENI7d+6U/7P9+/f/6Wt2796NgoICeHh4cLiphjjgJCIi\nlSORSPD9998jICCAe+spMS5PJ2Xz6aefIiAgALdv30azZs1ga2uLESNGIDMzU3SaWmjZsiXu3LmD\n0tJS0SkqqaioCCtXroS1tTVsbGyQkpKCHj16iM4iDaelpQUnJyecPXtWdAoJoK+vjwULFiAlJQWP\nHz+GVCpFSEiIUvycX7x4MWQy2Tv//NW2NOPHj4dMJsPevXsrP5gUjgNOIiJSSVKpFJMnT8akSZPA\n3VaUj0wmQ0REBNzc3ESnEP1JnTp1sGjRImRlZcHU1BRdunTBsGHDcOPGDdFpKk1PTw8GBgb45Zdf\nRKeonHPnzsHKygoXLlzAlStXMH/+fOjq6orOIgLwn304z5w5IzqDBDI0NMS2bdsQERGBPXv2oF27\ndjh9+rToLKI/4ICTiIhU1qxZs5CVlYUDBw6ITqH/kZqaiqpVq6JVq1aiU4jeqXbt2pg/fz6ysrJg\naWkJR0dHDBkyBKmpqaLTVJZUKuUdse8hJycHXl5e8Pb2xtKlS3H06FHuD0tKx8XFBZGRkfxAmWBt\nbY2oqCj4+/tj/Pjx6Nu3LzIyMkRnEQHggJOIiFSYjo4OtmzZAj8/P7x8+VJ0Dv2X3+/elEgkolOI\n/lGtWrUwe/ZsZGVlwcbGBi4uLhg4cCCSk5NFp6kc7sNZMaWlpdi0aRMsLS3RqFEjpKenw8PDgz8z\nSSm1bNkSEomEf7cJwH+2ivLw8EBaWhqcnJzg4OAAPz8/PHv2THQaaTgOOImISKV16dIF/fr1w5w5\nc0Sn0H/h/pukimrUqIGZM2ciKysLdnZ26NmzJzw8PHD9+nXRaSqDA85/duXKFXTs2BH//ve/cf78\neaxYsQLVq1cXnUX0ThKJBM7OzoiMjBSdQkpEV1cX06dPx40bN1BWVobWrVsjMDAQRUVFotNIQ3HA\nSUREKm/FihU4fPgwYmJiRKcQgOfPnyMpKQmOjo6iU4g+SPXq1TFt2jRkZWXB0dERffv2hbu7O+Lj\n40WnKT0OON/t+fPn+Prrr/H5559j6tSpiIqKgpmZmegsogpxcXHhPpz0l+rVq4eNGzfi3LlzOHXq\nFCwsLHDo0CFuaUCVjgNOIiJSeXXq1EFgYCB8fHz4qbESOHXqFLp16wY9PT3RKUQfRV9fH5MnT0ZW\nVhZ69OiB/v37w83NDZcvXxadplT2798PX19fODg4YNCgQThz5gyGDx/+l48tLi5GUFAQRo0aBSsr\nK+jo6EAikWDr1q2VXF15ZDIZduzYATMzM2hra+PGjRsYPnw4l6OTSunevTvOnTunFKdnk3IyMzPD\nsWPH8N1332Hu3LlwcXFBUlKS6CzSIBxwEhGRWhg4cCBatGiBVatWiU7ReFyeTuqmWrVqmDRpErKy\nstC3b18MGjQIvXr1QmxsrOg0pbBkyRJs3LgRiYmJaNy4MQCgpKTkLx9bUFCAKVOmYMeOHcjJyUHD\nhg0rM7XSpaSkoGvXrti8eTMiIiKwceNG1KlTR3QW0Xv77LPPYGhoyC076B/17NkTSUlJGDhwIHr2\n7IkxY8YgJydHdBZpAA44iYhILUgkEmzatAlBQUFcHilQaWkpTpw4ATc3N9EpRHKnq6uL8ePH4/bt\n2/D09MTQoUPh6uqKixcvik4Tav369bh58yby8vIQHBwMAPjtt9/+8rH6+vo4duwYsrOzkZOTg9Gj\nR1dmaqX57bffMGPGDDg7O2PYsGG4dOkSbGxsRGcRfRRnZ2cuU6cK0dbWxvjx45GRkYFPP/0UFhYW\nWLZsGV6/fi06jdQYB5xERKQ2mjZtinnz5mHcuHHc90eQq1evomHDhmjatKnoFCKF0dHRgY+PD27d\nuoUhQ4bA29sbTk5OOHfunOg0IZycnGBiYvKHJdfvGnDq6Oigd+/e+Oyzzyorr1LJZDLs378fZmZm\nePbsGVJTU/H1119DS0tLdBrRR3NxceFBQ/Re6tSpg1WrVuHy5ctISEhA69at8eOPP/L3dFIIDjiJ\niEit+Pr6Ij8/Hzt27BCdopEiIiJ49yZpjKpVq+Krr75CZmYmvL29MXbsWHTr1g2RkZEa/+YtLy9P\ndEKlu3XrFnr37g1/f3/s2bMH27dvR4MGDURnEclNt27dEBcXhzdv3ohOIRVjbGyM/fv344cffsDq\n1athZ2eHuLg40VmkZjjgJCIitaKlpYWQkBDMnj0bjx8/Fp2jcbj/JmmiqlWrYuTIkbhx4wbGjBmD\nCRMmwMHBAadOndLYQacmDThfv36NRYsWwdbWFq6urkhISICDg4PoLCK5q1WrFiwtLbn/MH2wrl27\n4urVq/j6668xcOBADB06FPfv3xedRWqCA04iIlI77dq1w4gRIzBt2jTRKRolOzsb9+7dg52dnegU\nIiG0tbXh5eWF9PR0TJw4EVOmTIGtrS2OHz+ucYPOdy1RVzfHjx+HpaUl0tPTkZiYiOnTp6Nq1aqi\ns4gUhvtw0seqUqUKvL29kZmZCRMTE7Rr1w7z589Hfn6+6DRScRxwEhGRWlq8eDFiYmJw8uRJ0Ska\n4/jx4+jRowe0tbVFpxAJpaWlhS+//BIpKSmYNm0aZs6ciU6dOuHo0aMaM+hU9zs4f/31VwwYMAC+\nvr7YuHEj/v3vf5efIE+kzpydnbkPJ8lF9erV4e/vj6SkJPzyyy+QSqXYtm0bSktLRaeRiuKAk4iI\n1FL16tURHByM8ePHo7CwUHSORuDydKI/0tLSwhdffIHk5GTMmjUL8+bNg42NDcLDw9V+0CmTyfD0\n6VPRGXJXXFyM1atXo127dmjTpg1SU1PRq1cv0VlElcbW1hbp6el4+fKl6BRSE40bN0ZYWBjCw8Ox\nbds2tG/f/qMP7Xvw4AHCw8MREBCA6dOnY8GCBdi1axdu3LiBsrIy+YST0uEtFkREpLZ69eqFzp07\nw9/fHytXrhSdo9bevn2LyMhIbNmyRXQKkdKpUqUKBgwYAA8PDxw+fBgBAQFYvHgxFixYAA8PD1Sp\non73HNSqVQs3b95EvXr1RKfIzYULFzBhwgQ0adIEly9fhrGxsegkokqnq6sLOzs7nDt3Dv379xed\nQ2qkQ4cOuHjxIvbv349Ro0bBysoKq1atgomJSYW+vrS0FD/99BNWrlyJzMxM6OjoID8/v3ygWaNG\nDchkMtSqVQvTp0+Hj48PatasqchviSqZ+v02RURE9F/Wr1+P7du3IzExUXSKWouOjkbr1q1Rv359\n0SlESqtKlSro378/rl27hm+//RYrVqxA27Zt8dNPP6ndHSU1a9bEzZs3RWfIRW5uLry9vTF8+HAE\nBATg2LFjHG6SRnNxceEydVIIiUSCQYMG4caNG+jcuTNsbW0xbdo0vHjx4m+/LjMzE9bW1vDx8UFS\nUhLevHmDvLy8P7y25ufno6CgAI8ePcKCBQvQokULnD59WtHfElUiDjiJiEitGRgYYPny5fDx8eGe\nPgrE5elEFSeRSNCvXz9cuXIFK1euxNq1a2FpaYm9e/eqzc+p3+/gVGWlpaUIDg6GpaUlDAwMkJ6e\nDk9PT0gkEtFpRELxoCFStGrVqmHWrFlIT09HYWEhWrVqhY0bN6K4uPhPjz1x4gSsra2Rmppa4YOK\nXr9+jadPn6J///5YsmSJvPNJEIlM3TcAIiIijSeTyeDk5ARPT0/4+fmJzlFLUqkUe/bsgY2NjegU\nIpUjk8lw6tQp+Pv74/nz55g/fz6GDBmiMgd2hYeHIzw8HACQk5ODkydPwsDAALq6unByckK9evWw\nZs2a8sevWLECGRkZAIDExEQkJSXBzs6ufBlily5dMGbMmMr/Rv5LfHw8xo8fDz09PWzevBkWFhZC\ne4iUSVlZGRo0aICkpCQ0atRIdA5pgJSUFEyfPh2//vor1q5di969e0MikeDcuXNwc3P7qP329fX1\nsXjxYsycOVOOxSQCB5xERKQRMjMzYW9vj+vXr6NJkyaic9TK7du34eDggIcPH6rlXoJElUUmk+Hs\n2bPw9/dHTk4O5s2bh2HDhin9oHPx4sXw9/d/5783MjLCvXv3yv+3o6Mjzp8//87He3t7Y8eOHXIs\nrLgXL15g3rx5OHjwIFauXAkvLy/esUn0FwYNGoR+/fphxIgRolNIQ8hkMhw7dgzTp09H06ZNsWjR\nIvTr1+8fl69XhJ6eHi5evMgP6lUcB5xERKQxAgICEB8fj0OHDvENqxxt2LABSUlJ+Ne//iU6hUgt\nyGQynDt3DgEBAbh//z7mzZsHLy8vVK1aVXRaheXn56N+/fooKChQiQ8+ZDIZwsLCMGvWLHh4eGDp\n0qX45JNPRGcRKa0tW7YgNjYWO3fuFJ1CGqa4uBjff/89Zs6cieLiYrntYd2iRQvcvHkTWlpacrke\nVT7l/22DiIhITmbNmoXbt2/jwIEDolPUCvffJJIviUQCJycnREVFYfv27dizZw9MTU0REhKCoqIi\n0XkVUqNGDdStWxe//vqr6JR/lJaWBkdHR2zYsAGHDx/G5s2bOdwk+ge/78PJ+6WoslWtWhUDBw4E\nALke0PfkyROcOHFCbtejyscBJxERaQxdXV2EhITAz88Pr169Ep2jFvLz8xEbGwtXV1fRKURqqWvX\nrjhz5gx27dqFn3/+GSYmJggODsbbt29Fp/0jqVSKzMxM0RnvlJ+fj2+++QaOjo4YPHgwLl++jA4d\nOojOIlIJxsbG0NbWVuq/46S+QkND5b4a67fffsPq1avlek2qXBxwEhGRRunSpQv69u2LOXPmiE5R\nC2fPnkXHjh1Rq1Yt0SlEas3e3h4nT57Evn37cOTIEbRs2RIbN27EmzdvRKe9k6mpqVKepC6TyXDg\nwAGYmZkhNzcXqampmDBhApclEr0HiUQCFxcXnqZOQhw+fFghr39xcXEoLS2V+3WpcnDASUREGmfl\nypU4dOgQYmJiRKeoPC5PJ6pcnTt3xrFjx3DgwAGcOnUKxsbGCAoKwuvXr0Wn/YkyDjizsrLg5uaG\nBQsWICwsDDt37oSBgYHoLCKV5OzsjMjISNEZpGFkMhnS09MVcu2qVasq3esWVRwHnEREpHHq1KmD\nwMBA+Pj4qMx+dsro99Ms3dzcRKcQaZwOHTrg8OHDOHLkCM6dOwdjY2OsW7cOhYWFotPKKdOA882b\nNwgICECnTp3g5OSExMREdOvWTXQWkUpzdnbGuXPneMcbVar8/HwUFxcr5NpaWlp48OCBQq5NiscB\nJxERaaSBAweiefPm3GvnI6SkpEBHRwdSqVR0CpHGsra2xsGDB3Hs2DHExsaiRYsWWL16NfLz80Wn\nKc0enCdPnoSlpSWSkpKQkJCAmTNnqtSJ9ETKysDAAI0bN8a1a9dEp5AGKSsrk/v+m/+NA3vVxQEn\nERFpJIlEgk2bNmH9+vVKc4eRqomIiICbm5tCf8kkooqxsrLC/v37cfr0acTHx8PY2BgrVqzAb7/9\nJqypWbNmePTokbB9Qh88eIBBgwZhwoQJCAoKws8//4ymTZsKaSFSVy4uLlymTpWqevXqkMlkCrm2\nTCZD3bp1FXJtUjwOOImISGMZGRlh/vz5+PrrrxX2i5I64/6bRMrH0tIS+/btQ1RUFJKTk2FsbIyl\nS5fi1atXld6ira2NZs2aISsrq1Kft7i4GOvWrYOVlRXMzMyQmprKn1VECuLs7MyDhqhSaWtro3nz\n5gq5dmFhISwsLBRybVI8DjiJiEij+fr6Ii8vDzt37hSdolKePXuG5ORkODo6ik4hor9gZmaGPXv2\n4MKFC8jIyEDLli0REBCAly9fVmpHZe/DGR0dDWtra5w8eRKXLl2Cv78/9PT0Ku35iTRNt27dcOXK\nFaU86IzUl5OTE7S0tOR+3RYtWvA1Q4VxwElERBpNS0sLoaGhmDVrFp48eSI6R2WcOnUKjo6OqFat\nmugUIvobrVq1QlhYGGJjY3H37l20bNkSCxcuxPPnzyvl+StrH84nT55g1KhR+PLLL7Fo0SKcOHEC\nJiYmCn9eIk1Xs2ZNtGnTBjExMaJTSIOMHz8eurq6cr1m9erVMXnyZLlekyoXB5xERKTx2rVrhxEj\nRmDatGmiU1QGl6cTqRYTExNs374dly9fRnZ2NkxMTDBv3jw8e/ZMoc+r6Ds4y8rKsGXLFpibm6Nu\n3bpIT0/HwIEDuTcwUSVydnbmPpxUqaysrGBqairXn/USiQReXl5yux5VPg44iYiIACxevBjR0dE4\ndeqU6BSlV1paihMnTnDASaSCjI2NsXXrVsTHx+Pp06cwNTXF7NmzFXYHuyIHnNeuXYOtrS3CwsIQ\nGRmJNWvWoGbNmgp5LiJ6NxcXF+7DSZVu06ZNqFJFPiOt6tWrY+PGjXwNUXEccBIREeE/v9hs3rwZ\n48ePR2FhoegcpXblyhUYGhryNGIiFda8eXNs2bIFCQkJyMvLg1QqxcyZM5GbmyvX51HEgPPly5fw\n9fWFm5sbxo8fjwsXLsDS0lKuz0FEFde5c2dkZmbixYsXolNIQ8THx8PLywsdOnSAvr7+R11LT08P\nDg4OGDFihJzqSBQOOImIiP5f79690alTJwQEBIhOUWoRERFwc3MTnUFEcmBkZITNmzcjKSkJb968\nQevWrTFt2jQ8evToo65bUlKC8PBwzJ07F0+fPkWNGjVQvXp1NGjQAM7Ozli2bBl+/fXX97qmTCbD\n7t27YWZmhuLiYqSnp2PkyJFyu4OHiD6Mjo4O7O3tce7cOdEppOZkMhk2bNiAPn36YOXKlYiNjYWP\nj88HDzn19PRgY2ODgwcPcmsTNSCRyWQy0RFERETKIjc3F5aWljh9+jTatm0rOkcptWvXDhs2bICD\ng4PoFCKSs+zsbKxatQo//PADvLy88M0336BRo0YV/vqysjJs3LgR/v7+KC4uxm+//faXj9PV1YVE\nIkG3bt0QHByM5s2b/+1109PTMXHiRLx69QrBwcHo1KnTe31fRKRYa9aswd27d7Fp0ybRKaSmXr58\nidGjR+P+/fvYt28fjI2NAfxn6BkaGopp06bh7du3KCkpqdD19PT0MGbMGKxevVruBxaRGPy4k4iI\n6L8YGBhg+fLlGDt2LEpLS0XnKJ2HDx/i/v37sLW1FZ1CRApgaGiIwMBApKWlQVtbG5aWlpg4cWKF\n7ra8f/8+OnbsiLlz5+L58+fvHG4CwNu3b/HmzRucOXMGFhYW+P777//ycQUFBZg9eza6deuGgQMH\n4urVqxxuEikhFxcXHjRECnPlyhVYW1ujcePGiImJKR9uAv85HMjHxwfp6enw8PBAtWrVUL169b+8\njq6uLqpVqwY7OztERkZiw4YNHG6qEd7BSURE9D9kMhmcnJwwYMAA+Pr6is5RKlu3bkVkZCT27t0r\nOoWIKsHjx4+xZs0abN26FYMHD8bs2bNhZGT0p8dlZWWhU6dOePny5Qd9OKSvr4/Jkydj2bJlAP7z\nc/jQoUOYPHkyunbtitWrV6Nhw4Yf/f0QkWKUlZXBwMAA169fR+PGjUXnkJr4fUn60qVL8f3338PT\n0/Mfv+bZs2c4ePAgLl68iGvXrqGgoAA6OjowMzNDt27d4ObmBhMTk0qop8rGAScREdFfyMzMhL29\nPa5fv44mTZqIzlEaHh4e8PT0hJeXl+gUIqpET548wbp16xASEgJPT0/MnTu3fFl5Xl4eWrVqhdzc\nXJSVlX3wc+jr62PdunVwdXWFn58f7ty5g02bNsHJyUle3wYRKdDgwYPRp08feHt7i04hNfDixQuM\nHj0aDx48wL59+9CiRQvRSaTkuESdiIjoL0ilUvj5+WHSpEngZ4H/8fbtW5w9exa9evUSnUJElax+\n/fpYvnw5bt68CQMDA7Rv3x6jR49GVlYWfH198eLFi48abgJAYWEhfH19YWNjAwcHByQmJnK4SaRC\nnJ2dcebMGdEZpAYuX74Ma2trGBkZITo6msNNqhDewUlERPQOb9++hZWVFZYuXVqhJTHq7syZM1iw\nYAEuXbokOoWIBHvx4gWCgoIQGBiI/Px8ue1Z/PvBQ1FRUXK5HhFVnqysLDg4OODhw4c8kZo+iEwm\nw/r167FixQqEhISgf//+opNIhfAOTiIionfQ1dVFSEgI/Pz88OrVK9E5wkVERMDNzU10BhEpgU8+\n+QSLFy+Gq6vrR9+5+d9kMhkuXbqEhw8fyu2aRFQ5WrRoAV1dXdy4cUN0Cqmg58+fo3///ti3bx+u\nXLnC4Sa9Nw44iYiI/oaDgwPc3NwwZ84c0SnCRUREoE+fPqIziEhJFBUV4ciRIwrZxmP37t1yvyYR\nKZZEIoGzszNPU6f3FhcXB2traxgbG+PixYto1qyZ6CRSQRxwEhER/YMVK1YgPDwcsbGxolOEuXXr\nFvLz89GuXTvRKUSkJNLS0qCjoyP36/6+3y8RqR4XFxcOOKnCZDIZ1q5di88//xxBQUFYt26dQl5X\nSDNwwElERPQPPvnkEwQGBsLHxwdFRUWic4Q4duwY+vTpwz21iKhcUlKSwg5hS0pKUsh1iUixunfv\njnPnzqGkpER0Cim5Z8+ewd3dHf/+979x5coVfP7556KTSMVxwElERFQBgwYNQrNmzbB69WrRKUJw\neToR/a9Xr16huLhYIdfOz89XyHWJSLEaNGgAIyMjXLt2TXQKKbHY2FhYW1tDKpXiwoULMDIyEp1E\naoADTiIiogqQSCTYtGkT1q9fj1u3bonOqVT5+fm4dOkSXF1dRacQkRLR1tZGlSqKeTuhra2tkOsS\nkeI5OzvjzJkzojNICZWVlWH16tXw8PDAxo0bsWbNGi5JJ7nhgJOIiKiCjIyMMG/ePIwbN05hyzKV\nUWRkJDp16oSaNWuKTiEiJVK/fn2FbVvRuHFjhVyXiBSP+3DSX3n69Cn69euHAwcO4OrVq+jXr5/o\nJFIzHHASERG9B19fX+Tl5WHnzp2iUypNREQE3NzcRGcQkUAymQx37txBWFgYxo0bBwsLC4waNQqv\nX79WyPM1b96ce/gRqaiuXbvi6tWrKCwsFJ1CSiImJgbW1tYwNzfHhQsX0LRpU9FJpIY44CQiInoP\n2traCAkJwaxZs/DkyRPROQonk8nKDxgiIs1RXFyMq1evIjAwEAMHDoShoSG6dOmCw4cPw8zMDDt2\n7MDLly/RokULuT+3jo4Obty4gYYNG2LkyJE4dOgQByVEKqRGjRpo27YtYmJiRKeQYGVlZVi5ciUG\nDBiA4OBgrFq1ClWrVhWdRWpKItOkNXZERERyMmPGDOTm5iIsLEx0ikIlJSVhwIABuHXrFk9QJ1Jj\nr169wqVLlxATE4Po6GjEx8ejWbNmsLe3R5cuXWBvb49mzZr96efAli1bMH36dBQUFMitpUGDBnj0\n6BEePHiAQ4cOITw8HPHx8ejevTs8PDzg5uaGunXryu35iEj+Fi9ejNevX2PlypWiU0iQJ0+ewNvb\nG69evcKPP/6IJk2aiE4iNccBJxER0QcoKCiAhYUFQkJC1PrwnWXLliE3NxdBQUGiU4hITmQyGX75\n5RfExMSUDzTv3LmD9u3blw80bW1tUadOnX+8VmFhIZo3b47Hjx/Lpa169epYt24dfHx8/vDPnz9/\njqNHjyI8PByRkZGwsbFB//790b9/fy51JFJCFy9exNSpUxEfHy86hQS4ePEihg4dimHDhuHbb7/l\nXZtUKTjgJCIi+q6b268AACAASURBVEDHjx/HpEmTkJKSAn19fdE5CmFvb4+FCxeiZ8+eolOI6AOV\nlJQgKSnpDwPN0tJS2Nvblw80raysPvgk27Nnz6Jfv34fvYxcS0sLnTp1QnR09N/eMV5YWIjTp08j\nPDwcR44cgZGREfr37w8PDw+Ym5vzbnMiJVBUVIT69evj7t27+PTTT0XnUCX5fUl6UFAQtm3bxi2O\nqFJxwElERPQRvvzySxgZGWHFihWiU+Tu2bNnaNGiBXJzc1GtWjXROURUQXl5eYiLiysfaF6+fBlN\nmzYtH2ja29vD2NhYroPAhQsXYu3atR885NTS0kK9evWQkJAAQ0PDCn9dSUkJoqOjER4ejvDwcGhr\na5cPOzt37gwtLa0P6iGij9enTx989dVXGDBggOgUqgRPnjyBl5cX8vPz8eOPP6Jx48aik0jDcMBJ\nRET0EXJzc2FpaYnTp0+jbdu2onPkas+ePdi3bx8OHTokOoWI/sb9+/fLh5kxMTG4efMmbGxsyoeZ\ndnZ2Cr+DSiaTYfHixVizZs17Dzn19PRQv359XLx48aOWm8tkMiQmJpYPO3NycuDu7g4PDw90796d\nH9QQVbJ169bh9u3b2Lx5s+gUUrALFy5g2LBh8PLyQkBAALS1tUUnkQbigJOIiOgjbd26FaGhoYiN\njVWru4WGDRuGrl27Yty4caJTiOj/lZaWIjk5+Q8DzdevX5cfBGRvbw9ra2vo6uoK6YuKisKXX36J\n/Pz8fzx4SEtLCzo6OvD29sbatWvlvtVHVlZW+SFFycnJ6NGjBzw8PNCnTx/Url1brs9FRH+WlJSE\nQYMG4ebNm6JTSEHKysqwfPlybNy4Edu3b0evXr1EJ5EG44CTiIjoI5WVlcHJyQkDBw6Er6+v6By5\nKC0thYGBAa5fv85TL4kEys/P/9Ny888+++wPA00TExOl2nfy9evX2Lt3L1auXIl79+6hWrVqKCkp\nQVlZGapWrQqZTIbS0lIMHToUU6dOhbm5ucKbHj9+jCNHjiA8PBznz5+Hra0tPDw84O7u/l5L4omo\n4srKytCwYUPEx8fzMDA19PjxYwwfPhxv3rzB3r170ahRI9FJpOE44CQiIpKDjIwMODg4ICEhQS0G\ngrGxsRg/fjySkpJEpxBplIcPHyI6Orp8oJmRkQErK6vygaadnR3q1asnOrPCnj17hoSEBNy9excl\nJSWoU6cOrKysIJVKhd3xnp+fjxMnTiA8PBzHjh2Dqalp+b6dUqlUSBORuhoyZAh69uyJUaNGiU4h\nOTp37hyGDx+OkSNHYvHixVySTkqBA04iIiI58ff3R0JCAsLDw5XqbqoPMW/ePMhkMixbtkx0CpHa\nKi0tRVpaWvnJ5jExMcjPz4ednV35QNPGxoZ7RypQUVERzp8/X75vZ61atcqHne3bt0eVKlVEJxKp\ntNDQUJw/fx67du0SnUJyUFpaimXLlmHz5s3YuXMnevToITqJqBwHnERERHLy9u1bWFlZYenSpfD0\n9BSd81GsrKywceNGdOnSRXQKkdooKCjAlStXygeacXFxaNCgAezt7csHmlKpVOU/IFFVZWVliI+P\nLx92vnr1Cp9//jk8PDzQrVs36OjoiE4kUjl3796FnZ0dsrOz+bNNxeXm5mL48OEoLi7Gnj17uL0H\nKR0OOImIiOTo4sWL+PLLL5GWlqayh1g8ePAAbdu2RW5uLpccEX2ER48elS81j46ORnp6Otq0aVM+\n0LSzs0ODBg1EZ9I7ZGZmlg87MzMz0bt3b3h4eKBXr16oUaOG6DwildGiRQscOXKkUvbbJcWIiorC\n8OHDMXr0aCxatIi/H5JS4oCTiIhIznx8fFC1alVs2rRJdMoHCQ0NRVRUFPbs2SM6hUhllJWVIT09\n/Q8DzZcvX8LOzq58oNm+fXvo6emJTqUPkJ2djcOHDyM8PByxsbHo2rUrPDw80K9fPw6pif6Bj48P\nLCws4OfnJzqF3lNpaSmWLFmCLVu2YOfOnXB1dRWdRPROHHASERHJ2YsXL2Bubo6ff/4Ztra2onPe\nW//+/TFw4EAMHz5cdAqR0iosLMTVq1fLB5qxsbGoW7fuH5abt2rVins4qqFXr17h2LFjCA8Px8mT\nJ2FpaVm+b2eLFi1E5xEpnX379mH37t04fPiw6BR6Dzk5ORg2bBjKysqwZ88efPbZZ6KTiP4WB5xE\nREQK8NNPP+Hbb7/FtWvXVGrftrdv36JBgwbIyspSqZOaiRQtNze3fJgZExODlJQUWFhYwN7evvxP\nw4YNRWdSJXv79i0iIyMRHh6OQ4cOwcDAoHzYaWVlxT0HiQA8efIEJiYmePr0KZc2q4jIyEh4eXnB\nx8cHCxYsgJaWlugkon/EAScREZECyGQy9O3bF/b29pg7d67onAo7ffo0Fi1ahNjYWNEpRMKUlZUh\nIyPjDwPNp0+fwtbWtnyY2bFjR+jr64tOJSVSWlqKuLg4hIeH4+DBgyguLi4fdnbp0oWDHdJoVlZW\nCA4OVsmVLZqktLQUAQEBCA0NRVhYGJydnUUnEVUYB5xEREQK8ssvv8DGxgaXLl2CiYmJ6JwKmTJl\nCurXr4958+aJTiGqNG/evPnTcvPatWv/4e5Mc3NzLjenCpPJZEhLSys/pOjevXvo27cvPDw84Orq\nyuE4aZwZM2agTp06mD9/vugUeodHjx5h2LBhkEgk2L17N1clkMrhgJOIiEiB1q9fj6NHj+LMmTMq\nsVTRxMQEP/30E9q1ayc6hUhhnjx58oe7M5OSkmBmZvaHgaahoaHoTFIj9+/fx6FDhxAeHo74+Hh0\n794dHh4ecHNzQ926dUXnESnc8ePHsXLlSpw7d050Cv2F06dPw9vbG+PGjcP8+fO5JJ1UEgecRERE\nClRSUoJOnTrBz88P3t7eonP+1s2bN+Hk5IQHDx6oxDCWqCJkMhlu3ryJ6Ojo8oFmTk7On5ab16hR\nQ3QqaYjnz5/j6NGjCA8PR2RkJGxsbNC/f3/0798fTZs2FZ1HpBD5+flo2LAhcnNzUb16ddE59P9K\nSkrg7++Pbdu2YdeuXXBychKdRPTBOOAkIiJSsISEBPTu3RupqamoX7++6Jx3CgwMRFpaGkJDQ0Wn\nEH2wt2/f4tq1a+UDzdjYWOjr65efbG5vbw8LCwvenUJKobCwEKdPn0Z4eDiOHDkCIyOj8n07zc3N\n+WETqZWuXbti3rx56Nmzp+gUApCdnY2hQ4eiatWq2LVrFwwMDEQnEX0UDjiJiIgqwfTp0/HkyRP8\n8MMPolPeydXVFRMmTICHh4foFKIKe/bsGWJjY8sHmtevX4dUKv3DQLNx48aiM4n+UUlJCaKjo8v3\n7dTW1i4fdnbu3JlDeVJ5/v7+KCgowKpVq0SnaLxTp07B29sbEyZMwNy5c/nzhdQCB5xERESVID8/\nHxYWFggNDYWrq6vonD/57bffYGhoiOzsbNSsWVN0DtFfkslkuH37dvlS8+joaDx8+BCdOnUqH2h2\n6tSJ/w2TypPJZEhMTCwfdubk5MDd3R0eHh7o3r07qlWrJjqR6L3FxMTAz88P165dE52isUpKSrB4\n8WLs2LEDu3btgqOjo+gkIrnhgJOIiKiSHDt2DL6+vkhJSVG6E3TDw8OxadMmnD59WnQKUbmioiIk\nJCT84UAgHR0d2Nvblw80LS0toa2tLTqVSKGysrLKDylKTk5Gjx494OHhgT59+qB27dqi84gqpLi4\nGPXq1cOdO3d4uJYADx8+xJdffolq1aohLCyMS9JJ7XDASUREVImGDBmC5s2bY/ny5aJT/mDs2LEw\nNzfHlClTRKf8H3t3Hl51feaN/w4EgYRNEFFA2QRU9gIKRCKCWsAF0iqCCl0c5/GxLtWqta2dqW3V\nTtW6zDN1qdYpUUGx9ACK6IAVBaSKIipIlIIi4kKVfQlL8vtjan6lorKc5HtO8npdl/+Qc+7zhusC\nw5v78/1Qg61duzbmzZtXUWa+/PLLcdRRR+1WaLqEhZru448/jmnTpkUqlYrZs2dH//79o6ioKM48\n88xo2bJl0vHgS51++unx7W9/O84666yko9QoM2bMiO985ztxySWXxI9+9KOoVatW0pEg7RScAFCF\nPvzww+jevXvMnDkzunfvnnSciPjfo5CtW7eOP//5z9GpU6ek41BDlJeXx/Lly3fbznz33XfjuOOO\nqyg0+/XrF40aNUo6KmSsTZs2xYwZMyKVSsX06dOjU6dOFc/t7Ny5c9Lx4HNuu+22KCkpibvvvjvp\nKDXCzp0746c//WkUFxfHww8/HIWFhUlHgkqj4ASAKnbffffF7373u5g3b16lP9T9wQcfjLFjx0ZE\nxO9+97v4l3/5l8+95tVXX42zzz473n777UrNQs22Y8eOWLhw4W6FZq1atSouAjrhhBOiR48ejpvD\nftq+fXvMnj274rmdjRo1qig7+/TpY2OLjPD666/HN77xDd9zVIFVq1bFmDFjIj8/P4qLi6N58+ZJ\nR4JKpeAEgCpWVlYWgwYNilGjRsUll1xSaZ/z3nvvRbdu3WLXrl2xadOmLyw4b7jhhlizZk3cfvvt\nlZaFmmfdunXxwgsvVJSZCxYsiHbt2lUUmgUFBdG2bdvIyclJOipUO2VlZbFgwYKKsnP9+vUxYsSI\nKCoqihNPPDEOOuigpCNSQ5WXl8dhhx0WL774YrRp0ybpONXWk08+Gd/5znfi8ssvjx/+8If+gYMa\nQcEJAAl48803Y+DAgbFw4cI44ogj0j6/vLw8TjnllFixYkV84xvfiFtuueULC84BAwbEz372szj1\n1FPTnoOaoby8PN59992YM2dORaG5fPny6Nu3b0WZ2b9//2jSpEnSUaFGKikpqSg7S0pKYtiwYVFU\nVBRDhw6NBg0aJB2PGmbMmDFxyimnxHe/+92ko1Q7O3bsiJ/+9Kfx0EMPxcMPPxwDBw5MOhJUGQUn\nACTk+uuvj4ULF0YqlUr77DvuuCOuuOKKePbZZ+OZZ56J66+/fo8F59/+9rfo0KFDfPzxx1G3bt20\n56B62rlzZyxatGi3QnPXrl0VFwEVFBREr169ok6dOklHBf7J6tWrY+rUqZFKpWLevHlRWFgYRUVF\nccYZZ8Shhx6adDxqgPvvvz9mzZoVDz/8cNJRqpX33nsvRo8eHY0aNYrx48c7kk6NY08ZABJy7bXX\nRklJSfzpT39K69w333wzrr322rj88su/8mHyTz31VJx00knKTb7Uhg0b4umnn45/+7d/iyFDhsTB\nBx8c3/rWt2LJkiVx+umnx3PPPRcffPBBPPbYY3HFFVfEcccdp9yEDNWyZcu46KKLYsaMGfHee+/F\neeedF08//XR06tQpBg4cGLfeemssX7486ZhUY0OGDIlnnnkm7Fqlz+OPPx59+vSJM888M5544gnl\nJjWSp7gDQELq1q0b99xzT5x77rkxePDgaNy48QHP3LlzZ4wdOzaOPPLIuPHGG7/y9U888UScdtpp\nB/y5VC8rV66s2MycM2dOLFu2LHr37h0FBQVx5ZVXRv/+/aNp06ZJxwQOUOPGjWPMmDExZsyYKC0t\njVmzZkUqlYr+/ftHixYtKi4p6tmzp+flkjZt27aNBg0axOLFi6Nr165Jx8lqO3bsiJ/85CcxceLE\nmDx5chQUFCQdCRKj4ASABBUWFsbw4cPjxz/+cfzXf/3XAc/7+c9/HgsXLow5c+ZE/fr1v/S1O3fu\njKeeeip+/etfH/Dnkr127doVr7322m6FZmlpacVx8/PPPz++9rWvuZQEqrm6devG8OHDY/jw4XHX\nXXfF/PnzI5VKxdlnnx07duyoKDtPOOGEyM3110gOzJAhQ2LmzJkKzgOwcuXKGD16dBx88MHxyiuv\nxCGHHJJ0JEiUI+oAkLD/+I//iD/96U/xwgsvHNCcv/zlL3HjjTfGD37wg+jfv/9evf6II46I1q1b\nH9Dnkl02bdoUM2fOjOuvvz5OPfXUaNq0aZx77rmxaNGi+PrXvx7PPPNMfPTRRzF58uT4wQ9+EP36\n9VNuQg1Tu3btKCgoiJtvvjnefvvtiiOvV111VRx22GHx7W9/O6ZMmRJbtmxJOipZ6uSTT45Zs2Yl\nHSNrTZs2Lfr27RtFRUUxbdo05SaES4YAICM88sgj8ctf/jJeeeWV/Xp24c6dO6NLly5Ru3btWLhw\n4W7P1PzZz362x0uGfvzjH0dOTk7ccMMNafk5kJlWrVpVsZ05d+7cWLp0afTq1atiQ3PAgAHRrFmz\npGMCWWLlypUxZcqUSKVSsWDBghg8eHAUFRXFaaed5s8S9tpnlxz+7W9/88zmfbBjx4740Y9+FJMm\nTYoJEybEgAEDko4EGUPBCQAZoLy8PE4//fQ44YQT4kc/+tE+v3/dunVx8MEH79VrL7/88rj99tuj\nR48e8dvf/tbzmqqRXbt2xeLFi3e73XzTpk1RUFBQUWj27t3bpVJAWnz66afx+OOPRyqVilmzZkXv\n3r1j5MiRMXLkyDjyyCOTjkeG+9rXvhb/7//9PyXdXnr33XfjnHPOiebNm8d///d/+wcF+CcKTgDI\nEO+880706dMnXnjhhejYseM+vXfr1q1x6aWX7vFrr7zySixcuDBOOOGE6Ny5c5xyyikxYMCA6NWr\nV3z00UdRu3btdMQnAZs3b44XX3yxotCcP39+tGjRYrdCs1OnTi4HASrdli1b4n/+538ilUrFtGnT\nok2bNhXP7ezSpYs/h/icq6++Oho2bBj/9m//lnSUjDdlypT413/917jmmmviyiuv9PsJ9kDBCQAZ\n5De/+U088cQTMXPmzLR987qnI+r33ntvzJ49Ox566KG0fAZV44MPPqi4CGju3LmxZMmS6NGjR0Wh\nOWDAgGjevHnSMYEabufOnTFnzpxIpVKRSqUiNze3ouzs16+ff1gjIiJmzJgRN910U8yePTvpKBlr\n+/btce2118bkyZNj4sSJ0a9fv6QjQcZy/R0AZJDLLrssHnrooSguLo5x48ZV2uc88cQTcc4551Ta\nfA5cWVlZLFmyZLdCc/369TFgwIAoKCiI3/zmN9GnT5+oX79+0lEBdpObmxuDBg2KQYMGxW233Rav\nvvpqpFKpuPjii+PDDz+MM888M4qKimLw4MFRr169pOOSkIEDB8ZZZ50Vmzdvjvz8/KTjZJx33nkn\nzjnnnGjRokW88sor0bRp06QjQUZzizoAZJDc3Nz43e9+F1dffXWsWbOmUj5j27Zt8ec//zm+/vWv\nV8p89s+WLVti9uzZceONN8bw4cOjWbNmUVRUFC+88EIUFhbG448/HmvWrIlp06bFtddeGwMHDlRu\nAhkvJycnevXqFddff30sWrQo5s2bF8ccc0z86le/isMOOyxGjRoVEyZMiPXr1ycdlSqWn58fvXv3\njueffz7pKBknlUrFcccdF6NHj44pU6YoN2EvOKIOABnoBz/4QaxZsybGjx+f9tlPP/10XH/99TF3\n7ty0z2bvffTRRxUXAc2ZMyfeeOON6NatWxQUFFT816JFi6RjAlSajz/+OKZNmxapVCpmz54d/fv3\nj6KiojjzzDOjZcuWScejCvziF7+IDRs2xM0335x0lIywffv2uOaaa2LKlCkxceLEOP7445OOBFlD\nwQkAGWjTpk3RtWvXuO++++Lkk09O6+zLL788WrRoET/+8Y/TOpcvVlZWFkuXLt2t0Pzkk08qjpsX\nFBRE3759Iy8vL+moAInYtGlTzJgxI1KpVEyfPj06depU8dzOzp07Jx2PSjJv3rz43ve+FwsXLkw6\nSuKWL18e55xzTrRq1SoeeOCBOPjgg5OOBFlFwQkAGWr69Olx2WWXxWuvvZa24qu8vDw6duwYjz32\nWPTs2TMtM/m8bdu2xUsvvVRRaM6bNy8aN25ccbN5QUFBHHvssVGrlqcFAfyz7du3x+zZsysuKWrU\nqFFF2dmnTx9/dlYjO3bsiObNm8eyZcvikEMOSTpOYiZPnhwXXXRR/OQnP4nLLrvMLemwHxScAJDB\nRo8eHe3atYubbropLfNKSkpiyJAh8d577/nmOY3WrFlTUWbOnTs3Fi1aFMcee+xuhebhhx+edEyA\nrFNWVhYLFiyoKDvXr18fI0aMiKKiojjxxBPjoIMOSjoiB+iMM86IsWPHxqhRo5KOUuVKS0vj6quv\njscffzweeeSR6Nu3b9KRIGspOAEgg3344YfRvXv3mDlzZnTv3v2A5912223x5ptvxr333puGdDVT\neXl5lJSU7FZofvTRR9GvX7+KQvO4445zIyxAJSgpKakoO0tKSmLYsGFRVFQUQ4cOjQYNGiQdj/1w\nxx13xOOPPx5HH310vPrqq7Fo0aLYuHFjnHfeefHggw9+4fvmzZsXv/zlL2P+/PmxdevW6NixY3z3\nu9+NSy+9NGrXrl2FP4P9s3z58hg1alQceeSR8fvf/z6aNGmSdCTIagpOAMhwv/vd7+L++++PuXPn\nHvA37CeffHJccsklMXLkyDSlq/5KS0tjwYIFux03z8/Pj4KCgopCs0uXLlnxlymA6mT16tUxderU\nSKVSMW/evCgsLIyioqI444wz4tBDD006HnvpjTfeiN69e8f27dujQYMG0bp161i6dOmXFpxTpkyJ\nb37zm1GvXr0455xzomnTpjFt2rQoKSmJs846KyZNmlTFP4t989hjj8XFF18c1113XVx66aVO1UAa\nKDgBIMOVlZXFoEGDYtSoUXHJJZfs95yNGzdGy5Yt44MPPrDl8iU++eSTmDdvXsyZMyfmzp0br776\nanTu3Hm3QrNVq1ZJxwTgH6xfvz6mT58eqVQqnnrqqejWrVvFczvbt2+fdDy+RHl5eTRr1iwee+yx\nOOmkk2L27Nlx0kknfWHBuWHDhjjqqKNi/fr1MXfu3OjTp09E/O/zrwcPHhwvvPBCTJgwIUaPHl3V\nP5WvtG3btrjqqqviySefjIkTJzqSDmmUm3QAAODL1apVK+65554oLCyMkSNHRuvWrfdrzsyZM6N/\n//7KzX9QXl4ey5Ytq7jZfO7cubF69eo4/vjjo6CgIK6//vo4/vjj/ZoBZLjGjRvHmDFjYsyYMVFa\nWhqzZs2KVCoV/fv3jxYtWlSUnT179rQtl2FycnJi2LBhsXz58hg8ePBXvv6xxx6LNWvWxLhx4yrK\nzYiIevXqxS9/+csYMmRI3HXXXRlXcC5btixGjRoV7du3j5dfftmRdEgz188BQBY45phj4nvf+15c\neuml+z3jiSeeiNNOOy2NqbLP9u3bY/78+XHrrbdGUVFRHHbYYTFkyJB46qmnomfPnjFhwoT49NNP\n4+mnn45///d/jyFDhig3AbJM3bp1Y/jw4XHvvffG6tWr46677oqtW7fG2WefHW3bto3LL788nn32\n2di5c2fSUfm7IUOGxKxZs/bqtc8880xERAwdOvRzXyssLIy8vLyYN29elJaWpjXjgXj00UdjwIAB\nccEFF8SkSZOUm1AJHFEHgCxRWloaPXr0iJtuuimKior26b3l5eXRqlWrmD17dnTs2LGSEmaetWvX\nxrx58yo2NF955ZXo2LFjxc3mBQUFceSRRyYdE4AqUF5eHosXL664pOidd96J008/PYqKiuKUU06J\nvLy8pCPWWCtXroy+ffvGBx98EM8999yXHlHv27dvLFiwIBYsWBC9e/f+3Ne7du0aixcvjiVLlsQx\nxxxTFfG/0LZt2+LKK6+Mp556Kh599NE95gXSwxF1AMgSdevWjXvvvTfOO++8GDJkSDRq1Giv37tw\n4cJo0KBBtS43y8vLY/ny5RWXAc2ZMyfee++9OO6446KgoCCuu+666Nev3z79ugFQfeTk5ETXrl2j\na9eucd1118XKlStjypQpceedd8a4ceNi8ODBUVRUFKeddlo0a9Ys6bg1ypFHHhmNGjWKN9544ytf\nu379+oj438cS7MlnP75u3br0BdwPb7/9dowaNSo6duwYr7zyyhfmBdLDEXUAyCKFhYUxdOjQ+PGP\nf7xP75s+fXq1O56+Y8eOePHFF+O2226Ls846Kw4//PAoLCyMJ554Irp06RLjx4+PTz/9NGbOnBnX\nX399nHrqqcpNACoceeSRcemll8asWbNixYoVUVRUFKlUKtq3bx+DBw+OO++8M1auXJl0zBrj5JNP\n3utj6plu4sSJMWDAgLjwwgvjkUceUW5CFbDBCQBZ5te//nV06dIlzjvvvOjfv/9eveeJJ56In//8\n55WcrHKtW7cuXnjhhYoNzQULFkT79u2joKAgioqK4pZbbok2bdq4PAKAfda0adMYN25cjBs3LrZs\n2RL/8z//E6lUKn7+859HmzZtKi4p6tKli//PVJIhQ4bEAw88EL169frS131WFn62yfnPPvvxJJ5z\nuXXr1rjiiiti1qxZ8fTTT3/lzwVIHwUnAGSZgw8+OH7zm9/Ev/7rv8Yrr7wSderU2e3r5eXlsW3b\ntsjJyYm6devG3/72t1iyZEkUFhYmlHjflZeXxzvvvFNRZs6dOzdWrFgRffv2jYKCgvjhD38Y/fr1\n85B+ANIuLy8vRowYESNGjIidO3fGnDlzIpVKxemnnx65ubkVZWe/fv2idu3aScetNk466aS44IIL\n4oorrvjS13Xu3DkWLFgQb7311ueeablz585YsWJF5ObmRvv27Ssz7ue89dZbMWrUqDj66KPj5Zdf\ndmoEqpgj6gCQhc4555w44ogj4pZbbomIiJKSkrjyyiuje/fuUb9+/WjYsGE0aNAgGjZsGP369YuW\nLVvGp59+mnDqL7Zz585YsGBB3HHHHTFq1Kho3bp1DBgwIKZMmRKdO3eO+++/Pz799NN45pln4he/\n+EUMHTpUuQlApcvNzY1BgwbF7bffHitWrIhJkyZFfn5+XHzxxdGyZcu48MILY/r06bFt27ako2a9\nZs2axVFHHRVvvvnml75u8ODBERExY8aMz33tueeeiy1btsSAAQOibt26lZJzTyZMmBAFBQVx0UUX\nxYQJE5Sbe9TqOQAAIABJREFUkAC3qANAlnrnnXeiV69ecdRRR8XixYtj586dsWPHjj2+tk6dOlGr\nVq0YOXJk/Pa3v42mTZtWcdrdbdiwYbfj5i+99FIceeSRccIJJ1Tcbt6uXTvHAAHIWH/9619jypQp\nkUql4rXXXotTTz01ioqKYvjw4Z65uJ+uueaa+Pjjj+MPf/jDF96ivmHDhujQoUNs2LAh5s6dG336\n9ImI/72xfPDgwfHCCy/EhAkTYvTo0ZWed+vWrfH9738//vznP8ejjz4aPXv2rPTPBPZMwQkAWere\ne++NSy655AtLzT056KCDIi8vLyZNmhQnn3xyJabb3cqVK2POnDkVheayZcuid+/eFYVm//794+CD\nD66yPACQTh9//HFMmzYtUqlUzJ49O/r37x9FRUVx5plnRsuWLZOOl/FSqVSkUqlYvXp1vPTSS7Fu\n3bpo3759DBw4MCIiDjnkkIpTK5+9/qyzzop69erF6NGjo2nTpjF16tQoKSmJs846Kx599NFK/0fS\nkpKSGDVqVBx77LFxzz332NqEhCk4ASAL3XDDDXHjjTfGli1b9uv99evXj4kTJ8aZZ56Z5mT/e9z8\n9ddf363Q3L59exQUFFQUmr169YqDDjoo7Z8NAEnbtGlTzJgxI1KpVEyfPj06depU8dzOzp07Jx0v\nI/3sZz+L66+//gu/3qZNm3jnnXd2+7G5c+fGDTfcEC+88EJs27YtjjrqqPjud78bl112WaU/G/Wh\nhx6K73//+3HDDTfEhRde6MQJZAAFJwBkmT/+8Y8Vt7weiLy8vJg/f35069btgOZs3Lgx/vKXv8Tc\nuXNjzpw58eKLL0arVq12KzQ7dOjgm38Aapzt27fH7NmzKzYUGzVqVFF29unTJ2rVci3GPzvppJPi\nmmuuiWHDhiUd5XO2bNkSl112WTz//PPx6KOPRo8ePZKOBPydghMAssiaNWuiY8eOsX79+gOelZOT\nE506dYrXX3/9czexf5lVq1ZVbGbOmTMn3nrrrejVq1dFodm/f/9o1qzZAecDgOqkrKwsFixYUFF2\nrl+/PkaMGBFFRUVx4oknOtnwd7/85S9j7dq1ceuttyYdZTdLly6Ns88+O7p37x533313NGzYMOlI\nwD9QcAJAFvm///f/xu9///vYvn17Wubl5+fHHXfcERdccMEev75r16544403dis0t2zZUnERUEFB\n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\nHQUAAIBKpuAEoNopLi6O8847L2rXrp10FAAAACqZS4YAqFbKysqiXbt2MW3atOjevXvScQAAAKhk\nNjgBqFaee+65OPjgg5WbAAAANYSCE4BqZfz48TF27NikYwAAAFBFHFEHoNrYsmVLtGrVKpYsWRKH\nH3540nEAAACoAjY4Aag2pk6dGscff7xyEwAAoAZRcAJQbTieDgAAUPM4og5AVtm2bVssWrQoVq1a\nFWVlZdG0adPo1atXbN++PY455phYtWpV5OfnJx0TAACAKpKbdAAA+CqlpaUxefLkuPnmm+P111+P\nvLy8iq/l5OTE1q1bo169etGhQ4fYsmWLghMAAKAGscEJQEZ77rnnYvTo0bFx48bYtGnTl762bt26\nUbt27bjxxhvj0ksvjVq1PIkFAACgulNwApCRysvL47rrrovbbrsttm7duk/vzc/Pj169esWTTz4Z\nDRo0qKSEAAAAZAIFJwAZ6Zprronf/va3sXnz5v16f926daNLly7x/PPP73akHQAAgOrF2T0AMs7U\nqVPjv/7rv/a73Iz43+d2LlmyJC6//PI0JgMAACDT2OAEIKOsXbs2OnToEGvXrk3LvPr168eTTz4Z\nJ554YlrmAQAAkFlscAKQUe66667Ytm1b2uZt3bo1rr766rTNAwAAILPY4AQgY5SVlcXhhx8eH3/8\ncVrn1q9fP15++eU45phj0joXAACA5NngBCBjLFmyJLZs2ZL2ubt27Yonn3wy7XMBAABInoITgIzx\n8ssvV8rc7du3x7PPPlspswEAAEiWghOAjPHWW2/Fpk2bKmV2SUlJpcwFAAAgWQpOADJGOi8X+mfb\nt2+vtNkAAAAkR8EJQMZo0qRJ1K5du1JmN2zYsFLmAgAAkCwFJwAZo0ePHpGfn18ps/v27VspcwEA\nAEiWghOAjNGnT58oLS1N+9z8/PwYOHBg2ucCAACQPAUnABmjZcuW0a1bt7TP3bVrV4wcOTLtcwEA\nAEieghOAjPLDH/4wGjRokLZ5derUiW9+85vRpEmTtM0EAAAgc+SUl5eXJx0CAD5TVlYW/fr1i1de\neSV27dp1wPMaNGgQb731Vhx++OFpSAcAAECmscEJQEapVatWTJw4MerXr3/As/Ly8uLuu+9WbgIA\nAFRjCk4AMk779u1j2rRpkZeXt98z8vLy4uqrr47zzjsvjckAAADINI6oA5Cx/vKXv8SIESNiw4YN\nsXWJjvv4AAAEhElEQVTr1r16T+3ataNu3bpx8803x8UXX1zJCQEAAEiaDU4AMtbxxx8fy5Yti299\n61tRr169L93orFOnTtSrVy8KCgritddeU24CAADUEDY4AcgK69atiz/84Q8xZcqUWLRoUXz66acR\nEVG/fv045phjYsiQIXHhhRdGx44dE04KAABAVVJwApCVysvLo7y8PGrVchgBAACgJlNwAgAAAABZ\ny9oLAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAA\nWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAA\nQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAA\nAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAA\nAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIA\nAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwA\nAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUn\nAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvB\nCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZS\ncAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1\nFJwAAAAAQNZScAIAAAAAWUvBCQAAAABkLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCQAAAABk\nLQUnAAAAAJC1FJwAAAAAQNZScAIAAAAAWUvBCfD/tWMHJAAAAACC/r9uR6AzBAAAALYEJwAAAACw\nJTgBAAAAgC3BCQAAAABsCU4AAAAAYEtwAgAAAABbghMAAAAA2BKcAAAAAMCW4AQAAAAAtgQnAAAA\nALAlOAEAAACALcEJAAAAAGwJTgAAAABgS3ACAAAAAFuCEwAAAADYEpwAAAAAwJbgBAAAAAC2BCcA\nAAAAsCU4AQAAAIAtwQkAAAAAbAlOAAAAAGBLcAIAAAAAW4ITAAAAANgSnAAAAADAluAEAAAAALYE\nJwAAAACwJTgBAAAAgC3BCQAAAABsCU4AAAAAYEtwAgAAAABbghMAAAAA2BKcAAAAAMCW4AQAAAAA\ntgQnAAAAALAlOAEAAACALcEJAAAAAGwJTgAAAABgS3ACAAAAAFuCEwAAAADYEpwAAAAAwJbgBAAA\nAAC2BCcAAAAAsCU4AQAAAIAtwQkAAAAAbAV+Oilx9KZ6ggAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Widget Javascript not detected. It may not be installed or enabled properly.\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f9d8fbb23a9f446585fac31b107eb123" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import ipywidgets as widgets\n", - "from IPython.display import display\n", - "\n", - "iteration_slider = widgets.IntSlider(min=0, max=len(coloring_problem1.assignment_history)-1, step=1, value=0)\n", - "w=widgets.interactive(step_func,iteration=iteration_slider)\n", - "display(w)\n", - "\n", - "visualize_callback = make_visualize(iteration_slider)\n", - "\n", - "visualize_button = widgets.ToggleButton(desctiption = \"Visualize\", value = False)\n", - "time_select = widgets.ToggleButtons(description='Extra Delay:',options=['0', '0.1', '0.2', '0.5', '0.7', '1.0'])\n", - "\n", - "a = widgets.interactive(visualize_callback, Visualize = visualize_button, time_step=time_select)\n", - "display(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## N-QUEENS VISUALIZATION\n", - "\n", - "Just like the Graph Coloring Problem we will start with defining a few helper functions to help us visualize the assignments as they evolve over time. The **make_plot_board_step_function** behaves similar to the **make_update_step_function** introduced earlier. It initializes a chess board in the form of a 2D grid with alternating 0s and 1s. This is used by **plot_board_step** function which draws the board using matplotlib and adds queens to it. This function also calls the **label_queen_conflicts** which modifies the grid placing 3 in positions in a position where there is a conflict." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def label_queen_conflicts(assignment,grid):\n", - " ''' Mark grid with queens that are under conflict. '''\n", - " for col, row in assignment.items(): # check each queen for conflict\n", - " row_conflicts = {temp_col:temp_row for temp_col,temp_row in assignment.items() \n", - " if temp_row == row and temp_col != col}\n", - " up_conflicts = {temp_col:temp_row for temp_col,temp_row in assignment.items() \n", - " if temp_row+temp_col == row+col and temp_col != col}\n", - " down_conflicts = {temp_col:temp_row for temp_col,temp_row in assignment.items() \n", - " if temp_row-temp_col == row-col and temp_col != col}\n", - " \n", - " # Now marking the grid.\n", - " for col, row in row_conflicts.items():\n", - " grid[col][row] = 3\n", - " for col, row in up_conflicts.items():\n", - " grid[col][row] = 3\n", - " for col, row in down_conflicts.items():\n", - " grid[col][row] = 3\n", - "\n", - " return grid\n", - "\n", - "def make_plot_board_step_function(instru_csp):\n", - " '''ipywidgets interactive function supports\n", - " single parameter as input. This function\n", - " creates and return such a function by taking\n", - " in input other parameters.\n", - " '''\n", - " n = len(instru_csp.variables)\n", - " \n", - " \n", - " def plot_board_step(iteration):\n", - " ''' Add Queens to the Board.'''\n", - " data = instru_csp.assignment_history[iteration]\n", - " \n", - " grid = [[(col+row+1)%2 for col in range(n)] for row in range(n)]\n", - " grid = label_queen_conflicts(data, grid) # Update grid with conflict labels.\n", - " \n", - " # color map of fixed colors\n", - " cmap = matplotlib.colors.ListedColormap(['white','lightsteelblue','red'])\n", - " bounds=[0,1,2,3] # 0 for white 1 for black 2 onwards for conflict labels (red).\n", - " norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N)\n", - " \n", - " fig = plt.imshow(grid, interpolation='nearest', cmap = cmap,norm=norm)\n", - "\n", - " plt.axis('off')\n", - " fig.axes.get_xaxis().set_visible(False)\n", - " fig.axes.get_yaxis().set_visible(False)\n", - "\n", - " # Place the Queens Unicode Symbol\n", - " for col, row in data.items():\n", - " fig.axes.text(row, col, u\"\\u265B\", va='center', ha='center', family='Dejavu Sans', fontsize=32)\n", - " plt.show()\n", - " \n", - " return plot_board_step" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us visualize a solution obtained via backtracking. We use of the previosuly defined **make_instru** function for keeping a history of steps." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "twelve_queens_csp = NQueensCSP(12)\n", - "backtracking_instru_queen = make_instru(twelve_queens_csp)\n", - "result = backtracking_search(backtracking_instru_queen)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "backtrack_queen_step = make_plot_board_step_function(backtracking_instru_queen) # Step Function for Widgets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now finally we set some matplotlib parameters to adjust how our plot will look. The font is necessary because the Black Queen Unicode character is not a part of all fonts. You can move the slider to experiment and observe the how queens are assigned. It is also possible to move the slider using arrow keys or to jump to the value by directly editing the number with a double click.The **Visualize Button** will automatically animate the slider for you. The **Extra Delay Box** allows you to set time delay in seconds upto one second for each time step.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Widget Javascript not detected. It may not be installed or enabled properly.\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e0cf790018f34082961a812b9bc7eb81" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)\n", - "matplotlib.rcParams['font.family'].append(u'Dejavu Sans')\n", - "\n", - "iteration_slider = widgets.IntSlider(min=0, max=len(backtracking_instru_queen.assignment_history)-1, step=0, value=0)\n", - "w=widgets.interactive(backtrack_queen_step,iteration=iteration_slider)\n", - "display(w)\n", - "\n", - "visualize_callback = make_visualize(iteration_slider)\n", - "\n", - "visualize_button = widgets.ToggleButton(desctiption = \"Visualize\", value = False)\n", - "time_select = widgets.ToggleButtons(description='Extra Delay:',options=['0', '0.1', '0.2', '0.5', '0.7', '1.0'])\n", - "\n", - "a = widgets.interactive(visualize_callback, Visualize = visualize_button, time_step=time_select)\n", - "display(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us finally repeat the above steps for **min_conflicts** solution." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "conflicts_instru_queen = make_instru(twelve_queens_csp)\n", - "result = min_conflicts(conflicts_instru_queen)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "conflicts_step = make_plot_board_step_function(conflicts_instru_queen)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The visualization has same features as the above. But here it also highlights the conflicts by labeling the conflicted queens with a red background." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Widget Javascript not detected. It may not be installed or enabled properly.\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a61406396a92432d9f8f40c6f7a52d3e" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "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", - "display(w)\n", - "\n", - "visualize_callback = make_visualize(iteration_slider)\n", - "\n", - "visualize_button = widgets.ToggleButton(desctiption = \"Visualize\", value = False)\n", - "time_select = widgets.ToggleButtons(description='Extra Delay:',options=['0', '0.1', '0.2', '0.5', '0.7', '1.0'])\n", - "\n", - "a = widgets.interactive(visualize_callback, Visualize = visualize_button, time_step=time_select)\n", - "display(a)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - }, - "widgets": { - "state": {}, - "version": "1.1.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/csp.py b/csp.py deleted file mode 100644 index 9e933c266..000000000 --- a/csp.py +++ /dev/null @@ -1,730 +0,0 @@ -"""CSP (Constraint Satisfaction Problems) problems and solvers. (Chapter 6).""" - -from utils import argmin_random_tie, count, first -import search - -from collections import defaultdict -from functools import reduce - -import itertools -import re -import random - - -class CSP(search.Problem): - """This class describes finite-domain Constraint Satisfaction Problems. - A CSP is specified by the following inputs: - variables A list of variables; each is atomic (e.g. int or string). - domains A dict of {var:[possible_value, ...]} entries. - neighbors A dict of {var:[var,...]} that for each variable lists - the other variables that participate in constraints. - constraints A function f(A, a, B, b) that returns true if neighbors - A, B satisfy the constraint when they have values A=a, B=b - - In the textbook and in most mathematical definitions, the - constraints are specified as explicit pairs of allowable values, - but the formulation here is easier to express and more compact for - most cases. (For example, the n-Queens problem can be represented - in O(n) space using this notation, instead of O(N^4) for the - explicit representation.) In terms of describing the CSP as a - problem, that's all there is. - - However, the class also supports data structures and methods that help you - solve CSPs by calling a search function on the CSP. Methods and slots are - as follows, where the argument 'a' represents an assignment, which is a - dict of {var:val} entries: - assign(var, val, a) Assign a[var] = val; do other bookkeeping - unassign(var, a) Do del a[var], plus other bookkeeping - nconflicts(var, val, a) Return the number of other variables that - conflict with var=val - curr_domains[var] Slot: remaining consistent values for var - Used by constraint propagation routines. - The following methods are used only by graph_search and tree_search: - actions(state) Return a list of actions - result(state, action) Return a successor of state - goal_test(state) Return true if all constraints satisfied - The following are just for debugging purposes: - nassigns Slot: tracks the number of assignments made - display(a) Print a human-readable representation - """ - - def __init__(self, variables, domains, neighbors, constraints): - """Construct a CSP problem. If variables is empty, it becomes domains.keys().""" - variables = variables or list(domains.keys()) - - self.variables = variables - self.domains = domains - self.neighbors = neighbors - self.constraints = constraints - self.initial = () - self.curr_domains = None - self.nassigns = 0 - - def assign(self, var, val, assignment): - """Add {var: val} to assignment; Discard the old value if any.""" - assignment[var] = val - self.nassigns += 1 - - def unassign(self, var, assignment): - """Remove {var: val} from assignment. - DO NOT call this if you are changing a variable to a new value; - just call assign for that.""" - if var in assignment: - del assignment[var] - - def nconflicts(self, var, val, assignment): - """Return the number of conflicts var=val has with other variables.""" - # Subclasses may implement this more efficiently - def conflict(var2): - return (var2 in assignment and - not self.constraints(var, val, var2, assignment[var2])) - return count(conflict(v) for v in self.neighbors[var]) - - def display(self, assignment): - """Show a human-readable representation of the CSP.""" - # Subclasses can print in a prettier way, or display with a GUI - print('CSP:', self, 'with assignment:', assignment) - - # These methods are for the tree and graph-search interface: - - def actions(self, state): - """Return a list of applicable actions: nonconflicting - assignments to an unassigned variable.""" - if len(state) == len(self.variables): - return [] - else: - assignment = dict(state) - var = first([v for v in self.variables if v not in assignment]) - return [(var, val) for val in self.domains[var] - if self.nconflicts(var, val, assignment) == 0] - - def result(self, state, action): - """Perform an action and return the new state.""" - (var, val) = action - return state + ((var, val),) - - def goal_test(self, state): - """The goal is to assign all variables, with all constraints satisfied.""" - assignment = dict(state) - return (len(assignment) == len(self.variables) - and all(self.nconflicts(variables, assignment[variables], assignment) == 0 - for variables in self.variables)) - - # These are for constraint propagation - - def support_pruning(self): - """Make sure we can prune values from domains. (We want to pay - for this only if we use it.)""" - if self.curr_domains is None: - self.curr_domains = {v: list(self.domains[v]) for v in self.variables} - - def suppose(self, var, value): - """Start accumulating inferences from assuming var=value.""" - self.support_pruning() - removals = [(var, a) for a in self.curr_domains[var] if a != value] - self.curr_domains[var] = [value] - return removals - - def prune(self, var, value, removals): - """Rule out var=value.""" - self.curr_domains[var].remove(value) - if removals is not None: - removals.append((var, value)) - - def choices(self, var): - """Return all values for var that aren't currently ruled out.""" - return (self.curr_domains or self.domains)[var] - - def infer_assignment(self): - """Return the partial assignment implied by the current inferences.""" - self.support_pruning() - return {v: self.curr_domains[v][0] - for v in self.variables if 1 == len(self.curr_domains[v])} - - def restore(self, removals): - """Undo a supposition and all inferences from it.""" - for B, b in removals: - self.curr_domains[B].append(b) - - # This is for min_conflicts search - - def conflicted_vars(self, current): - """Return a list of variables in current assignment that are in conflict""" - return [var for var in self.variables - if self.nconflicts(var, current[var], current) > 0] - -# ______________________________________________________________________________ -# Constraint Propagation with AC-3 - - -def AC3(csp, queue=None, removals=None): - """[Figure 6.3]""" - if queue is None: - queue = [(Xi, Xk) for Xi in csp.variables for Xk in csp.neighbors[Xi]] - csp.support_pruning() - while queue: - (Xi, Xj) = queue.pop() - if revise(csp, Xi, Xj, removals): - if not csp.curr_domains[Xi]: - return False - for Xk in csp.neighbors[Xi]: - if Xk != Xi: - queue.append((Xk, Xi)) - return True - - -def revise(csp, Xi, Xj, removals): - """Return true if we remove a value.""" - revised = False - for x in csp.curr_domains[Xi][:]: - # If Xi=x conflicts with Xj=y for every possible y, eliminate Xi=x - if all(not csp.constraints(Xi, x, Xj, y) for y in csp.curr_domains[Xj]): - csp.prune(Xi, x, removals) - revised = True - return revised - -# ______________________________________________________________________________ -# CSP Backtracking Search - -# Variable ordering - - -def first_unassigned_variable(assignment, csp): - """The default variable order.""" - return first([var for var in csp.variables if var not in assignment]) - - -def mrv(assignment, csp): - """Minimum-remaining-values heuristic.""" - return argmin_random_tie( - [v for v in csp.variables if v not in assignment], - key=lambda var: num_legal_values(csp, var, assignment)) - - -def num_legal_values(csp, var, assignment): - if csp.curr_domains: - return len(csp.curr_domains[var]) - else: - return count(csp.nconflicts(var, val, assignment) == 0 - for val in csp.domains[var]) - -# Value ordering - - -def unordered_domain_values(var, assignment, csp): - """The default value order.""" - return csp.choices(var) - - -def lcv(var, assignment, csp): - """Least-constraining-values heuristic.""" - return sorted(csp.choices(var), - key=lambda val: csp.nconflicts(var, val, assignment)) - -# Inference - - -def no_inference(csp, var, value, assignment, removals): - return True - - -def forward_checking(csp, var, value, assignment, removals): - """Prune neighbor values inconsistent with var=value.""" - for B in csp.neighbors[var]: - if B not in assignment: - for b in csp.curr_domains[B][:]: - if not csp.constraints(var, value, B, b): - csp.prune(B, b, removals) - if not csp.curr_domains[B]: - return False - return True - - -def mac(csp, var, value, assignment, removals): - """Maintain arc consistency.""" - return AC3(csp, [(X, var) for X in csp.neighbors[var]], removals) - -# The search, proper - - -def backtracking_search(csp, - select_unassigned_variable=first_unassigned_variable, - order_domain_values=unordered_domain_values, - inference=no_inference): - """[Figure 6.5]""" - - def backtrack(assignment): - if len(assignment) == len(csp.variables): - return assignment - var = select_unassigned_variable(assignment, csp) - for value in order_domain_values(var, assignment, csp): - if 0 == csp.nconflicts(var, value, assignment): - csp.assign(var, value, assignment) - removals = csp.suppose(var, value) - if inference(csp, var, value, assignment, removals): - result = backtrack(assignment) - if result is not None: - return result - csp.restore(removals) - csp.unassign(var, assignment) - return None - - result = backtrack({}) - assert result is None or csp.goal_test(result) - return result - -# ______________________________________________________________________________ -# Min-conflicts hillclimbing search for CSPs - - -def min_conflicts(csp, max_steps=100000): - """Solve a CSP by stochastic hillclimbing on the number of conflicts.""" - # Generate a complete assignment for all variables (probably with conflicts) - csp.current = current = {} - for var in csp.variables: - val = min_conflicts_value(csp, var, current) - csp.assign(var, val, current) - # Now repeatedly choose a random conflicted variable and change it - for i in range(max_steps): - conflicted = csp.conflicted_vars(current) - if not conflicted: - return current - var = random.choice(conflicted) - val = min_conflicts_value(csp, var, current) - csp.assign(var, val, current) - return None - - -def min_conflicts_value(csp, var, current): - """Return the value that will give var the least number of conflicts. - If there is a tie, choose at random.""" - return argmin_random_tie(csp.domains[var], - key=lambda val: csp.nconflicts(var, val, current)) - -# ______________________________________________________________________________ - - -def tree_csp_solver(csp): - """[Figure 6.11]""" - assignment = {} - root = csp.variables[0] - X, parent = topological_sort(csp, root) - - csp.support_pruning() - for Xj in reversed(X[1:]): - if not make_arc_consistent(parent[Xj], Xj, csp): - return None - - assignment[root] = csp.curr_domains[root][0] - for Xi in X[1:]: - assignment[Xi] = assign_value(parent[Xi], Xi, csp, assignment) - if not assignment[Xi]: - return None - return assignment - - -def topological_sort(X, root): - """Returns the topological sort of X starting from the root. - - Input: - X is a list with the nodes of the graph - N is the dictionary with the neighbors of each node - root denotes the root of the graph. - - Output: - stack is a list with the nodes topologically sorted - parents is a dictionary pointing to each node's parent - - Other: - visited shows the state (visited - not visited) of nodes - - """ - neighbors = X.neighbors - - visited = defaultdict(lambda: False) - - stack = [] - parents = {} - - build_topological(root, None, neighbors, visited, stack, parents) - return stack, parents - - -def build_topological(node, parent, neighbors, visited, stack, parents): - """Builds the topological sort and the parents of each node in the graph""" - visited[node] = True - - for n in neighbors[node]: - if(not visited[n]): - build_topological(n, node, neighbors, visited, stack, parents) - - parents[node] = parent - stack.insert(0, node) - - -def make_arc_consistent(Xj, Xk, csp): - """Make arc between parent (Xj) and child (Xk) consistent under the csp's constraints, - by removing the possible values of Xj that cause inconsistencies.""" - #csp.curr_domains[Xj] = [] - for val1 in csp.domains[Xj]: - keep = False # Keep or remove val1 - for val2 in csp.domains[Xk]: - if csp.constraints(Xj, val1, Xk, val2): - # Found a consistent assignment for val1, keep it - keep = True - break - - if not keep: - # Remove val1 - csp.prune(Xj, val1, None) - - return csp.curr_domains[Xj] - - -def assign_value(Xj, Xk, csp, assignment): - """Assign a value to Xk given Xj's (Xk's parent) assignment. - Return the first value that satisfies the constraints.""" - parent_assignment = assignment[Xj] - for val in csp.curr_domains[Xk]: - if csp.constraints(Xj, parent_assignment, Xk, val): - return val - - # No consistent assignment available - return None - -# ______________________________________________________________________________ -# Map-Coloring Problems - - -class UniversalDict: - """A universal dict maps any key to the same value. We use it here - as the domains dict for CSPs in which all variables have the same domain. - >>> d = UniversalDict(42) - >>> d['life'] - 42 - """ - - def __init__(self, value): self.value = value - - def __getitem__(self, key): return self.value - - def __repr__(self): return '{{Any: {0!r}}}'.format(self.value) - - -def different_values_constraint(A, a, B, b): - """A constraint saying two neighboring variables must differ in value.""" - return a != b - - -def MapColoringCSP(colors, neighbors): - """Make a CSP for the problem of coloring a map with different colors - for any two adjacent regions. Arguments are a list of colors, and a - dict of {region: [neighbor,...]} entries. This dict may also be - specified as a string of the form defined by parse_neighbors.""" - if isinstance(neighbors, str): - neighbors = parse_neighbors(neighbors) - return CSP(list(neighbors.keys()), UniversalDict(colors), neighbors, - different_values_constraint) - - -def parse_neighbors(neighbors, variables=[]): - """Convert a string of the form 'X: Y Z; Y: Z' into a dict mapping - regions to neighbors. The syntax is a region name followed by a ':' - followed by zero or more region names, followed by ';', repeated for - each region name. If you say 'X: Y' you don't need 'Y: X'. - >>> parse_neighbors('X: Y Z; Y: Z') == {'Y': ['X', 'Z'], 'X': ['Y', 'Z'], 'Z': ['X', 'Y']} - True - """ - dic = defaultdict(list) - specs = [spec.split(':') for spec in neighbors.split(';')] - for (A, Aneighbors) in specs: - A = A.strip() - for B in Aneighbors.split(): - dic[A].append(B) - dic[B].append(A) - return dic - - -australia = MapColoringCSP(list('RGB'), - 'SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: ') - -usa = MapColoringCSP(list('RGBY'), - """WA: OR ID; OR: ID NV CA; CA: NV AZ; NV: ID UT AZ; ID: MT WY UT; - UT: WY CO AZ; MT: ND SD WY; WY: SD NE CO; CO: NE KA OK NM; NM: OK TX; - ND: MN SD; SD: MN IA NE; NE: IA MO KA; KA: MO OK; OK: MO AR TX; - TX: AR LA; MN: WI IA; IA: WI IL MO; MO: IL KY TN AR; AR: MS TN LA; - LA: MS; WI: MI IL; IL: IN KY; IN: OH KY; MS: TN AL; AL: TN GA FL; - MI: OH IN; OH: PA WV KY; KY: WV VA TN; TN: VA NC GA; GA: NC SC FL; - PA: NY NJ DE MD WV; WV: MD VA; VA: MD DC NC; NC: SC; NY: VT MA CT NJ; - NJ: DE; DE: MD; MD: DC; VT: NH MA; MA: NH RI CT; CT: RI; ME: NH; - HI: ; AK: """) - -france = MapColoringCSP(list('RGBY'), - """AL: LO FC; AQ: MP LI PC; AU: LI CE BO RA LR MP; BO: CE IF CA FC RA - AU; BR: NB PL; CA: IF PI LO FC BO; CE: PL NB NH IF BO AU LI PC; FC: BO - CA LO AL RA; IF: NH PI CA BO CE; LI: PC CE AU MP AQ; LO: CA AL FC; LR: - MP AU RA PA; MP: AQ LI AU LR; NB: NH CE PL BR; NH: PI IF CE NB; NO: - PI; PA: LR RA; PC: PL CE LI AQ; PI: NH NO CA IF; PL: BR NB CE PC; RA: - AU BO FC PA LR""") - -# ______________________________________________________________________________ -# n-Queens Problem - - -def queen_constraint(A, a, B, b): - """Constraint is satisfied (true) if A, B are really the same variable, - or if they are not in the same row, down diagonal, or up diagonal.""" - return A == B or (a != b and A + a != B + b and A - a != B - b) - - -class NQueensCSP(CSP): - """Make a CSP for the nQueens problem for search with min_conflicts. - Suitable for large n, it uses only data structures of size O(n). - Think of placing queens one per column, from left to right. - That means position (x, y) represents (var, val) in the CSP. - The main structures are three arrays to count queens that could conflict: - rows[i] Number of queens in the ith row (i.e val == i) - downs[i] Number of queens in the \ diagonal - such that their (x, y) coordinates sum to i - ups[i] Number of queens in the / diagonal - such that their (x, y) coordinates have x-y+n-1 = i - We increment/decrement these counts each time a queen is placed/moved from - a row/diagonal. So moving is O(1), as is nconflicts. But choosing - a variable, and a best value for the variable, are each O(n). - If you want, you can keep track of conflicted variables, then variable - selection will also be O(1). - >>> len(backtracking_search(NQueensCSP(8))) - 8 - """ - - def __init__(self, n): - """Initialize data structures for n Queens.""" - CSP.__init__(self, list(range(n)), UniversalDict(list(range(n))), - UniversalDict(list(range(n))), queen_constraint) - - self.rows = [0]*n - self.ups = [0]*(2*n - 1) - self.downs = [0]*(2*n - 1) - - def nconflicts(self, var, val, assignment): - """The number of conflicts, as recorded with each assignment. - Count conflicts in row and in up, down diagonals. If there - is a queen there, it can't conflict with itself, so subtract 3.""" - n = len(self.variables) - c = self.rows[val] + self.downs[var+val] + self.ups[var-val+n-1] - if assignment.get(var, None) == val: - c -= 3 - return c - - def assign(self, var, val, assignment): - """Assign var, and keep track of conflicts.""" - oldval = assignment.get(var, None) - if val != oldval: - if oldval is not None: # Remove old val if there was one - self.record_conflict(assignment, var, oldval, -1) - self.record_conflict(assignment, var, val, +1) - CSP.assign(self, var, val, assignment) - - def unassign(self, var, assignment): - """Remove var from assignment (if it is there) and track conflicts.""" - if var in assignment: - self.record_conflict(assignment, var, assignment[var], -1) - CSP.unassign(self, var, assignment) - - def record_conflict(self, assignment, var, val, delta): - """Record conflicts caused by addition or deletion of a Queen.""" - n = len(self.variables) - self.rows[val] += delta - self.downs[var + val] += delta - self.ups[var - val + n - 1] += delta - - def display(self, assignment): - """Print the queens and the nconflicts values (for debugging).""" - n = len(self.variables) - for val in range(n): - for var in range(n): - if assignment.get(var, '') == val: - ch = 'Q' - elif (var + val) % 2 == 0: - ch = '.' - else: - ch = '-' - print(ch, end=' ') - print(' ', end=' ') - for var in range(n): - if assignment.get(var, '') == val: - ch = '*' - else: - ch = ' ' - print(str(self.nconflicts(var, val, assignment)) + ch, end=' ') - print() - -# ______________________________________________________________________________ -# Sudoku - - -def flatten(seqs): - return sum(seqs, []) - - -easy1 = '..3.2.6..9..3.5..1..18.64....81.29..7.......8..67.82....26.95..8..2.3..9..5.1.3..' -harder1 = '4173698.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......' - -_R3 = list(range(3)) -_CELL = itertools.count().__next__ -_BGRID = [[[[_CELL() for x in _R3] for y in _R3] for bx in _R3] for by in _R3] -_BOXES = flatten([list(map(flatten, brow)) for brow in _BGRID]) -_ROWS = flatten([list(map(flatten, zip(*brow))) for brow in _BGRID]) -_COLS = list(zip(*_ROWS)) - -_NEIGHBORS = {v: set() for v in flatten(_ROWS)} -for unit in map(set, _BOXES + _ROWS + _COLS): - for v in unit: - _NEIGHBORS[v].update(unit - {v}) - - -class Sudoku(CSP): - """A Sudoku problem. - The box grid is a 3x3 array of boxes, each a 3x3 array of cells. - Each cell holds a digit in 1..9. In each box, all digits are - different; the same for each row and column as a 9x9 grid. - >>> e = Sudoku(easy1) - >>> e.display(e.infer_assignment()) - . . 3 | . 2 . | 6 . . - 9 . . | 3 . 5 | . . 1 - . . 1 | 8 . 6 | 4 . . - ------+-------+------ - . . 8 | 1 . 2 | 9 . . - 7 . . | . . . | . . 8 - . . 6 | 7 . 8 | 2 . . - ------+-------+------ - . . 2 | 6 . 9 | 5 . . - 8 . . | 2 . 3 | . . 9 - . . 5 | . 1 . | 3 . . - >>> AC3(e); e.display(e.infer_assignment()) - True - 4 8 3 | 9 2 1 | 6 5 7 - 9 6 7 | 3 4 5 | 8 2 1 - 2 5 1 | 8 7 6 | 4 9 3 - ------+-------+------ - 5 4 8 | 1 3 2 | 9 7 6 - 7 2 9 | 5 6 4 | 1 3 8 - 1 3 6 | 7 9 8 | 2 4 5 - ------+-------+------ - 3 7 2 | 6 8 9 | 5 1 4 - 8 1 4 | 2 5 3 | 7 6 9 - 6 9 5 | 4 1 7 | 3 8 2 - >>> h = Sudoku(harder1) - >>> backtracking_search(h, select_unassigned_variable=mrv, inference=forward_checking) is not None - True - """ # noqa - - R3 = _R3 - Cell = _CELL - bgrid = _BGRID - boxes = _BOXES - rows = _ROWS - cols = _COLS - neighbors = _NEIGHBORS - - def __init__(self, grid): - """Build a Sudoku problem from a string representing the grid: - the digits 1-9 denote a filled cell, '.' or '0' an empty one; - other characters are ignored.""" - squares = iter(re.findall(r'\d|\.', grid)) - domains = {var: [ch] if ch in '123456789' else '123456789' - for var, ch in zip(flatten(self.rows), squares)} - for _ in squares: - raise ValueError("Not a Sudoku grid", grid) # Too many squares - CSP.__init__(self, None, domains, self.neighbors, different_values_constraint) - - def display(self, assignment): - def show_box(box): return [' '.join(map(show_cell, row)) for row in box] - - def show_cell(cell): return str(assignment.get(cell, '.')) - - def abut(lines1, lines2): return list( - map(' | '.join, list(zip(lines1, lines2)))) - print('\n------+-------+------\n'.join( - '\n'.join(reduce( - abut, map(show_box, brow))) for brow in self.bgrid)) -# ______________________________________________________________________________ -# The Zebra Puzzle - - -def Zebra(): - """Return an instance of the Zebra Puzzle.""" - Colors = 'Red Yellow Blue Green Ivory'.split() - Pets = 'Dog Fox Snails Horse Zebra'.split() - Drinks = 'OJ Tea Coffee Milk Water'.split() - Countries = 'Englishman Spaniard Norwegian Ukranian Japanese'.split() - Smokes = 'Kools Chesterfields Winston LuckyStrike Parliaments'.split() - variables = Colors + Pets + Drinks + Countries + Smokes - domains = {} - for var in variables: - domains[var] = list(range(1, 6)) - domains['Norwegian'] = [1] - domains['Milk'] = [3] - neighbors = parse_neighbors("""Englishman: Red; - Spaniard: Dog; Kools: Yellow; Chesterfields: Fox; - Norwegian: Blue; Winston: Snails; LuckyStrike: OJ; - Ukranian: Tea; Japanese: Parliaments; Kools: Horse; - Coffee: Green; Green: Ivory""", variables) - for type in [Colors, Pets, Drinks, Countries, Smokes]: - for A in type: - for B in type: - if A != B: - if B not in neighbors[A]: - neighbors[A].append(B) - if A not in neighbors[B]: - neighbors[B].append(A) - - def zebra_constraint(A, a, B, b, recurse=0): - same = (a == b) - next_to = abs(a - b) == 1 - if A == 'Englishman' and B == 'Red': - return same - if A == 'Spaniard' and B == 'Dog': - return same - if A == 'Chesterfields' and B == 'Fox': - return next_to - if A == 'Norwegian' and B == 'Blue': - return next_to - if A == 'Kools' and B == 'Yellow': - return same - if A == 'Winston' and B == 'Snails': - return same - if A == 'LuckyStrike' and B == 'OJ': - return same - if A == 'Ukranian' and B == 'Tea': - return same - if A == 'Japanese' and B == 'Parliaments': - return same - if A == 'Kools' and B == 'Horse': - return next_to - if A == 'Coffee' and B == 'Green': - return same - if A == 'Green' and B == 'Ivory': - return a - 1 == b - if recurse == 0: - return zebra_constraint(B, b, A, a, 1) - if ((A in Colors and B in Colors) or - (A in Pets and B in Pets) or - (A in Drinks and B in Drinks) or - (A in Countries and B in Countries) or - (A in Smokes and B in Smokes)): - return not same - raise Exception('error') - return CSP(variables, domains, neighbors, zebra_constraint) - - -def solve_zebra(algorithm=min_conflicts, **args): - z = Zebra() - ans = algorithm(z, **args) - for h in range(1, 6): - print('House', h, end=' ') - for (var, val) in ans.items(): - if val == h: - print(var, end=' ') - print() - return ans['Zebra'], ans['Water'], z.nassigns, ans diff --git a/games.ipynb b/games.ipynb deleted file mode 100644 index 042116969..000000000 --- a/games.ipynb +++ /dev/null @@ -1,1659 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# GAMES OR ADVERSARIAL SEARCH\n", - "\n", - "This notebook serves as supporting material for topics covered in **Chapter 5 - Adversarial Search** in the book *Artificial Intelligence: A Modern Approach.* This notebook uses implementations from [games.py](https://github.com/aimacode/aima-python/blob/master/games.py) module. Let's import required classes, methods, global variables etc., from games module." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# CONTENTS\n", - "\n", - "* Game Representation\n", - "* Game Examples\n", - " * Tic-Tac-Toe\n", - " * Figure 5.2 Game\n", - "* Min-Max\n", - "* Alpha-Beta\n", - "* Players\n", - "* Let's Play Some Games!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from games import *\n", - "from notebook import psource, pseudocode" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# GAME REPRESENTATION\n", - "\n", - "To represent games we make use of the `Game` class, which we can subclass and override its functions to represent our own games. A helper tool is the namedtuple `GameState`, which in some cases can come in handy, especially when our game needs us to remember a board (like chess)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `GameState` namedtuple\n", - "\n", - "`GameState` is a [namedtuple](https://docs.python.org/3.5/library/collections.html#collections.namedtuple) which represents the current state of a game. It is used to help represent games whose states can't be easily represented normally, or for games that require memory of a board, like Tic-Tac-Toe.\n", - "\n", - "`Gamestate` is defined as follows:\n", - "\n", - "`GameState = namedtuple('GameState', 'to_move, utility, board, moves')`\n", - "\n", - "* `to_move`: It represents whose turn it is to move next.\n", - "\n", - "* `utility`: It stores the utility of the game state. Storing this utility is a good idea, because, when you do a Minimax Search or an Alphabeta Search, you generate many recursive calls, which travel all the way down to the terminal states. When these recursive calls go back up to the original callee, we have calculated utilities for many game states. We store these utilities in their respective `GameState`s to avoid calculating them all over again.\n", - "\n", - "* `board`: A dict that stores the board of the game.\n", - "\n", - "* `moves`: It stores the list of legal moves possible from the current position." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## `Game` class\n", - "\n", - "Let's have a look at the class `Game` in our module. We see that it has functions, namely `actions`, `result`, `utility`, `terminal_test`, `to_move` and `display`.\n", - "\n", - "We see that these functions have not actually been implemented. This class is just a template class; we are supposed to create the class for our game, by inheriting this `Game` class and implementing all the methods mentioned in `Game`." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource Game" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's get into details of all the methods in our `Game` class. You have to implement these methods when you create new classes that would represent your game.\n", - "\n", - "* `actions(self, state)`: Given a game state, this method generates all the legal actions possible from this state, as a list or a generator. Returning a generator rather than a list has the advantage that it saves space and you can still operate on it as a list.\n", - "\n", - "\n", - "* `result(self, state, move)`: Given a game state and a move, this method returns the game state that you get by making that move on this game state.\n", - "\n", - "\n", - "* `utility(self, state, player)`: Given a terminal game state and a player, this method returns the utility for that player in the given terminal game state. While implementing this method assume that the game state is a terminal game state. The logic in this module is such that this method will be called only on terminal game states.\n", - "\n", - "\n", - "* `terminal_test(self, state)`: Given a game state, this method should return `True` if this game state is a terminal state, and `False` otherwise.\n", - "\n", - "\n", - "* `to_move(self, state)`: Given a game state, this method returns the player who is to play next. This information is typically stored in the game state, so all this method does is extract this information and return it.\n", - "\n", - "\n", - "* `display(self, state)`: This method prints/displays the current state of the game." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# GAME EXAMPLES\n", - "\n", - "Below we give some examples for games you can create and experiment on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tic-Tac-Toe\n", - "\n", - "Take a look at the class `TicTacToe`. All the methods mentioned in the class `Game` have been implemented here." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource TicTacToe" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The class `TicTacToe` has been inherited from the class `Game`. As mentioned earlier, you really want to do this. Catching bugs and errors becomes a whole lot easier.\n", - "\n", - "Additional methods in TicTacToe:\n", - "\n", - "* `__init__(self, h=3, v=3, k=3)` : When you create a class inherited from the `Game` class (class `TicTacToe` in our case), you'll have to create an object of this inherited class to initialize the game. This initialization might require some additional information which would be passed to `__init__` as variables. For the case of our `TicTacToe` game, this additional information would be the number of rows `h`, number of columns `v` and how many consecutive X's or O's are needed in a row, column or diagonal for a win `k`. Also, the initial game state has to be defined here in `__init__`.\n", - "\n", - "\n", - "* `compute_utility(self, board, move, player)` : A method to calculate the utility of TicTacToe game. If 'X' wins with this move, this method returns 1; if 'O' wins return -1; else return 0.\n", - "\n", - "\n", - "* `k_in_row(self, board, move, player, delta_x_y)` : This method returns `True` if there is a line formed on TicTacToe board with the latest move else `False.`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TicTacToe GameState\n", - "\n", - "Now, before we start implementing our `TicTacToe` game, we need to decide how we will be representing our game state. Typically, a game state will give you all the current information about the game at any point in time. When you are given a game state, you should be able to tell whose turn it is next, how the game will look like on a real-life board (if it has one) etc. A game state need not include the history of the game. If you can play the game further given a game state, you game state representation is acceptable. While we might like to include all kinds of information in our game state, we wouldn't want to put too much information into it. Modifying this game state to generate a new one would be a real pain then.\n", - "\n", - "Now, as for our `TicTacToe` game state, would storing only the positions of all the X's and O's be sufficient to represent all the game information at that point in time? Well, does it tell us whose turn it is next? Looking at the 'X's and O's on the board and counting them should tell us that. But that would mean extra computing. To avoid this, we will also store whose move it is next in the game state.\n", - "\n", - "Think about what we've done here. We have reduced extra computation by storing additional information in a game state. Now, this information might not be absolutely essential to tell us about the state of the game, but it does save us additional computation time. We'll do more of this later on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To store game states will will use the `GameState` namedtuple.\n", - "\n", - "* `to_move`: A string of a single character, either 'X' or 'O'.\n", - "\n", - "* `utility`: 1 for win, -1 for loss, 0 otherwise.\n", - "\n", - "* `board`: All the positions of X's and O's on the board.\n", - "\n", - "* `moves`: All the possible moves from the current state. Note here, that storing the moves as a list, as it is done here, increases the space complexity of Minimax Search from `O(m)` to `O(bm)`. Refer to Sec. 5.2.1 of the book." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Representing a move in TicTacToe game\n", - "\n", - "Now that we have decided how our game state will be represented, it's time to decide how our move will be represented. Becomes easy to use this move to modify a current game state to generate a new one.\n", - "\n", - "For our `TicTacToe` game, we'll just represent a move by a tuple, where the first and the second elements of the tuple will represent the row and column, respectively, where the next move is to be made. Whether to make an 'X' or an 'O' will be decided by the `to_move` in the `GameState` namedtuple." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fig52 Game\n", - "\n", - "For a more trivial example we will represent the game in **Figure 5.2** of the book.\n", - "\n", - "\n", - "\n", - "The states are represented wih capital letters inside the triangles (eg. \"A\") while moves are the labels on the edges between states (eg. \"a1\"). Terminal nodes carry utility values. Note that the terminal nodes are named in this example 'B1', 'B2' and 'B2' for the nodes below 'B', and so forth.\n", - "\n", - "We will model the moves, utilities and initial state like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "moves = dict(A=dict(a1='B', a2='C', a3='D'),\n", - " B=dict(b1='B1', b2='B2', b3='B3'),\n", - " C=dict(c1='C1', c2='C2', c3='C3'),\n", - " D=dict(d1='D1', d2='D2', d3='D3'))\n", - "utils = dict(B1=3, B2=12, B3=8, C1=2, C2=4, C3=6, D1=14, D2=5, D3=2)\n", - "initial = 'A'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In `moves`, we have a nested dictionary system. The outer's dictionary has keys as the states and values the possible moves from that state (as a dictionary). The inner dictionary of moves has keys the move names and values the next state after the move is complete.\n", - "\n", - "Below is an example that showcases `moves`. We want the next state after move 'a1' from 'A', which is 'B'. A quick glance at the above image confirms that this is indeed the case." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B\n" - ] - } - ], - "source": [ - "print(moves['A']['a1'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now take a look at the functions we need to implement. First we need to create an object of the `Fig52Game` class." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "fig52 = Fig52Game()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`actions`: Returns the list of moves one can make from a given state." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game.actions)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['b1', 'b2', 'b3']\n" - ] - } - ], - "source": [ - "print(fig52.actions('B'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`result`: Returns the next state after we make a specific move." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game.result)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "B\n" - ] - } - ], - "source": [ - "print(fig52.result('A', 'a1'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`utility`: Returns the value of the terminal state for a player ('MAX' and 'MIN'). Note that for 'MIN' the value returned is the negative of the utility." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game.utility)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "-3\n" - ] - } - ], - "source": [ - "print(fig52.utility('B1', 'MAX'))\n", - "print(fig52.utility('B1', 'MIN'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`terminal_test`: Returns `True` if the given state is a terminal state, `False` otherwise." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game.terminal_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print(fig52.terminal_test('C3'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`to_move`: Return the player who will move in this state." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game.to_move)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAX\n" - ] - } - ], - "source": [ - "print(fig52.to_move('A'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a whole the class `Fig52` that inherits from the class `Game` and overrides its functions:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Fig52Game)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# MIN-MAX\n", - "\n", - "## Overview\n", - "\n", - "This algorithm (often called *Minimax*) computes the next move for a player (MIN or MAX) at their current state. It recursively computes the minimax value of successor states, until it reaches terminals (the leaves of the tree). Using the `utility` value of the terminal states, it computes the values of parent states until it reaches the initial node (the root of the tree).\n", - "\n", - "It is worth noting that the algorithm works in a depth-first manner. The pseudocode can be found below:" - ] - }, - { - "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" - } - ], - "source": [ - "pseudocode(\"Minimax-Decision\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "In the implementation we are using two functions, `max_value` and `min_value` to calculate the best move for MAX and MIN respectively. These functions interact in an alternating recursion; one calls the other until a terminal state is reached. When the recursion halts, we are left with scores for each move. We return the max. Despite returning the max, it will work for MIN too since for MIN the values are their negative (hence the order of values is reversed, so the higher the better for MIN too)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(minimax_decision)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example\n", - "\n", - "We will now play the Fig52 game using this algorithm. Take a look at the Fig52Game from above to follow along.\n", - "\n", - "It is the turn of MAX to move, and he is at state A. He can move to B, C or D, using moves a1, a2 and a3 respectively. MAX's goal is to maximize the end value. So, to make a decision, MAX needs to know the values at the aforementioned nodes and pick the greatest one. After MAX, it is MIN's turn to play. So MAX wants to know what will the values of B, C and D be after MIN plays.\n", - "\n", - "The problem then becomes what move will MIN make at B, C and D. The successor states of all these nodes are terminal states, so MIN will pick the smallest value for each node. So, for B he will pick 3 (from move b1), for C he will pick 2 (from move c1) and for D he will again pick 2 (from move d3).\n", - "\n", - "Let's see this in code:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b1\n", - "c1\n", - "d3\n" - ] - } - ], - "source": [ - "print(minimax_decision('B', fig52))\n", - "print(minimax_decision('C', fig52))\n", - "print(minimax_decision('D', fig52))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now MAX knows that the values for B, C and D are 3, 2 and 2 (produced by the above moves of MIN). The greatest is 3, which he will get with move a1. This is then the move MAX will make. Let's see the algorithm in full action:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n" - ] - } - ], - "source": [ - "print(minimax_decision('A', fig52))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualization\n", - "\n", - "Below we have a simple game visualization using the algorithm. After you run the command, click on the cell to move the game along. You can input your own values via a list of 27 integers." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from notebook import Canvas_minimax\n", - "from random import randint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "minimax_viz = Canvas_minimax('minimax_viz', [randint(1, 50) for i in range(27)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ALPHA-BETA\n", - "\n", - "## Overview\n", - "\n", - "While *Minimax* is great for computing a move, it can get tricky when the number of game states gets bigger. The algorithm needs to search all the leaves of the tree, which increase exponentially to its depth.\n", - "\n", - "For Tic-Tac-Toe, where the depth of the tree is 9 (after the 9th move, the game ends), we can have at most 9! terminal states (at most because not all terminal nodes are at the last level of the tree; some are higher up because the game ended before the 9th move). This isn't so bad, but for more complex problems like chess, we have over $10^{40}$ terminal nodes. Unfortunately we have not found a way to cut the exponent away, but we nevertheless have found ways to alleviate the workload.\n", - "\n", - "Here we examine *pruning* the game tree, which means removing parts of it that we do not need to examine. The particular type of pruning is called *alpha-beta*, and the search in whole is called *alpha-beta search*.\n", - "\n", - "To showcase what parts of the tree we don't need to search, we will take a look at the example `Fig52Game`.\n", - "\n", - "In the example game, we need to find the best move for player MAX at state A, which is the maximum value of MIN's possible moves at successor states.\n", - "\n", - "`MAX(A) = MAX( MIN(B), MIN(C), MIN(D) )`\n", - "\n", - "`MIN(B)` is the minimum of 3, 12, 8 which is 3. So the above formula becomes:\n", - "\n", - "`MAX(A) = MAX( 3, MIN(C), MIN(D) )`\n", - "\n", - "Next move we will check is c1, which leads to a terminal state with utility of 2. Before we continue searching under state C, let's pop back into our formula with the new value:\n", - "\n", - "`MAX(A) = MAX( 3, MIN(2, c2, .... cN), MIN(D) )`\n", - "\n", - "We do not know how many moves state C allows, but we know that the first one results in a value of 2. Do we need to keep searching under C? The answer is no. The value MIN will pick on C will at most be 2. Since MAX already has the option to pick something greater than that, 3 from B, he does not need to keep searching under C.\n", - "\n", - "In *alpha-beta* we make use of two additional parameters for each state/node, *a* and *b*, that describe bounds on the possible moves. The parameter *a* denotes the best choice (highest value) for MAX along that path, while *b* denotes the best choice (lowest value) for MIN. As we go along we update *a* and *b* and prune a node branch when the value of the node is worse than the value of *a* and *b* for MAX and MIN respectively.\n", - "\n", - "In the above example, after the search under state B, MAX had an *a* value of 3. So, when searching node C we found a value less than that, 2, we stopped searching under C.\n", - "\n", - "You can read the pseudocode below:" - ] - }, - { - "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" - } - ], - "source": [ - "pseudocode(\"Alpha-Beta-Search\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "Like *minimax*, we again make use of functions `max_value` and `min_value`, but this time we utilise the *a* and *b* values, updating them and stopping the recursive call if we end up on nodes with values worse than *a* and *b* (for MAX and MIN). The algorithm finds the maximum value and returns the move that results in it.\n", - "\n", - "The implementation:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource alphabeta_search" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example\n", - "\n", - "We will play the Fig52 Game with the *alpha-beta* search algorithm. It is the turn of MAX to play at state A." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n" - ] - } - ], - "source": [ - "print(alphabeta_search('A', fig52))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The optimal move for MAX is a1, for the reasons given above. MIN will pick move b1 for B resulting in a value of 3, updating the *a* value of MAX to 3. Then, when we find under C a node of value 2, we will stop searching under that sub-tree since it is less than *a*. From D we have a value of 2. So, the best move for MAX is the one resulting in a value of 3, which is a1.\n", - "\n", - "Below we see the best moves for MIN starting from B, C and D respectively. Note that the algorithm in these cases works the same way as *minimax*, since all the nodes below the aforementioned states are terminal." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "b1\n", - "c1\n", - "d3\n" - ] - } - ], - "source": [ - "print(alphabeta_search('B', fig52))\n", - "print(alphabeta_search('C', fig52))\n", - "print(alphabeta_search('D', fig52))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualization\n", - "\n", - "Below you will find the visualization of the alpha-beta algorithm for a simple game. Click on the cell after you run the command to move the game along. You can input your own values via a list of 27 integers." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from notebook import Canvas_alphabeta\n", - "from random import randint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "alphabeta_viz = Canvas_alphabeta('alphabeta_viz', [randint(1, 50) for i in range(27)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# PLAYERS\n", - "\n", - "So, we have finished the implementation of the `TicTacToe` and `Fig52Game` classes. What these classes do is defining the rules of the games. We need more to create an AI that can actually play games. This is where `random_player` and `alphabeta_player` come in.\n", - "\n", - "## query_player\n", - "The `query_player` function allows you, a human opponent, to play the game. This function requires a `display` method to be implemented in your game class, so that successive game states can be displayed on the terminal, making it easier for you to visualize the game and play accordingly.\n", - "\n", - "## random_player\n", - "The `random_player` is a function that plays random moves in the game. That's it. There isn't much more to this guy. \n", - "\n", - "## alphabeta_player\n", - "The `alphabeta_player`, on the other hand, calls the `alphabeta_search` function, which returns the best move in the current game state. Thus, the `alphabeta_player` always plays the best move given a game state, assuming that the game tree is small enough to search entirely.\n", - "\n", - "## play_game\n", - "The `play_game` function will be the one that will actually be used to play the game. You pass as arguments to it an instance of the game you want to play and the players you want in this game. Use it to play AI vs AI, AI vs human, or even human vs human matches!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# LET'S PLAY SOME GAMES!\n", - "\n", - "## Game52\n", - "\n", - "Let's start by experimenting with the `Fig52Game` first. For that we'll create an instance of the subclass Fig52Game inherited from the class Game:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "game52 = Fig52Game()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we try out our `random_player(game, state)`. Given a game state it will give us a random move every time:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n", - "a3\n" - ] - } - ], - "source": [ - "print(random_player(game52, 'A'))\n", - "print(random_player(game52, 'A'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `alphabeta_player(game, state)` will always give us the best move possible, for the relevant player (MAX or MIN):" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a1\n", - "b1\n", - "c1\n" - ] - } - ], - "source": [ - "print( alphabeta_player(game52, 'A') )\n", - "print( alphabeta_player(game52, 'B') )\n", - "print( alphabeta_player(game52, 'C') )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What the `alphabeta_player` does is, it simply calls the method `alphabeta_full_search`. They both are essentially the same. In the module, both `alphabeta_full_search` and `minimax_decision` have been implemented. They both do the same job and return the same thing, which is, the best move in the current state. It's just that `alphabeta_full_search` is more efficient with regards to time because it prunes the search tree and hence, explores lesser number of states." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'a1'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "minimax_decision('A', game52)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'a1'" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alphabeta_search('A', game52)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Demonstrating the play_game function on the game52:" - ] - }, - { - "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" - } - ], - "source": [ - "game52.play_game(alphabeta_player, alphabeta_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" - } - ], - "source": [ - "game52.play_game(alphabeta_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" - } - ], - "source": [ - "game52.play_game(query_player, alphabeta_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" - } - ], - "source": [ - "game52.play_game(alphabeta_player, query_player)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that if you are the first player then alphabeta_player plays as MIN, and if you are the second player then alphabeta_player plays as MAX. This happens because that's the way the game is defined in the class Fig52Game. Having a look at the code of this class should make it clear." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TicTacToe\n", - "\n", - "Now let's play `TicTacToe`. First we initialize the game by creating an instance of the subclass TicTacToe inherited from the class Game:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "ttt = TicTacToe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can print a state using the display method:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ". . . \n", - ". . . \n", - ". . . \n" - ] - } - ], - "source": [ - "ttt.display(ttt.initial)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hmm, so that's the initial state of the game; no X's and no O's.\n", - "\n", - "Let us create a new game state by ourselves to experiment:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "my_state = GameState(\n", - " to_move = 'X',\n", - " utility = '0',\n", - " board = {(1,1): 'X', (1,2): 'O', (1,3): 'X',\n", - " (2,1): 'O', (2,3): 'O',\n", - " (3,1): 'X',\n", - " },\n", - " moves = [(2,2), (3,2), (3,3)]\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So, how does this game state look like?" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "X O X \n", - "O . O \n", - "X . . \n" - ] - } - ], - "source": [ - "ttt.display(my_state)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `random_player` will behave how he is supposed to i.e. *pseudo-randomly*:" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 2)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "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" - } - ], - "source": [ - "random_player(ttt, my_state)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But the `alphabeta_player` will always give the best move, as expected:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 2)" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alphabeta_player(ttt, my_state)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's make two players play against each other. We use the `play_game` function for this. The `play_game` function makes players play the match against each other and returns the utility for the first player, of the terminal state reached when the game ends. Hence, for our `TicTacToe` game, if we get the output +1, the first player wins, -1 if the second player wins, and 0 if the match ends in a draw." - ] - }, - { - "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" - } - ], - "source": [ - "ttt.play_game(random_player, alphabeta_player)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output is (usually) -1, because `random_player` loses to `alphabeta_player`. Sometimes, however, `random_player` manages to draw with `alphabeta_player`.\n", - "\n", - "Since an `alphabeta_player` plays perfectly, a match between two `alphabeta_player`s should always end in a draw. Let's see if this happens:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "for _ in range(10):\n", - " print(ttt.play_game(alphabeta_player, alphabeta_player))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `random_player` should never win against an `alphabeta_player`. Let's test that." - ] - }, - { - "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" - ] - } - ], - "source": [ - "for _ in range(10):\n", - " print(ttt.play_game(random_player, alphabeta_player))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Canvas_TicTacToe(Canvas)\n", - "\n", - "This subclass is used to play TicTacToe game interactively in Jupyter notebooks. TicTacToe class is called while initializing this subclass.\n", - "\n", - "Let's have a match between `random_player` and `alphabeta_player`. Click on the board to call players to make a move." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from notebook import Canvas_TicTacToe" - ] - }, - { - "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" - } - ], - "source": [ - "bot_play = Canvas_TicTacToe('bot_play', 'random', 'alphabeta')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's play a game ourselves against a `random_player`:" - ] - }, - { - "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" - } - ], - "source": [ - "rand_play = Canvas_TicTacToe('rand_play', 'human', 'random')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Yay! We (usually) win. But we cannot win against an `alphabeta_player`, however hard we try." - ] - }, - { - "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" - } - ], - "source": [ - "ab_play = Canvas_TicTacToe('ab_play', 'human', 'alphabeta')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/games.py b/games.py deleted file mode 100644 index 00a2c33d3..000000000 --- a/games.py +++ /dev/null @@ -1,344 +0,0 @@ -"""Games, or Adversarial Search (Chapter 5)""" - -from collections import namedtuple -import random - -from utils import argmax - -infinity = float('inf') -GameState = namedtuple('GameState', 'to_move, utility, board, moves') - -# ______________________________________________________________________________ -# Minimax Search - - -def minimax_decision(state, game): - """Given a state in a game, calculate the best move by searching - forward all the way to the terminal states. [Figure 5.3]""" - - player = game.to_move(state) - - def max_value(state): - if game.terminal_test(state): - return game.utility(state, player) - v = -infinity - for a in game.actions(state): - v = max(v, min_value(game.result(state, a))) - return v - - def min_value(state): - if game.terminal_test(state): - return game.utility(state, player) - v = infinity - for a in game.actions(state): - v = min(v, max_value(game.result(state, a))) - return v - - # Body of minimax_decision: - return argmax(game.actions(state), - key=lambda a: min_value(game.result(state, a))) - -# ______________________________________________________________________________ - - -def alphabeta_search(state, game): - """Search game to determine best action; use alpha-beta pruning. - As in [Figure 5.7], this version searches all the way to the leaves.""" - - player = game.to_move(state) - - # Functions used by alphabeta - def max_value(state, alpha, beta): - if game.terminal_test(state): - return game.utility(state, player) - v = -infinity - for a in game.actions(state): - v = max(v, min_value(game.result(state, a), alpha, beta)) - if v >= beta: - return v - alpha = max(alpha, v) - return v - - def min_value(state, alpha, beta): - if game.terminal_test(state): - return game.utility(state, player) - v = infinity - for a in game.actions(state): - v = min(v, max_value(game.result(state, a), alpha, beta)) - if v <= alpha: - return v - beta = min(beta, v) - return v - - # Body of alphabeta_cutoff_search: - best_score = -infinity - beta = infinity - best_action = None - for a in game.actions(state): - v = min_value(game.result(state, a), best_score, beta) - if v > best_score: - best_score = v - best_action = a - return best_action - - -def alphabeta_cutoff_search(state, game, d=4, cutoff_test=None, eval_fn=None): - """Search game to determine best action; use alpha-beta pruning. - This version cuts off search and uses an evaluation function.""" - - player = game.to_move(state) - - # Functions used by alphabeta - def max_value(state, alpha, beta, depth): - if cutoff_test(state, depth): - return eval_fn(state) - v = -infinity - for a in game.actions(state): - v = max(v, min_value(game.result(state, a), - alpha, beta, depth + 1)) - if v >= beta: - return v - alpha = max(alpha, v) - return v - - def min_value(state, alpha, beta, depth): - if cutoff_test(state, depth): - return eval_fn(state) - v = infinity - for a in game.actions(state): - v = min(v, max_value(game.result(state, a), - alpha, beta, depth + 1)) - if v <= alpha: - return v - beta = min(beta, v) - return v - - # Body of alphabeta_cutoff_search starts here: - # The default test cuts off at depth d or at a terminal state - cutoff_test = (cutoff_test or - (lambda state, depth: depth > d or - game.terminal_test(state))) - eval_fn = eval_fn or (lambda state: game.utility(state, player)) - best_score = -infinity - beta = infinity - best_action = None - for a in game.actions(state): - v = min_value(game.result(state, a), best_score, beta, 1) - if v > best_score: - best_score = v - best_action = a - return best_action - -# ______________________________________________________________________________ -# Players for Games - - -def query_player(game, state): - """Make a move by querying standard input.""" - print("current state:") - game.display(state) - print("available moves: {}".format(game.actions(state))) - print("") - move_string = input('Your move? ') - try: - move = eval(move_string) - except NameError: - move = move_string - return move - - -def random_player(game, state): - """A player that chooses a legal move at random.""" - return random.choice(game.actions(state)) - - -def alphabeta_player(game, state): - return alphabeta_search(state, game) - - -# ______________________________________________________________________________ -# Some Sample Games - - -class Game: - """A game is similar to a problem, but it has a utility for each - state and a terminal test instead of a path cost and a goal - test. To create a game, subclass this class and implement actions, - result, utility, and terminal_test. You may override display and - successors or you can inherit their default methods. You will also - need to set the .initial attribute to the initial state; this can - be done in the constructor.""" - - def actions(self, state): - """Return a list of the allowable moves at this point.""" - raise NotImplementedError - - def result(self, state, move): - """Return the state that results from making a move from a state.""" - raise NotImplementedError - - def utility(self, state, player): - """Return the value of this final state to player.""" - raise NotImplementedError - - def terminal_test(self, state): - """Return True if this is a final state for the game.""" - return not self.actions(state) - - def to_move(self, state): - """Return the player whose move it is in this state.""" - return state.to_move - - def display(self, state): - """Print or otherwise display the state.""" - print(state) - - def __repr__(self): - return '<{}>'.format(self.__class__.__name__) - - def play_game(self, *players): - """Play an n-person, move-alternating game.""" - state = self.initial - while True: - for player in players: - move = player(self, state) - state = self.result(state, move) - if self.terminal_test(state): - self.display(state) - return self.utility(state, self.to_move(self.initial)) - - -class Fig52Game(Game): - """The game represented in [Figure 5.2]. Serves as a simple test case.""" - - succs = dict(A=dict(a1='B', a2='C', a3='D'), - B=dict(b1='B1', b2='B2', b3='B3'), - C=dict(c1='C1', c2='C2', c3='C3'), - D=dict(d1='D1', d2='D2', d3='D3')) - utils = dict(B1=3, B2=12, B3=8, C1=2, C2=4, C3=6, D1=14, D2=5, D3=2) - initial = 'A' - - def actions(self, state): - return list(self.succs.get(state, {}).keys()) - - def result(self, state, move): - return self.succs[state][move] - - def utility(self, state, player): - if player == 'MAX': - return self.utils[state] - else: - return -self.utils[state] - - def terminal_test(self, state): - return state not in ('A', 'B', 'C', 'D') - - def to_move(self, state): - return 'MIN' if state in 'BCD' else 'MAX' - - -class Fig52Extended(Game): - """Similar to Fig52Game but bigger. Useful for visualisation""" - - succs = {i:dict(l=i*3+1, m=i*3+2, r=i*3+3) for i in range(13)} - utils = dict() - - def actions(self, state): - return sorted(list(self.succs.get(state, {}).keys())) - - def result(self, state, move): - return self.succs[state][move] - - def utility(self, state, player): - if player == 'MAX': - return self.utils[state] - else: - return -self.utils[state] - - def terminal_test(self, state): - return state not in range(13) - - def to_move(self, state): - return 'MIN' if state in {1, 2, 3} else 'MAX' - -class TicTacToe(Game): - """Play TicTacToe on an h x v board, with Max (first player) playing 'X'. - A state has the player to move, a cached utility, a list of moves in - the form of a list of (x, y) positions, and a board, in the form of - a dict of {(x, y): Player} entries, where Player is 'X' or 'O'.""" - - def __init__(self, h=3, v=3, k=3): - self.h = h - self.v = v - self.k = k - moves = [(x, y) for x in range(1, h + 1) - for y in range(1, v + 1)] - self.initial = GameState(to_move='X', utility=0, board={}, moves=moves) - - def actions(self, state): - """Legal moves are any square not yet taken.""" - return state.moves - - def result(self, state, move): - if move not in state.moves: - return state # Illegal move has no effect - board = state.board.copy() - board[move] = state.to_move - moves = list(state.moves) - moves.remove(move) - return GameState(to_move=('O' if state.to_move == 'X' else 'X'), - utility=self.compute_utility(board, move, state.to_move), - board=board, moves=moves) - - def utility(self, state, player): - """Return the value to player; 1 for win, -1 for loss, 0 otherwise.""" - return state.utility if player == 'X' else -state.utility - - def terminal_test(self, state): - """A state is terminal if it is won or there are no empty squares.""" - return state.utility != 0 or len(state.moves) == 0 - - def display(self, state): - board = state.board - for x in range(1, self.h + 1): - for y in range(1, self.v + 1): - print(board.get((x, y), '.'), end=' ') - print() - - def compute_utility(self, board, move, player): - """If 'X' wins with this move, return 1; if 'O' wins return -1; else return 0.""" - if (self.k_in_row(board, move, player, (0, 1)) or - self.k_in_row(board, move, player, (1, 0)) or - self.k_in_row(board, move, player, (1, -1)) or - self.k_in_row(board, move, player, (1, 1))): - return +1 if player == 'X' else -1 - else: - return 0 - - def k_in_row(self, board, move, player, delta_x_y): - """Return true if there is a line through move on board for player.""" - (delta_x, delta_y) = delta_x_y - x, y = move - n = 0 # n is number of moves in row - while board.get((x, y)) == player: - n += 1 - x, y = x + delta_x, y + delta_y - x, y = move - while board.get((x, y)) == player: - n += 1 - x, y = x - delta_x, y - delta_y - n -= 1 # Because we counted move itself twice - return n >= self.k - - -class ConnectFour(TicTacToe): - """A TicTacToe-like game in which you can only make a move on the bottom - row, or in a square directly above an occupied square. Traditionally - played on a 7x6 board and requiring 4 in a row.""" - - def __init__(self, h=7, v=6, k=4): - TicTacToe.__init__(self, h, v, k) - - def actions(self, state): - return [(x, y) for (x, y) in state.moves - if y == 1 or (x, y - 1) in state.board] diff --git a/gui/romania_problem.py b/gui/romania_problem.py deleted file mode 100644 index 31a3d04c7..000000000 --- a/gui/romania_problem.py +++ /dev/null @@ -1,518 +0,0 @@ -from tkinter import * -import sys -import os.path -import math -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) -from search import * -from search import breadth_first_tree_search as bfts, depth_first_tree_search as dfts,depth_first_graph_search as dfgs -from utils import Stack, FIFOQueue, PriorityQueue -from copy import deepcopy -root = None -city_coord = {} -romania_problem = None -algo = None -start = None -goal = None -counter = -1 -city_map = None -frontier = None -front = None -node = None -next_button = None -explored=None - -def create_map(root): - ''' - This function draws out the required map. - ''' - global city_map, start, goal - romania_locations = romania_map.locations - width = 750 - height = 670 - margin = 5 - city_map = Canvas(root, width=width, height=height) - city_map.pack() - - # Since lines have to be drawn between particular points, we need to list - # them separately - make_line( - city_map, - romania_locations['Arad'][0], - height - - romania_locations['Arad'][1], - romania_locations['Sibiu'][0], - height - - romania_locations['Sibiu'][1], - romania_map.get('Arad', 'Sibiu')) - make_line( - city_map, - romania_locations['Arad'][0], - height - - romania_locations['Arad'][1], - romania_locations['Zerind'][0], - height - - romania_locations['Zerind'][1], - romania_map.get('Arad', 'Zerind')) - make_line( - city_map, - romania_locations['Arad'][0], - height - - romania_locations['Arad'][1], - romania_locations['Timisoara'][0], - height - - romania_locations['Timisoara'][1], - romania_map.get('Arad', 'Timisoara')) - make_line( - city_map, - romania_locations['Oradea'][0], - height - - romania_locations['Oradea'][1], - romania_locations['Zerind'][0], - height - - romania_locations['Zerind'][1], - romania_map.get('Oradea', 'Zerind')) - make_line( - city_map, - romania_locations['Oradea'][0], - height - - romania_locations['Oradea'][1], - romania_locations['Sibiu'][0], - height - - romania_locations['Sibiu'][1], - romania_map.get('Oradea', 'Sibiu')) - make_line( - city_map, - romania_locations['Lugoj'][0], - height - - romania_locations['Lugoj'][1], - romania_locations['Timisoara'][0], - height - - romania_locations['Timisoara'][1], - romania_map.get('Lugoj', 'Timisoara')) - make_line( - city_map, - romania_locations['Lugoj'][0], - height - - romania_locations['Lugoj'][1], - romania_locations['Mehadia'][0], - height - - romania_locations['Mehadia'][1], - romania_map.get('Lugoj', 'Mehandia')) - make_line( - city_map, - romania_locations['Drobeta'][0], - height - - romania_locations['Drobeta'][1], - romania_locations['Mehadia'][0], - height - - romania_locations['Mehadia'][1], - romania_map.get('Drobeta', 'Mehandia')) - make_line( - city_map, - romania_locations['Drobeta'][0], - height - - romania_locations['Drobeta'][1], - romania_locations['Craiova'][0], - height - - romania_locations['Craiova'][1], - romania_map.get('Drobeta', 'Craiova')) - make_line( - city_map, - romania_locations['Pitesti'][0], - height - - romania_locations['Pitesti'][1], - romania_locations['Craiova'][0], - height - - romania_locations['Craiova'][1], - romania_map.get('Pitesti', 'Craiova')) - make_line( - city_map, - romania_locations['Rimnicu'][0], - height - - romania_locations['Rimnicu'][1], - romania_locations['Craiova'][0], - height - - romania_locations['Craiova'][1], - romania_map.get('Rimnicu', 'Craiova')) - make_line( - city_map, - romania_locations['Rimnicu'][0], - height - - romania_locations['Rimnicu'][1], - romania_locations['Sibiu'][0], - height - - romania_locations['Sibiu'][1], - romania_map.get('Rimnicu', 'Sibiu')) - make_line( - city_map, - romania_locations['Rimnicu'][0], - height - - romania_locations['Rimnicu'][1], - romania_locations['Pitesti'][0], - height - - romania_locations['Pitesti'][1], - romania_map.get('Rimnicu', 'Pitesti')) - make_line( - city_map, - romania_locations['Bucharest'][0], - height - - romania_locations['Bucharest'][1], - romania_locations['Pitesti'][0], - height - - romania_locations['Pitesti'][1], - romania_map.get('Bucharest', 'Pitesti')) - make_line( - city_map, - romania_locations['Fagaras'][0], - height - - romania_locations['Fagaras'][1], - romania_locations['Sibiu'][0], - height - - romania_locations['Sibiu'][1], - romania_map.get('Fagaras', 'Sibiu')) - make_line( - city_map, - romania_locations['Fagaras'][0], - height - - romania_locations['Fagaras'][1], - romania_locations['Bucharest'][0], - height - - romania_locations['Bucharest'][1], - romania_map.get('Fagaras', 'Bucharest')) - make_line( - city_map, - romania_locations['Giurgiu'][0], - height - - romania_locations['Giurgiu'][1], - romania_locations['Bucharest'][0], - height - - romania_locations['Bucharest'][1], - romania_map.get('Giurgiu', 'Bucharest')) - make_line( - city_map, - romania_locations['Urziceni'][0], - height - - romania_locations['Urziceni'][1], - romania_locations['Bucharest'][0], - height - - romania_locations['Bucharest'][1], - romania_map.get('Urziceni', 'Bucharest')) - make_line( - city_map, - romania_locations['Urziceni'][0], - height - - romania_locations['Urziceni'][1], - romania_locations['Hirsova'][0], - height - - romania_locations['Hirsova'][1], - romania_map.get('Urziceni', 'Hirsova')) - make_line( - city_map, - romania_locations['Eforie'][0], - height - - romania_locations['Eforie'][1], - romania_locations['Hirsova'][0], - height - - romania_locations['Hirsova'][1], - romania_map.get('Eforie', 'Hirsova')) - make_line( - city_map, - romania_locations['Urziceni'][0], - height - - romania_locations['Urziceni'][1], - romania_locations['Vaslui'][0], - height - - romania_locations['Vaslui'][1], - romania_map.get('Urziceni', 'Vaslui')) - make_line( - city_map, - romania_locations['Iasi'][0], - height - - romania_locations['Iasi'][1], - romania_locations['Vaslui'][0], - height - - romania_locations['Vaslui'][1], - romania_map.get('Iasi', 'Vaslui')) - make_line( - city_map, - romania_locations['Iasi'][0], - height - - romania_locations['Iasi'][1], - romania_locations['Neamt'][0], - height - - romania_locations['Neamt'][1], - romania_map.get('Iasi', 'Neamt')) - - for city in romania_locations.keys(): - make_rectangle( - city_map, - romania_locations[city][0], - height - - romania_locations[city][1], - margin, - city) - - make_legend(city_map) - - -def make_line(map, x0, y0, x1, y1, distance): - ''' - This function draws out the lines joining various points. - ''' - map.create_line(x0, y0, x1, y1) - map.create_text((x0 + x1) / 2, (y0 + y1) / 2, text=distance) - - -def make_rectangle(map, x0, y0, margin, city_name): - ''' - This function draws out rectangles for various points. - ''' - global city_coord - rect = map.create_rectangle( - x0 - margin, - y0 - margin, - x0 + margin, - y0 + margin, - fill="white") - map.create_text( - x0 - 2 * margin, - y0 - 2 * margin, - text=city_name, - anchor=SE) - city_coord.update({city_name: rect}) - - -def make_legend(map): - - rect1 = map.create_rectangle(600, 100, 610, 110, fill="white") - text1 = map.create_text(615, 105, anchor=W, text="Un-explored") - - rect2 = map.create_rectangle(600, 115, 610, 125, fill="orange") - text2 = map.create_text(615, 120, anchor=W, text="Frontier") - - rect3 = map.create_rectangle(600, 130, 610, 140, fill="red") - text3 = map.create_text(615, 135, anchor=W, text="Currently Exploring") - - rect4 = map.create_rectangle(600, 145, 610, 155, fill="grey") - text4 = map.create_text(615, 150, anchor=W, text="Explored") - - rect5 = map.create_rectangle(600, 160, 610, 170, fill="dark green") - text5 = map.create_text(615, 165, anchor=W, text="Final Solution") - - -def tree_search(problem): - ''' - earch through the successors of a problem to find a goal. - The argument frontier should be an empty queue. - Don't worry about repeated paths to a state. [Figure 3.7] - This function has been changed to make it suitable for the Tkinter GUI. - ''' - global counter, frontier, node - # print(counter) - if counter == -1: - frontier.append(Node(problem.initial)) - # print(frontier) - display_frontier(frontier) - if counter % 3 == 0 and counter >= 0: - node = frontier.pop() - # print(node) - display_current(node) - if counter % 3 == 1 and counter >= 0: - if problem.goal_test(node.state): - # print(node) - return node - frontier.extend(node.expand(problem)) - # print(frontier) - display_frontier(frontier) - if counter % 3 == 2 and counter >= 0: - # print(node) - display_explored(node) - return None - -def graph_search(problem): - ''' - Search through the successors of a problem to find a goal. - The argument frontier should be an empty queue. - If two paths reach a state, only use the first one. [Figure 3.7] - This function has been changed to make it suitable for the Tkinter GUI. - ''' - global counter,frontier,node,explored - if counter == -1: - frontier.append(Node(problem.initial)) - explored=set() - display_frontier(frontier) - if counter % 3 ==0 and counter >=0: - node = frontier.pop() - display_current(node) - if counter % 3 == 1 and counter >= 0: - if problem.goal_test(node.state): - return node - explored.add(node.state) - frontier.extend(child for child in node.expand(problem) - if child.state not in explored and - child not in frontier) - display_frontier(frontier) - if counter % 3 == 2 and counter >= 0: - display_explored(node) - return None - - - -def display_frontier(queue): - ''' - This function marks the frontier nodes (orange) on the map. - ''' - global city_map, city_coord - qu = deepcopy(queue) - while qu: - node = qu.pop() - for city in city_coord.keys(): - if node.state == city: - city_map.itemconfig(city_coord[city], fill="orange") - -def display_current(node): - ''' - This function marks the currently exploring node (red) on the map. - ''' - global city_map, city_coord - city = node.state - city_map.itemconfig(city_coord[city], fill="red") - -def display_explored(node): - ''' - This function marks the already explored node (gray) on the map. - ''' - global city_map, city_coord - city = node.state - city_map.itemconfig(city_coord[city], fill="gray") - -def display_final(cities): - ''' - This function marks the final solution nodes (green) on the map. - ''' - global city_map, city_coord - for city in cities: - city_map.itemconfig(city_coord[city], fill="green") - -def breadth_first_tree_search(problem): - """Search the shallowest nodes in the search tree first.""" - global frontier, counter - if counter == -1: - frontier = FIFOQueue() - return tree_search(problem) - - -def depth_first_tree_search(problem): - """Search the deepest nodes in the search tree first.""" - # This search algorithm might not work in case of repeated paths. - global frontier,counter - if counter == -1: - frontier=Stack() - return tree_search(problem) - -# TODO: Check if the solution given by this function is consistent with the original function. -def depth_first_graph_search(problem): - """Search the deepest nodes in the search tree first.""" - global frontier, counter - if counter == -1: - frontier = Stack() - return graph_search(problem) - -# TODO: -# Remove redundant code. -# Make the interchangbility work between various algorithms at each step. -def on_click(): - ''' - This function defines the action of the 'Next' button. - ''' - global algo, counter, next_button, romania_problem, start, goal - romania_problem = GraphProblem(start.get(), goal.get(), romania_map) - if "Breadth-First Tree Search" == algo.get(): - node = breadth_first_tree_search(romania_problem) - if node is not None: - final_path = bfts(romania_problem).solution() - final_path.append(start.get()) - display_final(final_path) - next_button.config(state="disabled") - counter += 1 - elif "Depth-First Tree Search" == algo.get(): - node = depth_first_tree_search(romania_problem) - if node is not None: - final_path = dfts(romania_problem).solution() - final_path.append(start.get()) - display_final(final_path) - next_button.config(state="disabled") - counter += 1 - elif "Depth-First Graph Search" == algo.get(): - node = depth_first_graph_search(romania_problem) - if node is not None: - print(node) - final_path = dfgs(romania_problem).solution() - print(final_path) - final_path.append(start.get()) - display_final(final_path) - next_button.config(state="disabled") - counter += 1 - - - -def reset_map(): - global counter, city_coord, city_map, next_button - counter = -1 - for city in city_coord.keys(): - city_map.itemconfig(city_coord[city], fill="white") - next_button.config(state="normal") - -# TODO: Add more search algorithms in the OptionMenu - - -def main(): - global algo, start, goal, next_button - root = Tk() - root.title("Road Map of Romania") - root.geometry("950x1150") - algo = StringVar(root) - start = StringVar(root) - goal = StringVar(root) - algo.set("Breadth-First Tree Search") - start.set('Arad') - goal.set('Bucharest') - cities = sorted(romania_map.locations.keys()) - algorithm_menu = OptionMenu( - root, algo, "Breadth-First Tree Search", "Depth-First Tree Search","Depth-First Graph Search") - Label(root, text="\n Search Algorithm").pack() - algorithm_menu.pack() - Label(root, text="\n Start City").pack() - start_menu = OptionMenu(root, start, *cities) - start_menu.pack() - Label(root, text="\n Goal City").pack() - goal_menu = OptionMenu(root, goal, *cities) - goal_menu.pack() - frame1 = Frame(root) - next_button = Button( - frame1, - width=6, - height=2, - text="Next", - command=on_click, - padx=2, - pady=2, - relief=GROOVE) - next_button.pack(side=RIGHT) - reset_button = Button( - frame1, - width=6, - height=2, - text="Reset", - command=reset_map, - padx=2, - pady=2, - relief=GROOVE) - reset_button.pack(side=RIGHT) - frame1.pack(side=BOTTOM) - create_map(root) - root.mainloop() - - -if __name__ == "__main__": - main() diff --git a/gui/tic-tac-toe.py b/gui/tic-tac-toe.py deleted file mode 100644 index c2781255f..000000000 --- a/gui/tic-tac-toe.py +++ /dev/null @@ -1,236 +0,0 @@ -from tkinter import * -import sys -import os.path -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) -from games import minimax_decision, alphabeta_player, random_player, TicTacToe -# "gen_state" can be used to generate a game state to apply the algorithm -from tests.test_games import gen_state - -ttt = TicTacToe() -root = None -buttons = [] -frames = [] -x_pos = [] -o_pos = [] -count = 0 -sym = "" -result = None -choices = None - - -def create_frames(root): - """ - This function creates the necessary structure of the game. - """ - frame1 = Frame(root) - frame2 = Frame(root) - frame3 = Frame(root) - frame4 = Frame(root) - create_buttons(frame1) - create_buttons(frame2) - create_buttons(frame3) - buttonExit = Button( - frame4, height=1, width=2, - text="Exit", - command=lambda: exit_game(root)) - buttonExit.pack(side=LEFT) - frame4.pack(side=BOTTOM) - frame3.pack(side=BOTTOM) - frame2.pack(side=BOTTOM) - frame1.pack(side=BOTTOM) - frames.append(frame1) - frames.append(frame2) - frames.append(frame3) - for x in frames: - buttons_in_frame = [] - for y in x.winfo_children(): - buttons_in_frame.append(y) - buttons.append(buttons_in_frame) - buttonReset = Button(frame4, height=1, width=2, - text="Reset", command=lambda: reset_game()) - buttonReset.pack(side=LEFT) - - -def create_buttons(frame): - """ - This function creates the buttons to be pressed/clicked during the game. - """ - button0 = Button(frame, height=2, width=2, text=" ", - command=lambda: on_click(button0)) - button0.pack(side=LEFT) - button1 = Button(frame, height=2, width=2, text=" ", - command=lambda: on_click(button1)) - button1.pack(side=LEFT) - button2 = Button(frame, height=2, width=2, text=" ", - command=lambda: on_click(button2)) - button2.pack(side=LEFT) - - -# TODO: Add a choice option for the user. -def on_click(button): - """ - This function determines the action of any button. - """ - global ttt, choices, count, sym, result, x_pos, o_pos - - if count % 2 == 0: - sym = "X" - else: - sym = "O" - count += 1 - - button.config( - text=sym, - state='disabled', - disabledforeground="red") # For cross - - x, y = get_coordinates(button) - x += 1 - y += 1 - x_pos.append((x, y)) - state = gen_state(to_move='O', x_positions=x_pos, - o_positions=o_pos) - try: - choice = choices.get() - if "Random" in choice: - a, b = random_player(ttt, state) - elif "Pro" in choice: - a, b = minimax_decision(state, ttt) - else: - a, b = alphabeta_player(ttt, state) - except (ValueError, IndexError, TypeError) as e: - disable_game() - result.set("It's a draw :|") - return - if 1 <= a <= 3 and 1 <= b <= 3: - o_pos.append((a, b)) - button_to_change = get_button(a - 1, b - 1) - if count % 2 == 0: # Used again, will become handy when user is given the choice of turn. - sym = "X" - else: - sym = "O" - count += 1 - - if check_victory(button): - result.set("You win :)") - disable_game() - else: - button_to_change.config(text=sym, state='disabled', - disabledforeground="black") - if check_victory(button_to_change): - result.set("You lose :(") - disable_game() - - -# TODO: Replace "check_victory" by "k_in_row" function. -def check_victory(button): - """ - This function checks various winning conditions of the game. - """ - # check if previous move caused a win on vertical line - global buttons - x, y = get_coordinates(button) - tt = button['text'] - if buttons[0][y]['text'] == buttons[1][y]['text'] == buttons[2][y]['text'] != " ": - buttons[0][y].config(text="|" + tt + "|") - buttons[1][y].config(text="|" + tt + "|") - buttons[2][y].config(text="|" + tt + "|") - return True - - # check if previous move caused a win on horizontal line - if buttons[x][0]['text'] == buttons[x][1]['text'] == buttons[x][2]['text'] != " ": - buttons[x][0].config(text="--" + tt + "--") - buttons[x][1].config(text="--" + tt + "--") - buttons[x][2].config(text="--" + tt + "--") - return True - - # check if previous move was on the main diagonal and caused a win - if x == y and buttons[0][0]['text'] == buttons[1][1]['text'] == buttons[2][2]['text'] != " ": - buttons[0][0].config(text="\\" + tt + "\\") - buttons[1][1].config(text="\\" + tt + "\\") - buttons[2][2].config(text="\\" + tt + "\\") - return True - - # check if previous move was on the secondary diagonal and caused a win - if x + \ - y == 2 and buttons[0][2]['text'] == buttons[1][1]['text'] == buttons[2][0]['text'] != " ": - buttons[0][2].config(text="/" + tt + "/") - buttons[1][1].config(text="/" + tt + "/") - buttons[2][0].config(text="/" + tt + "/") - return True - - return False - - -def get_coordinates(button): - """ - This function returns the coordinates of the button clicked. - """ - global buttons - for x in range(len(buttons)): - for y in range(len(buttons[x])): - if buttons[x][y] == button: - return x, y - - -def get_button(x, y): - """ - This function returns the button memory location corresponding to a coordinate. - """ - global buttons - return buttons[x][y] - - -def reset_game(): - """ - This function will reset all the tiles to the initial null value. - """ - global x_pos, o_pos, frames, count - - count = 0 - x_pos = [] - o_pos = [] - result.set("Your Turn!") - for x in frames: - for y in x.winfo_children(): - y.config(text=" ", state='normal') - - -def disable_game(): - """ - This function deactivates the game after a win, loss or draw. - """ - global frames - for x in frames: - for y in x.winfo_children(): - y.config(state='disabled') - - -def exit_game(root): - """ - This function will exit the game by killing the root. - """ - root.destroy() - - -def main(): - global result, choices - - root = Tk() - root.title("TicTacToe") - root.resizable(0, 0) # To remove the maximize window option - result = StringVar() - result.set("Your Turn!") - w = Label(root, textvariable=result) - w.pack(side=BOTTOM) - create_frames(root) - choices = StringVar(root) - choices.set("Vs Pro") - menu = OptionMenu(root, choices, "Vs Random", "Vs Pro", "Vs Legend") - menu.pack() - root.mainloop() - - -if __name__ == "__main__": - main() - diff --git a/images/IMAGE-CREDITS b/images/IMAGE-CREDITS deleted file mode 100644 index f8525eb92..000000000 --- a/images/IMAGE-CREDITS +++ /dev/null @@ -1,17 +0,0 @@ -PHOTO CREDITS - -Image After http://www.imageafter.com/ - - b15woods003.jpg - (Cropped to 764x764 and scaled to 50x50 to make wall-icon.jpg - by Gregory Weber) - -Noctua Graphics, http://www.noctua-graphics.de/english/fraset_e.htm - - dirt05.jpg 512x512 - (Scaled to 50x50 to make dirt05-icon.jpg by Gregory Weber) - -Gregory Weber - - dirt.svg, dirt.png - vacuum.svg, vacuum.png diff --git a/images/aima3e_big.jpg b/images/aima3e_big.jpg deleted file mode 100644 index 1105a5e14adf0074dfad807b8a8db0018a151881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57178 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

    78PC4N0xYj@ZRDuI@`lx z)33`M)LyAwWtB^dd!v9YdjL7NJl@zPj#NmJIl?M}BvnIm(!?I3#^>+A2bj(72xe~+c`ID_4MnGV~@OP3@Btg7h-RF zbOVl`w+5>jovm_=EgGIVKBuSO>3k|DW%Aloc!&ht{PCjKeTX8sESyn2oUal>UT5T+}_*+&mSx~Sy7b%-?d45 z06@PzKlSB-H+v3AC3F<~Q1@ky*un zJ7WL=W7mRkPVFQhNbF7a@T3b4zaDTs*puPvaOOIh)>dL2UU!F!B z(@2q)V7ss8RFmu17|N7tNoV2z0K<6JbfEHaCFpflZ4G=moD`I@PYryTony?-!mf6> zP~(CTL9kKD^}}jCMO#Bxl-3w2WBRgLrHTgK-AN?Gm%5&dV_|N7IE|>=B!S?5>Adf7 z2=q8_S-xKH+Gk-z?9Mn03Fg2LOjgESC{_ll z7l(Di?PFo{wiYyrx=9Sl5;B3{UA*}oMj>HUlv1+%-sSeaT${X}m;V6Oi*+`-)GJ14 z^BhY{a@Fr4fE{w4i03EA)-1M;q*rkG@Yqb4Hc-qP3 zO<8#sy3K!_$(YwyHd&JUbor3X=^YkOGTNaU#onL|XJU$^_nU^`2pnQ3_*+p$1IE!& z&LPPkB%^w;&auNQv&}IId71YSbH^itY()Ds;%)0vHi2dV2tJ^LZ=YNRpr;X7SzM8J zWjy@<09WCK*eSm3M!G_Awd8dUX-fhmF|@=gh2kPWx7};>^Yz21>gr?%_`AYEuvQ}F zeMlWXN1Svc5HyPdE2%ds66giG*m9@w!cjSnp;`^h=Z%Ei^uGtpar4Ka9MMTPvFFWG zo!XACnC4fTz5xyHw+D9?^EbkD^G_sYpe2->T$>VbjMAx$q)fz400i;=x83RS!=#ZS z1}OJQwMR~!2c9%d$?jm{qaC$62BW$J4csJwE>cJQ9=IAxQu%is22lgne`6A^J^`DehwosHZ4 zn`IUj0c95d0P$Y~ADQFy#Z|xcKf6Ckz%=l*?fon4dGB9UMm64`h?nn1Wit16xi@wq z-wShyVOI%^xOU-!Z35)6ByIWdaWk&zV;cVeJDxXXs2P<>-_-b=fs}9(K1P++m1P351N%*_Goq zkr;ct1Ig*;G0l63=;n5Pn^Ugc-1=JtDa>M_;hDsfi48^!WUPiPxE5{6NVSknrmYO+UQzVX7WdWA_ank?_Qq-i= zssh2bZ(YOQUtBrq&G^G=XjUn=_l)upw6PzWIsu0l=aY}R_HSG#%=k}fU;MRhLQ>5W zCA-0K>x62J=!k{EHupN=e&Q2<2;6Xti5k)dRr^9f^uIXvrk$DNQ)=qNDND395iLB8 z-a^567AD*S@xB{muvF4gcW)b{p*#%Vnxt|q=kOSBCViJj4N3~-@6&KVQ)vxi2T{*9 zI4^9iH1NnL_J0k`jbJZtFNyyEhZytST6vRB=d7sJP|DSld~Qs4jL|GcDH1p4Mjrc< z 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 N002ovPDHLkV1f`i!_@!) diff --git a/images/bayesnet.png b/images/bayesnet.png deleted file mode 100644 index 6260ab7e1efd41da85545ebd47c98ba6f5426093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81000 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%0D6JcP`nYxQTicw158l<5GzI z6yq8;W12M;nDGA(IK65N`_PMk&?znsLNL~Sc^e-KNwPs1jDu7SIgX(ex8PHV@~gOF gWuKB7_pQCs%CU@{S>b6`A^?B#vMT?9rA@;A2g>(L0RR91 diff --git a/images/decisiontree_fruit.jpg b/images/decisiontree_fruit.jpg deleted file mode 100644 index 41ac4d6061e06db4d5ee42d2e6fec40c04ae3ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45995 zcma&M19W8H(=Oc6#7-u*ZQHgcp4isJnbu+OPo8}C2gHvve};!@%O5D*Z6gHKj}wp&A0Nh_KECkKkkJ3Z{+|o)eE?)AkXX=MFc4$_C^85b zGRXS?02crP00sMVy8jV~PaxosV4zSRDE0^NSN;P6Kt3)4;?w&I01oWK5(x|m004P? z`7i$ePy*2)L~Oj1b0N#j`Cr+Xp9BF*TyZGQ7PL$nb4y^mrH!HsnbFDKe*dcpV4r-* zxN27UOmi#KmV4lwX>AER@0?GCyM#gTe>Vcjb9gys_||2l!ZYc~JnV+&P#9r3pPC>u zukiJMu>ye+u7L|c-cM{ST~zaeA7%f26lTxg^S`kFs3FiIC}hGAG$N3tl(ix-|92+5 zN_Gy!ZZZJ3;~0Rh+~l1S|M3j{|Hwd?RQL#sIcS^eWWtYZKLAYcg_a*=uNcW>{F{fL z0dnZlyoKQZw1blxuDnSBPM7+4I-c;hea)?KFpx3-U~zq)?*V|R{vaT2b!MXAND;A& z%E@&c^ZTC;26A%f+q5jjF~*ApBJE&3qy#@0Ad=)HuG5hxspmOLQyn&I3D%Q&NX3|Z zBql~|*|`Lk|I-Nw7_?Sd-S1(+>Oa;1z}~loPY1!Znr$^^KJy&%nQaXCX)_?#WKv&a z>h86B{&N10AH?`ziDYKrKN^{*-- zONNBpKMeCkmMycnwSV*e{zH7Nz$y1psQI^Y-%Nr}@NWe~pW0N$ojpzQ-w*&oGDzt( zNrfztZjkI>N`C1$xNfQKHY)N~KIKyzzYjGWn#m0Rj8LWDm23{pR~f;7F+r;uHQCAP z&IO#*v0_Pz%AQ6I5b`|!0gDq`-KwmCtJj|}I5?B>t>Vr7W*QOk7 z*71XPD*|-epZDd;9_Rk;b#HvG;2>=wL`Qg`n{L=H3zm<&s1}DpB00|bk@c^0uw>es znx_FgPx&M>9C8;DH(Bni11y(J`R}$PA5D4XNOs(ssl0kts{`ESJlWCAwc~RMe_CfM zBkL6X=j;H8s2St3wCULo zOt)JJUe}czJgs8oj~WClX|*nk9;)FV&L0hessf4R$$#pAec1WA3h&SM|7gt7b_9R9XWvW0k zR$CH)DX!UQAoxMRjMJI)P`ZPmG9@h-%~1RSfWj2YkcgX#PDJ?Xd;v$yWU4{^*N+kP zXP{RT?S|erE$AAj%oTbMR|bjroax4!I9_;r52>-66N{sdHbNv(z2Qg9D@vg}aMPs% zJaVNuP5Q0njQdOu0^HLj3c||BuiYmnz0s8KZ2X}@Xb;lP$)uagRmVs2F{U6+hEZj$apy4W)bIVIX&pb0+kMsG^vE|HY z0Dw3gxnPCN#8j3bNR`u(hcJ@q4CI6fW2-E^qH?lhkso6cS7oxbL-


    yN*;4>2Gf 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 diff --git a/images/dirt.svg b/images/dirt.svg deleted file mode 100644 index 162f84582..000000000 --- a/images/dirt.svg +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/images/dirt05-icon.jpg b/images/dirt05-icon.jpg deleted file mode 100644 index 38d02e97f84973f98b2b98ad5ca3a7a752986174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 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 P-~(3FRH&DG9`=6#fw6m- diff --git a/images/knn_plot.png b/images/knn_plot.png deleted file mode 100644 index 58b316fdd08a80ee60cc98476a420b14f5d904b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45256 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

    E$fHB1*xXl0UuWi#=)7h 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 diff --git a/images/makefile b/images/makefile deleted file mode 100644 index 20297a8ef..000000000 --- a/images/makefile +++ /dev/null @@ -1,34 +0,0 @@ -# makefile for images - -Sources = dirt.svg vacuum.svg - -Targets = $(Sources:.svg=.png) - -ImageScale = 50x50 - -Temporary = tmp.jpg - -.PHONY: all - -all: $(Targets) - -.PHONY: clean - -clean: - rm -f $(Targets) $(Temporary) - -%.png: %.svg - convert -scale $(ImageScale) $< $@ - -%-icon.jpg: %.svg - convert -scale $(ImageScale) $< $@ - -%-icon.jpg: %.jpg - convert -scale $(ImageScale) $< $@ - -wall-icon.jpg: b15woods003.jpg - convert -crop 764x764+0+0 $< tmp.jpg - convert -resize 50x50+0+0 tmp.jpg $@ - -vacuum-icon.jpg: vacuum.svg - convert -scale $(ImageScale) -transparent white $< $@ diff --git a/images/mdp-a.png b/images/mdp-a.png deleted file mode 100644 index 2f3774891c89262f6f780bfc9cb1d2f8abbe6ca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31989 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 diff --git a/images/mdp.png b/images/mdp.png deleted file mode 100644 index e874130ee7bee4523a7ae02280ad73420919825f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 824 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�>i>{sQT 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 diff --git a/images/parse_tree.png b/images/parse_tree.png deleted file mode 100644 index f6ca87b2fb76fe83e5b90453e8513eba14ecf24b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13655 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 E0q&R<=l}o! diff --git a/images/perceptron.png b/images/perceptron.png deleted file mode 100644 index 68d2a258a5bf59760897e11b64d4cc6d882bc17c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19756 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 ZfAyK+6-TFDyV=SB1fH&bF6*2UngEVfcYOc= diff --git a/images/search_animal.svg b/images/search_animal.svg deleted file mode 100644 index e3c3105c8..000000000 --- a/images/search_animal.svg +++ /dev/null @@ -1,1533 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start - 3 - 7 - 7 - 9 - 6 - 11 - 8 - 5 - 9 - 10 - 6 - 4 - 3 - 2 - 4 - 9 - 8 - diff --git a/images/sprinklernet.jpg b/images/sprinklernet.jpg deleted file mode 100644 index cac16ee09128cc9d021ff7891f73aac8091ed2ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42865 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 yU9!&}akN~2Wv#EXI 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 diff --git a/images/vacuum-icon.jpg b/images/vacuum-icon.jpg deleted file mode 100644 index 71c80bb6f5885c8bb317efde544ed838faa29596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1428 zcmex=BiC^fMpHASI3vm`^oGcUV1Ik6yBK_jE2 zq`*pFzr4I$FB2-LmtT~wuc`3=HiI+B42l5A5Q+={Y5sqJL6C#Nh{1@NQHg;`kdaxC z@&6G9DWKyRn1L7pxR}{F*|>pnDgq1)>@0}~S?3lkIEd?1U3m4QuAh+SAwi9^ItIq?521|DWcpnI4F8SEK$ zF)+5dbbO48{xm<$n0NYixe2c%Gg<$xJuWguW&c%;4wH_V^OP)S{^;m`bNE|GffU9DyGLPs`(DJ|ICN*<(%#kG>yCx5|KuoSr1*a0 z3yKy*umSyqkqn({(?TZS75SI{N*g)#k(-W>du` ziheX&_G+D@$gH0qr@2j4OxY&qzkJbt#a7j;`5RU2d)zL4SY9@{&(@-H%GUlnOWm@~ zCf591)p+gVo3k823tTggF16d&^Y7}L^Ebmjyu2lO`OfTO@mWc&y1P2nbu7PjPdV&e zTf3zDx=y4=+01#HW&XTwK7UW2pXX zdvbAmoNiZ>h?wG{oeGVb3=B)I*)EvNZ?ZS<)6$!Ny-b8=ocrG+fm?d)L}Gb5Hi%mG~vGruUC)<91KUS?{+y=;|d* z`WC)EYvzUvg=`zutDY?WD|YZn`t$v{54+Eb{!O{%-DiB&fA!|{ugjgM-}t9ERq$KL zlGV?AB5m#}*-Q&svNS98nyk}5@7q~MO0t(f@jp)9E_?7*yW_@!AHQ3R=j=SxfBt+? zSvKS1Z1e8J&q_Xgn%Wg+@s4MaUe}_{s&Q*&ZP?$xRf{w?2Aq?AGVs#NHfjC}A=7i_3 z&ebkG?Q|ixl8O0dx0Up(zs%PvyQ;P=RPvHvS6II^)F?V@CLizQ!rTejre|6u({iVm zII#LDiw1M|t?gN)W}3yx - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/images/wall-icon.jpg b/images/wall-icon.jpg deleted file mode 100644 index 754e591b4ae75e06e2ca9d0fa9f1854c1b166cd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35979 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 - - - - -''' # noqa - -with open('js/continuousworld.js', 'r') as js_file: - _JS_CONTINUOUS_WORLD = js_file.read() - - -class ContinuousWorldView: - """ View for continuousworld Implementation in agents.py """ - - def __init__(self, world, fill="#AAA"): - self.time = time.time() - self.world = world - self.width = world.width - self.height = world.height - - def object_name(self): - globals_in_main = {x: getattr(__main__, x) for x in dir(__main__)} - for x in globals_in_main: - if isinstance(globals_in_main[x], type(self)): - if globals_in_main[x].time == self.time: - return x - - def handle_add_obstacle(self, vertices): - """ Vertices must be a nestedtuple. This method - is called from kernel.execute on completion of - a polygon. """ - self.world.add_obstacle(vertices) - self.show() - - def handle_remove_obstacle(self): - return NotImplementedError - - def get_polygon_obstacles_coordinates(self): - obstacle_coordiantes = [] - for thing in self.world.things: - if isinstance(thing, PolygonObstacle): - obstacle_coordiantes.append(thing.coordinates) - return obstacle_coordiantes - - def show(self): - clear_output() - total_html = _CONTINUOUS_WORLD_HTML.format(self.width, self.height, self.object_name(), - str(self.get_polygon_obstacles_coordinates()), - _JS_CONTINUOUS_WORLD) - display(HTML(total_html)) - - -# ______________________________________________________________________________ -# Grid environment - -_GRID_WORLD_HTML = ''' -

    - -''' - -with open('js/gridworld.js', 'r') as js_file: - _JS_GRID_WORLD = js_file.read() - - -class GridWorldView: - """ View for grid world. Uses XYEnviornment in agents.py as model. - world: an instance of XYEnviornment. - block_size: size of individual blocks in pixes. - default_fill: color of blocks. A hex value or name should be passed. - """ - - def __init__(self, world, block_size=30, default_fill="white"): - self.time = time.time() - self.world = world - self.labels = defaultdict(str) # locations as keys - self.representation = {"default": {"type": "color", "source": default_fill}} - self.block_size = block_size - - def object_name(self): - globals_in_main = {x: getattr(__main__, x) for x in dir(__main__)} - for x in globals_in_main: - if isinstance(globals_in_main[x], type(self)): - if globals_in_main[x].time == self.time: - return x - - def set_label(self, coordinates, label): - """ Add lables to a particular block of grid. - coordinates: a tuple of (row, column). - rows and columns are 0 indexed. - """ - self.labels[coordinates] = label - - def set_representation(self, thing, repr_type, source): - """ Set the representation of different things in the - environment. - thing: a thing object. - repr_type : type of representation can be either "color" or "img" - source: Hex value in case of color. Image path in case of image. - """ - thing_class_name = thing.__class__.__name__ - if repr_type not in ("img", "color"): - raise ValueError('Invalid repr_type passed. Possible types are img/color') - self.representation[thing_class_name] = {"type": repr_type, "source": source} - - def handle_click(self, coordinates): - """ This method needs to be overidden. Make sure to include a - self.show() call at the end. """ - self.show() - - def map_to_render(self): - default_representation = {"val": "default", "tooltip": ""} - world_map = [[copy.deepcopy(default_representation) for _ in range(self.world.width)] - for _ in range(self.world.height)] - - for thing in self.world.things: - row, column = thing.location - thing_class_name = thing.__class__.__name__ - if thing_class_name not in self.representation: - raise KeyError('Representation not found for {}'.format(thing_class_name)) - world_map[row][column]["val"] = thing.__class__.__name__ - - for location, label in self.labels.items(): - row, column = location - world_map[row][column]["tooltip"] = label - - return json.dumps(world_map) - - def show(self): - clear_output() - total_html = _GRID_WORLD_HTML.format( - self.object_name(), self.map_to_render(), - self.block_size, json.dumps(self.representation), _JS_GRID_WORLD) - display(HTML(total_html)) diff --git a/js/canvas.js b/js/canvas.js deleted file mode 100644 index d9d313d2e..000000000 --- a/js/canvas.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - JavaScript functions that are executed by running the corresponding methods of a Canvas object - Donot use these functions by making a js file. Instead use the python Canvas class. - See canvas.py for help on how to use the Canvas class to draw on the HTML Canvas -*/ - - -//Manages the output of code executed in IPython kernel -function output_callback(out, block){ - console.log(out); - //Handle error in python - if(out.msg_type == "error"){ - console.log("Error in python script!"); - console.log(out.content); - return ; - } - script = out.content.data['text/html']; - script = script.substr(8, script.length - 17); - eval(script) -} - -//Handles mouse click by calling mouse_click of Canvas object with the co-ordinates as arguments -function click_callback(element, event, varname){ - var rect = element.getBoundingClientRect(); - var x = event.clientX - rect.left; - var y = event.clientY - rect.top; - var kernel = IPython.notebook.kernel; - var exec_str = varname + ".mouse_click(" + String(x) + ", " + String(y) + ")"; - console.log(exec_str); - kernel.execute(exec_str,{'iopub': {'output': output_callback}}, {silent: false}); -} - -function rgbToHex(r,g,b){ - var hexValue=(r<<16) + (g<<8) + (b<<0); - var hexString=hexValue.toString(16); - hexString ='#' + Array(7-hexString.length).join('0') + hexString; //Add 0 padding - return hexString; -} - -function toRad(x){ - return x*Math.PI/180; -} - -//Canvas class to store variables -function Canvas(id){ - this.canvas = document.getElementById(id); - this.ctx = this.canvas.getContext("2d"); - this.WIDTH = this.canvas.width; - this.HEIGHT = this.canvas.height; - this.MOUSE = {x:0,y:0}; -} - -//Sets the fill color with which shapes are filled -Canvas.prototype.fill = function(r, g, b){ - this.ctx.fillStyle = rgbToHex(r,g,b); -} - -//Set the stroke color -Canvas.prototype.stroke = function(r, g, b){ - this.ctx.strokeStyle = rgbToHex(r,g,b); -} - -//Set width of the lines/strokes -Canvas.prototype.strokeWidth = function(w){ - this.ctx.lineWidth = w; -} - -//Draw a rectangle with top left at (x,y) with 'w' width and 'h' height -Canvas.prototype.rect = function(x, y, w, h){ - this.ctx.fillRect(x,y,w,h); -} - -//Draw a line with (x1, y1) and (x2, y2) as end points -Canvas.prototype.line = function(x1, y1, x2, y2){ - this.ctx.beginPath(); - this.ctx.moveTo(x1, y1); - this.ctx.lineTo(x2, y2); - this.ctx.stroke(); -} - -//Draw an arc with (x, y) as centre, 'r' as radius from angles start to stop -Canvas.prototype.arc = function(x, y, r, start, stop){ - this.ctx.beginPath(); - this.ctx.arc(x, y, r, toRad(start), toRad(stop)); - this.ctx.stroke(); -} - -//Clear the HTML canvas -Canvas.prototype.clear = function(){ - this.ctx.clearRect(0, 0, this.WIDTH, this.HEIGHT); -} - -//Change font, size and style -Canvas.prototype.font = function(font_str){ - this.ctx.font = font_str; -} - -//Draws "filled" text on the canvas -Canvas.prototype.fill_text = function(text, x, y){ - this.ctx.fillText(text, x, y); -} - -//Write text on the canvas -Canvas.prototype.stroke_text = function(text, x, y){ - this.ctx.strokeText(text, x, y); -} - - -//Test if the canvas functions are working -Canvas.prototype.test_run = function(){ - var dbg = false; - if(dbg) - alert("1"); - this.clear(); - if(dbg) - alert("2"); - this.fill(0, 200, 0); - if(dbg) - alert("3"); - this.rect(this.MOUSE.x, this.MOUSE.y, 100, 200); - if(dbg) - alert("4"); - this.stroke(0, 0, 50); - if(dbg) - alert("5"); - this.line(0, 0, 100, 100); - if(dbg) - alert("6"); - this.stroke(200, 200, 200); - if(dbg) - alert("7"); - this.arc(200, 100, 50, 0, 360); - if(dbg) - alert("8"); -} diff --git a/js/continuousworld.js b/js/continuousworld.js deleted file mode 100644 index ab589f6d1..000000000 --- a/js/continuousworld.js +++ /dev/null @@ -1,71 +0,0 @@ -var latest_output_area ="NONE"; // Jquery object for the DOM element of output area which was used most recently -function handle_output(out, block){ - var output = out.content.data["text/html"]; - latest_output_area.html(output); -} -function polygon_complete(canvas, vertices){ - latest_output_area = $(canvas).parents('.output_subarea'); - var world_object_name = canvas.dataset.world_name; - var command = world_object_name + ".handle_add_obstacle(" + JSON.stringify(vertices) + ")"; - console.log("Executing Command: " + command); - var kernel = IPython.notebook.kernel; - var callbacks = { 'iopub' : {'output' : handle_output}}; - kernel.execute(command,callbacks); -} -var canvas , ctx; -function drawPolygon(array) { - ctx.fillStyle = '#f00'; - ctx.beginPath(); - ctx.moveTo(array[0][0],array[0][1]); - for(var i = 1;i1) - { - drawPoint(pArray[0][0],pArray[0][1]); - } - //check overlap - if(ctx.isPointInPath(x, y) && (pArray.length>1)) { - //Do something - drawPolygon(pArray); - polygon_complete(canvas,pArray); - } - else { - var point = new Array(); - point.push(x,y); - pArray.push(point); - } -} -function drawPoint(x, y) { - ctx.beginPath(); - ctx.arc(x, y, 5, 0, Math.PI*2); - ctx.fillStyle = '#00f'; - ctx.fill(); - ctx.closePath(); -} -function initalizeObstacles(objects) { - canvas = $('canvas.main-robo-world').get(0); - ctx = canvas.getContext('2d'); - $('canvas.main-robo-world').removeClass('main-robo-world'); - for(var i=0;i').attr({height:size,width:size,src:val["source"]}).data({name:i,loaded:false}).load(function(){ - // Check for all image loaded - var execute=true; - $(this).data("loaded",true); - $.each($imgArray, function(i, val) { - if(!$(this).data("loaded")) { - execute=false; - // exit on unloaded image - return false; - } - }); - if (execute) { - // Converting loaded image to canvas covering block size. - $.each($imgArray, function(i, val) { - $imgArray[i] = $('').attr({width:size,height:size}).get(0); - $imgArray[i].getContext('2d').drawImage(val.get(0),0,0,size,size); - }); - // initialize the world - initializeWorld(); - } - }); - } - }); - - if(!hasImg) { - initializeWorld(); - } - - function initializeWorld(){ - var $parentDiv = $('div.map-grid-world'); - // remove object reference - $('div.map-grid-world').removeClass('map-grid-world'); - // get some info about the canvas - var row = state.length; - var column = state[0].length; - var canvas = $parentDiv.find('canvas').get(0); - var ctx = canvas.getContext('2d'); - canvas.width = size * column; - canvas.height = size * row; - - //Initialize previous positions - for(var i=0;i=0 && gx=0 && gy" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pseudocode('Current-Best-Learning')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "As mentioned previously, examples are dictionaries (with keys the attribute names) and hypotheses are lists of dictionaries (each dictionary is a disjunction). Also, in the hypothesis, we denote the *NOT* operation with an exclamation mark (!).\n", - "\n", - "We have functions to calculate the list of all specializations/generalizations, to check if an example is consistent/false positive/false negative with a hypothesis. We also have an auxiliary function to add a disjunction (or operation) to a hypothesis, and two other functions to check consistency of all (or just the negative) examples.\n", - "\n", - "You can read the source by running the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(current_best_learning, specializations, generalizations)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can view the auxiliary functions in the [knowledge module](https://github.com/aimacode/aima-python/blob/master/knowledge.py). A few notes on the functionality of some of the important methods:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* `specializations`: For each disjunction in the hypothesis, it adds a conjunction for values in the examples encountered so far (if the conjunction is consistent with all the examples). It returns a list of hypotheses.\n", - "\n", - "* `generalizations`: It adds to the list of hypotheses in three phases. First it deletes disjunctions, then it deletes conjunctions and finally it adds a disjunction.\n", - "\n", - "* `add_or`: Used by `generalizations` to add an *or operation* (a disjunction) to the hypothesis. Since the last example is the problematic one which wasn't consistent with the hypothesis, it will model the new disjunction to that example. It creates a disjunction for each combination of attributes in the example and returns the new hypotheses consistent with the negative examples encountered so far. We do not need to check the consistency of positive examples, since they are already consistent with at least one other disjunction in the hypotheses' set, so this new disjunction doesn't affect them. In other words, if the value of a positive example is negative under the disjunction, it doesn't matter since we know there exists a disjunction consistent with the example." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the algorithm stops searching the specializations/generalizations after the first consistent hypothesis is found, usually you will get different results each time you run the code." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Examples\n", - "\n", - "We will take a look at two examples. The first is a trivial one, while the second is a bit more complicated (you can also find it in the book).\n", - "\n", - "First we have the \"animals taking umbrellas\" example. Here we want to find a hypothesis to predict whether or not an animal will take an umbrella. The attributes are `Species`, `Rain` and `Coat`. The possible values are `[Cat, Dog]`, `[Yes, No]` and `[Yes, No]` respectively. Below we give seven examples (with `GOAL` we denote whether an animal will take an umbrella or not):" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "animals_umbrellas = [\n", - " {'Species': 'Cat', 'Rain': 'Yes', 'Coat': 'No', 'GOAL': True},\n", - " {'Species': 'Cat', 'Rain': 'Yes', 'Coat': 'Yes', 'GOAL': True},\n", - " {'Species': 'Dog', 'Rain': 'Yes', 'Coat': 'Yes', 'GOAL': True},\n", - " {'Species': 'Dog', 'Rain': 'Yes', 'Coat': 'No', 'GOAL': False},\n", - " {'Species': 'Dog', 'Rain': 'No', 'Coat': 'No', 'GOAL': False},\n", - " {'Species': 'Cat', 'Rain': 'No', 'Coat': 'No', 'GOAL': False},\n", - " {'Species': 'Cat', 'Rain': 'No', 'Coat': 'Yes', 'GOAL': True}\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let our initial hypothesis be `[{'Species': 'Cat'}]`. That means every cat will be taking an umbrella. We can see that this is not true, but it doesn't matter since we will refine the hypothesis using the Current-Best algorithm. First, let's see how that initial hypothesis fares to have a point of reference." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "False\n", - "True\n", - "True\n" - ] - } - ], - "source": [ - "initial_h = [{'Species': 'Cat'}]\n", - "\n", - "for e in animals_umbrellas:\n", - " print(guess_value(e, initial_h))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We got 5/7 correct. Not terribly bad, but we can do better. Let's run the algorithm and see how that performs." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "True\n", - "False\n", - "False\n", - "False\n", - "True\n" - ] - } - ], - "source": [ - "h = current_best_learning(animals_umbrellas, initial_h)\n", - "\n", - "for e in animals_umbrellas:\n", - " print(guess_value(e, h))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We got everything right! Let's print our hypothesis:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'Species': 'Cat', 'Rain': '!No'}, {'Coat': 'Yes', 'Rain': 'Yes'}, {'Coat': 'Yes'}]\n" - ] - } - ], - "source": [ - "print(h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If an example meets any of the disjunctions in the list, it will be `True`, otherwise it will be `False`.\n", - "\n", - "Let's move on to a bigger example, the \"Restaurant\" example from the book. The attributes for each example are the following:\n", - "\n", - "* Alternative option (`Alt`)\n", - "* Bar to hang out/wait (`Bar`)\n", - "* Day is Friday (`Fri`)\n", - "* Is hungry (`Hun`)\n", - "* How much does it cost (`Price`, takes values in [$, $$, $$$])\n", - "* How many patrons are there (`Pat`, takes values in [None, Some, Full])\n", - "* Is raining (`Rain`)\n", - "* Has made reservation (`Res`)\n", - "* Type of restaurant (`Type`, takes values in [French, Thai, Burger, Italian])\n", - "* Estimated waiting time (`Est`, takes values in [0-10, 10-30, 30-60, >60])\n", - "\n", - "We want to predict if someone will wait or not (Goal = WillWait). Below we show twelve examples found in the book." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![restaurant](images/restaurant.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the function `r_example` we will build the dictionary examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def r_example(Alt, Bar, Fri, Hun, Pat, Price, Rain, Res, Type, Est, GOAL):\n", - " return {'Alt': Alt, 'Bar': Bar, 'Fri': Fri, 'Hun': Hun, 'Pat': Pat,\n", - " 'Price': Price, 'Rain': Rain, 'Res': Res, 'Type': Type, 'Est': Est,\n", - " 'GOAL': GOAL}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "In code:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "restaurant = [\n", - " r_example('Yes', 'No', 'No', 'Yes', 'Some', '$$$', 'No', 'Yes', 'French', '0-10', True),\n", - " r_example('Yes', 'No', 'No', 'Yes', 'Full', '$', 'No', 'No', 'Thai', '30-60', False),\n", - " r_example('No', 'Yes', 'No', 'No', 'Some', '$', 'No', 'No', 'Burger', '0-10', True),\n", - " r_example('Yes', 'No', 'Yes', 'Yes', 'Full', '$', 'Yes', 'No', 'Thai', '10-30', True),\n", - " r_example('Yes', 'No', 'Yes', 'No', 'Full', '$$$', 'No', 'Yes', 'French', '>60', False),\n", - " r_example('No', 'Yes', 'No', 'Yes', 'Some', '$$', 'Yes', 'Yes', 'Italian', '0-10', True),\n", - " r_example('No', 'Yes', 'No', 'No', 'None', '$', 'Yes', 'No', 'Burger', '0-10', False),\n", - " r_example('No', 'No', 'No', 'Yes', 'Some', '$$', 'Yes', 'Yes', 'Thai', '0-10', True),\n", - " r_example('No', 'Yes', 'Yes', 'No', 'Full', '$', 'Yes', 'No', 'Burger', '>60', False),\n", - " r_example('Yes', 'Yes', 'Yes', 'Yes', 'Full', '$$$', 'No', 'Yes', 'Italian', '10-30', False),\n", - " r_example('No', 'No', 'No', 'No', 'None', '$', 'No', 'No', 'Thai', '0-10', False),\n", - " r_example('Yes', 'Yes', 'Yes', 'Yes', 'Full', '$', 'No', 'No', 'Burger', '30-60', True)\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Say our initial hypothesis is that there should be an alternative option and let's run the algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "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" - ] - } - ], - "source": [ - "initial_h = [{'Alt': 'Yes'}]\n", - "h = current_best_learning(restaurant, initial_h)\n", - "for e in restaurant:\n", - " print(guess_value(e, h))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The predictions are correct. Let's see the hypothesis that accomplished that:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'Res': '!No', 'Fri': '!Yes', 'Alt': 'Yes'}, {'Bar': 'Yes', 'Fri': 'No', 'Rain': 'No', 'Hun': 'No'}, {'Bar': 'No', 'Price': '$', 'Fri': 'Yes'}, {'Res': 'Yes', 'Price': '$$', 'Rain': 'Yes', 'Alt': 'No', 'Est': '0-10', 'Fri': 'No', 'Hun': 'Yes', 'Bar': 'Yes'}, {'Fri': 'No', 'Pat': 'Some', 'Price': '$$', 'Rain': 'Yes', 'Hun': 'Yes'}, {'Est': '30-60', 'Res': 'No', 'Price': '$', 'Fri': 'Yes', 'Hun': 'Yes'}]\n" - ] - } - ], - "source": [ - "print(h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It might be quite complicated, with many disjunctions if we are unlucky, but it will always be correct, as long as a correct hypothesis exists." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VERSION-SPACE LEARNING\n", - "\n", - "### Overview\n", - "\n", - "**Version-Space Learning** is a general method of learning in logic based domains. We generate the set of all the possible hypotheses in the domain and then we iteratively remove hypotheses inconsistent with the examples. The set of remaining hypotheses is called **version space**. Because hypotheses are being removed until we end up with a set of hypotheses consistent with all the examples, the algorithm is sometimes called **candidate elimination** algorithm.\n", - "\n", - "After we update the set on an example, all the hypotheses in the set are consistent with that example. So, when all the examples have been parsed, all the remaining hypotheses in the set are consistent with all the examples. That means we can pick hypotheses at random and we will always get a valid hypothesis." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pseudocode" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "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": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pseudocode('Version-Space-Learning')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "### Implementation\n", - "\n", - "The set of hypotheses is represented by a list and each hypothesis is represented by a list of dictionaries, each dictionary a disjunction. For each example in the given examples we update the version space with the function `version_space_update`. In the end, we return the version-space.\n", - "\n", - "Before we can start updating the version space, we need to generate it. We do that with the `all_hypotheses` function, which builds a list of all the possible hypotheses (including hypotheses with disjunctions). The function works like this: first it finds the possible values for each attribute (using `values_table`), then it builds all the attribute combinations (and adds them to the hypotheses set) and finally it builds the combinations of all the disjunctions (which in this case are the hypotheses build by the attribute combinations).\n", - "\n", - "You can read the code for all the functions by running the cells below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(version_space_learning, version_space_update)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(all_hypotheses, values_table)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(build_attr_combinations, build_h_combinations)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "Since the set of all possible hypotheses is enormous and would take a long time to generate, we will come up with another, even smaller domain. We will try and predict whether we will have a party or not given the availability of pizza and soda. Let's do it:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "party = [\n", - " {'Pizza': 'Yes', 'Soda': 'No', 'GOAL': True},\n", - " {'Pizza': 'Yes', 'Soda': 'Yes', 'GOAL': True},\n", - " {'Pizza': 'No', 'Soda': 'No', 'GOAL': False}\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Even though it is obvious that no-pizza no-party, we will run the algorithm and see what other hypotheses are valid." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n" - ] - } - ], - "source": [ - "V = version_space_learning(party)\n", - "for e in party:\n", - " guess = False\n", - " for h in V:\n", - " if guess_value(e, h):\n", - " guess = True\n", - " break\n", - "\n", - " print(guess)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are correct for the given examples. Let's take a look at the version space:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "959\n", - "[{'Pizza': 'Yes'}, {'Soda': 'Yes'}]\n", - "[{'Pizza': 'Yes'}, {'Pizza': '!No', 'Soda': 'No'}]\n", - "True\n" - ] - } - ], - "source": [ - "print(len(V))\n", - "\n", - "print(V[5])\n", - "print(V[10])\n", - "\n", - "print([{'Pizza': 'Yes'}] in V)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are almost 1000 hypotheses in the set. You can see that even with just two attributes the version space in very large.\n", - "\n", - "Our initial prediction is indeed in the set of hypotheses. Also, the two other random hypotheses we got are consistent with the examples (since they both include the \"Pizza is available\" disjunction)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/knowledge.py b/knowledge.py deleted file mode 100644 index 6fe09acd2..000000000 --- a/knowledge.py +++ /dev/null @@ -1,409 +0,0 @@ -"""Knowledge in learning, Chapter 19""" - -from random import shuffle -from math import log -from utils import powerset -from collections import defaultdict -from itertools import combinations, product -from logic import (FolKB, constant_symbols, predicate_symbols, standardize_variables, - variables, is_definite_clause, subst, expr, Expr) - -# ______________________________________________________________________________ - - -def current_best_learning(examples, h, examples_so_far=[]): - """ [Figure 19.2] - The hypothesis is a list of dictionaries, with each dictionary representing - a disjunction.""" - if not examples: - return h - - e = examples[0] - if is_consistent(e, h): - return current_best_learning(examples[1:], h, examples_so_far + [e]) - elif false_positive(e, h): - for h2 in specializations(examples_so_far + [e], h): - h3 = current_best_learning(examples[1:], h2, examples_so_far + [e]) - if h3 != 'FAIL': - return h3 - elif false_negative(e, h): - for h2 in generalizations(examples_so_far + [e], h): - h3 = current_best_learning(examples[1:], h2, examples_so_far + [e]) - if h3 != 'FAIL': - return h3 - - return 'FAIL' - - -def specializations(examples_so_far, h): - """Specialize the hypothesis by adding AND operations to the disjunctions""" - hypotheses = [] - - for i, disj in enumerate(h): - for e in examples_so_far: - for k, v in e.items(): - if k in disj or k == 'GOAL': - continue - - h2 = h[i].copy() - h2[k] = '!' + v - h3 = h.copy() - h3[i] = h2 - if check_all_consistency(examples_so_far, h3): - hypotheses.append(h3) - - shuffle(hypotheses) - return hypotheses - - -def generalizations(examples_so_far, h): - """Generalize the hypothesis. First delete operations - (including disjunctions) from the hypothesis. Then, add OR operations.""" - hypotheses = [] - - # Delete disjunctions - disj_powerset = powerset(range(len(h))) - for disjs in disj_powerset: - h2 = h.copy() - for d in reversed(list(disjs)): - del h2[d] - - if check_all_consistency(examples_so_far, h2): - hypotheses += h2 - - # Delete AND operations in disjunctions - for i, disj in enumerate(h): - a_powerset = powerset(disj.keys()) - for attrs in a_powerset: - h2 = h[i].copy() - for a in attrs: - del h2[a] - - if check_all_consistency(examples_so_far, [h2]): - h3 = h.copy() - h3[i] = h2.copy() - hypotheses += h3 - - # Add OR operations - if hypotheses == [] or hypotheses == [{}]: - hypotheses = add_or(examples_so_far, h) - else: - hypotheses.extend(add_or(examples_so_far, h)) - - shuffle(hypotheses) - return hypotheses - - -def add_or(examples_so_far, h): - """Adds an OR operation to the hypothesis. The AND operations in the disjunction - are generated by the last example (which is the problematic one).""" - ors = [] - e = examples_so_far[-1] - - attrs = {k: v for k, v in e.items() if k != 'GOAL'} - a_powerset = powerset(attrs.keys()) - - for c in a_powerset: - h2 = {} - for k in c: - h2[k] = attrs[k] - - if check_negative_consistency(examples_so_far, h2): - h3 = h.copy() - h3.append(h2) - ors.append(h3) - - return ors - -# ______________________________________________________________________________ - - -def version_space_learning(examples): - """ [Figure 19.3] - The version space is a list of hypotheses, which in turn are a list - of dictionaries/disjunctions.""" - V = all_hypotheses(examples) - for e in examples: - if V: - V = version_space_update(V, e) - - return V - - -def version_space_update(V, e): - return [h for h in V if is_consistent(e, h)] - - -def all_hypotheses(examples): - """Builds a list of all the possible hypotheses""" - values = values_table(examples) - h_powerset = powerset(values.keys()) - hypotheses = [] - for s in h_powerset: - hypotheses.extend(build_attr_combinations(s, values)) - - hypotheses.extend(build_h_combinations(hypotheses)) - - return hypotheses - - -def values_table(examples): - """Builds a table with all the possible values for each attribute. - Returns a dictionary with keys the attribute names and values a list - with the possible values for the corresponding attribute.""" - values = defaultdict(lambda: []) - for e in examples: - for k, v in e.items(): - if k == 'GOAL': - continue - - mod = '!' - if e['GOAL']: - mod = '' - - if mod + v not in values[k]: - values[k].append(mod + v) - - values = dict(values) - return values - - -def build_attr_combinations(s, values): - """Given a set of attributes, builds all the combinations of values. - If the set holds more than one attribute, recursively builds the - combinations.""" - if len(s) == 1: - # s holds just one attribute, return its list of values - k = values[s[0]] - h = [[{s[0]: v}] for v in values[s[0]]] - return h - - h = [] - for i, a in enumerate(s): - rest = build_attr_combinations(s[i+1:], values) - for v in values[a]: - o = {a: v} - for r in rest: - t = o.copy() - for d in r: - t.update(d) - h.append([t]) - - return h - - -def build_h_combinations(hypotheses): - """Given a set of hypotheses, builds and returns all the combinations of the - hypotheses.""" - h = [] - h_powerset = powerset(range(len(hypotheses))) - - for s in h_powerset: - t = [] - for i in s: - t.extend(hypotheses[i]) - h.append(t) - - return h - -# ______________________________________________________________________________ - - -def minimal_consistent_det(E, A): - """Returns a minimal set of attributes which give consistent determination""" - n = len(A) - - for i in range(n + 1): - for A_i in combinations(A, i): - if consistent_det(A_i, E): - return set(A_i) - - -def consistent_det(A, E): - """Checks if the attributes(A) is consistent with the examples(E)""" - H = {} - - for e in E: - attr_values = tuple(e[attr] for attr in A) - if attr_values in H and H[attr_values] != e['GOAL']: - return False - H[attr_values] = e['GOAL'] - - return True - -# ______________________________________________________________________________ - - -class FOIL_container(FolKB): - """Holds the kb and other necessary elements required by FOIL""" - - def __init__(self, clauses=[]): - self.const_syms = set() - self.pred_syms = set() - FolKB.__init__(self, clauses) - - def tell(self, sentence): - if is_definite_clause(sentence): - self.clauses.append(sentence) - self.const_syms.update(constant_symbols(sentence)) - self.pred_syms.update(predicate_symbols(sentence)) - else: - raise Exception("Not a definite clause: {}".format(sentence)) - - def foil(self, examples, target): - """Learns a list of first-order horn clauses - 'examples' is a tuple: (positive_examples, negative_examples). - positive_examples and negative_examples are both lists which contain substitutions.""" - clauses = [] - - pos_examples = examples[0] - neg_examples = examples[1] - - while pos_examples: - clause, extended_pos_examples = self.new_clause((pos_examples, neg_examples), target) - # remove positive examples covered by clause - pos_examples = self.update_examples(target, pos_examples, extended_pos_examples) - clauses.append(clause) - - return clauses - - def new_clause(self, examples, target): - """Finds a horn clause which satisfies part of the positive - examples but none of the negative examples. - The horn clause is specified as [consequent, list of antecedents] - Return value is the tuple (horn_clause, extended_positive_examples)""" - clause = [target, []] - # [positive_examples, negative_examples] - extended_examples = examples - while extended_examples[1]: - l = self.choose_literal(self.new_literals(clause), extended_examples) - clause[1].append(l) - extended_examples = [sum([list(self.extend_example(example, l)) for example in - extended_examples[i]], []) for i in range(2)] - - return (clause, extended_examples[0]) - - def extend_example(self, example, literal): - """Generates extended examples which satisfy the literal""" - # find all substitutions that satisfy literal - for s in self.ask_generator(subst(example, literal)): - s.update(example) - yield s - - def new_literals(self, clause): - """Generates new literals based on known predicate symbols. - Generated literal must share atleast one variable with clause""" - share_vars = variables(clause[0]) - for l in clause[1]: - share_vars.update(variables(l)) - - for pred, arity in self.pred_syms: - new_vars = {standardize_variables(expr('x')) for _ in range(arity - 1)} - for args in product(share_vars.union(new_vars), repeat=arity): - if any(var in share_vars for var in args): - yield Expr(pred, *[var for var in args]) - - def choose_literal(self, literals, examples): - """Chooses the best literal based on the information gain""" - def gain(l): - pre_pos = len(examples[0]) - pre_neg = len(examples[1]) - extended_examples = [sum([list(self.extend_example(example, l)) for example in - examples[i]], []) for i in range(2)] - post_pos = len(extended_examples[0]) - post_neg = len(extended_examples[1]) - if pre_pos + pre_neg == 0 or post_pos + post_neg == 0: - return -1 - - # number of positive example that are represented in extended_examples - T = 0 - for example in examples[0]: - def represents(d): - return all(d[x] == example[x] for x in example) - if any(represents(l_) for l_ in extended_examples[0]): - T += 1 - - return T * log((post_pos*(pre_pos + pre_neg) + 1e-4) / ((post_pos + post_neg)*pre_pos)) - - return max(literals, key=gain) - - def update_examples(self, target, examples, extended_examples): - """Adds to the kb those examples what are represented in extended_examples - List of omitted examples is returned""" - uncovered = [] - for example in examples: - def represents(d): - return all(d[x] == example[x] for x in example) - if any(represents(l) for l in extended_examples): - self.tell(subst(example, target)) - else: - uncovered.append(example) - - return uncovered - - -# ______________________________________________________________________________ - - -def check_all_consistency(examples, h): - """Check for the consistency of all examples under h""" - for e in examples: - if not is_consistent(e, h): - return False - - return True - - -def check_negative_consistency(examples, h): - """Check if the negative examples are consistent under h""" - for e in examples: - if e['GOAL']: - continue - - if not is_consistent(e, [h]): - return False - - return True - - -def disjunction_value(e, d): - """The value of example e under disjunction d""" - for k, v in d.items(): - if v[0] == '!': - # v is a NOT expression - # e[k], thus, should not be equal to v - if e[k] == v[1:]: - return False - elif e[k] != v: - return False - - return True - - -def guess_value(e, h): - """Guess value of example e under hypothesis h""" - for d in h: - if disjunction_value(e, d): - return True - - return False - - -def is_consistent(e, h): - return e["GOAL"] == guess_value(e, h) - - -def false_positive(e, h): - if e["GOAL"] == False: - if guess_value(e, h): - return True - - return False - - -def false_negative(e, h): - if e["GOAL"] == True: - if not guess_value(e, h): - return True - - return False diff --git a/learning.ipynb b/learning.ipynb deleted file mode 100644 index 87236282d..000000000 --- a/learning.ipynb +++ /dev/null @@ -1,1768 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# LEARNING\n", - "\n", - "This notebook serves as supporting material for topics covered in **Chapter 18 - Learning from Examples** , **Chapter 19 - Knowledge in Learning**, **Chapter 20 - Learning Probabilistic Models** from the book *Artificial Intelligence: A Modern Approach*. This notebook uses implementations from [learning.py](https://github.com/aimacode/aima-python/blob/master/learning.py). Let's start by importing everything from the module:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from learning import *\n", - "from notebook import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Machine Learning Overview\n", - "* Datasets\n", - "* Iris Visualization\n", - "* Distance Functions\n", - "* Plurality Learner\n", - "* k-Nearest Neighbours\n", - "* Decision Tree Learner\n", - "* Naive Bayes Learner\n", - "* Perceptron\n", - "* Learner Evaluation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MACHINE LEARNING OVERVIEW\n", - "\n", - "In this notebook, we learn about agents that can improve their behavior through diligent study of their own experiences.\n", - "\n", - "An agent is **learning** if it improves its performance on future tasks after making observations about the world.\n", - "\n", - "There are three types of feedback that determine the three main types of learning:\n", - "\n", - "* **Supervised Learning**:\n", - "\n", - "In Supervised Learning the agent observes some example input-output pairs and learns a function that maps from input to output.\n", - "\n", - "**Example**: Let's think of an agent to classify images containing cats or dogs. If we provide an image containing a cat or a dog, this agent should output a string \"cat\" or \"dog\" for that particular image. To teach this agent, we will give a lot of input-output pairs like {cat image-\"cat\"}, {dog image-\"dog\"} to the agent. The agent then learns a function that maps from an input image to one of those strings.\n", - "\n", - "* **Unsupervised Learning**:\n", - "\n", - "In Unsupervised Learning the agent learns patterns in the input even though no explicit feedback is supplied. The most common type is **clustering**: detecting potential useful clusters of input examples.\n", - "\n", - "**Example**: A taxi agent would develop a concept of *good traffic days* and *bad traffic days* without ever being given labeled examples.\n", - "\n", - "* **Reinforcement Learning**:\n", - "\n", - "In Reinforcement Learning the agent learns from a series of reinforcements—rewards or punishments.\n", - "\n", - "**Example**: Let's talk about an agent to play the popular Atari game—[Pong](http://www.ponggame.org). We will reward a point for every correct move and deduct a point for every wrong move from the agent. Eventually, the agent will figure out its actions prior to reinforcement were most responsible for it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DATASETS\n", - "\n", - "For the following tutorials we will use a range of datasets, to better showcase the strengths and weaknesses of the algorithms. The datasests are the following:\n", - "\n", - "* [Fisher's Iris](https://github.com/aimacode/aima-data/blob/a21fc108f52ad551344e947b0eb97df82f8d2b2b/iris.csv): Each item represents a flower, with four measurements: the length and the width of the sepals and petals. Each item/flower is categorized into one of three species: Setosa, Versicolor and Virginica.\n", - "\n", - "* [Zoo](https://github.com/aimacode/aima-data/blob/a21fc108f52ad551344e947b0eb97df82f8d2b2b/zoo.csv): The dataset holds different animals and their classification as \"mammal\", \"fish\", etc. The new animal we want to classify has the following measurements: 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1 (don't concern yourself with what the measurements mean)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To make using the datasets easier, we have written a class, `DataSet`, in `learning.py`. The tutorials found here make use of this class.\n", - "\n", - "Let's have a look at how it works before we get started with the algorithms." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Intro\n", - "\n", - "A lot of the datasets we will work with are .csv files (although other formats are supported too). We have a collection of sample datasets ready to use [on aima-data](https://github.com/aimacode/aima-data/tree/a21fc108f52ad551344e947b0eb97df82f8d2b2b). Two examples are the datasets mentioned above (*iris.csv* and *zoo.csv*). You can find plenty datasets online, and a good repository of such datasets is [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets.html).\n", - "\n", - "In such files, each line corresponds to one item/measurement. Each individual value in a line represents a *feature* and usually there is a value denoting the *class* of the item.\n", - "\n", - "You can find the code for the dataset here:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource DataSet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Class Attributes\n", - "\n", - "* **examples**: Holds the items of the dataset. Each item is a list of values.\n", - "\n", - "* **attrs**: The indexes of the features (by default in the range of [0,f), where *f* is the number of features. For example, `item[i]` returns the feature at index *i* of *item*.\n", - "\n", - "* **attrnames**: An optional list with attribute names. For example, `item[s]`, where *s* is a feature name, returns the feature of name *s* in *item*.\n", - "\n", - "* **target**: The attribute a learning algorithm will try to predict. By default the last attribute.\n", - "\n", - "* **inputs**: This is the list of attributes without the target.\n", - "\n", - "* **values**: A list of lists which holds the set of possible values for the corresponding attribute/feature. If initially `None`, it gets computed (by the function `setproblem`) from the examples.\n", - "\n", - "* **distance**: The distance function used in the learner to calculate the distance between two items. By default `mean_boolean_error`.\n", - "\n", - "* **name**: Name of the dataset.\n", - "\n", - "* **source**: The source of the dataset (url or other). Not used in the code.\n", - "\n", - "* **exclude**: A list of indexes to exclude from `inputs`. The list can include either attribute indexes (attrs) or names (attrnames)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Class Helper Functions\n", - "\n", - "These functions help modify a `DataSet` object to your needs.\n", - "\n", - "* **sanitize**: Takes as input an example and returns it with non-input (target) attributes replaced by `None`. Useful for testing. Keep in mind that the example given is not itself sanitized, but instead a sanitized copy is returned.\n", - "\n", - "* **classes_to_numbers**: Maps the class names of a dataset to numbers. If the class names are not given, they are computed from the dataset values. Useful for classifiers that return a numerical value instead of a string.\n", - "\n", - "* **remove_examples**: Removes examples containing a given value. Useful for removing examples with missing values, or for removing classes (needed for binary classifiers)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Importing a Dataset\n", - "\n", - "#### Importing from aima-data\n", - "\n", - "Datasets uploaded on aima-data can be imported with the following line:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "iris = DataSet(name=\"iris\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To check that we imported the correct dataset, we can do the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5.1, 3.5, 1.4, 0.2, 'setosa']\n", - "[0, 1, 2, 3]\n" - ] - } - ], - "source": [ - "print(iris.examples[0])\n", - "print(iris.inputs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which correctly prints the first line in the csv file and the list of attribute indexes." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When importing a dataset, we can specify to exclude an attribute (for example, at index 1) by setting the parameter `exclude` to the attribute index or name." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0, 2, 3]\n" - ] - } - ], - "source": [ - "iris2 = DataSet(name=\"iris\",exclude=[1])\n", - "print(iris2.inputs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Attributes\n", - "\n", - "Here we showcase the attributes.\n", - "\n", - "First we will print the first three items/examples in the dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "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" - ] - } - ], - "source": [ - "print(iris.examples[:3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we will print `attrs`, `attrnames`, `target`, `input`. Notice how `attrs` holds values in [0,4], but since the fourth attribute is the target, `inputs` holds values in [0,3]." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "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" - ] - } - ], - "source": [ - "print(\"attrs:\", iris.attrs)\n", - "print(\"attrnames (by default same as attrs):\", iris.attrnames)\n", - "print(\"target:\", iris.target)\n", - "print(\"inputs:\", iris.inputs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we will print all the possible values for the first feature/attribute." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[4.7, 5.5, 6.3, 5.0, 4.9, 5.1, 4.6, 5.4, 4.4, 4.8, 5.8, 7.0, 7.1, 4.5, 5.9, 5.6, 6.9, 6.6, 6.5, 6.4, 6.0, 6.1, 7.6, 7.4, 7.9, 4.3, 5.7, 5.3, 5.2, 6.7, 6.2, 6.8, 7.3, 7.2, 7.7]\n" - ] - } - ], - "source": [ - "print(iris.values[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally we will print the dataset's name and source. Keep in mind that we have not set a source for the dataset, so in this case it is empty." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: iris\n", - "source: \n" - ] - } - ], - "source": [ - "print(\"name:\", iris.name)\n", - "print(\"source:\", iris.source)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A useful combination of the above is `dataset.values[dataset.target]` which returns the possible values of the target. For classification problems, this will return all the possible classes. Let's try it:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'virginica', 'versicolor']\n" - ] - } - ], - "source": [ - "print(iris.values[iris.target])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Helper Functions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will now take a look at the auxiliary functions found in the class.\n", - "\n", - "First we will take a look at the `sanitize` function, which sets the non-input values of the given example to `None`.\n", - "\n", - "In this case we want to hide the class of the first example, so we will sanitize it.\n", - "\n", - "Note that the function doesn't actually change the given example; it returns a sanitized *copy* of it." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "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" - ] - } - ], - "source": [ - "print(\"Sanitized:\",iris.sanitize(iris.examples[0]))\n", - "print(\"Original:\",iris.examples[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Currently the `iris` dataset has three classes, setosa, virginica and versicolor. We want though to convert it to a binary class dataset (a dataset with two classes). The class we want to remove is \"virginica\". To accomplish that we will utilize the helper function `remove_examples`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['setosa', 'versicolor']\n" - ] - } - ], - "source": [ - "iris2 = DataSet(name=\"iris\")\n", - "\n", - "iris2.remove_examples(\"virginica\")\n", - "print(iris2.values[iris2.target])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also have `classes_to_numbers`. For a lot of the classifiers in the module (like the Neural Network), classes should have numerical values. With this function we map string class names to numbers." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Class of first example: setosa\n", - "Class of first example: 0\n" - ] - } - ], - "source": [ - "print(\"Class of first example:\",iris2.examples[0][iris2.target])\n", - "iris2.classes_to_numbers()\n", - "print(\"Class of first example:\",iris2.examples[0][iris2.target])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see \"setosa\" was mapped to 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we take a look at `find_means_and_deviations`. It finds the means and standard deviations of the features for each class." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "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" - ] - } - ], - "source": [ - "means, deviations = iris.find_means_and_deviations()\n", - "\n", - "print(\"Setosa feature means:\", means[\"setosa\"])\n", - "print(\"Versicolor mean for first feature:\", means[\"versicolor\"][0])\n", - "\n", - "print(\"Setosa feature deviations:\", deviations[\"setosa\"])\n", - "print(\"Virginica deviation for second feature:\",deviations[\"virginica\"][1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## IRIS VISUALIZATION\n", - "\n", - "Since we will use the iris dataset extensively in this notebook, below we provide a visualization tool that helps in comprehending the dataset and thus how the algorithms work.\n", - "\n", - "We plot the dataset in a 3D space using `matplotlib` and the function `show_iris` from `notebook.py`. The function takes as input three parameters, *i*, *j* and *k*, which are indicises to the iris features, \"Sepal Length\", \"Sepal Width\", \"Petal Length\" and \"Petal Width\" (0 to 3). By default we show the first three features." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nnjD6AAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgsAAAGMCAYAAABUAuEzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzsnXlwm+d9578v7puXeFM8RFEHddKSLFmXnXgTj7c5mjpu\nZzsbj51O0mltN2ky3Z2sm93pJDOetE2TpuPNbGe6zm7bNNnUce1cih07tiRbkh1ZhyWSAHiAB0CQ\nIAkS9/Ee+wf7vH4B4saL9+XxfGY0tiAQDwACz/N9f8f3xwiCIIBCoVAoFAolDxq1nwCFQqFQKJSN\nDRULFAqFQqFQCkLFAoVCoVAolIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLFAoVCoVAo\nlIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLFAoVCoVAolIJQsUChUCgUCqUgVCxQKBQK\nhUIpCBULFAqFQqFQCkLFAoVCoVAolIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLFAoVC\noVAolIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLFAoVCoVAolIJQsUChUCgUCqUgVCxQ\nKBQKhUIpCBULFAqFQqFQCkLFAoVCoVAolIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLF\nAoVCoVAolIJQsUChUCgUCqUgVCxQKBQKhUIpCBULFAqFQqFQCkLFAoVCoVAolILo1H4CFMpWRxAE\ncBwHlmWh1Wqh1WrBMAwYhlH7qVEoFEpJULFAodQIqUhIp9NIpVLQaDSiUNDpdNBqtdBoNOJ/qYCg\nUCgbEUYQBEHtJ0GhbCUEQQDP82BZFjzPA4D4d4ZhIAhCxh8iEIhoIH80Go34h0KhUNSEigUKRSbI\n4c+yLCYmJhCPx7F//34wDAOWZcGybM6DP1s8kNtIBCJbQNA0BoVCURqahqBQZIBEDjiOy4gskAO9\n0MGe6+CXigaSxpDeV5rGkEYhqICgUCi1gIoFCqUKyGHOsiyAzMOcpCAqQSoypNEIaQQilUpl/Ay5\nn06ng16vp2kMCoUiG1QsUCgVIC1e5Hk+QyQA6yMJ0hRDNeSLQpA/IyMjMJvN6O7upmkMCoUiG1Qs\nUChlkEsk5Ar/k0JGJZAe/CSSoNOtfbVJOoSmMSgUSjVQsUChlECuDodCh2u1aYhqIc9Lq9Vm3F4s\njZEvCkGhULY3VCxQKAXIJRJKCeErGVkoZ91iaQziByG9L01jUCgUKhYolDxkdziUE6ZXSyxUQqFu\njHxpjHyeEFRAUChbEyoWKJQscomEcjsKNpNYyEWxNAbP8+A4DolEAhMTExgcHBQFhE6nE98zmsag\nULYGVCxQKP8OaYPkOK5g8WIpaDQaUSysrKzA6XQiFovBbrfDZrPBbrfDbrfDaDTKepjWWqRkRyEY\nhkEwGBRfL01jUChbEyoWKNueUjscyoVlWdy8eROBQADd3d3YuXMnYrEYwuEwAoEAYrEYtFpthoCw\n2WywWCwVeyOodQBnP1+axqBQthZULFC2LSScnk6nxcNNjgMrlUrB5/MhHA6jrq4O586dg16vRyqV\nwo4dO8T7cRyHaDSKcDiMSCSC2dlZRCIRAIDVahWjDzabDTabbV1KoNDrUop8a5WaxpBC0xgUysaF\nigXKtqPSDodicByHqakpTExMwGKxwGq14uDBgwCQs41Sq9XC4XDA4XBkPLdYLIZIJIJwOIyFhQVM\nTEwgnU7DYrGsi0IYDIaqnrPS0G4MCmVzQsUCZVtRTYdDPgRBgM/ng9vthsFgwNDQEDiOg9vtzrhf\nKeswDAOr1Qqr1YrW1lbx8VOpFMLhMMLhMEKhELxeLxKJBIxGY4Z44Dhu09k7l9qNQe6TTCaRTqfR\n2NhI0xgUikJQsUDZFpBDJxwO4+rVq3jwwQdlOVQXFxfhdDqRTqexZ88etLe3g2EYBAIB2dIBDMPA\naDTCaDRmpDHS6TQikYgYhVhcXEQkEgHDMAiHwxlRiGrqINQgVxqDvJ/BYBCBQAA2m028XVoHQdMY\nFIr8ULFA2dLk6nAgQ5+qIRwOw+l0YmVlBf39/eju7s442JRondTr9WhoaEBDQ4N4m8vlQjqdRkND\nAyKRCHw+HyKRCHieF2sfpHUQxBZ6MyCdu0HsqoHy0hgkCkHTGBRKeWyenYJCKYN8HQ7SA6aSwyKR\nSMDtdmNubg7d3d04fPhwzroBNR0c9Xo9Ojo6xNsEQUA8HhcLKRcXF+HxeJBKpWCxWDJEhN1u3xR1\nENntm4XqILLTGLQbg0IpHyoWKFuKYh0O5L/lHuQsy2JiYgJTU1Nobm7G2bNnYbFY8t5/I5kyMQwD\ni8UCi8Ui1kEAa7l/ksKIRCKYm5tDPB6HwWBYV0hpNpsLzsFQklLe10J1ENICVwL5jNA0BoWSGyoW\nKFuCUjscSN6e5/mSWhF5nsfMzAzGxsZgs9lw7733oq6urujPbdTZEFJIHURTU5N4G8uyGQLC4/Eg\nGo1Co9FkiAe73Q6r1Vqrl1GQSqNC2YKR/P5pGoNCKQ4VC5RNTzkdDkQsFDtQBUHA/Pw8XC4XGIbB\noUOH0NzcvClmQ1Szrk6nQ319Perr68XbeJ5HNBoVRYTf74fb7QbP8zCbzeA4DjMzM6KQUKIOQm7X\ny2JpjEAggLm5OQwODmaktKQpDJrGoGxlqFigbFoqmeFANvNC46ODwaBozzwwMIDOzs5NMxuiFoeV\nRqMR6xna29sBrB2miUQCgUAA4+PjWF5extTUFFKpFMxm87oohMFgkO25KfG+5hIQiUQCWq1WjGIl\nEgnx32gag7LVoWKBsukgV3sk50w29lJ9DBiGySkWotEoXC4XFhcX0dfXh97e3oqvkjdrZKFUGIaB\n2WxGQ0MDtFotjhw5AgCiH4Q0ChGLxaDX69fNxShUB1GIStMQ1SCNWJWbxiDigaYxKJsZKhYom4Zc\nHQ6VbLrZB3kqlcLY2BhmZ2fR0dGBc+fOwWQyVfVc8wmSWqP2AWQwGNDU1LSuDoLYWofDYUxPTyMa\njYJhmHXtnFartaRaEqVfJ/m85XsuxVwppQKHpjEomxEqFigbHqlIkGOGg0ajEWcTeDweTExMoLGx\nEadPnxaNfqplq0cWykGn06Guri6jMJTneXGoViQSgd/vRyQSAcdxOW2t9Xq9+LNqvL5yoxmldGMU\nS2NIoxAUitpQsUDZsNRqhgMAzM/PY2ZmBkajEffcc0/GlbAcbKTWyY0I6a6QijNSB0FSGCsrK5iZ\nmUEymYTJZBKFQywWA8/ziqYj5Firkm6MYDCIhoYGGI1GmsagqAoVC5QNh3TjlFskBAIBsXp/3759\naGtrq8mmuxlaJzcapA7CbDajublZvD2VSmXYWi8vLyOdTuPy5cvrCiktFktNfp+kZqEWFEpjOJ1O\nDA4OwuFwiIKFpjEoakDFAmVDUYtBTwAQCoXgdDoRCoWg1Wpx6NChjDkLciNt0aQbeHUYDAY0Njai\nsbERADAxMYFEIoHOzk5RQEjHe+fygyh1vHc+lP49Sgtx9Xo9dDpdRhqDpOUINI1BqTVULFA2BCSS\nwHEcgPI6HAoRj8fhdrvh9/vR3d2No0eP4sqVK5sqfF0O2+Vg0Gg0OesgpLbWCwsLGB8fB8uysFqt\n60SEtA6iGGqJPmlEI7tAUnqf7DQGuW8hW+vt8lmhyAMVCxRVIVdJXq8XqVQKXV1dsmxk6XRatGdu\nbW3NsGcmBY61pFTzp1qg9Jobxe5Zo9GI472l900mk6KAWFlZwezsrDjeO7uQ0mQy5Xw9aokFnudL\n8g4p1o0h7cigaQxKJVCxQFGF7DbIcDiMeDyO7u7uqh6X53lMT09jfHwcdrsdJ0+eXGfPrERev9IZ\nFJTilHNwMwwDk8kEk8mUUQdBxnsTEREIBBCLxaDVanPWQRRqnawV5LCvpFaiWDdGvjSGVEDQNAZF\nChULFEXJ1eFANqZqrval9swajaagPbMSkQW1xMJmLnAsh2oPsFzjvTmOE/0gIpEIvF6vWAdBDtHZ\n2VlRSFRbB1EMaXGvHJSSxkilUojH45iYmMCBAwfypjFqVexJ2bhQsUBRhGJtkBqNpuJDLhgMYnR0\nFIlEArt37y5qz6yEYVIusUAOcnqlVh21EkNarRYOhwMOhyNjrVgshvHxccTjcSwuLmJychLpdFoc\n751tay0XUk+RWpIdhRAEAaFQSPxO5kpjZAsIYmtNP9tbFyoWKDWnlA4HjUYjFjeWSiQSgdvtLtue\nuRphUiq5xIISQmGj1A/UGqVeJ8MwYh2E0WjE3r17xStw4kgZCoXg9XrFOohsAZGvDqIY0sibkpA6\niex1pWkMlmWRTqfFf6NpjK0PFQuUmlHOoKdy0hDJZBLj4+OYnZ1FZ2cnzp8/D6PRWPLzUiuyoBRb\nPQ2h1mwIaRifjPeWtt+yLJsxF2NxcVEc751dSGm1WouKALnTEKWSr6iy1DSG9L2iaYytAxULFNkh\nVx4cx4mFYcWuMEqpI5DaMzc1NVVsz6xWZEEJtsNVXC0NkgqtWey91el06+ogyHhvIiJ8Ph8ikQh4\nnl83FyN7vLd0/omS8DxfVj1GJd0YNI2x+aBigSIbuQY9lRqGLCQWBEGA1+uF2+2GyWTCsWPHRIOe\nSlCiwBFQr9hwq0cWAHXSLZUIFOl4b+ljxeNxMQKxtLQEj8cjjveWzsNQ4/DkOK5qMVasG0OaxpDe\nVxAEmEymjDHfVEBsDKhYoFQNKV4kVw9A+YOech3ggiBgcXERTqcTHMfJZs+s1CEuTXcomWPf6qgh\nhsq92i4EwzCwWCywWCxoaWkRb08mkxntnKurq+B5HpcvX16Xxqh0vHcplOLtUAnF0hixWAzvvPMO\nzp49K/47TWNsHKhYoFSMnIOessXC6uoqnE4nwuEw+vv70d3dLdsGoWRkodDfa8VWjyyoXbNQK0gd\nBBlqFgqFcOvWLRw8eFAUEVNTU4hEIuIgrmxbazm+I7USC/mQ7hlarRYGg4GmMTYgVCxQKkLuGQ7k\nAJfaM/f09GBoaKgsW95SUKLAkayz1Q9uYPtEM9SqHaivr0d9fX3G7dFoVBQQfr8fbrcbPM/ntLUu\npUMo17pKI123kjSGtBsj29qaUj1ULFDKopwOh3IfN5VK4dKlS2hra8O5c+dgNptleMbrUaLAEVBO\nlGSvudVRK7KgVgtjNtI6iPb2dvH5JRIJMYWxvLyM6enpdeO9yc8ZDIa876EcNQuVwHFcQZFSajeG\nFJrGkA8qFiglIe1wkIYDq920iT3z2NgYeJ7H6dOnM0xxasFWjyzQaIb8qBVZKMfWmoz3ltZBED8I\nEoWYn59HLBaDXq9fVwdBxnsrnYYgFBML+SilG4OICJrGqBwqFigFydXhIMeXShAE+P1+uFwuaLVa\n7Nu3D3fu3Km5UACUjSyQdViWxfz8PMxmc02tgrfDZqeWANuM0QyDwYCmpiaxDgJYO5SlhZTT09OI\nRqOiARXP89DpdAiFQrKM9y4VOSMahdIYJDoqTWMEg0GYzWY4HA6axsgDFQuUnEhFQqUdDvlYXl6G\n0+lEIpHAwMAAOjs7kUwmxXVr/eXUaDQZ7nO1glylzc7OwuVyQafTIZVKgeM4WK1WMSQs96yBrR5Z\n2OhX+Rt9Ta1Wm3O8dywWE8VDPB7HzZs3wXEcLBbLuiiE3HVEQOWRhVKRFlFKEQQB09PTaG9vh8lk\nyvi37DRGNBqt2evf6FCxQMlA2uEwPDwMi8WCnp4eWTatSCQCl8uFpaUl7Nq1C729veIXl1xRKFFc\npVR6QBAE3L17F4IgYP/+/aJZj7RFTtpjTzZl6Z9yi9OUZqvbPRPUEihKpQNId4XNZkMwGITRaERf\nXx8SiYT4WV1ZWcHMzIxYB5FdSGk0Gqt6j2otFvLBMAw4joNerxe/b/nSGA8//DCeeuopfOYzn1H8\nearNxt6JKIpBvhjSugSO45BOp6veJJPJJMbGxuD1etHV1ZXTnllJsVDr1slYLAan04lkMonOzk4M\nDg5Co9GIGw7JLZORydmzBqSbMjHpkf4pdFWzHTowtksaQq3aAbKutA4ie7y3tA5iYWEB0WgUer0+\n53jvUt83tcQCsJYmlArzfGmMSCSSYbC1naBigZK3w0Gn05U93EkKy7LweDyYnJzEjh07cObMGVit\n1pz3lYqFWlOrAsd0Oo3x8XFMT0+jo6MDFosFbW1t0Gq1BQ+4fLMG8g0rItXt0j9yTjvc6GxVn4Vc\na6opFvKh1+vR2NiY4aKaPd57dnZWHO+dy9Y6lyhQSxwBpQuVcDickb7ZTlCxsI0hkQSWZQFk9isD\nlU2CBNa+9F6vF2NjYzCZTDh+/HiGX34uyJpKiAW5CxxJXYLb7YbD4cB9990Hu92Ot956K+eI6lLJ\nVZwmvaoLhULw+/2IxWIwGAyw2+1gGAbpdFqcgLhVi7O2w8GtRp0EWbfcK/xC473J53VhYQETExPi\neG9pvY7dblc1slCOWKCRBcq2odQOB61Wu65vudjjBgIBuFwu8DyP/fv3o7W1taQNj/ROKyUW5Fon\nEAjA6XSC53kcOnQIzc3NGf3gcofMc13VsSybERKOx+N4++23xfY46Z9KxyVvJGgaorbI1ZVAuiuk\n0URBEDJqdlZXVzE7O4tEIiG6N05MTIgiQonPK8/zYgdIIQRBoJEFyvag3EFPWq225MiC1J559+7d\n2LlzZ9kbzmYa8BSJROB0OhEMBrF79+6cdtRK1Q/odDrR5U+v18Pr9eLo0aPihhwOh+HxeBCNRqHV\natcJiFrOGagVW6UzoRAbNQ1RDQzDwGQywWQyZaTc0uk07ty5A4ZhkEgkEAgEEIvFoNVqc9ZByPn8\nyB5XLLIQi8XAcRwVC5StS64ZDqW0QZaShojFYnC73VhYWKjanlmr1W74yEIqlcLY2BhmZ2fR1dWF\nQ4cO5a0XUKPYkKyZrz1OKiCk/fXZIeFyNmQ1DlGl2U6RBTXWJZ0I9fX12LlzJ4AP6iDIZ5aM9xYE\nIcPWmszFqLRzqFSxEA6HAYCmIShbj2oHPRU6vKXFfG1tbTh79mzV9sykhanWVHKIS50mGxoacPr0\nadhsNtnXqZZCv1uNRrMur0z664mA8Pl84qYo3YzlHFRULdulwFHNmoWN4OBYqA6CCIjFxUVMTk6K\ndRDZUYhSCn9ZlhUdHAsRiUTEQuTtCBULWxQ5Bj3lSkPwPI+pqSlMTEzA4XDg1KlTsrkubsTIAqnD\nGB0dhUajwdGjRzPCp4XYDHbP0v566ZwBqYCQDirKFhBKz74gbAexoFYaQq1Cw1JqJaR1EK2trQAy\nW49J4a/P50M8HhcLfwuN9y719YZCIbGIeDtCxcIWQ85BT9JDVRAEzM3Nwe12Q6fT4ciRIyUfmpWs\nV0tK7YYIh8MYHR1FKBTCwMAAurq6ynovN6vngXRDbmtrA7D2+4/H46KAWFhYwPj4OFiWBcMwGBkZ\nqYkbZS7UEmBqdEOoNf1xM4mUfK3HLMtm+EEsLS0hGo2Kg7jK7cLYzp0QABULWwapoVIpxYulQCIL\nS0tLcDqdSKVSGBgYQEdHR03UtZIFjoXWSSaTcLvd8Pl86O7uxtGjRyuqw9hKUycZhoHFYoHFYsm4\noiNRF4PBgKWlJTEknJ1TltONcjulIbZLzQIgf0RDp9OhoaEho22bjPcmIoKk3XiexzvvvLMuCiH9\nzBKxQCMLlE1JuR0O5ZBMJhGPx3Hjxg309fVl2DPXArVbJzmOw9TUFMbHx4uaSJVCrt+BEoeOUlfe\nDMPAYDBAq9Wiv79fXFsuN8qNhFqzIahYkBfpeG+Cz+eD1+tFT08PwuEwlpeXMTU1hVQqBbPZDI/H\ng7t374opu+0KFQubFFK8mE6nZR/0lEgkRHtmhmFw/vx5RRwC1WqdFAQB8/PzcDqd0Ov1uOeeezKM\nkKpZZ6tEFspZv9ZulNslsqBW6oN00yiNWmkXjuNgNBrR0tKSc7z37Ows7t69i+HhYczNzaGtrQ1D\nQ0MYGhrCuXPn8PDDD5e13rPPPosf//jHGB0dhdlsxunTp/GNb3wDe/fuzfsz3/ve9/DEE0+suz0e\nj68bflUrqFjYZFTb4VAIlmUxOTkJj8eDHTt24J577sHNmzcVsxJWI7KwurqK0dFRxGIxcQKmXIfC\nZihwVIpCbpTSQkriRulwODLSGNlulNtBLKgVzQCgWmRhI0U0yGf20UcfxaOPPoq//uu/xvvvv48v\nf/nLuHnzJm7cuIHXX3+9bLHw5ptv4sknn8SJEyfAsiyeeeYZfPSjH8Xw8HDBSKbD4YDT6cy4TSmh\nAFCxsKmQo8Mh3+POzs5ibGwMFotFtGcmJiRKbZRK1yzcvn0b8/Pz6OnpwbFjx2Sf8LhZCxyVopgb\nZTgcRiAQEIcUEeGQSqWQSqUUPcC3S82CWmJBzYgGx3ElfffD4TCamppw5swZnDlzpuL1Lly4kPH3\n559/Hi0tLbh+/TrOnz+f9+cYhhELjtWAioVNABEJU1NTEAQhp1tgJZACNafTCUEQcODAAbS0tKyb\n+66kWKi1zwLHcZidnRXTN3L4Q+Rjo/ksbAakbpQEjuMyBEQqlYLL5RJtgZVwo1QjJaBWGgJQXiyU\naoxUC4jPQjFCoVBN3BtXV1cBIEM05yISiaCnpwccx+Ho0aP42te+hqGhIdmfTz6oWNjAZHc4xONx\nsVWtWkj4PRqNor+/P6c9M/kCKRUerKXPAmn9dLlc0Ov10Gg0OHLkSE3WItA0hDxku1GGw2H09vbC\nZDLJ7kaZCzK+fTtEFsh3Xa30h1qRhVJSreFwWHSXlAtBEPClL30JZ8+excGDB/Peb9++ffje976H\nQ4cOIRQK4W//9m9x5swZ3Lp1CwMDA7I+p3xQsbABydfhoNPpkEwmq3rsWCwGl8uFQCBQNPxONiqO\n4xSpWq9VGiIYDGJ0dBTJZBJ79uxBXV0dLl++LPs62cg93bIU1IgsqFX4l8+NMhQKZbTFAdW5UZLf\n4XapWVCzXkGNz2+paYhoNCp7N8RTTz2F27dvF92PTp06hVOnTol/P3PmDO655x783d/9Hb7zne/I\n+pzyQcXCBqJYh0M5g52ySaVSGB8fx8zMDNrb23Hu3LmixTFkbaUq+uUWC/F4HE6nE4FAAH19fejr\n64NWq0UikVDkalEaWZCrCLUUtlpkIRe53kupGyWhHDdKq9Wa88pWLbGgVhpiOxU3AuWlIeRyqwWA\np59+Gi+//DIuXryIrq6usn5Wo9HgxIkTcLvdsj2fYlCxsAEotcNBp9OBZdmyHpvjOExPT2N8fBz1\n9fW47777ynIhq0aglItGo0E6na76cViWxcTEBDweT05hRN5XJcWCUmyXoU6lUo4bJcdxsFqtGQLC\nZrPRyIICqGUxTdYutcBRjpoFQRDw9NNP48UXX8Qbb7yBvr6+ih7j5s2bOHToUNXPp1SoWFCZcjoc\nyjm4s3P05cw0qHTNaqk2siAIArxeL1wuF6xWK06ePJnzy002w1pvjLRmoTZUK/LyuVEmEglRQEjd\nKC0WCwDA6/Wirq5OVjfKQqhVs6BW3YBaYqGUyIIgCIhEIrLYPT/55JP4/ve/j5deegl2ux1+vx8A\nUFdXJxZbP/bYY+js7MSzzz4LAPiLv/gLnDp1CgMDAwiFQvjOd76Dmzdv4rnnnqv6+ZQKFQsqUckM\nh1IPbjntmZXoUJCuValYWFpawujoKFiWxeDgIFpbW/O+ZmlkoZbQ1snaIfcVN8MwMJvNMJvNojEP\ncaNcXl7GyMgIVldX4fV6FXOjVKt1cjtGFkqdDSFHZOG73/0uAOCBBx7IuP3555/H448/DgCYnp7O\n+D2srKzg85//PPx+P+rq6jA0NISLFy/i3nvvrfr5lAoVCwpDOhxIOoGkG0rZ/IqJhXA4DKfTiZWV\nFezatQs9PT1VfwGVmgQJVCYWotEonE4nlpeX0d/fj56enqKbnTSyUEuy6z2UCClvB4GipJ210WgU\nW9oOHz4MhmFkdaMsxHaqWVDLvREoLw0hR2ShlM/vG2+8kfH3b33rW/jWt75V9drVQMWCQuTqcCi3\n6C1fzQKxZ/b5fNi5cycOHz4sm+viRk1DpNNpjI+PY3p6Gp2dnTh37lzJc+bJe66EWMi2laZUj9Jt\njNI6IqA8N0qj0ZjRxulwOGAwGEp6/rRmofaQi7dia3Mch1gsJmuB42aDioUaIxUJ1c5wyD64pfbM\nzc3NOHv2rJhflQulXBXJWsWECXGbdLvdcDgcZRdsAh9Ec7ZiGmKzmzKVipKvsxRxks+NUjoiOZcb\nJfljMpnWraFGZEHNmgW1IhpAcX+HUCgEADUxZdosULFQI2oxw4GIBY7j4PV6MTY2BqvVihMnTmQ4\n3snJRoosELdJnudx6NAhNDc3V1WLoXRkQSk2egRjNbmKOmPlm67Sr6/SSEauEcnZbpQejwfRaBRa\nrTZnF8Z2SUOoKVIAFE1DhMNhMAxDp05S5IP075PiRUC+HnvyJX7rrbfAMMw6e+ZaoKRYyFcfEYlE\nMDo6itXVVfT398tid00jC+pwc/4mLkxcwBOHn0CrtbXix9lokYVSyXajBNYOaKmAmJ6eRiQSAQC8\n//77qKurE9MYVqu1pq99u4kF4ohb7DWHw2HYbDbVvCA2AlQsyEitBj0Ba9Wwo6OjAICuri709vYq\n8sFVsxsilUphbGwMs7OzstdiKBVZUHpENaD8lXepn3GWZ3Fx5iLuLt7F29638ak9n6poPaVrFmp9\nha/RaDAeH0dciOP0vtMAgGQyibfeegttbW2IxWKyuVEWQ61CQzXHU5dS3BgKhWC32ze8GK8lVCzI\ngCAISKfT6yIJcnywsu2ZV1ZW0NbWppjCVaMbgud5TE9PY2xsDA0NDTh9+rTs4T8lDvLs3/923mgA\n4P3A+3AuO9FmbcM13zWc7jxdUXRhs6QhSiWajuLfXP+GJJvE3qa9aDI3iet1dHSI33U53CiLoeaY\naCW8K7Ip1b2ReCxs5+8wFQtVIEeHQz6k9swdHR2iC+H09LRiV/qAsmkIhmGQTqdx+fJlaDSaio2k\nSkGJuQ3+ZTtJAAAgAElEQVQ0DfEBLM/i0swlaBktdtp34u7SB9EFlmcxuTKJXfW7oNWUdsBt1jRE\nLt6dexczoRkIEHDVexW/tfu31nVgkP+v1o2y2MHI87wic2Cy2ehmUHK1TW5mqFioAGLWkkgkoNfr\nxZyXHBsKx3GYmprCxMQEGhoa1lX7a7Xasi2fq0GpNEQoFMLo6CjS6TQGBgbQ1dVVc3dFpdMQy8vL\nSCaTqKurg9ForNkBpKRAKXUtElXocfSAYRi0WlrF6MJCbAGveV7Dw7sext6mvVWtyQs8nEtODDQO\nQKeRZ3urZQtjNB3Fr6d+DbvBDr1Wj0szl3Cq8xTMgrmkC49y3SitVuu6KIT0in471iyUk4bYzlCx\nUAbSDof5+Xm43W6cOXNGlo1EEAT4fD643W4YDAYMDQ1l9HETlLzSJ+ulUqmaPX4ymYTb7YbP50N7\nezui0Si6u7trth5BychCNBrF6OgogsEgjEYjYrEYdDodHA6HuGE7HI6SfSKKrbnRIFEFCICO0SHN\npVFnrMPo8iguzlxEJBXB5Ook3p17F7sbdheNLhS60r8TuIN/uPUPeHTfozi786wsz7+WkQUSVdjb\ntBcaRoPhxWFc9V7F/W33V3xoF3KjJAJiZWUFMzMz69woE4mEaDmsJJshsrCdPRYAKhZKIlcbpF6v\nFytpq2VxcRFOpxPpdBp79uxBe3t73sfV6XRbIg3BcRw8Hg8mJiawY8cOnD17VhRMSqBEgSOpcn/r\nrbfQ1dWFwcFBUUBEIhGEQqGM/nuDwSAKB7J5VyIgNlrr5NTqFBZji9AwGkyuToq3m7QmXJ65DKve\nin2N+zC+Mo6x4FhJ0YVc3w9e4PHLyV9idGkUv5z8JU60n4BRV70Aq5VYkEYVSBSkydyESzOXcLDu\noKxX+MSN0mg0ZqT2st0oQ6EQVlZWMDc3J6sbZTHULHCkaYjSoGKhCPk6HOQ4tKX2zKQlsNgHV+nI\ngtxpCEEQ4Pf7xQFXx44dE41s4vG4IqOjgdrWExDRMzY2BgBiKonjOKRSqZztcyzLiu1zoVAI8/Pz\nGQ6AUhFRaNPeiJGF3rpePHH4CXBC5ucozaXxi4lfIJ6Ow2F0IBAPlBRdyPd7uxO4g9sLt7G3aS/c\nQTfenXtXluhCrbohfjP3G0yuTEKv1cO17AKwJngiqQjenXsXbUyb7Gtmk+1GeePGDezYsQNWq1VW\nN8pibPQ0hFxDpDYzVCzkodigJ2K9XMnBlkgk4Ha7MTc3V3ZLoNI1C3J2Q6yurmJkZATxeBwDAwPo\n7OzMeO/IZqHEVUatIgurq6sYHh5GMplER0dHRq6zkDjR6XSor6/PMNciDoDkj1RAZKcw1ChKKxWt\nRou++vVjeN8PvI/V5Cp663oBAJ22zpKjC9nfORJVYDkWTeYmBBNB2aILtRKvdcY6/Ife/5D73/R1\nqjka1sKNshhqdmGUGllob29X4BltXKhYyEJqqEQKm3IVL+p0OjE9UerBxrIsJiYmMDU1VbE9sxo1\nC9Wul0gk4HK5MD8/j97eXvT19eVU89IBT7UWC3IXOCaTSbhcLszNzaGvrw+7du3CwsKCaBNbCbkc\nAMmmTVIYc3NziMfj4hAjk8kEnueRTqc3nIBYTa7iPf97uLfjXug1evxm7jdIcSmEkh+8R3E2XjS6\nkEt0kahCl6MLALDTvlO26EKtxMLR1qM42no0578tLy/DteKSfc1i5PvuVeNGabfbYTabC76HatYs\nlPI9CYfD2Lu3eHpsK0PFQhbEM6FYhwM57Erp0+V5HjMzMxgfH4fVasW9995bsce40jUL1VyBS2dX\ntLS04OzZswWLp5SaBknWkiMNIfWEaGpqyhCAtUh15Nq0pUOMgsEgBEHApUuXxMI1aRSiFr3spR6k\ndwN3cd1/HQ2mBnQ7usHxHNpsmaH2dls7UlwKMTYGu2F92Je8n9I1SVQhkoqANbNYSawAWEtzyBFd\nUGugkxoppXK6IUp1o4xGo2AYJqOF0+FwwGKxiK9RzTREKQWdtMCRioV1kHRDsS8quQ/LsnmL0ARB\nwPz8PFwuFxiGwcGDB6uaZwBsjsgCydm7XC6YTKaSZ1coNQ2SrFXtOouLixgZGQHDMDk9IZTyWZCG\njZubm3Ht2jWcOXNG3LBXV1fFyneLxbLuqk8JM5xgIoi7i3fBCzxuzd/CQOMAnjj8BASsf38YMEU7\nIqTfodXkKgLRAJotzYimo+LtTeYmRNNRzMfm0e2ovMNGacdIQN0WxmrW1Wg0cDgcGQcrz/OIRqNi\nGsPn88HpdAL4wI2S53mxE0PJ1027IUqHioUclHrVmW9kNAAEg0E4nU7EYjExPy/Hl2Cji4VgMIiR\nkRGkUins3bu3YGdHNiSas9EjC7FYDKOjo1heXsbu3bvzzqpQ05Qp1xhlUvlOKt6zBYQ0AiH3Vd7I\n4giCiSAGGgYwFhyDe9mdNwRfiFzvZ4OpAf/97H9Hilvf4qvT6OAwVrfJbyexUIt1NRqN+LkiSN0o\nV1dXAQB37tyR1Y2yFEp1jqTdEFQsVEUusRCNRuFyubC4uIje3l4cP35c1is3rVaLZDIp2+MVo9Ru\nCKkt9a5du9Db21vRF1xJsVDuOqTmxOPxoKOjA+fPny/amSA93JQ6cPIJlFwCIplMihGI5eVlTE1N\nIZVKie5/RECU4v6XDxJVaLY0Q6vRos5YJ0YXrHprRa8t+720GWo3DVCN6Y9qCBRAuRZGqRtlY2Mj\nvF4vzpw5k9HKWa0bZSmUkkYmrc7beTw1QMVCVUjrB6RDj6T2zLVcUwmKdUOwLIvx8XFMTU2hvb29\n6tetlFgo56pfEATMzc3B6XTCbDbj5MmTJW0cao2oLofs3nti3kMKKIn7H8uyGRu2w+GA1VraQU+i\nCnsb1wrEWqwtcC+7K44uAFvL7jkXWymyUAyyn2m1WlndKEtdm/oslAYVCzkodZPX6XTiDIfJycma\nDT2SopbPQvaGKQgCZmdn4Xa7YbVaSz5AS1lvI0UWQqEQRkZGEIvFKkqrqJWGqPSAI+Y9zc3NaG5u\nFh+LRCBCoRAWFxdFAWEymZBKpeD1esUrPulhE0qGMLI0gjSfxtjKmHh7kkvi9sJt7GvaB5OudHGp\nhvhSQyyoFc1QSyxotdqc73E1bpTkT6Fuh1J8FgRBQDgcppEFtZ/AZoW0WI6OjsJiseS1Z5YbNWoW\ngMwNc2lpCaOjo2BZFoODg2htbZVtM1VqFkWxAsdUKgW32w2v14uenh4cO3as7KuWStIQ48FxTK5O\n5u2/VwOGYWAymWAymTIERCKRgM/ng9frzQgZS0179GY9hlqHchYy6jQ6aJnKQsk0slCbNQGosm45\nKYVS3Si9Xi8SiYTYVpzLjbKUyEI8HgfLslQsqP0ENiOBQAAulwuxWAzNzc04cuSIYpuJWmKB4zjE\n43E4nU4sLy+jv78fPT09NSmGUrPAkbS5ut1uNDQ04MyZMyWH27PJFVko9DnhBR7/ePcfMRGcwEDD\nAHrqeipaUwnIFV99fT0CgQCGhobWTUD0+/0Ih8MQBCEjXGyz26AxaGAzlh6BI86GZo3ycwu2S+sk\n+d4p3cIoV9tkrpocaVtxthulzWYDz/MIhULQ6XR53SjD4TAA0DSE2k9gI5LvSxoKheB0OhEKhbBr\n1y5EIpGaTg/MRaEOjFpAxIDT6YTP50NnZyfOnTsny9CjXMjpGFmIXBGMpaUljIyMgOd5HDlyRLyK\nrpRy0xDX/ddxe+E2oukofjnxS3x+6PMVr63G1XC+CYjxeFysgfD7/XjjN29gMjaJ/7TrP2FH/Y6M\nqvd8z/ll98t43fM6/sfp/yGupRQ0slBbaumxUMiNcnV1FUtLS5iamsLIyMg6N0qr1Qqz2YxIJAKD\nwVCTGrTNhPIVNJuQeDyO27dv4+rVq7Db7Th//jz6+vrEYVJKomRkgVxlA2ve6Pfddx8OHDhQM6EA\nqFPgGI/HcePGDbz33nvo7OzE2bNnqxYK2WsUgxd4/Gz8Z+B4Dp22TlycuYip1amK1txIEAHR1taG\ngYEB9B/oR7A+iKg1ihXzChiGgc/nw29+8xu8+eabuH79OlwuF/x+P6LRKARBwGpyFT8d+ymGl4bx\nxvQb4uMqxXapWeA4rqSx2LVYV8nXSozN2trWDMFOnjyJ+++/H4cPH8aOHTuQSqXg8Xjwz//8z+jq\n6sITTzyBpqYm/PCHP4Tb7a54f3r22Wdx4sQJ2O12tLS04Ld/+7dFv4lCvPDCCxgcHITRaMTg4CBe\nfPHFitavFhpZKEA6nRbtmVtbW9fZM+t0OsTjcUWfk1JiIRAIYHR0FMDaAT44OKhIGE7JNATLsnC7\n3fB4PGhra8P58+dlFULliAUSVei0d8Kqt2J4cbiq6IKShYDlHC7v+N7BfHQeNpMNd6J38OD+B2HU\nGcVR3iRcPDs7i0gkAoZhcD1+Ha4FF6x6K152v4xHLY/W8NWsR42DW600xEaez1CrdRmGyelGeejQ\nIezfvx8/+9nP8KMf/Qjf+ta3cPv2bRgMBtx///34yU9+UtZ6b775Jp588kmcOHECLMvimWeewUc/\n+lEMDw/nTXVeuXIFv/d7v4evfe1r+NSnPoUXX3wRv/u7v4vLly/j5MmTVb3+cqFiIQeCIMDj8WB8\nfBx2uz1vpb/SKQHgg0FStbraIZMwV1dXsXv3buzcuRNvvvmmIgc4oIxYIH3TgUAANputZIfJcinV\nJVIaVSB+Aa3WVlycuYiHdj1UVu3CRossSFlNruLSzCU0mBrQbGnGWHAMNxdu4mTHSTAMA5vNBpvN\nJg7s4Xke/hU//tev/xcsWgsccMDpd+Jm80103OzIMJEqNnugGtRKQyh9gBZa07nkRJejq2xfjFJQ\n0+q50Lpmsxnnzp3DysoKLl26hHfeeQfpdBrDw8OYnZ0te70LFy5k/P35559HS0sLrl+/jvPnz+f8\nmW9/+9v4yEc+gq985SsAgK985St488038e1vfxv/8i//UvZzqAYqFnIwMzOD2dlZHDp0qKA9sxpi\ngVTky72ZSH0isidhKtWhQNaqpVgIh8MYGRnB6uoqrFYrTp06VbODoNTIwnv+93B74TYECGLqQYCA\nQCyAVyZfweeOfq4mz09p3vG9A3/Uj/079kPLaGHSmfDm9Js42nI05+wGjUaDa4vXsMQuYU/rHug0\nOiQMCVxbvYZHGx8Fm2AxPT2NSCSSMbzIZrchro2jt6lXlt+tWmJB6UFg+dIBvrAPPxv/Ge5puwcP\ndD9Qk3XVjCwUQ+qxoNfrceTIERw5cqTq9YlzpbSeIpsrV67gT//0TzNue+ihh/Dtb3+7qrX9fj/m\n5uag1+tFe26bzVaw44uKhRx0d3ejvb29aEhOrcgCIN8XjOd5TE1NYXx8PK9PhFJFh0DtxIJUDHV3\nd6OpqQmhUKimh0CpYoFhGAw2Da5rLxxoGIBeU9mBsdHMoEhUoc5YBwgAJ3Bot7VjYmVCjC7k+pmf\njf0MVp0VDJi1wVOWNtxcvonR1Cg+ue+TANYPL3rp1kt43f86Hm1/FLubd2c4UWr1Wui15b2n28XB\nMV8a4rr/OmZDsxAg4EjLETSYGnL8tPzr1ppSrZ4jkYjsKVhBEPClL30JZ8+excGDB/Pez+/3i8XC\nhNbWVvj9/orXvnnzJr761a/i+vXrCAaDoiMwOc9u3LiRUwxRsZADMkyqGCQloCTkeVV7pS8IAhYW\nFuB0OqHRaHIOQiIoWVQpdxRDEASxFbKurk4UQ9PT0zUXQKWKhWNtx3Cs7Zhsa25ERpdGEWNjiKVj\ncAfd4u0aRoMb8zdyioX3/O8hlAwhwSVEQyee56FltHhj+g18cs+aWJAOL0qwCfwf///BqmEVgboA\nTu04hXA4jMnJSTiXnPjV8q/w2MBj6NvRJ4qIfC1zBLVSAmrUSWSv6Qv7cGfxDnY17MJcZA63Fm7J\nHl3YqGkIQi2GSD311FO4ffs2Ll++XPS+2Z/NSoUk+f1+8YtfhCAIeO6559DX14dkMol4PI5EIoGl\npSX09/fn/HkqFqpAjcgCKcapZt1QKITR0VFEIhEMDAygq6ur4IdPqaJDudcKBoMYHh4Gx3HrUkpK\nvCay8apVTb+RONR8KO8VqcOQeyO+t+PedUOgEokEhu8O48PHPpzzZ675rmFiZQLdjm68t/Qefmvf\nb2F/134IgoDL71yGL+jDncQdtCfaEQgEEI1GYTAYMmys7XZ7RqHrdumGyCWKrvuvI5qKotvRjTSX\nxnX/ddmjCxzHKZ5yIeuWOkRKTrHw9NNP4+WXX8bFixfR1dVV8L5tbW3roggLCwvrog3F4DgOHMfB\nYDDgxo0beOONNzA0NFTWY1CxkINSNwal5zRUu24ymYTb7YbP50NPTw+GhoZK+pIqHVmo9hBPJBJw\nOp1YWFhAf38/ent71228SlgxV2u9XM2aSlHqe2jRW7CncU9Zj23VW9dFXKLRKNLWNPob1l/9JNgE\nLkxcgFFrRLutHXeX7uJ1z+t4/PDjcC47cX3+OurN9bgVvoVHhx7FoH0QHMdlmPYsLCwgFovBYDCI\nwiGRSCh+mKlluyxdk0QV2m1rBac7LDswujQqe3SB4zhVPAxKjSyEQiFZxIIgCHj66afx4osv4o03\n3kBfX1/Rn7nvvvvw6quvZtQtvPLKKzh9+nRZa2u1WvG1fvazn8Xw8DAVC0pCIgtKX3mUe3hzHAeP\nx4OJiQns2LFjXQuo3OtVA2lprATp62xpaSk41EqJyIJULCjNRosslAPHcxAgQKfJvT3l+66RqEJ/\nfT9WkitYii3hzZk38aGeD+HCxAXE0jHsb9qPu4t38ZrnNXzm0Geg1WpRX1+f0Q3DsiwikYhoJBUK\nhRAMBjE/P5/RgSG1DZabjdA6ed1/HYuxRRi1RsxH5wGspY3kji6okeYBSk9/RCIRdHR0VL3ek08+\nie9///t46aWXYLfbxYhBXV0dzOY1Z9LHHnsMnZ2dePbZZwEAX/jCF3D+/Hl84xvfwCc/+Um89NJL\n+NWvflVS+kLKM888g/r6ejQ0NKC9vR3PPPMMNBoNhoaGUFdXB5vNBqvVWlCgUrFQBSSEVWo4Sy5K\nPbwFQYDf74fT6YTBYMCxY8cKVt7mQ8luCK1Wi1QqVdbPkPqL0dFR6PV6HD9+HA0NhTcypSMLlNL5\n7o3vIpqO4r+c/C8587W5IFEFBgxYgcWdwB34Ij6wAot/Gf4XvB94Hx22DjAMg2ZLM349/Ws82Psg\nOuzrDwGdTpchIO7cuQOr1Yr6+npRPMzNzSEej2fMHSBCQo4ohNo1C4IgIJwKo7e+N+M+LdYW6Bk9\nIqmIbGJBzW6IUtMQchQ4fve73wUAPPDAAxm3P//883j88ccBANPT0xm/99OnT+MHP/gB/vzP/xxf\n/epX0d/fjx/+8IdleSykUilcuHABPM8jFoshmUxCr9fjD/7gD9bV59ntdni93pyPQ8VCDkpV9OQD\nXsrkMjkppWZhZWUFo6OjiMfj2LNnDzo6Oiq+UtnI3RCRSAQjIyMIhULYs2dP0fqLStepBDXEwkYt\ncCyV8eA4Xp96HRzP4W7/XRxszqwUzxfFm1iZQCgZgkFrgGvZhanQFFJcCsFEEK9MvgKb3oYex5pf\nRYulJSO6UAxBEETXP6kIzZ474PP5xMFFRDiQ/5a7P6hVs0DWZBgGv3/g9xVZV2kHRwLLsuIVfSHk\nqlkoZR9444031t326U9/Gp/+9KcrXlev1+Pf/u3fwLIsOI6D2WzG3NwcWJZFIpEQixsjkUjBPZGK\nhTyUcuWp0WhU6YgoFFmIx+NwuVxYWFhAb28v+vr6qhYyG7FmIZ1OY2xsDDMzM9i5cyeOHj1a1hXd\nVo8sbNZoxk/GfoLV5Co00OAl90s4sOPAOnGQSyzsa9qH/3rffwXHc/j7G3+P5fgyeup6MB4cX0tn\nMGsdGQRBEHDFdwUfH/g46k2FDbnypQRyzR1Ip9MZ6YvZ2VlxdHJ2CqPQ91KNNMRG9ztQa91IJLKp\nJ04yDIOdO3cCWKvnunTpEj7ykY+U/ThULFSJGmIhV4Ejy7KYnJyEx+NBS0sLzp49W5JqLoWNZMok\nCAK8Xi9cLhdsNhvuu+++ikKENLKw8dYcD47j4sxFtFpaoWW0eMf3Du4uZkYX8r2XGkaDbkc3hheH\nMbI8gl31u1BvqsdyfBlmnRmfO/o5GLSZ9QUmnUl0zCxEOTVJer1+3eRDMjo5FAphZWUFMzMzSCaT\nsFgsGdEHqSmO2mkIJVGzdbLYhZQgCLKlIdSE/G5v3LiBhx56KOfed+HCBfzhH/4hpqZyz6ShYqFK\n1OiIkF7pC4IAn88Hl8sFs9lcE+viSuoIKqXQIb6ysoLh4WGkUikMDg6itbW14oNqq4oFwkaKLLw6\n+So6bB040Hyg4P1IVKGjca2OwB/154wu5PudC4KAv7/59/CsenC28ywAoLuuG5Mrk2AYBh/q+VBF\nz7/aAuZco5OTyaSYvggGg5iamkIqlYLVaoXdbkcqlUI8Hlf0IN3ohYZqrStXN4SaxONxRKNRTE5O\noqenB/F4HKlUCnq9XhzPvbi4WLDwnYqFPJQaplZzPkQwGMTIyAhSqRT27duHtra2mlxZqp2GSCQS\ncLlcmJ+fR19fH/r6+qreXLZqGmKj1SzMhmfxw5Efot3Wjq82fnXd1T1BGlUgr6HN2rYuulDovbwT\nuINLM5cQSoZwY+EGbPq1qEEoFcLL7pfx4Z4P5+2wKEQt6geMRiOMRmOGEVoymRRTGDzPY2JiAm63\nGxaLJSOFYbPZanK4qmExTdbdyGIhEolsWrFAhO6NGzfwJ3/yJ2AYBktLS/jjP/5j6PV68bOVSCTw\n2muv4ezZs3kfi4qFKlFDLJAuh+npaezatQu9vb01/bIpnYYgaxEr6rGxMTQ3N8ueWlF6FLaSbJTI\nwmue1xCIBRBKhvDu3Ls403Um5/0uzVxCNBVFWAgjEA+s3fjvL+HizMUMsZBPEPkiPrRb29Fh60CD\nqQGnO09Dq1n7XpSSbsiHUq3RRqMRzc3NaG5uhtfrxeHDh2E0GsUUxuLiIiYnJ8GyrBiBkKYwqhU0\nal7hq1XgWCwNwXEcotHophUL5HNrt9vxwAMP4NatW7BYLGI7MCluZBgGDz744Lo5FFKoWKgSJcUC\ny7IYHx+H1+sVJ6IpYWaiRjdEIBDAyMgINBoN7rnnnowQrhwodYiXOnlS7jU3ArPhWVycuYgOWwdW\nk6u4MHEBJ9pP5IwuPNj74Lo2PUK3ozvj77leX4JNwLXswvH24+LMiVOdp3C09WjVr0MtB0etVguT\nyQSTyYTm5mbx9kQikWEiNT4+Do7jYLPZMto4i/XNZ6NWnQR5rUpTijgKh8MAsKkLHAHgyJEj+Ju/\n+Rt4PB7cuXMHH/vYx8p+DCoW8lCOi2OtxYIgCJidnYXb7YbNZkN3dzeSyaRirmdKpiHS6TRisRhu\n374tWlHXYgNTMrIArIWYnU4n/H4/rFarOMvA4XDAYrFsmANeTl7zvIZgPIgDOw7AbrDDueTMG13Y\n6diJnY6dRR8zn8C7E7iDmdAMdjfshl6rh1FrxBXvFQzuGMyb+iiVjWCQRGAYBmazGWazGS0tLQA+\nEBAkhZEtIKQpjEICQi3XSACKiwVBEEryWSBiYTMXOE5OTmJsbAwWiwUtLS2455574PF4YDKZYDAY\nYDQaYTAYiqagqFioklp3QywtLWFkZAQ8z+PAgQNoaWnBzMwMYrFYzdbMRomDlURNPB4PNBoNzp07\nVzN3PEDZK36fz4fp6Wk0Njbi6NGj4pWhz+eD0+kEwzDi1SDZ2E0mU1UHlFxRk1g6hvf87+F012lo\nmPUHSb51SFSh1bpWg2DSmaDT6ApGF0oh11V+gk3givcKLHqLOFGy096JiZUJDC8OVx1dUDqyIAhC\nWQJFKiDIzABBEBCPx8UUht/vh9vthiAIYgSCfNYsFov4HZdDLCTZJCZXJ7GncU/Oz4wU8h1UY1BX\nKRGNcDgsS4pHTV5++WU899xz6OjogE6nEwvWSTuvTqeD3W5HMpnEY489ts40ikDFQh7Ung8RjUYx\nOjqKYDCI/v5+9PT0iB9YpeskahlZkHZzWCwWHDp0CKOjozUVCoAyQ56CwSA4joPP58ORI0fQ1NSE\nVCqFuro6tLW1AVjbtKLRqLipezweRKNR6HS6DGMfMh2xFOR8PT8d+yl+NPojGHVGnGg/UfLPve55\nHd6wFw2mBqwmVwEASS6J0aVR/GbuNzjdVZ63vZTs1zceHMdyYhnRdBQjSyPi7ZzA4eb8zU0pFgBU\ndUAxDAOLxQKLxZIhIGKxWIaJVCQSgSAIsNvtiMViYuV/NdGuu4t38Zb3LRi0Buyq31XwvqReQQ1P\nCaC4SAmFQrDb7Zs68nfmzBlotVpoNBp4vV688MILSCQSGBwcRCqVwt27dzExMYG6urqC5k9ULFSJ\nTqcT54HLgdRsqLOzE+fPn193SCiZFqjlequrqxgZGUEikRC7OYq5iMkF2YhrUYmdSqXElINWq8Xh\nw4fR2NiY83VpNBoxREz85zmOE2cThEIhcbgRsRaWRiDyhVHliCwEE0H8ZOwnmFqdwovOF3Gs7VjR\nK0VCg6kBD/U9tO52hmFg0eduz/JH/IixsYIHTK7X1VPXg0/vzb3JVVPYKF1TyStLOcRCLhiGgdVq\nhdVqFcUqERChUAhutxvBYBBzc3NgGGZdCqMUARFLx3Ddfx3ekBc35m+gt6634GdGzeJGhmGKrh2J\nRDZ1CgIAjh8/juPHjwMAfvCDH8Dn8+ErX/kK9uz5YLDbX/3VX+Hu3bs4cCB/ezMVC1Ui11U+z/OY\nmZnB2NgYHA5HQbMhpcWC3N0Q0umXpBWSHHpK1xLIWeQoCAJmZmbgdrvR0NCAM2fO4Nq1a+Ja5diI\n19XVZRRVEWthIiCIMyBpfSJ/bDabbFdBr06+Cm/Yiz2Ne3Bj4Qau+6+XHF34+MDHy1qL4zm8MvkK\nwugsx1YAACAASURBVKkwHj/8OKx6a977Zr8+m8G2zsOBF3jE2XjBxykVJSILSTaJF10v4mO7PwYj\nszYeW4mrWamA8Hg82LNnD+rr68UIBPmsRSIRMV0mTWGYzeaM5zm6NAp/xI89TXswtjwGz6qnoPhT\n22Oh2HtMDJk2c2RBEASxxu0b3/gGPve5z2HPnj3geR48z0On0+HLX/4yTpw4gbt376Knpyfn41Cx\nkAelChwFQUAgEIDT6QQAHD58GDt27Ci4vhqRBTkOcJ7nMT09jbGxMTQ1NeWcfknEQq03aGlkQQ6I\nYRTLsjh8+LBYvZ4SUvjp+E/x0f0fRYulpeLXlMtamBj7kLa6iYkJcBwHQRAwOTmJxsZGsSq+3HVJ\nVMFusKPOWAd/1I8fO39cVnShHMaCY5hYmUCKT+Fu4C7u7bg35/1KFXcvu1/Gzfmb+Mp9X4FRZ6zq\nuSkhFl5yv4RnrzyLcCqMx/Y/BkD+yEIxSJRNo9HAZrPBZrOhvb1d/DeSLguHw5ienkYkEoFWqxUF\nhN6ix1XvVTgMDtgNdsxH5otGF9QWC8XYCoZMDMOIxYttbW24dOkSHnnkEbS2toqfsfHxcfh8Plit\n+cU1FQtVUo1YCIfDGB0dRSgUwu7du7Fz586SNgilaxZIZKGaTXNxcREjI2v55KNHj2aY0WSvBdR+\ngyaPXa1YSKVScLlcmJuby2kY5Yl7cCtyC3a7HZ/c88mq1som29iHVMVfvXoVGo0Gc3NzcLlc664I\nHQ5H0QJKElUYaBgAAHTYOnBz4WbO6EK1vyeO53DNtxaBqTfW4525d3Cg+cC6qECKSyHJJouutxRf\nwq88v4I/6sc13zWc7z5f1fOrdTdEgk3gH27/AwKxAP7vnf+LT/R+AoDyLbCFUgLSdBmBCAjShXF1\n9Crem3sPXeYupCwp6A163Jq5hcG6Qexr3Zfz9Wxkq2fggwLHzQ55j7/4xS/iqaeewhe/+EX8zu/8\nDlpaWuD3+/H1r38d+/btw969e/M+BhULVVJJN0QqlYLb7YbX661oCJIakQWgsgM8FothdHQUy8vL\n2L17N7q7uwsKIrJWrdu4qk1DkHZWl8uF+vp6nDlzZl2UJJ6O427oLtLmNG74b+BE+wnsMOYWSXJA\nquK1Wi26u7ths9nEsbRkQydXhKQCWlr/YDSuXYGTqIIgCAgmguLjh5KhmkQXSFShy9EFg8YA57Jz\nXXRBEAT8z/f+J6KRKD5iLTwE5+L0RcxF5mDQGvDLyV/iZMfJqqILtRauL7tfxuTKJLocXfBH/PhX\n17/igGb9AK1aU+53TiogYukYLiUuoUvfBZvGhkQigWQiCV/Yhx+99SPc33w/6hx1GSkMo9G44d0b\n5Zo4qSbS3+tDDz2Eb37zm3j22Wfx+c9/Xqy3e+SRR/CXf/mXYi1LLqhYyEMtuiGII+H4+DgaGxtx\n5syZgmGffGi1WrG9SolQJflSlVOMxLIsJiYm4PF40NHRgXPnzomHUSHI45c6a75SGIapuH1ydXVV\nnFFx6NAhsd89m9sLtzGfmsexjmPwJX141/cuHu57uNqnXhLSIjkSUiaQAkqSwiAFlEajEQ6HA4tY\nBJtm0WxpRppPYym+hFZrK7rsXVhJrCCWjslSOAhkRhXMujV3zjpj3browujSKK76riKdTGOvZi/u\nRe40xVJ8Ca9NvYYGUwN2mHfAHXRXHV2opVggUQUGa68/oo3g+6PfxzNdz9RkvXxUu5/E2ThMOhO6\n7F1rN/z7ttaDHtj0Nuxv349ULIVQKISJiQlEo1Gxt5/neSwuLmYI1lqzncRC9u/0E5/4BD7xiU+A\nZVmEQqGM1GYhqFioklJSAoIgYGFhAU6nE1qtFkNDQ1U5EpIPOcuyNW8xBDIP8GIREGJF7XQ6YTKZ\ncPLkybLcz+RKD5SCRqMpK7IgjQj19fVh165deTeceDqOt2ffhllrho7Roc3Whvfm38PR5qNot7XL\n9RJyUuxg02q1qBMENE5NAaEQhOZmpE6cQPjfNw+EgD9q+SPEE3FcjlzGVe4qHul6BA/2P4g6ex0M\n+vI+c0k2CYPWkPN5jQXHML6yNkbaF/EBWCtOnA5Ni9EFQRDw84mfI5aOIcWmcGXpCh4RHsn5eCSq\nsL9pP7QaLQya6qMLteyGIFGFJvPaftBgasB8ZB5vBt/Ef8R/rMmauSDfg0qv8pvMTfjMwc8UvpPk\nTCKCdWpqCuFwGOPj46KAkHZglNMyXA6lpiEikYjYerpZ+ad/+id8+tOfhslkwttvvw2DwSAWRptM\nJoRCIZjNZmrKVGtIZCGfKg+FQhgZGUE0GhUdCau9SpFe6SsB6YMuth55rbFYDHv37kV7e3vZr5W0\nMyklFkpZh4zFdjqdqKurKykidHvhNqZXp9FsbAaEtc3UH/bj3bl38YmBT8j1Ego+53wwbjf0//iP\nYLxegGHAaDTQ7d0L/eOPo0FSCT27Mov//av/jRAbwoXJC2iNtQI8MhwoWZYtuFaaS+O7N76Lwy2H\n8eGeD6/79ySXRJe9CwIyH6PR3IgEmwCwFlV4d+5ddNo6EUvEMLw6DNeyC3ubMvOrJKpQb6pfixoJ\nPDrtneuiC7F0DDOhmXU/n49aRRZIVCHJJhFLxxBLrxmtpfk0Xg28iv+W/G+oMypjM0y+20oVVZKO\nH9L+Ozg4CJZlxZbhcDiM+fl5MeIlTV/Y7faqBUQ5kYWBgYGq1lITjuPw3HPP4eMf/zj0ej2+8IUv\nQKfTQaPRQKPRQKfTQa/XQ6/Xw2Qy4YUXXsj7WFQs5KGcNASwPkSfSCTgdrsxNzeHnp4eHDt2TLaw\nOsMwG6ojQnrFLcdr3UhDnkjKIZlM4uDBg2hpKd7RkOJSeHv2bUTSEUTiEYSCIViSFiS5JG4t3MKp\njlNotdXuaqXg80uloP/Xf4Vmfh78/v2AVgshmYTm7l1of/ELsP/5P4t3/fXsr7HKrWKocwiz4Vlo\n+jS4t/lecTP3+/0IhULgeR7Xr1/PMJEiLXU35m/g/cD7CMQCON52HA5jZkj3cMthHG45nPfpkqhC\nPB1Hj6MHOlaHaW4aPx//OfY07sl4rbcWbiGcCiOejsOZdGY8zlXfVVEs/L+R/4dXPa/iLz/0l+i0\ndxZ8LwVBqJlYWEmsIM2lscOSWcfSaGoEwzIIxAKKiQXyfVPD7pkc2jqdDvX19aivrxf/nWVZsQMj\nFAphbm4O8Xhc9ByRiohy6r5KTXOGw+FNPxfi61//Ourq6sDzPD772c+CZVlxgBT5bzQaLfq7p2Kh\nAKUcJtKUgF6vB8dx8Hg8mJiYECclFpoRXikbwZhJ6g1BivwqqcHIZiNEFtLpNNxuN2ZnZ9Hb24v+\n/v6SQ7QaRoPj7cdxqOUQRkdG0dLaspYXFNY2KZNOmZkeOZ/b5CSY6Wnwvb0AeT1GI4S2Nmhv3wYb\nCgEOBxaiC3hl8hU0mhph0VugYTT4ydhPcLrzNFpbW8XQ7Pz8PCYnJ9HR0YFQKISZmRmxpc5is+CF\nuReQTqUxw87gmu8aPtJXuDgxGxJVaLN9UHjVZGzCO3PvrIsunGg/gQZTQ87HIWH++eg8fj7xc8yG\nZvHTsZ/iD4f+sOD65PtfC7HQZmvD67//+rrbl5aW4Ha7sbtht+xr5oN8D9Qoqiz0vdLpdGhoaEBD\nwwe/V+I5InWiTCQSMJlMGdGHQgKC7NfF2OzdEFqtFg8++CBu3LiBoaEh/NEf/VHFj0XFQpWQq/x0\nOo1gMAiXywWDwYDjx49nfMDlptYzKbLJNmaSzqyQ+grItZZSkYXsdUjKweVywW63VySAdBodznWf\nAwDYF+zY2b4THR0dEAQBqVRKtudfiLwiN50Gw3EQsjZKQa8Hk0iASachAPjl5C8RiAWwr2kfAKDL\n3oXRpVFc8V7JKBYkn//29vaMnvxIJIJLk5cwEZpAs64ZgVAA/3zln2EL2tDe2F7y1eC1uWtIc2nM\nR+YxH5lHMpVEMpVEA9eAa75rGWLBbrBjqHWo4OP9YvwXWIwtot3Wjlc9r+Jjuz9WMLpQS7FQaE21\nPBbUaNcsNwqZy3Mk27TM6/UikUjAbDavS2GQ1HEpg/i2QoHj2NgYHnnkETzwwAM4c+YMjhw5gr6+\nvrLr5qhYkAGNRoPbt28jnU5jz5496OjoqPmXTq00RDweh9PpRCAQwO7duzNmVsiFkpEF6aEaCoUw\nPDws+qa3trZW/XtUahR29pr54Lu6IDQ2gvH7IXR+cEhq/H5wg4MQGhrEqALLs5gJzYj3CSfDeMn9\nEu7rvE8c2JQLjUYDs9WMO7E72NG4A/0N/ehOd+P9hfcxyU7CHrGLV4NkmI3UgVJ6pfnwrodxqPmQ\n+PfFwCKWlpewd+9e7LQXn1IphUQV6o31aLG0wLnsLBpdUEMsqDHlUi3bZbl8FnIJiFQqJUYfVlZW\nMDMzI7qesiwLnuexsrICm82WU7AIgoBIJLLp0xANDQ341Kc+hffeew+vvvoqduzYgQMHDuDBBx/E\n/fffj5aWlpKM26hYKECxjT4ej8PlciGdTou/gFq2+0mp1QCrfJAhJIFAAK2trTh37lzNRmQrHVmQ\nzuPo7e3Frl27ZK0vkX6GlBAPvMCD5fJEnerrwX7kI9D9+MfQOJ0QrFZgdRVCYyO4j34U0GiQ4lPo\nq+tDh60j40d3N+xGvbEeLM8WFAsAcGP+BsaCY+it7wWwtpm32FtwN34XHzvyMTiMDnEzD4VCWF5e\nhsfjAcuysFqtGR4QQy1D4kHm432YZ+cx1FY4gpALElXY27gXGkaDJlNT0eiCWmJBjcjCZhYLuTAY\nDGhqasq4gk6l1to3XS4X4vE47ty5g1QqJXYHSDswTCaTaPe8mWlqasI3v/lNCIKAK1eu4LXXXsPr\nr7+OP/uzP4NOp8PJkyf/P3tnHh5Xed/7zzmzz0ijXZZkWZZkW96xMRgv2AbM4kLShISG0JYkJZTc\nQpvblCbpTZulT9vnaQhpLyRpk5KSSymBLBCDgUAxNosNGLzKtjTa910ajTQzmvUs94+jM57ROpJG\nkgn6Po8f0Ehz3jNnznnf7/tbvl9uuOEGPvaxj01ZzLlEFmYBSZJobm6mpaWFZcuWkZ6ezrJlyxaM\nKMDCRRZUVaW3txe/3080GmX79u0JBUjzgVR7UUwGQRBwu91cvHiR9PR0du/enXR+ssffw7OuZ7l7\n891kWie/Hgtpha3D5Xfh7fFyW9ZtE6vm7d+PmpOD4YMPEAYGULZtQ961C7Vc0/AvTi/mH/b9Q9Lj\nTTTGqZ5TyKpM41DjpRdVkBSJqoEqdi3fNW4y1zXs9VByb28vDQ0NMVtlp9MZ6zyaadGhHlUwG8z4\nI34ALEYLrcOtU0YXUm3qlAz5WCIL8wez2Uxubi7Nzc2UlpaSl5eXIJs+ODhIY2Mjd955J4WFhdhs\nNl566SUURWHLli3YbLYZj/n222/z8MMPc/r0abq7uzl48CC33377pH//5ptvcsMNN4x73eVysW7d\nuhmPrxfpiqLI7t272b17N9/61reor6/npZde4tChQzz44IMcO3ZsqRtithj7QOv57Pr6emw2W2zh\nPHny5ILWD8DC1Cz4fD5cLhd+vx+73U5JScm8EwVInRfFVPD5fAQCAUKhEBs3bpxxyuG3Db/l5YaX\nKUgr4A/WT27rOtUxvSEvjUONs9olTwZ30E1roJXAUIC+QB/LHJe6Ls72nsUiWtiQtwFl61aUrXOw\nbpYkhO5uTO3tWDwekOVLBZPAx1Z9jN3LJ7ahnsxYSBAErFYrVqs1JnQV74ro8/nweDyEQiGOHTs2\noQLlZNe71l2LiIjVaMUX9cVez7HnUNlXOenHnGxxj8gRfBFfrHAyWTx04iFkRebvrp1cdGkxaxYW\nGos1riRJsXHHyqYrisKJEyc4duwYf//3f8/x48f58Y9/jMfjYdOmTRw5cmRG+f6RkRG2bNnCPffc\nwx133JH0+2praxPqJWZbF6a3vV+4cIGOjg7cbjc9PT20t7dTVVVFbW0tBQUF7NmzZ8rjLJGFJDE4\nOEhNTQ2RSCRmp6xPIAvt1QDzG1mI7wQoKSnhyiuv5OLFiwu2Q57PNIQkSdTX19Pe3o7JZGL16tVT\nSpxOhE5fJ0dajhCRI7zS8Ao3lt04aRX+VJGFR049wvGO4zz2e4/FwvVzRY27hoASICyFqR6ojpEF\nT8jD6e7TmAwmVmauTPBdaPA0kG5OTyAWU8LrxfD224htbdiHhsj1ejEA8r59MBqyXZmxkpUZK4nK\nUQyiYdby0PGuiIWFhdjtdtxuN2VlZbHdYLwiYHwo2el0xgoo967Yy7qcdeP0HIApnSkn6xK497f3\ncqLrBOe/eB6bKbndZq27lpcbX0ZVVT619lNsyN0w6ZiXu9RzqnA5GkmJokh5eTkOh4Mvf/nLvPji\ni9jtdtra2jhz5kzSioc6br31Vm69debKrfn5+XPanOnRt8OHD/Of//mf5OTkMDw8THNzM1lZWVx1\n1VV89atfZdeuXUkV4y+RhWkQCASora1lYGCA8vJySktLx91kC92ZAPNTsxDvd+B0OhPC8guVGtDH\nSjVZUFWV7u5uamtrcTgc7N69G5fLNatJ+X8a/wd3wK21RrprONJ8ZNLowmQ1Cg2eBo60HKE30MvT\n1U/zt7v/dsbnMRbuoJsadw3Zpmzy7Hk0eBrYkLuBZY5l1AzU4Al7EBGpc9fFohm+iI+jrUfJseVw\n+5rbMYjTTNyqiuGDDxAbGlBKS4lmZRHu7ERsaACbDXn//rg/VXm16VWybdlcW3ztnD+ffkxBEGJk\nYPlokWa8oI/ejz+2Gl4nEjNZnCZKd1zsv8gL9S8A8MSFJ7h/W3LtaM9UP4Mv7ANB+/9/3PePk465\nGHoHi0UWFmvc6dLGfr8/JlYkCAIrV66c1L55PnDllVfGiq2/+c1vTpiamAr6vfvBBx/w61//mlWr\nVnHffffx0EMPUVxcPOPzWSILU6Cjo4MLFy5QVFTEvn37JtUt/12ILHg8HlwuF9FolM2bN5OXl5cw\nSS5EakBHqsmCnk4ZGRlJiArNpp5Ajyrk2fMwikYyLBlTRhcmIwtPVz3NYGhQK7JrPswfbfijOUcX\natw1+KN+0oxppJnS6In2UD1Qjdlgpmqgijyb5vVwvv88FTkVOEwOXAMu+kb6GA4N0zzcPH1v/9AQ\nQmsrSlERWCwQDKKazSjLliG0tMDwMIxWj7d6W6lx12A32Vmfs55s28x2ZJNhIoI3kaBPNBqNkYeh\noSHa2tqIRCIJCpS6hfdkC9ZEZOGf3/tnjIIRSZV4+P2H+ZPNfzJtdKHWXcuR1iNk27IREHij9Q2q\nB6onjC4s1SzML1RVTWpcr9dLenr6gl+XwsJCHnvsMa666irC4TD//d//zY033sibb77Jvn3Je5zo\n533XXXeRnZ3Nu+++y+HDhzl9+jRr1qxh3759bN68maysrKSK1ZfIwhTIyspi586d0/bZGo3GBeuf\n12EwGGKOYXNBKBSitraWvr6+SSMn+ngftsiCJEk0NDTQ1tZGSUkJ27ZtS9hNzNQbAi5FFTbmbQQ0\n62aX2zVpdGEistDoaeRIiyZLnGfPo2GwYc7RBT2qkG/Lp0foAaDQUUiDp4FAJMBQeIiKrApUVBo8\nDdS561idvZqzvWfJteXij/qp7KukLKNsyuiCEI1qWgxjibPZjDA0FNNpUFWVc73nkFSJwdAg1QPV\n7FkxdU40Gczk+zKZTJMWUPp8Pvr6+mhsbERRlFgBpR6FsNvtse8unixc7L/Iiw0vxn52B91JRRf0\nqIJer9E03DRpdGGx0hCXWzpgPscEpo0sLFYnxNq1axOsonft2kV7ezvf//73Z0QWdKxatYr777+f\n+++/n9raWo4dO8bhw4d55plnyMrK4pprruGGG27gwIEDU651S2RhCqSlpSUVMTAajQQCgQU4o0uY\na+ojXmkyPz9/2lZIURQXLHoyV7Kgm1nV1NRgt9vZtWvXhA/9TCMLvSO9HGk5QlAKUj1QHXt9JDLC\nKw2vcKD8AOmWxHEmIgs/r/o5g6FBKrIrMAgGnBbnnKML7d52wnKYkegIHcEOwkNh7A5NYrp1qJXV\n2au1aAoCTouT8/3n8Ua8uINuKrIrcMpOmjxN00YX1IwM1IwMBLcbtbDwUgHg4CBqZibq6GTT6m2l\nfrCeorQiglKQyr5KNuRumHN0YS7Sy1MVUOr1D7oHiCAIpKenx56JUCiExWJJiCoAqKjTRhcSogqj\n555jzZk0urAYu/zFSAfoTpeLRRaSiSykpaUtOHGbCDt37uSpp56a83F0IvKnf/qndHZ28sILL/Cj\nH/2In/zkJzz//PN84hOT+9YskYUpMB821anCbMdUVZX+/n5qamowGAxJK00aDIYFi57MhSz4/X6q\nq6sZGRmZ1sxqppEFi8HCgfIDRJXouN9ZjdYJd+Rjx2jwNHCk9QgWgwV/VGvhsxltdPo75xRdWJW1\nKlaZfy5wjpUrV5KVlUVlXyUfdH2AO+hmMDQIaDoMQSlI01AThY5CREHrEhAEYfrogsWCsnUrhrfe\ngtZWRFnG2t2NsHIl8pYtYDbHogqyKuMwOegf6U9pdCGVk3d8AaVe6KooCiMjI3i9XtxuN4qi8N57\n79EeaU+IKugYCA5MGV14qeElvGEvBtHAcHgY0EiGrMi83PjyOLKwWN0QizEmzN7pcraQJClmjjcV\nLif1xrNnz8YUUmcKn89HU1MTra2tdHd343K5aGxsjPn5GI1G1qxZQ2lp6ZTHWSILKcCHpWbB7/dT\nU1PD8PAwa9asYcWKFUlPvAudhpjpWJIk0djYSGtrKytWrODKK6+cVkp4pqQk05rJ56/4/IzOa2xk\n4VT3KQQETAYT3rA39nqGJYNzfedmdOx4pJvTSTdrUY0uSxdFjiJynbmoqOPElQCqBqo413uOsDVM\np68z9nqjpzEWXQhJIV5pfIVdy3cleDMo69ahms2ILhe0tREqLES65RbUsjLgUlShMK0QT8jD2b6z\nOM1OKhuPs7l5hGzRoSlJrlwJM1z4F0INUxTFmDRwWloaPp+PnTt38tXXvzrpe3565qfcVXZXTE44\nHreU30JR+vjvAGBj7sZxry3GbnuxohmwOOZVyZpIpSIN4ff7aWhoiP3c3NzMuXPnyM7OpqSkhG98\n4xt0dnby5JNPAvDII49QWlrKxo0biUQiPPXUUzz33HNTaiBMBP07vf/++6msrIyRYKfTyfr16/nS\nl77Ezp07ueaaa5K6HktkIQW43MlCNBqlsbGRtrY2iouL2bJly4wc2mDhuyGSHUsXjaqpqcFms02a\ncpgIC6GmOHaMO9fdmaBIGI/J2i9nM6aOEmcJJc6ScX8jKdI4Q6sObwcDgQH07sLzfec51nEMRVW4\nY11cf7ggoK5ahVxejr+rC3d3N2Xll7QTGj2NSKpEp6+TWnctrUOtOEIS+QM1tHsukB/JRXU4kHft\nQr7ttgR9hukwXw6Qk0GvHzAYDHxt99fYsWIHYTlMRI5gN9hjzn35Yj5VVVWxAsr4DoyNORsTJKuT\nGXOmz+dcsZjpgIUmC/EaC1PB7/enJLJw6tSphE6GBx98EIAvfOELPPHEE3R3d9PW1hb7fSQS4atf\n/SqdnZ3YbDY2btzIyy+/zG233TajcfXrWlFRwdq1a9m2bRubN2+mpGT8fJAMlsjCFJjJrvtyFGWK\nN0VKS0ub0UI60Xjz0Q1xvvc8y53LE8RtRFFMKuXh9/txuVz4fD7Wrl07Y0+OhZCVHksWRFFkTfaa\nRak8BxgIDPBm25vcuupWrim6JvZ6VI7ynePfoc3bhiqohKQQ73a+S0SOcLbvLDuW76A4fUy7lSDA\nBDuSrcu2UpZZRt9IH/0j/SzPSsd98X2Wq2msXnUNimgDjwfjW2+hrlgxN3GoeUY8OSlKL+KuDXfx\nS9cvGQwO8vltn8diTCz0jFeg7O/vp6mpCVmWYwWU+j+9gHIiLNYufyEVaPUxF8u8KhmykKo0xPXX\nXz/lpuSJJ55I+PnrX/86X//61+c8ro5vf/vbCT/Ha4fM5NovkYUUYDEiC9PVLAwNDeFyuQiHwykx\nRZqPNES3v5tjbcdYlb2KA+UHYuc3HTGRJImmpiZaWlooLi5m69ats9qJLYQU82IYScHk4fp3Ot7h\naOtR8u35Ce6RJ7tPUj1QTUgK8Wrjq1xTeA2tw62sz1lPvaee9zvfp3jdxL3ZY++rHFsOObYcLvRd\n0MhRyE5+wEF3voiHEOnYICsL+vsRq6pmRBYWOrIwdrx2bztnes7gi/io7KtMIFygqQHm5eXF1PZU\nVSUYDMY6MLq6uhIKKOP1H/R+/o9SzcJiqTcmQ4z01skPO3R5dL1OY7bf8xJZmAIzKXC8XNIQ4XCY\n2tpaent7KSsro6ysLCUP5Hzswi/0XcAT8lDnrmNz/uaYmc9kY6mqSl9fHy6XC6vVmlRb61RYiNTK\nYnhDTHbf9o70cqLrBGEpzNvtb3NV4VU4TA6icpSXGl9CQKA4vZhjHcfoHenFZrJhMpgocBRMHl2Y\nBF2+Ls71nqPAUQB9PWSpVrrUCO/LrZSIWrpFNZlgFl1Ei2kX/W7nu/giPqxGK8faj7Elf8u46EI8\nBEHAbrdjt9vHFVDqHRgtLS2MjIxgNBpxOp0EAoFYO7bZbJ73z6if02JEMy7ndk2/3z9jddfLEan6\nXpfIQgpgNBpjbUAL9cCNJQuKotDa2kpDQwN5eXns2bNnVqYnyY43V3T7u6l111KSUUKPv4cLfRco\nSiuKMd+xC+zIyAgulwuv10tFRQXLly+f86IhiiLR6PjOhpRhcBBrQwOSqkJJCcICtmFNFFk40XmC\nwdAgG/M2UjdYx+nu0+wr2ReLKqxIX4HVaKVusI7B4CC3r9HMbrJt2fSM9EwZXRiLk90n6RnpYZlj\nGQFLCINxBEGyUil0skNZSYmSjjAyglpRMefPNZ+IjyzoUYXCtEIcJgdNQ00TRhemQ3wBZVGRPs9I\n3AAAIABJREFUVvgoy3JMgdLn89Hf309XVxdWq3VcBGI+0gWLVbNwOZOF34XIQvw8Gj/3zGYeWiIL\n0yCZMLL+8EqStGA7AT1UrygKbrcbl8uFKIps27ZtRiYnMxkvlWThQt8FglKQFc4VCAgJ0YV4siDL\nMk1NTTQ3N8+6OHMyzFuKQFURTpxAPHGCzNGctdjcjHrTTURXrpyXMLOqqlwcuMj6nPUTTgR6VGGZ\nfRmiIGISTbzd/jZX5F8RiyrYTDYUVUFRFTp8HZzpPUOGRVNjDMthKvsq2V28m8K06Vu4VFS25G/R\nfrDmIvYHWdbWjsGiICmdiIOgrFmjtVvO8HMuVhpCjyqscK4AwGwwJxVdSAYGg4GMjAwyMjIYGBig\noKCA3NzcWPTB6/XS0dFBOByO2Snr5CEtLW3Oi+5i6CwsltRzsmmIVBU4LiZSeX2XyEIKoOeCFpIs\n6Df7mTNnGB4eZvXq1axYsWLeHr5Uhuz1qEKBQwvxpVvS6fZ3x6IL+lh6ysFsNrNjxw4yRmWEU4X5\nKnAUGhsRjx5FdTiIlJcTCYVQfT7cTz1F5ZYtRDIyZlTwlgxOdp/keye+x71b7yWPvHEkKBZVyNlI\nZV8lXf4uglKQX1T/guqBaqJylAaPZgdtFI3YjDYcJge3rbpUgS0KInaTPeG4k5Gt2yvGWPBuDGA4\nfRrx3DmQJKRdG5C3b4dZGOUsRjeEHlVwmp0xi+tMSyYNnoYpowu+iA+zaJ4RmdDHNJlMZGdnJxgX\nxdspDwwMjCug1KMQDodjRtdpKQ0xHj6fL+VzzkLC7/fz1FNPkZubi91ux+FwxFJidrsdm82GzWbD\narVOamUQjyWyMA2S2X0KgrCgdQu6pgBo/ux79+6dd5KSym6Ii30XGQgMoKgKnpAH0ISC6tx1XJF/\nBdFoFL/fz4ULF1i7dm1KUg4TYd4iC7W1IEmwbBn09RFVFGrDYdK7u7nquuuQt2+PhZz1grf07m6W\ntbWR4fViWr4c065dGLZuTUqHQFVVfl3za+o8dTxb8yz35t6b8PuBwAAnuk4QioY403uGc73nCMkh\nFFXBbrKzs2gnRnH8VFCWUcbNZTen5prY7ch79yLv3TvlnwlNTYi1tZCerpGJMZPYYqUhmoeaMYgG\nJEWKiVuBRnQbPA0TkgVZkbnvt/dRkFbAIzc9kvSYUy3cY+2UVVUlFAolGGjV1dUhCMI4QqoXUM50\nzPnCYpKF6RZHVVXx+XwxI70PI/r6+njkkUfIzc2NrU16B4TBYMBgMGA2m5EkiQ0bNvCjH/1oyuMt\nkYUUYSHaJ+OdE/Wd6KpVqxYkmqHv9lMRBk4zp028E1OhtaUVX7cPURTnnQTNW2TB60W1WIhKEsND\nQ4RCIQqLisgDJKORiM2Gw+Fg2bJRS+gLF+D114kMDREwm4mcPEn0xAkGr70W5dprp3VMPNl9krO9\nZynPLKfB08AZ4xnKSy7pHpgNZvat2IesyhxvP06mNROzwUymNZObS2/mQPkBzIaFiYhNikgE8/e+\nh/GVV8DvB6MRtbSU8He+g3LFFQl/uhhpiN3Fu1mfu37Cv0kzTbygHGk9wrm+c5gGTFT2VV5KyyQx\nZrILtyAIsR2ifj8pikIgEIjVP7S1teH3+zEajePqH/RF86NUsyBJEg7H5LbkOj7skYX8/Hx+8IMf\nxApq9X+BQIBgMEgwGCQcDjM4OBirnZkKS2QhRZjvyMLw8DAul4tgMBhzTjx69OiCRTP0hzoVZGFX\n8a5xr+kpB9WksnbtWlpbW+edBM1Xp4JSXIz/xAnavF5MFgvp6enkOZ0IAwOoY+tJJAnTu+8iAKar\nrkKfwpT2dnJ7e+kSxZhjYjQaTXBMzMjIwGaz8euaXxNRIuTYcvCGvRzpO8In5Esa706Lk1tX3Urf\nSB+/bfwtG/I2kG3NpsHTgMPsWHyiAJiefhrjc8+hZmRAWRlEIoiNjVi++U2CP/85jBaaLUTNgqzI\nuINu8h35sYXbKBrJs+fN6Bg/PfdTZFVGkiQer3ycH9z8g6TeO1cjKVEUSUtLS9gV6wWUegqjr6+P\nQCCAxWLB6XQSDodjOfqF0lu43J0uP+w1C2lpadxyyy0pO94SWZgGi+0PEYlEqKuro6uri9LSUsrL\ny2MP80JKMOsPV6qLkgKBADU1NXg8HioqKiguLmZoaGhB2g1n4zo5HbxeL7WBANkmE6vCYYIWC0GP\nByEYRF2/HmXVqoS/F4aGEHp6UPUog35uhYXYm5pYabFQsmFDgmPi8PBwLNxcO1LL8e7j5NhzCIfC\nFNgLqO928V7NS5Qs+1KCaNIbrW/gDrpZn7seURCxGW281vwaO4t2jqtFmC8IbjdCczMYDNq1cDpB\nUTAePAhms6a/AJoHRXExQns7huPHkW+9FVgY34QnLz7JC/Uv8Phtj8+anBxpPcKF/gtkW7OJKlHe\naH0j6ejCfCyi8QWUOiRJSqh/aGtro6GhAbvdnhCBSEUB5URYzMjCdIRIUZQPPVmASxoL+nVua2tj\ncHAQq9WKzWaL6XvY7dM//0tkIUVIdWRBUZTYw5udnc2ePXvGfaELaWClT16yLKekG0GWZZqbm2lu\nbqawsDAh5bAQyoqpHifeDru0rIzSv/5rjGfPEjp5EkUUUfbvR73qKi0HH/edqUYjmEwI4TBqfH40\nEgGTSVtAmdgxUZZlnn/9eSJEUGSF/v4OTO4BRNnDyx0/4JYjrZhu/Ti23btxh9y81f4W6ZZ0orLW\nLppnz6N5qJkTXSfYv3J/Sq7DpFBVDEeOYDx8GDweLaqTn490++0o69cjDA/DWNfT0ftMGBxMeHk+\nIwvuoJtfuX5Fu6+dg3UHOZB9YMbj6VEFRVWwGq1YVAtd4a6kowsLteM2Go1kZWWRlZVFS0sLW7du\nxWw2x+ofBgcHaWlpiYXtxxbkzvUcUzWXzGbc6UiKz+cD+FCnISBx3n722Wd5+umnaWxsZHh4OJaC\n8vv9/MVf/AXf/OY3pzzWEllIEVJJFgYGBqipqUFVVbZu3RorZhqLhTZ3EgQhJeP19/fjcrkwGo1s\n376dzDEV8QtFFlJV4Njb24vL5RrnTaEWFjJcUUHfwADLd+7U/nisrkNmJsq6dYjvvANpaRqZkCTE\n1lbktWtRp8glesIeekI95DvzUWUZg28ARQqQLljwWgVaG6so+XE71S0tnM73Mzg0iCIqBMNBjAYj\nCJpb5pmeM/NOFsSqKowvvAA2G+q6daiKgtDWhulXvyLyv/83SlmZ1ikRV/lPIKDVLowaVMH8Fzh+\n461vUD1QzfL05Txb8yzbt23HIMxs96tHFTItmbHzTTenJx1dWCwFR73gLTc3d8ICSp/PR09PD/X1\n9aiqGos+6P+12WwzIlayLMcswBcSMyELvws6C6IocvjwYf7pn/6J/fv3YzKZaG1t5c477+Spp54i\nMzMzwbtiMiyRhWmwkCqOgUCA2tpa3G43q1evpqSkZMpJY6E9KebaEREMBqmpqcHtdlNRUTGp6+WH\nJbIQDAZxuVx4PJ5JuzYEiwV1molJuuEGjENDiPX1WtRBEFBWrpzWZCnXnsu/3fJvhKUw4rlzmN7+\nOUppKT2DHjIcaazeUohQXU1WJELhFR9nbe9a/H4/fr8/Zs2clpbG8pzlhMPhpNqnJkIyz4h49ixE\no6h6GkYUUcvKEC9eRKyqIvpHf4SlpgahrQ01KwshHEYYHkbatQv5mkvFsPNZs+AacPFa02tElAg2\nk42+kT5ebX+Vjy/7+IyOc6j+UEKnjw6DaOC3jb+dlizMtWZhpoiXAx6LiQooVVVNUKBsb2/H7/dj\nMBgS0hdOp3PKe+pylnv2+Xw4HI5FOb9UQierL7/8MuvXr+fRRx/la1/7Gk6nk6997WvcfPPNPPTQ\nQ4yMjEx7rCWykCLMZeGOFx4qKipi7969yfW9LmAaAmYfyVAUhebmZpqamigoKGDfvn1TFi/qi/h8\nF7PNtsAxXi2zoKBgyq6NsdGLCT9PVhbS3XcjNjUheDyoaWkoq1dDEgqcugGXYeQ8RsmOas4FJUK6\nOloq6XRi6elhReEKVhSuiJ1/IBBgeHgYr9fLUNcQ79S/Eyt2mw+1QGFoaFwbJIIAoogQCCB98pOE\no1FM//VfiB0dYDYT/cxniDzwwIRmVfOBf/ngXxiJjmA1WOkP9JNhyeCV9lfYmz11u+dYfGX7V/j9\n1b8/4e825W2a9v0LHVnQn4GZdGDoBZSFhYWxY+jtwF6vl6amJkZGRjCbzePuKT31cDnrLOjqjQtt\ncpVq6HOP2+1mxQrt+R8cHIzNV1u3bsXtdnPx4sVpiyGXyMI0mElkIRwOz+jYqqrS09NDbW0tFotl\nxsJDC5mGgNkJMw0MDFBdXY3BYODqq68mK2t6G2Z90ppvsjCbAsehoSGqqqpQFIWrrroqQTBnTmOY\nzSjr1k36a6G+HuPRowgeD0pZGdJNN0F8Z4V+34TDWHt7sbS1IaaloQYCKGvXjjsnfbJfvlzz44gv\ndotXCxzbfTFTsR8dSlkZhnPnUBUF9EUpEkEVBNSCAhAE5NtuQ77lFoS+PlS7fULBpvm6J1wDLl5v\neR2TaMJitDAcGibbmk1/qJ+jPUfZze6kj7U6azWrs1bP6jwWWjYeZk4WJoIoirH7RId+T+n3VVdX\nF6FQCJvNFvPACIVCC0oa9E3IdCTY7/d/6FMQcGn9ysvLw+12A7B+/Xpee+01zp49S3p6Ou3t7ZOm\nuuOxRBZSBKPRmFQoR4fX68XlchEIBKioqJixvTIsPFmYSRoiPuWwZs0aSkpKkv58+qQ135PmTCIL\n0Wg01pVSXl5OWVlZUueWiroIw6uvYn74YW13rh0U43PPEX7ooVg+X964EUNBAYaXXybT7cYgioiy\nDEYjys6doKpTCjzFF7vpiO++6O3tpaGhASAh1Jyst4ayfTvKqVMI1dWaWJUsI/T3o2zciLx5c/yJ\nTFmnMV9k4bFzjxGSQ5hEE2E5TESO0DLcQqYxk3cH3k35eJNBv1cWOg0BqZUGhonvqUgkktCB0dHR\nQWtrKw6HI+G+cjgc8/Ls69HfZGoWfhciC/rn/MxnPsPZs2fp7+/nj//4j/nNb37DH//xH+PxeFi9\nejU79ZqqKbBEFlKEZGsWIpEIDQ0NdHR0sHLlSq666qpZh3oXo2ZhOnKiKAotLS00NjaybNmypFMq\n8YgnC/OJZHb9uhBWTU0NTqeTa6+9Nqk2Ix1JpSGmwtAQ5h/8ACEQ0PL9gqAVQDY0YHrsMSL//M/a\n3zmdKKtXY3zpJVRRRDWbUdPTISMDw5kzSI2NqKtnttsda7dc664ljTSEsBBzS9TrH86fPx+LPkyU\nvlCXLSN6770YjhzBUFsLBgPSgQNIN94I0wjkCL29CK2tmtbCPJDjbn837d52NudujqV1AtEAnpCH\nTxR9gm3Z21I+5mSYr4V7Kujt0AuxMJrNZnJycsjJyaGnp4eKigocDkcsoqWTUlVVxylQzrSAciLo\n89d01/d3wUQqHnv27GHPnj2xn5955hkOHjwIwN13370UWUgFUlXgqCgKHR0d1NfXk5mZybXXXpuU\nith0Y8409TEXTJeGcLvdVFdXI4pi0imHycYBUh81CQa1ne3goLaIFhdPSUhGRkaorq7G7/ezfv16\nCgoKZjxZzTWyYDh1CqG/H7Wk5FJkwGhEzc7G8MEH4PHEtAnElhaUigp8BgNWkwn7smVgMiFWV2O4\neBFphmQhHu6gm79582+4quAqvnXtt2KKb52dnXR2dpKRkYHX66Wzs3Nc+iK2U1yxAulP/gQpENBS\nEdNVwkejmJ56CsPhw7Gah5KcHHxf/CKUls76s4zF8Y7jjERHUFFxh9yx100GE+6Qm5K0kpSNNR30\ne2Wh0xCLJY5kNBrHtQSrqpqgQNnR0YHf74+5dY5VoJxpB4bRaJz2PXpk4cMOvZjzoYce4o477mD1\n6tXIsszKlSv5yle+AkB9fT1Op3NaEbwlspAiTEUWBgcHcblcyLLM5s2bYw/FXHG5pCFCoRA1NTUM\nDAwk1cUxHXT98pRGFvr6EJ98EnG07UsA7AUFWNaPl/BVFIWmpiaampooLi5m69ats+4Hn3MaQpK0\nFMLY62kwQDSKIEnEjh4Og8mE7HAgW60xjQZgfMtmPHTCOUUE6FD9IVqGW/CGvXx2/WepyNaspUVR\nxGg0snLlyrjDhWM7xb6+vthOUZ/oMzIytEr5aVIKxldewfjss6hZWSgVFRAM4nC5sDzxBOiaFSnA\ntcuvJcs6MbGVBqRFSQks9JiLQRYm64bQO3UcDse4Ako9hTG2gDKeREz1rEqSlLSJ1IddkAkuGQ5+\n4xvf4Prrr2f16tXjPv/GjRupqqpizZo1Ux9r3s7yI4aJyEIwGKS2tpb+/n5WrVpFaWlpSh/KxSAL\n8ePFdwUsW7aMPXv2pKxvOpXGVQDiiy8i1NSgrl0LZjOqJGGoqmKZ2w133hlrUXS73VRVVWE0GlPi\ndDmWLKiqOjF58PkQGxoQurvBbkcpL0ddsQJl61bUzEyt6K+gQD8IwsAA8s6dqHHhQ+XKKzFUV4PF\ncolAeL2oZrPWXTH23Hp6tLTAxYtageGWLcg33phwTNCiCs/VPkeGJQNvxMsvXb/kW9d+a9LPPDZ9\noe8U9e6LlpYWRkZGMJlMCdGHBKlhScLwP/+DarWi6uTa4SBYXExaczNCZSXKNeP9RYTubgyHDyPW\n1KDm5CDv24dy9dVT1msUpRdRlF7EcHgYu9GOyXBpsakJ1fxO1A9MN+ZiRRaSHTe+gDK+KDe+A6O7\nu5tQKITVah3XgRGvQJtM2vd3hSy88cYbZGZmkpaWRm9vLy0tLZhMJsxmM2azmeHhYWw22zitm4mw\nRBamQbITRfxCGq9OqOft50N8ZDG7IdxuNy6XCyCproDZjJUystDfj1BTA8uXX9ptG40oJSXYKyuh\nvZ1wYSG1tbX09vbGCjJTMYEmFVnweDC++ipCWxvYbAiRCOL588h796JceSXS3Xdj+ulPEZqatPMP\nhVDz84ned1/CIijv34/h9GnsJ08iZmQgmEwIkoR0ww0o8UWEAG43pp/+FLGpCXV0UTe++ipic7PW\nrhg3UR6qP0TPSA/lGeUMh4d5o/WNhOhCMtdA3ynq6QtZlhO6L/RKebvdjtPpJNNopGRgAMMY1z/V\nZEKQZQSPZ/w4jY1Y/uEfEFpatKhDNIrxyBGiX/wi0h/8wZTnGJJC/MfZ/6AiuyLBXnshvCji8VFx\nfxwrQzwbGI1GMjMzExa6aDQau6d0T5VIJBJLi8WPP9V19vv9MbL7Ycbf/d3fAdrn+e53v0t6enqM\nKFgsFlwuF5s2bVoiC6lCMhO+0WgkGo3GWiFNJtOc8vbJYCFtsUEjJ5FIhMrKSvr6+lK6qI5FSslC\nNKqF88fk5ASzGUGS6G5tpaqhgZycnJQTu2TuHcOFC5oY0Zo1YDCgAkJfH+LJkyhlZUS/8AWt9fDV\nVxF7e1E2bCD6yU9qfx8HNSeHyNe+Rt+TT5LT2oqSl4e8Y4dmCz1mN2U4fRqxqQllwwat2BCZ1hyB\n8tpaDOfOIe/bB1yKKqSZ0jCIBrKsWTQMNUwbXZgOBoNh3EQfn77oHRrCbDDgaGoiqiiYzWZMZjPC\nyAiq2Qyj4el4mJ5+GqGlBbWiIhYpErq6MD39NPLeveP8N+JxtvcsLreL/kA/1xZfGzONWmiysFjq\njYtBUGD6roSZwmQyxQoogZinik5M+/v7CQaDvP3227ECSj2FoTv5ghZZWDXGx+XDiC9/+ct4vV5a\nW1vZO2oPHwwG8fv9SJLEgQMHeOCBB5JKsy6RhRQhFAoBUFVVNamaX6qxkJEF3eZ0aGgoJkQ0n1Kt\nKSUL+fmoBQWI7e0JC6zc0UE4I4P2YJArtm1LWS1JPCYkC9EoQlMTgterRRJqazWZ47iJU83LQ6yv\n18hBZibyddchX3fdtOOpOTm4b7oJKSMDS0lcYZ7fj+H99xEbGlBtNi2iYLXGxnTRz+umRj5uN7Gq\nvT32tkP1h+jwdVCUVoQvokng2oy2WHQhndQVgY1NX4j33Yfh//5f5MFBgmlphP1+jAMDdG/aRK8k\n4WxujnVfmEIhDOfOQW5u4nUsKNCu4/nzyDffPOG4ISnEm61vYjPaGAgO8E7HO7HowmIIJC10u95i\nkAX92Z7viEa8p0peXh5msznWLqgT087OTmpraxEEgZdeeolQKMTw8DCSJM2JLL799ts8/PDDnD59\nmu7ubg4ePMjtt98+5XveeustHnzwQaqqqigqKuLrX/86f/Znfzar8QH+8A//ENB0Fj796U/P+jiw\nRBbmjGg0SkNDA+2jE+yOHTsSrGHnEwtFFgYHB6muriYcDpObm8uWLdM7580VKSULRiPqLbegPvUU\nQnU1cno6vo4OvOEwfXv2sGP//nmzwx5HFjwezAcPYmhqAv3z9fWhrl8P+fng92umUqPtmeosJvFx\nk9vQEOYf/hDD+fOa9LQsIwwMaMWQq1cTFRQ+oIMGBjllEilNu9Slc6rnFFmWLILRYOw1o2DEIBqo\n7KtkT8aeeVvclOuvR/B4MP/Xf2FtaQGbjc6rryZ4771k5eYm5KnTBIFtfj9GoxExGsWkV7yrqla/\nMdl1HBnhbM1rNPa5WLVsPZ6Qh3c63olFF5YiC/ODhWzXjIfeHWC327Hb7RSM1gHpm6GmpiaOHj3K\nxYsXOXr0KD/+8Y/Zvn0711xzDZ///OcpnUEXzsjICFu2bOGee+7hjjvumPbvm5ubue2227jvvvt4\n6qmneOedd3jggQfIy8tL6v0TQU8xffrTn+bFF1/k1KlTpKen88ADD2A2m2O1GcmQtiWykAQm2h2q\nqkpHRwd1dXU4nU52797Nu+++u6A3/3yThXA4HMvjr169GkmSYhGU+Uaq/SHUK69Esdvxv/Yag5WV\nyGVl5H784wz6fPMuKR1/7xiOHIGaGpQ1a7S8ejiMob0d4f33Ubu7Ebu7Y2kTZfXqS8V9M0T8mMYj\nRxArK5ErKi65WNbVYbh4EaGmhpq1mTQxyPohIzXOEHVlGejxl4euf4jh8HD8gTG8/TaG//kflv/i\nKQLFbzGyaxdceeWsznMqCJ2dGN97DwFiRZfWri4y2trI3nZJ+yASieD1eglt3UrakSN4DAbU0S6N\nNLcbMT2dQEVFYveFLGM8dIjo4Vc4ZjuN3RbFVhTFtGkzVb76WHRhMXwaPgo1C5eb1LPelnnPPfdw\nzz33sHv3bv7lX/6F0tJSTp48yQcffIDH45kRWbj11lu5ddRaPRn85Cc/oaSkhEceeQTQlBZPnTrF\n97///VmTBT11/Pjjj/Pwww8jSRJer5cvf/nLDA0N8ad/+qdcffXV0zpOwhJZmBU8Hg8ul4toNMqm\nTZvIz89HEIRFqSGYj/Hi7bFzc3NjKYfm5uYFdblM5VjBYBDXyAieDRtY+6lPsXL5co2MHD48r06G\nCWTB7UZsaEAuKrrU9mexIG/ZgumFF6CzEzU7W6svUBREtxuxpgZlx44ZjxkPw/vvozqdCTUb6po1\nqN3dSF4PJ7vrsZhCZFoL6F1byklDN+WKjEE0kGZOI818KVJm+tnPMP3Hf2g1IDYb9qZmVr//PobC\nQuT9STpXDg1hOHECsasLNTMTeccO1NEK93gYf/MbxLo6lPXrtWuiqgjnzpHxwguwf3+sCFN3ShT+\n/M+xDAxgb2xEBuRolIjVSvP+/bQ0NGBsaYlVyBe8+y6Zv/417xdEqMuQKA1YiLouooSDZG4ujUUX\nFqPA8aOQhphJJ0Sqx52uG0JVVfx+P/n5+ezevZvdu5OX+p4L3nvvvXH+DAcOHODxxx8nGo3OuH1b\nv3fr6+t59NFHefjhh9m6dSv79+/HaDSSm5vLzTffzPPPP79EFlKNUChEXV0dvb29lJeXU1pamsBS\nF1pR0Wg0ptxwyePxUF1djaIo4+yxU72AT4VURRbGtnfGmz4thFJkAlkIhxGiUdSMDOK/LWHUL0G5\n4gpIT0c1GlFzchA8Hgzvv49y1VVaGH0Gk2syBEjNzeXC7++k3lRDubWIaOFyCs0iDZ4GmoaaWJOd\nWEAp9PdjeuopMJlQi4sBiGZkILa2YvrP/9SKIqeZiIX2dswPP4zY0KDpR6gqxhdeIPLnf57YCjk8\njHj+vNYuqh9TEAgVFGDr7UWoqRnXOqmWlBD63vcwvvEGYmMjQmYmxj17KNu4kRJZjrXZ+fr6iDz/\nPP2BAG85giBBm03CYAJxoA5lOA1LRi6uARdO1fk7H1n4qEQzQEtDJKMouxitkz09PTFnTx3Lli1D\nkiQGBgZimhPJQl8XWlpaEASBO+64g0OHDiUIWRmNRgYHB5M63hJZSAK6SE9jYyP5+fmTFvcthgsk\nJN87PBXiUw6TaUKkWvtgKqRirHjTp23btsUqpHXoD8x8k4XY8XNyNBLQ1oahowNDTQ1IklZoKAgo\nmzZB3O5BlWXE9nYML76I4PejOp2o69drmgkzmNzl7dsx/eIXyNFo7PjCwADRNDvvFylExFy8ablA\nGCQISAFOdp+kPLMcg3hpQherqmBoSFOTvPQBkTIysLa2IrS3x7wqJoSqYnrmGS1asHZtLFogNjZi\n+tnPCG/aBLqU9iiRGPc59dcnI0M5ORO2SRoMBjIyMsjIyEAwGLCYzcirVvF5VaV/aIRINEo0HMbR\n1UX3mm1QvpWVhpX0S/3JXOKUYbFqFj7qaYixWCwFx7HENBVeIZFIJLY+6G3M+j2my/IngyWykAR0\nQ6Tp9AQWIw0ByfmzTwZFUWhvb6e+vp6cnBz27NmDbRJr5IXsvphLZGEmpk+zcZ6cCRIiCxYLyrZt\nmH72My0Er0c4QiFtkezsTJAxFjo6oLcXsaUFsrMRurqgrQ38fpRtk/sVjJ1YpP37EauqEC9e1FIR\no22kg7fdQDRLJj9qRFIu3bfL7MsISkECUoB0c9yEabFonQaSlNBxIMiydtzpumMGBxG4iBmTAAAg\nAElEQVQrK8dFC5SSEsSWFkSXS4uiAGRkoKxbh+HddzU569HvzzwwgJKTgzCN2txUUJ1OSEvDEAiw\nPLOI5RatvVn1elGdJvLX7cbtyKa/ux+v18vIyAgDAwOkp6fH1Cdnq+g5HRYjDbEYKYHFICiQ3FwZ\nDoeJRCJzFmSbKQoKCujp6Ul4ra+vD6PROG6jkwz07/TKK6+krKyMb3/725hMJkRRZGRkhBdeeIHX\nX3896W6LJbKQBCoqKmISxFNhocmCXk082wVcTznIsjwu5TDZeJczWYg3fUpPT0/K9CllstJ+P+I7\n7yCcOaNV4G/bhnLttQhjyIjQ04Pg96OM1rmoZjOq3Y7Y2IjxzTeRPvlJsNsR3G7EtjaUsjJNN0B/\n/8AAYmWlViA5xc4ngQDl5BD5q7/S6gRqa8FuR962jYytW7lHlVHU8Z9fFMQEJUMAeetW1BUrEFpb\nteiCKIIkYRweRj5wAHWaMKkgy6Ao4zs8DAatMyT+2REEpE99CrGtDbG6GtVm09I4ioLvtttwzkUE\nLC0N6YYbMD3zjJZSycrSWks7OpB37yZnxw5yRp/1U6dOkZOTg9FojBkdBYPBmM1yvEpgKhbcxUpD\nzBf5mQyXc2TB6/UCLHgaYteuXbz44osJr7322mtcffXVs/5+VFWltLSUL37xi3zve9+jv7+fSCTC\nzTffTFVVFV/60pf40pe+lNSxlshCEjCbzUmRgIUmC/qYM13AI5EItbW19PT0zMhueSHTEDMlC7M1\nfUpJZCEYRPyP/0A8eVKLEAgCwvnz2r977kk4vnjxoia8tGoV6mitAoAyPKzpL4yMIAwOolitKOXl\nKGPaVNXsbITGRgSPR3OVnAATfu6MDOQDB5APHEh42dzbj+H4ccTaWlSnE3n7dpTt2ydOc9hshP/m\nb7B85zuaSqIgYJIk/CUlWP7yL6e9TGpuLsqqVRjOnkXJzIypTwpdXdrvKhIVIdXVq4n87d9iOH4c\nobERcnJocTrJvu465jqNS7ffjjAyguHYMcTGRlSbDWnfPqJf/OI4aWiHw5GgwRGvEjg4OEhLSwuS\nJJGWlhaLPMzWJfGjVLNwuRY4+kdbcCeLsCYLv98fs3UHrTXy3LlzZGdnU1JSwje+8Q06Ozt58skn\nAfizP/szfvSjH/Hggw9y33338d577/H444/zzDPPzGr8+Fq222+/nZtuuoknn3yS+vp6bDYbjz76\nKNu3b0/6eEtkIYVYDLIwk9SAqqq0t7dTV1c3bcphrmPNFcmSBb2epLm5meXLl8/Y9CkVhZTCqVOI\nZ85ogk96KD4cRjh7FtPoYq8/uGp8cVXcZCkoCkp5OdE//3MYGUG12zG+/DKCLJNAZSIRre5gzGcU\nGhsxVFaiOp0IubmJ40x23h0dmH74Q8SWFlSHAzESwXDyJNLHP67l/SdY6JQdOwg98QSGI0cQ3G7c\naWm0rFnDFVPVKsR9Xumzn0Vsb0d0uVAdDoRgEGw2op/5TMw9Mx5qYSHSZz4T+3nk1ClyUrHIWK1E\n770X6WMfQ+jtRc3IQF25ctxnnigtMJFKYDAYjBGIeJfEsd4X0+l5LNUszC+SMZLS7ann+j2cOnWK\nG264Ifbzgw8+CMAXvvAFnnjiCbq7u2lra4v9vqysjN/+9rf81V/9Ff/2b/9GUVERP/jBD2bVNqnP\nN52dnbz11lt4vV42bNjAAw88MOvPs0QWkkCqbKrnA8l2YAwNDVFdXY0kSWzZsmVWuueXWxoi3vTp\nmmuumVWOcc6ukIBQX6/9T3zO3mIBoxFDfT2sXh17eJX9+xGffRahowO1qEgjDB4PyDLy/v2oOTkw\nuggpa9ZgeO89cDi0Y0sSne1V9BdmsEnf6UajWL71LYwHDyIEAqgGAxszMxk+cABTdjbk5CDv3Imy\nceO4hdD42muarfWGDSCKMZlp4+uvayZVK1ZM+HlVkwll2zbUjAz8qorc15f0tVI2byb87W9rHQv1\n9cjLlmkeGFdfndT7VVVlZERgAmsITCaYqR6aWlBwyaBrkvGme/4FQZhQ5Cfe5Kivr49AIIDVak2I\nPqSlpSUsXh+l1snLOQ2RCmG966+/fsq55Yknnhj32nXXXceZM2fmNG58F8RXvvIV3njjDSwWC4FA\ngP/zf/4PDz744LTp2YmwRBZSCIPBQFi3+13AMadawCORCHV1dXR3d1NWVkZZWdmsH9KFTkNM9rni\nOzfm6k+RkhZNi2Xi6nxZjhEIfdJQt28ncvfdWJ5+GqGuThMcMpuRr7+e6Kg0qw5l61YEr1drM5Qk\nFFRey+inIydKYWSIHFsOpscew/iLX6BaLKj5+QihENb2diz/7/+h7NkDgOHNN4l+7nOJKYhoVGtN\nzM1NiHCoeXkILhdiYyPyWLIQDmP81a8wHj2qdWfYbGRVVOBOQoY6HuqqVURnqbsfCIi89FIaMD56\nlJ4Of/AH0RkThqkw27bk+KiCjqnSF/rfhkKhpQLHeYKqqkmlIfROiIX+HlIF/Z79yU9+QltbG9/9\n7nfZunUrv/zlL/nhD3/Iddddx969e2d8by+RhRRioVsnpxozXmEyKysrqWK/6aATk4UQqhFFkWg0\nmvBa/GfKzs5OiT9FrMAxGkWorNSsoHNzUbduHWc8NRnUTZvg8GEYGNC8CQAGB7Xiuc2bweNJ2GFE\n778f9dprMbz9NkSjyFdcgXLDDeM1Cux25JtvRtm0CcHnwxXpxOXuIaj4Od19mlvKbsb09NPaYq/X\nLwSDqKKIMLpDVdatQ2hvx/jcc8jbt2seFKC9x2CAYDBxTP08J5jIjc8/j+m551Czs1FKShB8PhzH\njlE4NAR79kxpAz0hFAXx/HkEt1sr5Cwvn/YtkiQwMmIgOxtstkvXNBgU8Pk08ctUIpVpgYnSF6FQ\nKMF5Uy+u06vxk01fzAWLFVmYa7v3bMaE6f0ofpfsqT/3uc9x//33A1oB5aFDh+jq6gJmToSXyEIS\nuNzTEGPJwvDwMNXV1UQiETZv3pwyg6R4EaP53hWMjSz4fD6qqqoIhUIp/0xCXx+Ghx9GuHABQZI0\nUaT165H/+q81W+tpoG7ejHLrrQivvYbQ3Q2CgGqzoRw4oJGON96I7Wrq6+sZHBzE6XSS8dnP4nQ6\nsVqtk99jBgNqcTGyqnDi4gcgGiiwF3Cq5xRXZW3EMTgYa8FEURDCYRSjEUGSIBDQzq+oCLGuDkNd\nHfLOnbHjyjt3Ynz2Wc2iejQ6IrS3a8WG69cnnoffj/HoUS23P9qXrebkEA2HSa+p0TokJpDCFbq7\ntQLF/n7U/PyY+6PQ3o7lm99ErKrSvDAcDqSbbiLyt397SWthoms9SmZsNhWHI+E3hMOpJ7DzSYwF\nQcBms2Gz2WK97vX19YRCIbKyssalL8Z2X6TqGfyo1Cx81MhCT08PV1xxRcJrDocjRtJmShCXyEIK\nsdhkIRKJUF9fT2dnJ2VlZZSXl6f0gdSPtVBkQVEUJEmisbGR1tZWVq5cyapVq1K6IxEAx3//N8Kp\nU1Berhk4BYMIlZUYfvxj5H/8x+l3zKKIcuedCFu3ag6SgFpRgVpRgTC6uLndbmprazGbzRQWFuL3\n+2lra8Pv92MymTTyELeTHHt96wfrqR2sZXn6cqxGKy63i9OeixSXlyNWVaHGx95H0yqqXjA4aqak\njtVfuPlmrTDy/PmE90h33hnzYohdp+Fh8Ps1Oeo4KGlpiB0dCG73OLIgXriA+fvf1/QhRBEUBePL\nLxN58EHM3/ue1hWRn6+1RXq9mJ5/HrKziYwWgk2OhTV2WmgjKavVSvGoQiZo6QvdYnloaIjW1lYk\nScLhcCTcM/EWyzPBR6VmQZIkRFGc9rMuliBTqjEyMsLhw4djRZ0lJSX09fUxODhIf38/JpMJi8WS\ndJH7EllIIRardTIajdLR0UFtbS2ZmZns2bNnzimHiaA/ZLIsz3tftsFgIBgMcvz4caxWK7t27ZqX\nB9jqdmO+cAGKii7taG02KC5GuHgRGhoupSOKiycMz8ujPgrq2rWoa9cm/C46arx14cIFKioqKC4u\nJhqNJlxLfSEYHh6mvb2daDSasBCkO9N5r/M9UMFu0s4xz57HqZ7TXHPvH7L863+PMDCAmpaGKgiI\nkQhSTg6UlFyKFixbhrJuXeKJZ2YS/cu/RDl7VhOAstmQr7hC6woYAzUzU+u0GB5OICaiz4dkt48j\nF0gSpscfR+jp0cYdJQtiXZ0m91xVhVJQoF3r0XNRo1GMhw4Rue++STUk5lNAayIsdMGhqqrjFlGT\nyUR2dnZMEG6i9IVusTy2+yIZaePFqFm4nM2rPuxkQb9fKyoqePXVV3nrrbdQFCWWsv73f/93fv7z\nn2M2mwkGgxw6dIisCTqRxmKJLCSByzkNIUkS/f39CIKQYGo1H5irCFSyCAaDdHR04PP52LhxI8uX\nL5+3z2SKRLR2xLHs2mqFpiYMjz4KutNmaSnKHXdodtL6uUaDfOvNb3HbmtvYX3rJSEkXiHK5XABs\n376dzMzMS8WUgQCGs2cxNjZisVjI3rwZZdMmVLQCTp08dHV14ap0cXTgKCaLiYAvgNlixmK2MBgZ\n5IOtV3PbP/0T5h/9CKG3V9NCyM4mmpmJ/fx5LSWSn4/0h38IE3WL2GzIyRjlOBzIN96oeUMIgqb3\n4PNh6ulh8MorscRLQANiUxNiczPKihWXCihFEWX5cgx1dQgjI1o3SBxUmw0hEJhSQ0Lb6U9/uqnC\n5WgkNVH6QrdY1glEU1MTIyMjWCyWhOjDROmLxdJ2uJzJwoc5DaHfP//6r//K0NAQwWCQQCDAyMhI\nLEoVCAQIhUIMDw8nvbFcIgtJIpkWu4U0kopGo9TX19Pb20t6ejo7duxYkIdvPjsidLfL+vr62OQW\nH46dD0Ty85GzsqC/X9uJ62hrQ3C7ob9fK7xTVYSaGsTHHkP++tdhVK3wjdY3ONl9El/Ex+7i3ViN\nVgKBANXV1TGyc+7cuYQdnuzxYP7ZzzBUVmoP9qj7pfTxjyN98pNYrVasVmusLsMx4MDf5CcQDBAM\nBgmNhIgORcmx5NDV0UXr3pvJuOUW0gYHEZxOeg8eJOfFFxF8PlS7HXntWuQxucvZQPrkJzXFxtdf\n1+SqbTb8N95Iz9695I1d4EbVGseJO4mipgFhtYLfnxBBEHw+rbh0mrZeQRAIBgUgscBxPrAYZGE2\nC7dusZyens7y0Tob3Y5YT1+0tbXFolbx0YfLeZefSiQri+/z+VJWE7WY2KnXJ6UIS2QhhdDDPPM5\nwaiqSmdnJ3V1dTidTkpKSohGowv24M2XMNNY06doNEpzc3PKxxkHhwPfzTdjP3gQoaEBNTMTvF7o\n7YXsbK2bYfS7VNetQ7h4EfHkSZRPfIJgNMjBmoOIoki9p56jzUdZb1xPQ0MDhYWFbNmyBZPJxNCQ\nleZmsFoULOdPkv6Ln6LUXcB75W7EzHTS0jR9A8MrryBt3gxj2grX5a5jXW5iCkGPPugSxPVeL4Ig\nsOL4cQpefpmI1Up4wwaMkQiGc+fgZz8j+pd/OWEaJWmYTEh33YX0e7+H0N8PmZl4IhHk/vFmS0pZ\nGUpREWJnJ0p5uXYNVRWxu1szkdqwAeMbb6BGIlpEwetFiEaJ3nXX+ChPHAwGBYdDIRxmXEFjevo4\nrao5Y6FFklK5yzcajePSF/H3TU9PD3V1dSiKQk1NDVlZWTNKX8wFl3Pq48OehpgvLJGFFEJnrfPV\nFuT1eqmuriYUCrFx40by8/NpbW0lOLb9bR6RamGmyUyf+vr65h7BGB5GfPVVhKoqSE9H2b8fddu2\nhIJFQRDw3XQTuStXIr70kqbmt3IlrFyp7XzjSZ8gaPULvb2AFlVo8DRQnlVO82Azjx1/jC+XfznB\ncKynB374gy2US+18s+lLrPefQAFEwOyq5u2CP2DLHSXYc3MRXC5Ul4voihWxlI8gCBNOqhaLhby8\nvJi4lqIojPh8mF96iSjgz87GMzioydamp+P44ANCZ89i3bZt7pN0ZqZGqgA6OycmxlYr0t13awqR\nNTWxFIOanY30uc8hr1+P+uijGA8fRvB6UTMzid51F9HPfW7Koa1WidtvD2K3j28lnI0o03RYjALH\n+VpEBUEYF7WSZZm33nqL3NxcgsFgQvpibPdFKue0yzmy4Pf7P9RpiPnCEllIEsmkIfQbcS4ukBMh\nGo3S0NBAe3s7paWllJeXx46/GLbYqUhDjDV92r17N464XrgJxZIkSfMI8HjA6URdvXpyLYTubowP\nPqgRBW1AxN/8Bvl//S+UP/mThHFUQL3lFuSbbtJ0B2w2xIMHEX79a013QF8sVFWrb8jPj0UVTKJW\nR2AJWugVewkVhRJ2coF+P5/pfJy7PD+jJNKkjTk6tpEo1/X8mqHAX2BMtyKIIuIoOVBVNeHzjyUO\nYxcUURRJNxiwBIMM5eXhSEsjKzOTcDhMKBwm2tVF0/vvM+D3J7gnZmRkzNsuUt67FzUnB8PRo4jt\n7cglJcg33hgrtIx85ztE/+IvYHBQq19I7IWcFGlpE5dfpBqqql6WNQvzgaKiopiWgyRJsaJbr9dL\ne3s7kUgkQTzK6XTicDhmfa6Xc+rjw16zMF9YIgsphCAIKa1bUFU1VumsL6hjZUgX0q8hVeMlY/o0\nLoLh8SD+6lcILpeWDx81Y1I++1mYIL9o+K//QrhwAbWs7FJsuqcHw+OPo1x3HYx6GSSQElGMLVjK\n9u0Ib72FUFurOSzqXQUFBShXX80brW/g6neRIWcQMUVYXrgc2S9zqO4Q+0v3YzVakWWZ9Bef4Ybg\nUYoireMa/gTAgIRYdQ5FXIUxLQ3D+vWIFguKosQIg/5f/V/8NUogETYbamYmhv5+JKcTURS1QjhA\nzM1l8759+MvLGR4exuv10tzcPK4ILiMjY5wE8VygbNigyUlPgnh562SwkN0Q+lgfhpqFuYwHidoD\nRqORrKyshAr5cDgcu296enqoH5U4T09Pj5GHZImnfj9fzmRhKQ0xHktkIcVIVUeEz+ejurqaYDDI\nhg0bWLZs2YST1kKThbmkIXTTp6amJoqLi6c0fRrrBim+8grCuXOaWZNuV+z6/+y9eXRkd33m/bm3\n9iqV9larWy2pd6kX9Wr3apsJix2TmXhIAj4JwYwDwxCTmWEYTiAZHAIOYcs7OATMMnNmeJMMYAhr\n3pADTsjEbbxgG9vdrbW173vt66177/vH1e/qllSSqqRSSXb0nKNjS12le1VV9/6e3/f7fZ6nE/mH\nP0R717uy2wWqivzTn6KXl2c3sevqoL8f+dln0RbIwooVo6YmtHe/G/k734GREcCwKdbe+lbSu3bx\nV9/+K4KRIJpXwyW7mA/No+oqI+ERnh19ljv23YEeCFD2wlNE7VU4yP2aaUjYhvuYdWaYv3yZeDxO\n5fAwFRUV+P3+rNfHShjm5yGV0tHNeGkVSZKoPHsX7vZ27DMzUF5uJGIOD6O1taG3tuJzOPD5fOxd\nUCIsHYITGv6li8CqxlElRCl3+ltBFraikgFrG/S4XC7q6urM9oWR0REzVTuDg4NEo1GcTucy9cXS\nKmsuglIK5FPx1XWdSCSyrpyZ1zp2yEKeyPcC3mhlIZPJcOvWLUZGRmhubub8+fOrfsBLqcAQx1tP\nG2Jubo6Ojg5kWebChQtUip73KscxScncHFJHB/q+fYvDby4XenOzEeI0Pp7ttKjrRvVh6Xsmvl+y\nO1/p79FPnUI9dgwWkuH0pibGp6fpunaNe+rv4W1n34bTYZRudXSzbN1abZTZ7bEYeipB2FZH1FaO\nTw0vqy7Y0FHveCOVD70D/cAB5GiUubk5+vv7jcqE309lZSUVFRXmoj0/D3/+5w6CwYW8CV1fcGnW\nKfO8kd85105zzy+grw9cLjLnz6P89m8j5SBmS4fg+vp05uYUwuEoExNRotF54vFRysslWloWzaOK\n3cMuBK9lslDqyoKqqmZ1qhBIkkRZWRllZWVZxNPavhgdHSWVSi1TX4h2x1YMOOZT+dhpQ+TGDlko\nMtZbWRA9/O7ubnw+X86Ww0rH285tiPWGPpmZDWD4HKRSsJRguN3GDIHwQRCw29HuuAP5O98xzILE\nDmZuDsrK0C0Jh2vOojgccOgQ8Xic9pdfJhqNcuLECd5Q/wbzIcLK2bq4SJKEXlOD6q+kQp2no+IS\nF+Z/kvWrM8iMuQ8T+8ij7D9ipwaosezc4vE4oVCIUChEf38/0WgUl8uFqu5ibOwgfr+DqirHwt8A\ns7NJ+odCjP/KPTT/zttIzs0Z0sl9+4wWSzptnluu4cn+fnjnO71EoxJgfa11PB6VP/uzISRpltHR\nUbOHLchqLBZbt4NgIdiKNsSrVQ1R6uOt1L6wqnZ6e3vN17W/v9+sQrhcrk3/7OQzeC78KnbIwnLs\nkIU8UYgxU6GLt2g5xONxWltbc/bwV8J2bUNsNPRJVDB0XUeqrUWvrTXyBaxDcNPTRjDSgjGNFeo7\n34n00ktI/f3GEGQmAw4H2m/9FvrRo1l/z2qVEk3TGBoaore3l71792a1TkQlQbQGxAyBCZ+P9Bvv\noeypvySqeXnZf5Vj0Rdw6Sk04OmqX+HLp7/In/iXX4aSJOHz+fD5fDide6mslMyd29BQnFBIIZ0O\noihJnE4XmqYSj4Pfv4uTJ2so2yMZrRRNww4mmbHOQFiPJcsy4bCNaFTC5dKz0raTSUgk7Pj9DbS1\n7Vn4meEgODY2RiqV4vnnnzeTFq1l6M1w+nwtVxa2Qqq5me2ApaodXdeZmZmhvb0dVVUZHBwkFouZ\nlufWr2JXroTt8WqIRqPour5DFnJghywUGYVUFjKZDL29vQwPD9PU1LRmyyEXSpkEKY63VhuiGKFP\n4oap6zqSy4X+S7+E9PjjSLduoVdUIIXDoGlo99yTWy938CCZL30J+fvfR37pJfSqKrQ3vQn9jW9c\nJp1cifyEQiHzpnbb2bNU1dQsei5YSII431yvv/+BX6VRlnH9w4+xhXUS7l8j0HKS0K/cT+3uvfyJ\nW6e+fuXXYXYWPv5xB6GQhBHL7CGZhN5eCb+/mosXAyQSc9jtdmw2O/PzIZ59tpeDB71m62Lpor10\naFJURlTVID8ul4bPJ1leJomlyetCgpdOp5Flmba2NqLRqDkENzExQTKZxOv1Zg1PbmSCXrzupcJW\ntSFKebxS+x0I+abD4aB1QRVjtTy3EtCl7Qufz7ehc81nwDESiQDskIUc2CELRUY+ZEHXdSYnJ+nq\n6sLr9W4o90B8+EsV+bpaJWPN0KdMxohudjqXtxSWwJpwKcsy+oULaC4X0jPPGF4IBw+iX7yIfv78\nyr+koQHtfe9jNWqzdJBS/B2CxB1LpWjq6MD2139tRDP/0i+Red3r0BdI00okwYTNRvk774O33W3Y\nGJeX4ywrw7gVrb3wKYpEKCTh8ehmdEU8bnQVgsEUwWCE5uZ6fD4v0ajRmTl+3InLFTAHFhVFMeWS\nFRUVVFZW4na7s4LBjFO1WimLOQhRQTEqSpqWe+crqgrWm2w6nWZ8PEwgEGV6eo5odAgwJuirqsrY\ns8dfcPxyKQcAxevyWp5Z2A4hUjabjcrKyqw5Jmv7Ynp62mxfWAdv10xszXHcte6RkUgEr9e7ZfM4\n2xk7r0ieKFY+RDQapaOjg1gsRktLC3v27NnQzWizjaCWQpblnH/f9PQ0HR0dK4Y+STduID35pJFf\n4HCgHzuG9oY3wAoBJlayIKCfPo1++jQoCtjta6dB5vn3WI8xMzNDR0cHLpeLO91u/P/n/0A4jF5T\ngzQwgNzdjTQ+jvb2t69NFKzweIx0xXXC6xUFFJ1oNEoy6QAcOJ0NRKMS0ahheZxOQ0VFBfX1xjS3\nCB0KBoOEQiGGh4dpb2/H4XCY5EF82e02syUhy5hDkwKappLJLC6ga817pNNOnnyynnBYWni+Tjqd\nJplMYrdHuXhxAF2P4PF4stoXZWVlqy5gpWxDlFoB8mp2jMwX+ezwc7Uv4vG4SSCGhoYKbl/k04YI\nh8P4/f5tofzZbtghC0XGSuoE6667sbGRc+fOFWVxFzftUs0t2Gw20um0+X0ymaSzs5P5+XkzVXHp\nhSb19CB/+9ugKOh1dcag3VNPIQeDaO98Z06P3lxkwcRG+uC6jvT888j/+I8wNkZNRQXq2bOkW1vp\n7OxkZmaGo0eP0tjQgP1jH4NYzCA2ALt2wfQ09n/6J3jjG9EX8iHWfR6Dg0iDg8a3+/cbEc9L/SYC\nc9RF4+hVjaTTGnNzs4RCEqnUXlIpmWef1bNeDr/fqDwIWEOH9iycryj7CgIhTHcmJ3eTSp0iEpHQ\nNBlJMshQOi0tmFe6sNsVc1ZDURTm5+cBo4ogiIb4r6JAOCzhdoPbLUiFk2TSRTJZwZkzdZSVKab8\nbnZ2lv7+fjRNW9E4qtRtiFIvGltRWdgKv4NC/0brDM/Sz7E1fVO0vqzkQZDPfCsLOx4LubFDFooM\nu91O0jKdr+s6U1NTdHV14fF4ih61LIygSkkWjHL0YujT7t27ueOOO1aUJUnPPw/xOLolIlkvK0Pq\n6UHq68v6ufmcBRJU7NAq+cc/Rv7qV42pvbIyfDdvsvvnP+fm+DjSnXdyxx13GIOYc3MwPIy2a5fh\n8Kjrhuyxrg6powNpaGj9ZEHTkP/+77E9+STEYsbPfD7Uu+5Cu/deo8cwOYnzIx+h8cf/wKeiKkH3\nLr5/9HeItr2TffuqqK2VSKd17rpLNUc2EglIp6U1jRBzlX2TySTXr8coK9OIRCSiUYPwyrKMzSZT\nXi7h9WbM2QchhXW73bS0tJizLNbPoaJIqKqM02lURiRJLBA6yaSxCDscDmpqaqhZMGayqkDC4bCp\n3xfGUbqum99v9iJX6l0+vPZnFsQxi/He5focp9NpkzzMzMxkkU9FUQgEAtjt9hXbF9EFh9OdysJy\n7JCFPLEeNUQ0GqWzs5NIJEJra+uGWw4roZReC7Isk0wmeeaZZ8zQp5rVHPh0HeheLqwAACAASURB\nVMbGFrMEBFwuwwshEFj1WEUlQZGIUeGQJPRjx8goCvOShGtkhJM3buD83d81qxa6y4XucBikYmGH\nKYEh4bTb0XMpO3QdaXgYaWgIbDa0I0dyuktKXV3YfvpT9Opq00mSuTls//RPxizG4cO43v525Js3\nUW1O0rpMdXyM37nxSb5bv4+n970Vm82YT6irM7yXwIiymJtb30vjdru5cMHNt75l/B5dl4lGo8Ri\nUSKRCKoaYmgowOysD13XSSQSpvW4dbGxGkeJHxskAkBDkkBVJTTNtmAolb1QWXeQS/X7oVCI6elp\nurq6UFWVsrKyrOpDsY2jtiIXYqcNsTE4nU5qa2upra0FlkuQJyYm6Ovrw263L8u+cDqdZhtiB8ux\nQxaKDLvdboYjDQ4O0tjYuKpTYbGOWYrKgqIoTE1NEQwGOXz48LKFIickCWprkXp60ONxpMlJUFX0\nigrj31bxklhL1lgopIEBmJ5Gb24mvHDzcDqd6Lt3452fJzM6arQDdB3N7Ua/eBHH979vrMY+HygK\nUn+/saAfO5b9y1UV2w9/iPzP/0xiOoqqSmQqqwm/4T7i568Chp/U3r06cne3MexpJVk1NTA9jdzT\nAwMDyO3tKG43aV0mY3OSsHnxpQNc/fmf80Tlb5DJbCxAciliMeOUamuNLwNlQBl2ez0+H6YPiM1m\nw+/3MzQ0xMjISNbgpFV54XQaRNZu17DZNHQ9W26ayaik05k1Q7OEfr+yspL+/n5uv/12ALP6MDIy\nQmdnJ3a7PYs8bNQ4aivIAry2fR2gtLkQgnw6nU66urq4bcFjJRqNmu2viYkJ/u7v/o7vfe97NDU1\nEY/Hef755zl9+nRBw7dL8dhjj/HZz36WiYkJTpw4waOPPsqdd96Z87Ff+9rXePDBB5f9PJFIFCQ5\n30zskIUiQpRIg8Eguq5z6dKlkkhwNrsNYVVvOBwO/H4/hw8fzv/5t92G9M//jPzUU0Y1QVWRMhn0\nc+fQDx5c8XnFCq0y4XCQ0XVmx8ZQF+xrlUyGVCRiDF06HFlySO0tb0GbmkJ++WVjqBLQm5vJvPvd\nRmXEAvnll5F/8hMizhr+zy8OkUrq7MmMoP/dD/ha7WEmHE34/Tp//ddpGhUFct2gJQnSaZI3biCr\nKpos47I5SSVlNB3SkouaYD/xuSSZTBk+n14UwhCLwd/+rY0F1dgy+HwqR492Eg5PcPToURoaGswW\nkdjxi5tuIpHA5/NRUVGBJFWTTteRTDqQ5cVbTSajY7Pp2Gw2ZDm378NaoVkulwuPx0P9gu7U2r8O\nhUKm/E6EHwkSUYhx1FZZL5f6mKWeWdgKgiIqr4KYCoLb2NgIwOHDhzl9+jTf+c53GBgY4O677yaR\nSHD27Fl+7/d+j7e//e0FHe/xxx/n/e9/P4899hhXr17lK1/5Cvfeey8dHR00NTXlfE55eTnd3d1Z\nP9suRAF2yELeWOsCjsVidHZ2EgwGcTgcXLx4sWQX/WaSBRH6FIlEOHbsGJIk0dfXV9Dv0GtrkZJJ\nY+vqchmlfrsdKRYzwp4uXcr5vGJWFjKZDLcUhXK3m7rZWdynT4PdTiYUwjkzg3bPPai7d6Mt9HAl\nSYLKSjIf/CDSzZtGRcTvRzt9Omc1RHr5ZdB1Uv5aEgkJWYYZTxNHEtdpVW8y4WgkEJBIJDDCrZ56\nymhpCNKRTKJnMvQDqUSCNknCZreDTaKi0pAxyhEFtbqWD/43mb94TKW2Vs83qHGN1wYiERYGEbP/\nbXY2yiuvTNLQkOLy5ct4LIoOWZbNm66ACBwS5GF2NsLIiAOPx7PgzWD8t6pKxut14HJl+z6sFpq1\n2nDjSnMYgjyIQLZCjKNKPT+Qb05DMfFqnllYzzFXej/r6up429vexiuvvEJTUxNf+tKXuHXrFs89\n9xz79u0r+Hj//b//d971rnfx7ne/G4BHH32UH//4x3zpS1/ik5/8ZM7nSJJkkt/tiB2yUAByScVU\nVaW/v5+BgQH27dvHgQMHeOWVV0p6k9mMmQVN0xgYGKC/v5+GhgazlTI7O1vwAi61txs79ze/2djG\n2mxQXm4MOD7//KaTBeEY5/F42P8Hf4DnK19BefE6eiqNBMzs2sfw5bfgGjV2uy6XpRRvtxPYf4b0\n3oXv4wtfZNtFSJEIOJ3EYhAOA5KELEFElQmk0ozYJHRdYnYWDp06iXTqlFGxWFjtk3NzDNfWEti7\nl2NXryJ9//tIs7Pofj+yzQapJBIa6oPvYPdeGbvdUD1MTS3+ncaA4/pfJ7d7MSU6k8kwPj7G1FSU\nmpq9nD69H49n7c+0NXDoyBE4c0YjGIwtDJ1NEAqFSCaTlJd7GBoqM8nG0qRLK2EQrYvZ2VnAuOYU\nRVm1+mD8PYZxlDAF0zStIOOonTbE5kBV1U1ty650zHxaUpFIhNraWiRJ4ujRoxy1uL3mi3Q6zYsv\nvsiHP/zhrJ/ffffdPP300ys+LxqN0tzcjKqqnDlzhkceeYSzZ88WfPzNwg5ZWCd0XWd6eprOzk5c\nLhcXL16koqKCaDRa0mAnKP7MgjX06fbbb8/ara2niiElk0aJ3eXKKt/rbjdSKLTi8zZKFlKpFF1d\nXYtyyMZGpFSKyP4TTPxkCFciTszm58VwK9/+hJegPYLdbqemRua//bcYBw+Wk0i4eOwxO8Hg8kWj\nslLnoYcyVFaC1tKC/fp1Ml4VXbcjy+CREuiyzJRjHzJGJyOVksDjQf3N30Q/ehTtlVeYnplhoq2N\n2nvv5eyRI4Zc8X/8D5y/+7uGL4WmgcuF+mu/RuY//ScSE9DXJ5PrpauoMEjDRiDklB6Ph6NHjxCL\nOZGk3O/5zIyhwFgKp1Nn1y4oL5cpL/cDfsAI+0qn02b1YWpqip6enoVzz/Z9EP1iRVHo7u5mZmaG\n1tZWXAsR3mtGdi/BSsZRgjyI7ALArDioqko6nd5Q7zpfiErGa70Noapqycvr+XgsgLFgH1ylNZoP\nZmdnUVWV3Uts6Hfv3s3k5GTO57S2tvK1r32NtrY2wuEwf/7nf87Vq1d55ZVXOHLkyIbOp1jYIQvr\nQDweN1sOLS0tZg8XjIXbmhVQChSrDZFOp+nq6lo19Gk9CgV9716jmpBILKZGahpSOIz2S7+04vPW\nSxZ0XWdsbIzu7m6qq6sX5ZCA9N3v4njyp4w6D5KorKKMKOei1ylXv8cPWv4roXCGcDhDb+8Io6Nz\nJJPl9PW1Ul7uoLLShcvlRJIk4nEIBiVzJ6/dfjvaL36B/5kO9uq7cGoqVXKQl523c8vdBkljzZ+Z\ngbExCV33MVt+nOFmB413uDl27FjWDVS7coXkM89g+6d/gmAQ7dw5c6jS64XjxzUcDh2rz1MiYcgV\nhdNjoVDVDENDY4RCIRoaGqiuriYeX3nhmpmBhx92rkhaHnkkzYKnThacTie7du3Cbt+F3w8NDYuG\nO+PjYXp7+7HZwni9XtxuN+Gw8f+XLl3KaoNYraqtg5MCq4VmLT0Xq/lPLBYzlReKovDUU0/hdruz\n7LPXMo5aD0rd9hDHLAURWnrMrWpDrIViJk4ufS9Xq1RdunSJS5YK69WrVzl37hx/8Rd/wec///mi\nnM9GsUMWCoCmafT29jIwMEBDQwN33nnnsgvN6qj4aiELS0Of7rjjjqyb8tJjFbqA6ydPop05g/zC\nC+hVVca8wswMemMj2tWrKz5vPWRBzFhEo1FOnjyZxe71SAT5n/8ZtaKasKsWjxM0ZwVhRzP7w9c5\nIg8xWHsYSZI4f/48dXUKfX2RBQIYJRCYQtd1PB43quojmfQuzD06oLaWzLvfzYz2M+LX2olg56eO\nX+YZ5+uIKi7icQlNg8cec/CNb6gLskQ3u3Zd4KMftTE7m30TcTp16uq8qL/yKzn/TrfbyNCyjk9E\no4ab9noQiUSZmBimqspFa2trXgtIOi0RChmGS1aCEo9DKCQtVBxyzxkEAvDoow4L0XAiki4rKuC9\n740wMdHB/Pw8Ho+HWCzG008/nVV5qKysxOl0LrOtzic0ayXyYI1edjqdZDIZzpw5Y2r3lxpHidaF\n1ThqvdgKX4d/KTMLmUwm7zbERqWTtbW12Gy2ZVWE6enpZdWGlSCqurdu3drQuRQTO2ShALz00kuk\nUimz5ZAL4iLIZDIl68tthCwUGvq0ruAqlwvtXe+CAweQnn0WFAXtjW9Ee/3rYe/eFZ9WSBVD0zQG\nBwfp6+ujoaGBs2fPmjcHsevUg0Fs0SiarxpYXMiSTj+V0VE8qVDWFSEkexUVDmpqKvD5DLviRCLB\n/HyaQCDI0093sHev3Vy8xu98M4984TdBMiyTyRgVBbFeud0JFGUet9vDwEANo6MSf/iH2rLBwooK\n+NSn0lk2DRMTxoDk3BwEg8bPUiljXnS9myFFUejs7GViwklj4x7q6ytRFEmIP5alf+fCohX1ItZ6\nXjrNikRjejrNCy9cp75e4sqVK3i9XnPHL1wne3t7icVieDyeLALh9/vzCs0SWK36ID7jKxlHieFJ\nq3GUlTwsncNYC1tVWdghKIsoRmXB6XRy/vx5nnjiCd7ylreYP3/iiSe477778voduq7z8ssv09bW\ntqFzKSZ2yEIBaGtrw263r3pBS5JUUPJkMWC320ktjQVcA2uGPq0Aqw1zQbsDvx/tvvvgX/9rY+XM\ng0jlW1kIhULcvHkTXde57bbbqLLkTVjL1FRWQk0NtrEAsPgYbzJA0llOxLs6UZIkCZfLhcvlwm4H\nm03iypVKnE5jAZucnGR8fJi9DedwuWx4vcZCoyh2uroM5uBwBGloqERVvdy4YXyOlkZCix27dWc+\nMSHx7/6dk0jEmH2Ynpaw2TDNmd7+9gyybLQipqchF8dyOrOtHcTMjcNRyalTLSSTDpOEWOH3G1Ec\nmwEr0dB1nbm5eWZmkuzdu5dz5xbbe9Ydv5hOVxTDKjoYDDI7O0tfXx+apmUt2JWVlVluj4VUH1RV\nzXmt57IethpHiQCvTCZTkHHUVizcr3WfhUKOKaTvK20EC8EHPvAB3vGOd3Dbbbdx+fJlvvrVrzI8\nPMx73/teAB544AEaGhpMZcTHPvYxLl26xJEjRwiHw3z+85/n5Zdf5otf/OKGz6VY2CELBcDtdue1\n0y01WSi0srBW6NNax4IN9B3FCpcH1iILmUyGW7duMTIywsGDB7NMoqw9bLFDlLxe1De9CenL/y+7\n4kMk9Go88QhlyTmuN/4yo+zLylWwYunPxfcOhyOr593QoPOtb9kIBDSSyQyxWIJUCjIZHx6PRnm5\nD4fDTjyuL2Qw6PT0yMu407592eX7RMKQN7pcxthHKGRYNWiaITAJBg2zzOefl5mfdy6rVABUVOj8\nwR8o+P1puru7mZ2dpbW1lfr6ek6flshkcn+G7HaKItFcDclkkqmpSZJJJ7t372bfvrVzwlba8Yvq\nQ39/P9Fo1Jw3qKyszLv6kMlkCC30SITyIh/jKEFURYBXIcZRO2Rh81DKNgTA/fffz9zcHB//+MeZ\nmJjg5MmT/OhHP6K5uRmA4eHhrNc9GAzynve8h8nJSSoqKjh79ixPPvkkFy5c2PC5FAs7ZGETsF3J\nQj6hT6siHsc2NoYzGCyJ/Gm1+QirHPLKlSuUWergWdUEFkvNANo995AI6Sif/Ue80TniNi8v7Hor\nT9f8Oul54+KtrNRxOo3nGvJInWBQWqYyMB6X/bM9eyS+/GWNVEoiFkvT29vLxITOt751kooKBYgz\nORkgFHKjqnULlSgVl0tEjRvEYCWO5HYb5+TxGP4ImmY8JxiUcDiM771efVmY59ycUZ145ZV5gsEe\n/H4/R45cxel0IkkbIwMrEal8YEgi5wgGg9TUVFNdXUUgIANKwedh3fE3NBjKC7Hoh0Ih5ubm6O/v\nR1VVM6hKEAhrZLcYYI7FYqa3yHpmH0SAl9U4Skg3cxlHieOXUrK5XXf5W3XMYg44PvTQQzz00EM5\n/+3//t//m/X95z73OT73uc8V5bibhR2yUADyvYBLGeyUz/EKCX3KCV1H/pu/Qf7Wt5BmZ7ktGsXR\n3g7vf392XbvIyFVZSKVSdHZ2Mjs7S0tLSxbhWbo7zBkhbbPh+81f4eidryczNY9WVs4BfznGGKGx\nQDmduumzUFkJDz2UyelfYPVZsKKuzpifmJgYoKVlH2fOHOEf/9EwJPJ6/Xi9OqmUiq5LSJJOJpMg\nmdQWjIfsqKoDTVs5YdHhgP37dTTNWJjDYXjXuzJ4PDrhsJOqquwZgngcrl+XmJvLMDlpY9eu281y\neGWlzkc+oqzrbXQ6dSoqjGHGpTMKFRWYhGslpNMK/f0zuFwadXXNOByOgohGPjCksLmDqkKhEAMD\nA0QiETOoSpZlZmZmqKur49SpUyYhzmUctfSaW0u6abPZlplYCeMoMTyZSCS4du1a3sZRG8VWVTO2\norKw1j0vlUqRSqWK0oZ4LWKHLGwCtmJmYaXjBYNBOjo6yGQya4c+rQD5hz/E9vnPGwFK1dWQSOD8\n0Y8gGkX9sz8rbkiB9bgWsrCaHNLachBDYjmJggU1+zywr2Hhu9UXtcpK6OmBaHT57ysr07H6toTD\nYdrb2835iYqKCmZmWFhUWUhblIjFZEBGlnVkuWyBNKgoik48rjE7G+W5524wP2+U0MPhGnTdDG0w\n2xaZjPH/NTVGtSGXiCESiRMIyMiyncOHK/H7jcs+HtcX5J8rqxZWw65dhjxyNZ+FXNA0jfHxYWIx\nB7Jcjcfjz3ptDaJR8OnkhZWCqubn5+nr6yMWi5mT7LFYzKw8LK0+iL9jqXFUIbbVkG0c5ff7GR4e\npqWlxRyenJycJJFImLHL4lyEcdRGsTPguIjIgt95KSz6X43YIQubgO3QhlAUhVu3bjE6Orqsn18Q\nVBX5b/7GSGpc8FFXKivJOBw4f/ELtFdeQT93rhh/xjKIIbOhoTg3bvQQj8dpaTlDTU0Ns7MsOC1m\ntxzWIgnrQU8PvPWtrpyeA16vzre/neLQIcPJc3h4mP3793PgwAHz9d61C/70T7MX1eeeg//wH2xo\nGkxOGgQCZHQdNE3C43HQ2Hic8vJZgsEgnZ3TRKNnyGQk4nEZu92Ow2EjlVr5BqiqKrOzM8zPK7hc\nDdjtdvx+LavqsFEDJ4MQ5E80otEoN2/eRNM0HnmkDZfLA2RfK04ny9oom4lgMEhXVxd+v59z587h\ndDpJJBJm9UGoHRwORxZ5KC8vz+qDL60+WAmswGrVB7HjFtUEMcgpYpeF94MwjhKtFEEi1uOXUOpd\nvnhttmMbIhKJYLPZ8K7XqOQ1jh2yUAAKianeKrJgDX0qKyvj6tWr+DbSkA6HjaRGS2lOAjSfD2Zm\nkMbHN40sSJLE4GCML3whiqq2UFZWlvUeVFTo/MmfpKip0TaFJAhEoxLxuITDka1aSCYhHpcYH48w\nM3Mdu93OhQsXSCT8jI/n3m0LKeSBA0YLwOHQszKpMhlIJHT27tWx2SpwOMqprYUjR6Cmxk4sphKJ\nqKiqgqqmkGUZv19nfn6G8nI/ul69MNUdY3Z2Fo/HzZ49e2lvL6297lLous7Q0BB9fX00NTVx6NCh\nku8ul0JVVXp6epiYyA7IAvB6vXi9XlPtoKqquWCHQiGGhoZQFIWysrIsAuHxeNZdfVhJOpkrdlkY\nR4XDYfr6+ojH4+YgpyAP+RhHlXqXL+5T23HAMRKJbIrZ1msFO2RhE7AVZCGTyRCPx+no6CAcDtPa\n2sqePXs2voCWlRl1+Olpc7snSZKxJbXZ0DdpZiEYDDI6Oko47MRu30VNjX1Bj2+EKsVihrFPKrU5\n1YRccLvJ8gQw+t8q3d3d3HNPA83NzczMSHz4wyu7GgrvBKfT8BiQpOwASlk2CEh/v8THPmbPIid7\n98IHPqBTXW20MIRcT1HCyPIsN24MMjnZQiCg4XIp+P0VuN3lJBI2VHXz5I9rIRaL0d7ejqIonD9/\nPss+fKsg5LZOp5NLly6tuZu02Wwrqh1CoRDDw8NEIhEcDscy2+rVqg9WMhFfGNjIZDKrzj5YZaRi\nkFPISMPhMHNzcwwMDCwzjiovL19ms1zqNoQgStuxshAOh4uihHitYocsFIBCKguF+h5sBJIkoaoq\nP/vZz9i7dy+nT58u3kCUw4H2b/4Nti9+EX16GqqrsScS2KamjIjphXz4YsEqh6yurkZRPDidDrze\nxYRF4yark0zKC0RhsQw+Pb2Qv5ADLpfOGp5TBZ1nIpFG1x20tbWxf79RHlh0NTRaFAKBgMTkJAwO\nyqRSOvG4RGOjTlmZjt+/6IIdjcLTT9sQthA+n/E74nFDjVFfb5VV2jBcDyvR9UZcrinKyjIkk27S\naS+Tkwqjo9NkMk4SiUp8PolwOIOuO0zL6s2EruuMjIzQ29tLQ0MDhw8fLvkisRSaptHf38/Q0BAH\nDx5k//796yKaK6kdrF4LIyMjpNNp02tBfHm93qzXQVEUenp6mJqaorW1dV2zD+sxjvL7/SUnC6KS\nUWrzqXyCpIQSotTn9mrBDlnYBNjtdmKxWEmONT8/z82bNwE4f/481dXVRT+Gdv/9EAgg/93fIQ0M\n4EinSZ06BQ8/nJe5Ur4Q/g9CDjk3N8fMTBgwPASMuYRFOeTy58MHP+gkFFr+b9GosYC/731KVj/c\n79c4eTL/cxQ7ykwmg8Pu4pz+c1r+9w9w/NUs+smT2C79GtCM16ubswGJBLS3G62Mhx924HYbFZGu\nLmnBVEnn9ts1PJ5Ft0chZ1ycL9BJJHLfxIRCJBQK8cd/fJyKigpmZw3SlMlkmJiI87//d4JIRKO/\nP4XTqeFwOHE4HNTW2pFlnWLfChKJBO3t7SQSCc6cObMpn8tCIeYldF3nwoULRd9FWmOyhZ5eVB9E\npayzszNLFeFwOBgaGsLlcpkR4PlGdq9VfcjHOArgxo0bVFZW5mUctVFshWwS8guSKpbHwmsVO2Rh\nE1AK6aQ19OnQoUP09PRkeQ0UFQ4H2n/8j2i/8RtIAwP0j45SduECTQs3xI1iJTlkMBi09Ho1dH31\n6k4qJREKSQsWwou7+mAQXnrJjqrCL37hzCr7u93wgx8k8yIMsZhGPJ5Alm04nT7eGvpfvCv0Oap/\nEkd3yUhP/JSa2h9Q6/4KMc9Rc6FXVaPiIEmGN4PXa1QWbDbjfAMBiWvXJOx247Hz85LpxrjaW2qd\nT6mtreXy5cs4nU6mpuBP/9RJOCxhZC4YGRY2m6He+PCHg9jtQSKRCIlEkOvXw/h8PrP3XllZidfr\nXdeCIVQrPT091NfXc+bMmbzMcDYTosJx69YtGhsbOXz4cMl200LtIDIBNE0jEokQDAYZHx8nGo0C\nxj1jYGAg6/VfOvuw0dCspcZRiqJw7do19u3bRzQaNcnMasZRG8VWKCHE65YPWdhRQqyMHbJQALbD\ngKNVQlhVVWVKCHt6eshkMpubILdnD/qePaReeolizAuLv0UsdnfeeaephRbGNMlkknQ6jabZkKTs\nm0wyCaOjkMkY78v4+KJxksu1+F6l05Jpf+x2L/buFcX4HZGIDKzsFOl0prHZdGIxCYfDGGDblRzh\ngdAX0DToTu1HVkDSVernhni99Bf80cRj/Kt/pWbNONhsRrXA5zMqBzbbovmS3Z49UyDMlqxIpWB0\n1PhbUqkUvb29RKNRTpw4xYkTNZbHSYTDBmlamkqZTErs3eujqclreXzK7L2Pj4/T1dWVtfsVu861\nFoxkMmmGeJ06dcocyNtKJJNJ2tvbicfjnDt3LssKfCsgyzJOp5Pp6Wk0TePChQu43W5zty9ef1mW\nl73+DoejqKFZ4rH19fXmv1uNo8Lh8DLjKEEg1ksmt6KyIP7OfAccd5AbO2RhE7BZZCESidDR0UEi\nkVgW+lRKI6j1xFQvRSwW48knewiF0hw+fJaKihrGx41/c7t1du0yXPa8Xi/hcIREQqGszIbL5cTp\ndBCLublxw8bv/77TVBOkUtDTI5FIyHg8i3bBqmqoDCTJ6JpYZ7yUVYwCdV1nfHycmZkePvvZBurq\nDi50XTLU/uOTNH4hRE+yyciJkAFsxLUKLiSexpUKo6orq1BkWc/q4Ij2g7jXSxKkUjoLG0/m5iSu\nX5f5/d93IElp4nEVh+MoXq+Xigr44hfTLLTOTXg8+QU8uVwu6urqzM+T2P2KBWxsbIxkMrnM9dDj\n8ZjuhhMTE3R3d7Nr1y4uX75cshC1lWCtutTV1XH69Oktr3AATExM0NXVxe7duzl37py5cC59/aPR\nqGlbPTExQSKRwOfzZREIn8+3odAssYhaF/1cxlGCTIbDYSYmJujp6UGW5SzykK9x1FZZPcPaQ5U7\nlYXVsfVXz6sM4ua4GopNFlRVpbe31wx9On/+/LIbn91uLxlZWE9MtYCmaQwMDPDCC6N89asXUVWr\nHNJ4Xf1+nS9+MUN9vYezZ49z6JCD+XkNRVGIxxUUJUU8niSdrkDTkrjdMg6HA7fbvjDsmb0YG4RA\nWvAwyO88E4kEHR0dxGIxTpw4QV1dHRMTBiEBYxEWmzWJRV8qWTa+V1XDOVGSDOWGpmWrHjweOHVK\nIxKRkSQ4c0bD6zV+/4svyiQSkEhIzM2J8xHl1AguV4qGhjKcTheJBITD0sJQZ+HGSrlg3dU2NTUB\n2b136+S/3+8nmUySSqU4duyYOey3lRAtuvn5efO922ooikJXVxdzc3NrnpN1IRawVn8mJyfp7u42\nH2clcIVUH5LJZJZkc6X2QC4yGY1GzeHJqampZcZR5eXl+Hy+Fb0kSgnR+lir/bEzs7A6dsjCJqCY\nZGFmZoaOjg5zAGqlD3MpKwvrPVYwGDSHMVtbz6JpfjweHY/HWOR0XV9Y/CCVMiKeDUMjZcHQyLbw\nBYODGT70IZ3ycpDlBMlkiGTSjq5XAw40TcdYtrOhqovVhEzG+F4syOIcxAR/fX29afk7MQHvfa+Y\nA4DdqTv4f8LleFOzzNl3U1GhY5dUfEqIJ91vJkw5waBGKrWY9WC3Gx4KZrZHAwAAIABJREFUgmuq\nKqZ0UsgyvV44e1Zjfl7i4YczNDToC3G1s/zRH5VRXg67d1dltWTyiZHeKJb23g2zrCEGBgZwOAx1\nxc2bNxkaGjKH/MSwXCkxOztLe3s7FRUVXLlyZXPbcnlifn6e9vZ2fD4fly9fLsxqfQG5FmxrZHd3\ndzfxeHyh0rRIHsrKynJWHwyjr06qqqoKtq22kplCjaO2qrKQby7E/v37N/+EXqXYIQsFolSVBRH6\nNDc3tywDIRdK3YYo5O/LZDL87Gf9DA3N0NjYRGNjI2NjRp6Ax2PIAxfVDhLJpAh+Ml7nXC6BmYwd\nr9dBWZl9wXRKJxLJ4HAY74+iCOtnGVWVEcRhbk4yd/jGMeEzn3Fw/nwKvz9KR0cH6XR62QT/0jmA\nNI38MPa7/Gr/52nMDOKMy9jIMFfWxLXW/8hRReejHzUW+7k5eOQRB7GY4b4oJIvJ5CKJsC74mmaQ\nhz17dGprjQpHMqlSUXERv9++ZhrjZmPpzr2+vn6B6CXM6oPIXMiV+LgZA26ZTIaenh4mJydpaWlh\n7969Wy6B0zSNvr4+hoeHOXLkCI2NjUU7J8OMy4/f76dxwVk1nU6b1YepqSl6enoAsmSb5eXlTExM\n0NfXx8GDB2lqajKl12JwstDZB1jbOKq/v59YLIbdbsdmszEyMpK3cdRGsRUhUq9F7JCFTYDNZjMv\nuEIvhKWhT9ahv9VQSiMom82Wt4/E9PQ016718Wd/dgZNO2a+HqkUDA1JuFxw+bJRXdjYjVTC73fQ\n0gIvviixf7+Mz2fcKAKBDIODxg7XqDgsPkeWjYX61q1RFKWbffv2reoHYJAb4///4dB7+OnUSe5O\n/X8cq5xipPo0Tzf8BmM04Eoai/2+fTr79sFjj6WX+T/MzMDHP+5Y8FDITrUsL9eZnx+nr8/ouZ89\n27KwQ8y/1bDUynmj1s5gvJ+dnZ1UVFRk7ZIlSVrmepjJZAiHwwSDQebm5ujr60PTNMrLy7OUFxvd\n/YuKlVV+uNWIxWLcuHEDXde5ePFiSQbnnE5nVly64eS5mHLZ3d1NIpFAkiSqq6tNifdK1YeNhGat\nZBzV09NDLBZjfn4+b+OojSIfjwUwpLU7bYiVsUMWNgHig1moOiEUCtHe3r6u0KdStyHWmlmwyiFd\nrlOk0+W4XDou12LLAWTSaTH1vz6isNRYSMwGGDJLGbtdprx8caixpUXB6VTIZDJmcJOi2BgbG+PK\nlcPs3bs37zKpbJN4wXMn17iT440LVtALFYLy8sW/FVgwg8pe6Bsb4StfWU4ikskkQ0PdhMNB2tra\nqK2tZWgo/9fH5dIpL9cJh5enQS49r3yhKArd3d3MzMzQ0tKSlzuo3W6nurrarNAIoyBROu/t7SUW\ni+HxeLLIw1Jb75VgNVg6dOgQzc3NW15N0HWd0dFRbt26ZRLPrbIPliTJrD64XC4zTbO+vp5oNMrM\nzAy9vb1omrbMddLlchU9NMvhcOByubDb7bS0tGQZR4XD4ZzGUeXl5fj9/g21LgppQ+wkTq6MHbJQ\nIPK5GQnWnS9ZKEbo03ZRQ4ibZXd3N7W1tbS23sVDD3kZHjZ8BMQ1q6rSQgKjkcYoXtZ8d7/WBdFa\n5MhkjAwGRZEIG35O5oyC3Q5+vx23226JKk6jqg6qqqoYGRkx/SrEwlVZWbmwU13+vrvdcPy4RiAg\n8Sd/olicFY3zW2jvrwrjMYsEamxsjNHRHhoa6jlyZLmqIJ9qwe7d8Oijy0lIIedlxdzcHO3t7ZSV\nlXH58uV17/ysRkHW3abY+U5PT3Pr1i1gsXRuHdyzYrMNltaDdDpNe3s7kUhk2xhRqarKrVu3GB8f\np7W11UzaFLMn1nbBUgJnJQ9LvRbWG5plHXDM1zgqk8mY16SYlRBKnHxfg3zJwnb4HG1X7JCFTYAk\nSXm1BYoZ+rQdKgvRaNR07Tt16hR1dXUMD0MkIpmyRatqQJaNqkIoJGEdAykv13G7V9/91tfDF76Q\ne0GcnwfrNT86KvFf/6uT0VGJV16RTbto8ALGLrayspVLl46SSqXMne/o6CgdHR04HA7i8d2kUq2E\nwzZ0fdGuVtOM9Mu9e3WamtavRhDqi3g8ntOjoNBqgZWErBfWOYClQUvFguEimd3rtsoGu7q6lskG\n4/E4w8PDNDc3b4tAKlgcRK6qqtoW0lEwrscbN24gy/KK+Rer5UyEQiFmZ2ez2kdWArGeyG5FUXC7\n3Su2aJcaRwnHVHE+o6OjRCKRLOMo8bVSqyGfNoSu6zuVhTWwQxY2CWuRhWKHPpV6ZsFKTIQcsq+v\nj8bGxixpp7BoFlP/4pq1241FLpGAD30ow223Ld5U3G59mWdALhiPWb4gLjWWtNkMomJIKlVAw2aT\nkSQZRTGklr29EjU1EuAG6pGkehoa4Px5o+9+61YUlytFIADz80bErhjWqqqyrau0L14fUbaur69f\n0Q+gvt7wUlipWlBsxaKY4Pd4PCWdA7CWzq2De2Lu4datW2ZZORKJMDg4mDOwqVSwJlcWLbxtg7C6\naDY2NhZMqFbKmRC7/f7+fqLRqDm8mm9kdyAQIBAI0NTUZN6r8pl9EBkcViVOLuMoQSiXGkcV0obY\nqSysjB2yUCA26uIoFtb+/v6ihj5tVRsiEAjQ3t4OwIULF7ISBRd3FobKQdOMNkH27zIGAffvL45H\nQC643Toul9FuAOO9MUxpFsv4H/6wA2vHyG6Hujqdxx+HhoYqLlyo4utfN4YhE4kE4fA84XCYSCRC\nJhOlv9/G/Pxi393n8635WbHmJ5w+fXrNGZWVyFExITw9xsbGOHz4cFEn+NcLh8NBJpNhcnKS3bt3\nc/jw4SzlhTCNssZFi/bRZp57OBzm5s2b2O32vJIrSwFFUejo6CAYDOb1mcoH1naBaGOI4dVQKGQO\nK2YymazqQ2VlJW63G1mWGRwcpL+/n0OHDtHQ0LCq8mKt2YdCjaNEO1hRlBXvtaKitaOGWBk7ZGGT\nIGKjrRC7NVmWuf3224sa1Wuz2Uin00X7fWsdS1VVOjo6GBsb4+DBgxw4cMC8sLN7mDqyLOF0GkTB\n+pKI2OTNlOIrisLcXDdve5vCzMxtVFbaF3wddKamIBo1zjkQyL2oWAcoF9qqgGfhy9jpCMlaMBg0\nnQzFDU0sXhUVFebuxlpN2LNnz7bITwBDVdDe3o7D4eDixYvrbokVE+l0ms7OToLBICdPnjQn/Z1O\n54qmUaJ9ZLfbs8hDeXl5UTT+uq4zNDREX18fBw4cYP/+/duiFSJC5fx+v5kTslnINbyaSCTM9pEY\nVnQ4HOb9oLW1lfr6+pyZF0v/a7135iPdXM04amRkhHg8zrVr11Y0jopGo+i6vtOGWAVbf4d6lWE9\nlYV0Ok13dzeTk5McPnyY5ubmot9cSllZCIfDxONxotEoV65cyVpUlg46ybKMy2W4FS69dyWTRm5D\nXV1xd8sTE4YMcXZ2lv7+fsrKyjh8uBW73YEsL+YlrPVW5tvVWSpZs4YFCcdDRVHw+/34fD7C4TCZ\nTGbbDMFZ/QC2i6oAFucAKisr11z8cplGifcgFAplvQfW4dVChzVFNSiZTHLbbbdti8XFqgo5evTo\nmp4smwGrdFZUH6anp2lvbzffm97eXjo7O833wFp9WCs0azXb6rWMo4LBIH6/nz179iwzjlIUhU98\n4hMcO3aMuro6kkVwOHvsscf47Gc/y8TEBCdOnODRRx/lzjvvXPHx3/nOd3j44Yfp6+vj0KFDfOIT\nn+Atb3nLhs+j2NghC5sEQRaEMkCEPm1W7zdXJaPYEEZRs7Oz2Gw2br/9dvOmtHQiWuwE3G6oqNAJ\nhbJVC2As1nV165PyrYSJCYkHH7QzM5Mik/Hjdl/E4XCQSkmMjUnMzEicPKmx1LpCkhbJwzqdrE1Y\n7ZKbm5vNXVd/fz+Tk5PY7XYURaG9vd1ctAqRDBYTopQuy3LJ/ADWghisnJqaylumuRTWuGhYHJRb\nuvN1Op1Z1YfVTKMmJyfp7Oykrq5u21SDEokEN27cIJPJbBtViCAvw8PDWQZZS9+D4eFhs5K1NDTL\nZrMVLTRLDDjmMo6amZnhvvvu42c/+xmRSITm5mb279/PpUuXeP3rX8+73/3ugv72xx9/nPe///08\n9thjXL16la985Svce++9dHR0mFUwK5555hnuv/9+HnnkEd7ylrfwve99j7e97W089dRTXLx4saBj\nbzYkfS07wh1kQdOMjIK18NJLLxEKhQA4fvz4pvvTj4+PMzIysikfsKVyyKamJl588UXe9KY3mf+u\nqqrpMS++BKanyTmYB8ZwXrFeGl3XefbZGd773kq8XpmqKg+ybBw3kTCUEABHj2q43TA+DiMjxs9y\nkYXdu3V+/OMUR45s7BKJxWJ0dHSQSqU4fvw41dXVZDIZs2wubp5A1q53M4f2xOzM4OAg+/fvz2oj\nbSWEwZLb7ebEiRObOlipqqopGRTvgaqqy/IWZFmmu7ub2dnZklzL+UKEUtXX13P06NGS2yjnQiKR\n4ObNmyiKwqlTp9Ykn6qqmrt98T4oipI1f2INLRPIFZplXcqs96GXX36ZhoaGVXNLfv7zn/Nbv/Vb\ndHV18fzzz/Pss88Sj8f51Kc+VdDff/HiRc6dO8eXvvQl82fHjh3j3/7bf8snP/nJZY+///77CYfD\n/P3f/735s1/+5V+mqqqKb3zjGwUde7Ox9dT4VYa1djhiQGx6ehq/38+FCxdKsgPZrDaEVQ55+vRp\ndu3aRSKRMMmBlekLZr8UuQyJio1EIkFnZydDQyoezx5qamxYW+42mzEfoSgQjUqk08szFYpNm3Vd\nZ3h4mL6+Pvbu3ZuVMmi325dNnAvJoIgqtg7tWcvmG60+RCIR2tvb0XWd22+/fVsMdVlbIYcPHzZt\niDcTNpstp2mUWLT6+vqIRqNIkoTD4aCpqWlV2V+pkMlkTIOs7RKUBYtth927d9PS0pIXeTHURMul\nkoI8jIyM0N7ebkolBYEQyou1qg+pVIpEIrFgAa+sWH0QSojKykruvvtu7r777oL//nQ6zYsvvsiH\nP/zhrJ/ffffdPP300zmf88wzz/Bf/st/yfrZPffcw6OPPlrw8TcbO2ShiBA9VqfTyb59+9A0rWSl\nymKTBVFK7O/vXyaHFDdxRVGy+oZb0edeGvx07lzLwnlmr/xut05bm0YwKPGZz6RpbNT55jdlPvlJ\n58LvWf67RbjTehCLxWhvbyedTnP27FnzZrgSckkGlyY9tre3m4N9gjwUkrWgaRpDQ0P09/fT1NS0\nbTwKhB+AJElb2gqxTv3X19ebeQYNDQ04HA4CgQBDQ0Poup5lWV1RUVGywKpQKMSNGzdwu91cunSp\n5EFduaBpmikf3WjyqFUqKX6PmD8RBGJ0dHSZ+kVIJa1qBzHwWVFRYRLClWyrI5HIhtuAs7OzqKpq\nzs0I7N69m8nJyZzPEQqffB+/ldghC0VArtCnwcFBgsFgyc6hmDMLQg4pbt7WIS5dNzIcbDYbTz/9\ndNau1+/3l5QwWMv7Yliwv3/l4xt209DcrHPwoM7lyyp2e+4ZBVmGP/qjFA0NhZUbrJPya+VMrIVc\nQ3vihjk/P09/f3+WVa94H3LJwwR5URRl2wzmWV+r5ubmdTmXbgZisRg3b95E0zQuXryYNQdgzVsI\nBoNMTU2ZaY/W2Yd8pLOFwPpaHTx4kP3792+LIVSRgQFGCX4z5KNL50+ArOrD2NgYnZ2dpgKpvLyc\nZDLJxMQER48eNeW/S6sP1jmrJ598kjlr/OwGsPR9EffMYj1+q7BDFgqE9U0UF3Cu0KdSmiSJ4220\nsiAGy8bGxjh06FCWJMx6YUmSxF133WWGBM3OzpqRtFbyYJULFhPWHfJGFuQ3vAG++90EgcDy51ZV\nqbzhDYX9PuuCfP78+aJKYyF32dwaU9zT00M8Hsfn82XtuIQL30bJSzEhetupVGpTXqv1wGpm1NDQ\nkPO1slaArPHMgjxMTk7S3d2dNeS60fmTVCrFzZs3SSQS24bogTEz0dnZSUNDA0eOHCkp0VtKpIUC\naW5ujpGRERRFMd/PaDRqvhc+ny+LTCeTSR5++GG+8Y1v8N73vndD51RbW4vNZltWFZienl5WPRCo\nr68v6PFbiR2ysA5IkmRq0lcKfSrG4l0INtqGmJqaoqOjA5/Pl1MOKdg4LJbuli5couceCAQYHR0l\nnU6bfUDxlU+C5moIh8N0dHSgadqqi0wuBVSunxmEYGPvk3XXJxzzSrEgW616rQuXIA8jIyN0dHQA\nmK+96M1uFWHQdZ3x8XF6enqor6/n7Nmz20JVkE6nTUfVQs2McklnrZbV1vkTK3kQDoOrYWZmhvb2\ndmpqalZ09yw1VFWlq6uLmZkZ2trazL97KyHLskkOKioqOHHiBJqmmdWH8fFxurq6kGWZZ555hrm5\nOY4fP87XvvY1FEXhxRdfpKWlZUPn4HQ6OX/+PE888USW9PGJJ57gvvvuy/mcy5cv88QTT2TNLfzk\nJz/hypUrGzqXzcDWf/JeZdB1nY6ODkZGRkwzolw33lJXFtYTi93bKzE7m2JwcIBQKExz8wkqKuqY\nmJA4fDi7TCdKYyvd3HL13IVJi9UiViQMiq98y7WqqppyrNWm9z0eIxciElmeoQDGvxVzwF4MgGYy\nmW2xQxYLVyqVIh6P09DQwO7du03PgaGhIRRFMXvuYuHaKInLB2JBDoVCWQZLW43Z2VlTxnrp0qUN\nzx9YNf4CuTJHlg7tWStxKwVAbTWi0SjXr1/H4XBsm5kJMUjc29u7bDg2l1HT8PAw165d41vf+hbz\n8/O0tLTw6U9/msuXL/Orv/qrG9rVf+ADH+Ad73gHt912G5cvX+arX/0qw8PDZtXigQceoKGhwVRG\n/Of//J+56667+PSnP819993HD37wA/7hH/6Bp556aoOvSvGxQxYKhCRJuFyuNUOftoIsQP6x2Ldu\nQVubE3ACp5b9+40bKQ4cWKwmrEYUVoIYVBKJciJh0FqutfYjhcZ6KQkQVRy73b6mlnzPHp3/9b/S\nK6ZXejzGYzYKayuklNWEtZBMJuno6CAajWbtkK2qCyuJWxoTXSiJyxfT09N0dnbmZbBUKlgXZKsf\nwGbA5XKxe/furLK5kAxajbvKysrw+XwEAoFt5aRpbdE0NTVtm/kSYW8dCoXWJOuyLOP1ehkYGOAX\nv/gFn//853nzm9/Mc889x7PPPsvXv/51Tp48uSGycP/99zM3N8fHP/5xJiYmOHnyJD/60Y9oXgis\nGR4eznrdrly5wje/+U0+8pGP8PDDD3Po0CEef/zxbeexADs+C+uCoig5UxetiEQiPPfcc7zxjW8s\nyTnpus6Pf/xjXve6162pTY9Go3zve0P8+39/bsXHXLsW5/RpdVNVDqLPGAgEzMVL6NzFwOT8/DwT\nExMcOnSIpqambXGDEtUEVVU5ceLEtugh67puWk3X1dVx9OjRvDNHrCRO7H5Fz32j8ydC5jc9PW3a\n/W6H4a1IJMKNGzew2+2cPHlyy3MdBIkbGBhgYmICh8OBoihZ6hcxvFfqa0BRFDo7OwkEArS1tW0L\n11FYVIZ4vV5Onjy5JgGdnJzkwQcfZHJykm9/+9ucOrV8k7SDlbFTWdgkCHVCqSZbhUJhtbkFqxzS\n5zu65u/cbDmkdQgMFnXuYspcyNS8Xi/xeJypqamieQ2sB5qmMTg4yMDAgLm72g7VhFQqZfbb11Pe\nXxoTbe25i6yFdDqd0/NhNQQCAW7evInX6+Xy5cvbpmQt5ku2kxlVJpPh1q1bBINBzp49S01NzTL1\nizWsyaq82MwWknVB3i4VIWES19PTk5cyRNd1rl27xoMPPshdd93F3/7t324Lb5FXG3bIwiZBDCLl\nk6VeLKxGFsSNW9j69vev3ls32g6bcZarH9PpdJqLVEtLC3V1deauVxi0CIteq03yZt/whZGRpmnb\nZiJd13Wmpqbo6uqipqamaDdza89dWNRaUx4HBweJRCJmRPHS90HTNHp7exkZGeHIkSPbIrkSjBaN\nMBjbDvMlAisFQK1lGmWNiraSh2JcD9Y5gO0k1cxkMnR0dBAIBDh37tya/iWqqvK5z32OT3/603zq\nU5/ife9737Ygh69G7JCFdSCfi2aryMLSOQlFUejp6WF8fHyZHHK7QSx85eXlXLlyxdyJWoeUxG5L\nSDb7+vrMtLjNsEm2VhO2kxeASGMMBAIcO3Zs06VWS41yhF11KBTKeh98Ph+JRAK73b6tFmSh9qmr\nq9s2qoJCA6ByRUUripIlYe7r61vmvVGoaVQ6naa9vZ1oNLqt3sNIJML169dxu915EeO5uTne8573\n0NXVxU9/+tNtOQfwasLWXzGvUciyjCzLZDKZkkyaw3K5prhBlpWVcfXq1ay+7HYaVUmlUnR1dREI\nBGhpaVm1r51rt7XUJjmVShVFsrkdbZEhe1jwypUrW1IaXmpXLVz8RkdH8fl8qKrK888/nyUXrKys\nXObxv9nIZDKmzO/48ePbRr9erAAoh8OxzDY8l/eG1+vNIg8ruRUGAgFu3LhBRUUFly5dynvuZTMh\nhiu7u7s5cOAABw4cWPMz9Pzzz/PAAw/Q1tbGCy+8UJAUdge5sUMWNhFboYhQVdV0lJyfnzdlV0vT\nIb3e1clCKcLrrEN5NTU161r4VpNshkKhdUk2rSFL26maoCiKmQmwnYYF4/G4aW19++23my0aIRcU\ncw8dHR04HI6skvlmDuyJUCqPx7NtZiZgcwOgVvLeEFWglUyjysvLGRkZYWBgYMtirnNBkL25uTnO\nnDmz5qKvaRpf/vKX+ehHP8pHPvIRPvShD22La/e1gB01xDqgqmpeJODJJ5/kxIkTJWO1P//5z3G7\n3UxPT7Nr1y6OHTuWtfhaU9oA+vpkotHlNwS/Hw4fLk3wUyQSMbPkNwu5pv2FNWxVVVXWohUOh2lv\nbwfgxIkT26aaMDs7a1aJjh8/vi0WPqucbs+ePWsufCJh0Po+WNUvYuHaaKXEWt4vVShVPhAL31an\nV4oBVus1kUwmkSTJNJfK1zRqMyE8HZxOJ21tbWtWB8PhMO973/t45pln+PrXv87rXve6bfG+v1aw\nQxbWgXzJwtNPP82hQ4dKUvqMRqM899xzAJw6dSprIn5plOtWhT6Jc7EGPx05cqTkpU4h2RQ3ykAg\ngKqqOBwOUqmUmZpXqvbRahAW3JOTk5vuBVAIrAqMEydOmEqKQmBVvwjyEIvFzJwF8VXIohWPx7l5\n8yaZTIa2trZ1l/eLDWsA1MmTJ7cF2QODhN68eZOqqirq6urMwKZwOGwS6lymUZsN4biYr6fDjRs3\n+O3f/m0aGxv5+te/vqEwqx3kxg5ZWAc0TUNRlDUf99xzz7Fv3z4aGho29Vz6+voYGBgwB9COHDkC\nLM4liDhpa8b7VsAa/HTs2LFt00cMhUJmcJDf7ycWi2VlLFRWVlJVVVVyyeb8/Dzt7e14vV6OHz++\npn9GqTA9PU1HRwfV1dUcO3asqGTPmrMQDAaXLVqiCrR00RI20t3d3SvmOmwFtmsAlLhvjIyM5HSI\ntBJq8X5Y5bPi/Sj2NWG1kj558uSaJFTXdf7qr/6KD37wg7z//e/nj//4j7fF8OprETtkYR3Ilyy8\n+OKL7Nq1y5SfFRtCDmmz2Thx4gSjo6M4HA6OHj2aleew1dWEYgU/bcZ5iXL1gQMHspQiImPBumg5\nHA6zbbGZkk2rs+CRI0e2Vf/YarAknDk3E0urQMFgEEVRsgZYvV4v/f39BIPBdVc5NgPWAKi2trZt\nIbeFxeFKVVVpa2vLOxI8mUxmVYEikciyGZSN5I7EYjGuX7+O3W6nra1tzepLPB7nAx/4AD/60Y/4\ny7/8S+69995tcZ28VrFDFtaBfMnCK6+8gt/v5+DBg0U9vlUOefjwYZqbm5Flma6uLjRNo7W11SQK\nW11NsAY/HT9+fNvIsEKhEO3t7ciyzIkTJ9YsV1v77YFAgFAotCmSTTGU53K5OHHixJY7CwpYqxwn\nTpzYsjK6rutZi9bc3ByJRAJZlqmtraW6utokclu5cIgAqNraWlpbW7fNblcopIoxXGm9JkT1QZhG\nWdsX+XxWRIKlsE5fi4T39PTwjne8g7KyMr75zW+adso72Dxsj0/wqwz53oQ2Qw0xOTlJZ2dnTjmk\nzWYjmUySyWSQJGlLqwmqqjIwMMDQ0NC2UhRYA6kOHjxoEq21YLPZqKqqoqqqigMHDqwo2RRl2qqq\nqrxvlOK8RFn40KFDNDc3b4tdkqqq9Pb2MjY2xuHDh7fcYEmSJDweD06nk3A4TDqd5ujRo/h8PkKh\nENPT09y6dQtJkooWEV0IrFWhY8eOlaT6kg/EeU1MTBRNQmq9JiA7d8SqRLKad1VUVOD3+81rTlVV\nuru7mZqayivBUtd1vvvd7/J7v/d7PPjgg3zmM5/ZFq6S/xKwU1lYB3RdJ51Or/m47u5uVFXl+PHj\nGz6mCAgKBAIryiEnJiZob2/PCmeqqqrKujhLgWAwSEdHR9679lJBVBNE2ybf8mu+sO54g8EgkUgk\nL8nmZp/XehEOh80218mTJ7dFoBEY/hfCjTTXeWmaZnoNWKf9Retis/rt0WiUGzduIMsybW1t26Yq\nJMr7sixz6tSpks6+WM27BInQNI3y8nJ8Ph/z8/PY7XZOnz695nmlUin+8A//kG984xv8z//5P/n1\nX//1bUGo/6VghyysA/mShb6+PmKx2IYCS4R6oKenh7q6OlpbW1eVQ+q6bvZ4RUCTpmlZC1ZlZeWm\nzAxkMhlzF7qdgp+su/ZCqgkbxUoBTda2xezsLCMjI8tmJrYSuq4zODhIf3//tspPsFoQF1qtSiaT\nWe9FJBLJsg1fuuMt9LyEhDTfMnqpIFQFYlZoq89LmEaNjIwwNjZmus4KUm21rLYSgcHBQR544AEy\nmQzf/va3zSHuHZQOO2RhnUilUms+ZnBwkPn5ec6dWzndcTUIB8E1rzZIAAAgAElEQVRUKrVscEuQ\nhP+fvfMOa+rs3/gdQDaEIeIEXMwEUVBAxFFX9dfx2lpHiwJ11L3qW0fVum2rfR211ddqxdYiVq2r\nrdX6VoaK4GrZQ5aiAoIJCYQQkjy/P7zO6QlDAiThaM/nurhawwl5ss75Pt9x39R/myo5UF9OprMj\npXDIbNZrayqvoqICGRkZMDc3h7e3N2t2oUx76/betTOb9crLyyESiUAIgY2NDRwdHVslzatrqNHD\nuro6CAQC1jTlUb4OMpkMQqGwzb0vTNlw6r+UTDLzotXcpAdlkSwWi1nlyMjUdNBmqsBQUEqfzHII\nM6imshAAcOjQIXTq1AlOTk7Yu3cv3nnnHezZs4c1U0H/NLhgoZUoFIpmJZOLi4vx+PFjDBw4sEV/\nmzkO6eLigj59+mjUW6lJh9aOQ1J1RSqAqK6upscEqQBC2xQt1WxZWlrKqs59qtZeXFzMqiwHczLE\nxcUFXbp0gUQioZsmme+FISWSmbvjrl27om/fvqyYWAGeNeVlZmbqtVmwvkyyWCxuMD5bX6iIMoCy\ntbWFt7c3a2rnlIeCmZkZqzQdampqkJKSAkIIfH19myzTUGWk/fv348KFC0hPT0d1dTW8vLwwePBg\nBAcHY8qUKawp8/xT4IKFVqJNsFBSUoKCggIEBwdr/XeprnOqfs3c2elrHJI5JigSiegULRU42Nvb\nN1prp4yfbGxsWKMqCDwbKaWkhX18fFiT5aiurkZaWhpUKlWD95aiqZFNZtOkrntQKIElqVRqUMXR\n5mCOanp5eRlcaKex98LExAR8Ph8qlQpisRh9+/ZljUIk07rZzc0NvXr1YsW6gGfaHOnp6VpPYZSU\nlCAiIgLl5eU4fvw4OnXqhMTERCQmJuLGjRv47bffDJph2LZtG1avXo3Fixdj165djR4TFRWFyMjI\nBrfX1NSw5tzYFrhpCD3SkmkISvf/8ePHGuOQwN8NjFRvgq4nHUxNTRs4O1InyLKyMuTk5NC1dipw\nePjwIW0jzRaPgvrZBLZMFDBr7VRNu6mTZWPvBTWeVlFRoXOXTWrXTllcs8E4CPh7hJRyGGyPk239\n90KtVuPJkyfIyclBXV0djI2NkZubi9LSUo1MUHtkGKhySGVlJfr378+acoharUZubi4ePnwIb2/v\nZgM+Qgji4+MRERGBkSNH4pdffqEbpP/1r3/hX//6lyGWrcHNmzdx4MABrXrPbG1tkZ2drXHbyxAo\nAFyw0Gp4PF6zmQVtggVCCH3CbsodksomADDIOKSxsXEDR0GpVAqRSISSkhJIpVIAAJ/PR3V1NZ4+\nfWqw0bSmEIlESE9Ph6mpKYKCgliTTaBMlmprazFgwAB6zExbGhtPY/agPHr0SKPTn/pp7gTFNKVq\nj117UzBNvNgU8AF/Z9Ko3bGRkRFd0hOLxbh37x6qq6tbZFqmCyorK5GSkgJra2sEBQWxphwil8uR\nkpIClUqFwMDAZr+TKpUKO3bswI4dO/D5559j7ty57V46rKqqwnvvvYdvvvkGmzdvbvZ4Ho/Hmu+S\nruGCBT3SXLDAHIekZrLrj0NS2YT21EwwMjKCqakpnj59itraWvj6+sLKyoo+SVISztbW1hqlC0Oc\ntJhz7VRvAhsuLlRKODc3F127dsWAAQN00gPAdBWkXDaZI5uFhYWQSqUwNzfXaGBlXrCoUpeVlRWr\n3BiZvg5ssgRnNgv6+PhoGEBZWlrC0tKSlktmNuvVd3hkZoJ08VlgSkmzLbCiPCc6deoEDw+PZp9v\neXk5Zs2ahdzcXFy5cgWDBg0y0Eqfz/z58/F///d/GDVqlFbBQlVVFVxdXaFSqeDn54dNmzahf//+\nBlip/uGCBT1iYmKioaRIQaWlc3Jy4OzsjNDQ0OeOQ7a38RN10XN2doZQKKRT1UwbXLlcTu92KTEW\nyhCIumjpulHv6dOnyMjIgJmZmVY7F0NRU1ODjIwMyGQy9OvXT+89AObm5ujcuTO9o6Fm28ViMUpL\nSzUuWEqlElKplFVujJRGSFZWFuuaK5kGUEFBQc0GVh06dEDHjh3p6QMqK0e9H8XFxVAoFLCxsdEI\nIFoasCkUCqSlpaG6uhoBAQGsmVphek5oK0qVlJSE8PBw+Pn54datW6wpocTExODOnTu4efOmVsd7\nenoiKioKQqEQEokEu3fvRkhICP7666+XYtSTa3BsJUqlEiqVqtljLl++jFGjRtEp+ubGIdmSTQDa\nZvxUV1enMXEhkUg05trt7e1bLclL6TlQctftrSpIQZkZUZoYHh4erJD5VavVKCkpQW5uLt3zQsny\nsqXWzjZfB30aQDFVDinNB3Nz8wY6A02l4J8+fYrU1FTY29vr3MirLcjlcqSmpqKurg6+vr7Njimr\n1Wp8/fXX2LBhAz755BMsX7683csOFA8ePEBAQAAuXbqEfv36AQCGDx8OPz+/Jhsc66NWqzFgwAAM\nHToUe/bs0edyDQIXLLQSbYIFQgguXryI4cOHo0OHDsjPz0dBQQFcXV0bmCm1dRxSl+jD+Ik5106N\nCfJ4PI3gwdbWttmTBZVCt7CwgLe3N2vGp+RyOTIzMyGRSODt7d2sbK2hUKvVKCwsREFBAS38xOPx\nNGrt9cdnDTWyWVFRgfT0dNjY2MDHx4c1tXZDG0AxM0GUzgCziZWSrTYxMUF+fj4KCwvh4eGBbt26\nsSJIBp69l6mpqejYsSO8vLyaPV9UVlZi3rx5SE5OxrFjxzB06FADrVQ7zpw5gwkTJmg8D5VKRTeX\n19bWanVOnDVrFoqLi3HhwgV9LtcgcMFCK1GpVFpNOvz+++/w9vZGfn4+LZvLrMUyMwnt7Q4J/J35\n0Lfxk1qtRlVVFZ15EIlEUKlUsLW11ai1UztzpVJJa9uzSc+BEIKSkhJkZWXROgBs2elVV1cjPT0d\nSqWyweeuPtSYYGVlJUQikcbIJvWjq5FNtVpNT624u7uz6qLHBgMopu8IFURQZllGRkZwdXVF586d\nDaK/oc1aKedWDw8PDRn6pvjrr78QFhaGnj174ocfftCJT4WukUqlKCoq0rgtMjISnp6eWLFiBQQC\nQbN/gxCCQYMGQSgU4ttvv9XXUg0GFyy0Em2Chbq6Oly5cgUA0Ldv32bHIdszm9Dexk+EEMhkMg2l\nyZqaGtjY2MDc3BxisRiWlpYQCASsySYoFApkZmZCJBLB29tbo/GtPWH2mXTr1q1VmSHmyCb1U182\nvDUTMJR/Ao/Hg1AoZE2fCVsNoIBnAUxaWhpsbGxgbW0NiUSi12BOW6gMjFwuh6+vb7MeMIQQHDly\nBB999BGWLVuGdevWsaJMpy31yxDTp09Ht27dsG3bNgDAhg0bEBQUhL59+0IikWDPnj34/vvvce3a\nNdY0bLaFF+edeoGgxiEzMjLA4/Hg7e2Nbt26afze0OOQz4Np/DRo0KB2MX7i8XiwsrKClZUV3TRZ\nXV2NzMxMlJeXw9TUFJWVlbhz545G5oGpqGdIqHFXe3t7DB48mDUpdGrCpqqqqk3NlU2NbFKBw+PH\nj+lgTpuRTcrjJDc3Fy4uLqzyT2AaQAUFBbEmGGVmYOoHMMxg7unTpygoKKAzc8xgTl+fS6pvwsHB\nAf369Wv2ol9dXY2lS5fi0qVLOHXqFMaMGdPuWZG2cv/+fY3PsFgsxuzZs1FSUgI+n4/+/fsjPj7+\npQgUAC6z0GrUajXq6uoa3E51wovFYnh5eaGwsBC9evVC586dWdfAyFbjJ+BvrwlLS0t4e3vDwsKC\nbppkGjMx1Q2p3ZU+X9O6ujp6jM7T05M1glQANMohHh4eei+HNOaySTXqMQW8FAoFLdkrEAharDWh\nL5gZGLYZQMlkMqSmpoIQolUGhsrMMb8b1dXV9ESSroJrQggKCgpQUFCgdd9EVlYWpk2bBnt7exw7\ndowe+eV4seCChVZSP1ioPw5JuUPevHkTXbp0Qbdu3TSyCe1ZcgDYa/zE9Jporp7N3F1R5QsADZom\ndTWG9+TJE2RkZMDW1hZeXl6s0SegApiKigp4eXm1Ww2Y2ahHXbCAZ98VKysr9OnTBw4ODqwYi6RK\nSJWVlRAIBKwZ1wNAZyW7dOnSpjFShUKh8X5IJBIYGxtrjGy25PtBjWvKZDL4+vo2q4NBCMGJEyew\naNEizJo1C59++ilr+nk4Wg4XLLQSZrAglUqRlpYGhULRYPyLSpv36NGD1ltozyCBrcZPwDNhloyM\nDFhZWdHZhJbQmD13XV2dxslRGyfB+jA9Ctzd3bVq4jIU1ESBtbU1fHx8YGZm1t5LAvAskMvKykJp\naSmcnJygVqvp96O9RzbZagClUqmQnZ2N0tLSBuJPuoDpekr9UO8H8zvS2GdILBYjJSUFfD4f3t7e\nzX6H5HI5Vq5ciRMnTuDQoUOYMGECa74zHK2DCxZaCSEENTU1yMvLQ2FhYZPjkKmpqRCJRHBycqJr\nwO0VXZeVlSEzMxM2Njbw8vJijdUrFcCUlZWhb9++OuuOp94j5sRFTU2NhtJkc4I4jZVD2ACzIY9t\nEwWVlZVIS0uDqakpBAIB/ZpR70djI5t8Pl9v4l0UarWa7tx3d3dnVaBM9U0YGxtDKBQa5HNGCGlQ\nSqqqqqLlqqmRzYqKCuTn56Nv375aaZoUFBRg+vTpIITgxx9/RJ8+ffT+XDj0DxcstBKZTIZr167B\nxMTkueOQCoUCIpFIww6aulhRJ0d97wZra2uRnZ2Np0+fssr4CXiW2qd8MQzhXFlbW6uReZBKpRpa\n/vb29rC0tKQNcB49esS6DAx1Me7QoQOrpkOY9WxthYzqp8qZfSi67PKvqalBamoqlEqlVoJBhoIS\n8srOzmZF30RdXZ1G4yRV2uPz+XB0dHzuFAwhBL/88gs++OADTJ48Gbt27WJNqY6j7XDBQishhKCw\nsPC5fg6NjUPWDx6kUiksLS01PBV0taugZHRzcnLg4OBA91GwAaaRUXum9pVKpYY9t0QigZGREdRq\nNUxNTeHu7g4nJydWNL4xTZZ69eqlMYrb3tTU1NClOKFQ2Gpfh6ZGNuuXkloyckdJSbe1B0DXKJVK\nZGZmoqKiAgKBgDXqlcDf5lRWVlZwc3PTmIRhGpcxP4sbN27EoUOH8PXXX+O9995jTXDNoRu4YKEN\n1NbW0v9ffxxS294EZoc/dbEyMzPTCB5a08FcU1ODzMxMSKVSeHl5sUYDAGBvoyCV2i8uLoajoyMI\nIRpqetR7oisjoJZQXV2NtLQ0qFSqZgWWDAkVkGZnZ9NujLp8beqPbDL1N5ob2WQaQLFJBwMAJBIJ\n7TkhEAhY02vCHHFtypyKWbpYvnw54uLiYGNjA7VajXnz5mHixIno168f18z4ksEFC21AoVDQyou6\nGodUqVQawUNlZSVMTEzowKE5T4X6xk/u7u6s+dIyswkeHh4aWZn2prKyEunp6bTKJjUdwlTTo7JB\nCoWCbtKjAgh9vca6EFjSF3V1dcjMzMTTp0/h4+NjMIlruVxOK002NrJpZ2cHlUqFtLQ0WFhYwMfH\nhzUBKfNi3LNnT/Ts2ZM13wHKp6OyshK+vr7NqrcSQhAbG4tZs2bB398ffn5+uH37NhITE6FQKNrF\nPXLbtm1YvXo1Fi9e/FwPh1OnTmHt2rW0Y+eWLVswYcIEA670xYMLFtpAbW0tlEqlXsch1Wo1JBKJ\nRumC8lSgggeqpksZP8nlcnh7e+vd7bAlUM2VbMsmMJvetEnt12/SE4lEkMlksLKy0sgG6eL5yeVy\npKenQyaTwcfHh1XjfdREgY2NDby9vdt1Z1x/ZFMkEoEQAktLS3Tp0qXdskH1qaurQ3p6OiQSCYRC\nIWv0JoBnmY6UlBRaJbW5cqVKpcLnn3+OnTt3YseOHZg9ezb9vVGr1cjMzETPnj0N2k9z8+ZNTJo0\nCba2thgxYkSTwUJiYiJCQ0OxadMmTJgwAadPn8a6detw9epVBAYGGmy9LxpcsNBKEhMTsXXrVgwe\nPBhDhgzRSsVMFzA9FajgQaVSwczMDHK5HE5OTvDy8mJNb4JCoUB2djYrRYyokVcejwcfH59WK1dS\nfShMcSJmKcnOzg5WVlYtet5Und3JyckgAkvawlQVZFvjJyU/LJPJ0Lt3b7ofRSQStfvIplgsRmpq\nKj3iypbvJ5W5ysnJ0bop9cmTJ5g5cyYKCgoQExODgIAAA622aaqqqjBgwAB8/fXX2Lx583PdISdP\nngyJRKJh7vTqq6/SolEcjcMFC63k/v37OHr0KOLj45GYmAgACAoKwpAhQxASEoIBAwYY5IRA1T6V\nSiWsra1RVVVFaws0ZshkSEpLS5GVlQU+nw8vLy/W1GWZToz68MGgdrpUAFFZWQljY2ONiYumOvyZ\nqX221dmrqqqQlpYGABAIBKyZKACebwBFjQgyAzp9qBs2BtUInZ+fjz59+sDFxYU1wZVSqURGRgZE\nIhGEQqFWmavExESEh4dj4MCB+Pbbb1mTHQkPD4eDgwN27tzZrJW0i4sLli5diqVLl9K37dy5E7t2\n7WpgHsXxN5w3RCtxcXHB6tWrsXr1aiiVSty9exdxcXFISEjArl27IJfLMWjQIISEhGDIkCEYOHAg\nzM3NdXaiYKbPmRe8+toCWVlZGt3LVAChz0BGoVAgKyuLlaOaVVVVSE9Ph0qlQkBAgF7sh01MTODo\n6EiXgahSErXLLSgoaGDKZGdnB5FIhIyMDNjY2CA4OJg1wRWbZZG1MYDi8XiwsLCAhYUFunbtCkCz\nsfjRo0fIzMzU+chmbW0tXUbS12ettUilUqSkpMDc3BxBQUHNftbUajW+/PJLbN68GRs3bsTSpUtZ\n8xmIiYnBnTt3cPPmTa2OLykpaaBy6uzsjJKSEn0s76WBCxZ0gImJCQYOHIiBAwdi+fLlUKlUSE9P\nR2xsLBISEnDw4EGIRCIEBATQwUNQUFCLU9MUzzN+4vF4sLS0hKWlJW1exdxV3bt3j9Z6YAYPuuoh\nYBosse2CV1RUhLy8PLi4uKBXr14Gq2EbGRnRFyA3Nze6w596Tx4+fEhP1jg4OLBKIbK2tpY2pvLz\n82NV30RbDKA6dOgAJycnuilTpVLR6oZMYybmyCafz9e6HFRRUYG0tDTY29sjKCiINe6KhBA8fPgQ\nOTk59Cajuc+aWCzGnDlzcPfuXVy8eBFDhgwx0Gqb58GDB1i8eDEuXbrUonNY/edMqetyNA1XhjAA\narUaOTk5iIuLQ3x8PK5evYpHjx7Bz8+PDh4GDx4MPp//3A+sUqlEXl4eiouL22T8pFAo6F2uSCSi\nhYmohkmqQa8lXx6mXbOnpyecnZ1Z8+Wrrq5Geno6FAoFBAJBs13ehoQSWDIxMYGzszNtBkQpG9YP\n6Az5mlKpfQcHB3h5ebGmb8IQmY6mRjapILupRlYq43f//n3WKWuqVCoNXQdtGqD//PNPhIWFoW/f\nvvj+++9ZVRYDgDNnzmDChAkagb9KpQKPx4ORkRFqa2sbbAq4MkTr4IKFdoBSumMGD/n5+RAIBHTw\nEBISgo4dO9InmqSkJCgUCr0YP9XV1dE1dkrrwdTUVENlsqksCGXHnZWVBXt7e1Y1V1Jjavfu3UPX\nrl1ZJchTfwqjfmMZFdBRQZ1UKqXfE6ajoz4uREyPArY1pbanARSl/lm/kZXZ85CXl8c6lUjgWRYm\nJSUFpqamEAqFWpUdDh8+jFWrVuHf//431qxZw5rvDhOpVNrgAh8ZGQlPT0+sWLECAoGgwX0mT54M\nqVSKX3/9lb5t3LhxsLOz4xocnwMXLLAAKjVI9TzEx8cjKysLnp6e8Pf3R3FxMZKTk3Hx4kX0799f\n7ydulUql0aAnFothbGysETzY2NjQvQkikahd3Q4bo6amBunp6aipqWHd2CHVKEgIgUAg0GoKg6m/\nQf1Q5Q3qPbG1tW3zDptqmK3v68AG2GYAxRzZLCsrQ1VVFXg8nsb3hA0jm48ePUJWVhZdfmvuM1JV\nVYXFixfjjz/+wA8//ICRI0eyJljUhvoNjtOnT0e3bt2wbds2AMD169cxdOhQbNmyBW+++SbOnj2L\nNWvWcKOTzcAFCyyEEIKysjJ88cUX+Oqrr2BnZ4fa2lrw+Xy6ZBEaGtqoupo+YGo9MOfYCSG09bCj\noyMrGp6YNVlKUZBN9WJKkKdHjx7o06dPq18zykGQGdAxa+z29vZNavg3tTaqa1/bETpDwWYDKKaH\niIeHB6ytrTUCOkrAizmdZKggh3L+fPLkidZy0hkZGZg+fTocHR0RExND9z29SNQPFoYPHw43NzdE\nRUXRx5w8eRJr1qxBfn4+Lcr01ltvtdOKXwy4YIGlLFy4ENHR0di1axfee+89VFZWIiEhAXFxcbh6\n9Sru3LmDLl26ICQkhP7p27ev3i/YVMObWCxGp06doFQqIRKJoFKpNGq57bGjksvldDOet7c3q7T2\nmQJLAoFA5yNn9WvsIpEItbW1Gg6b9vb2jV6omL4OAoGAVV37bDWAAp6ZyaWkpAAAfH19GzRYMl0d\nKTXWqqoqg4xsVldXIyUlBcbGxvD19W22+Y8QguPHj2PJkiX44IMPsHXrVtb0qHCwAy5YYCmJiYno\n1atXo6l9SoL4+vXrdOni5s2bsLOzo0WihgwZAi8vL51dsAkhKCkpQVZWFjp27AgPDw/6wsO8UFF9\nD9SOikrJtqSTvC1rY5uIEXNtnTp1goeHh8EyHfW1BZgXKiqAEIvFyM7OhrOzMzw8PNo9Zc6ErQZQ\nwN9ro3phtA3SmSObYrEYEolEaw2OlqwtMzMT3bt31yp7JZfL8dFHH+Gnn37C4cOH8cYbb7Amc8PB\nHrhg4SWA0lZISkqig4cbN27A3NwcgwcPpssWvr6+rbpQyeVyZGZmQiKRaGVKxRTBoX4o8x9mPVcX\n6dja2lq64Y1thllMvQk2CCxRFypmIyvwzH64c+fOzfqOGAo2G0BRzZ9lZWU6WRtTg6OxclJLRjZV\nKhVycnJQUlICgUCglVdHXl4ewsPDYWxsjOPHj6NXr15tej4cLy9csPCSUltbi1u3btHBw/Xr1wE8\nU5mkyhb+/v7PvWAzHQXbumNnpmOpXW5b/RQoTQe22W8DQHl5OdLT08Hn81nRjMdEJBIhLS0NlpaW\n6N69O635UFlZSfuOUO+JLpomW0JlZSVSU1NZZwAF/D1R0KFDBwiFQr2sjRACmUymkRGqP7JpZ2fX\noPGUKonweDz4+vo225hKCMH58+cxd+5cTJ06FTt37mSNJgoHO+GChX8IlMpkfHw8Pa4pl8sxcOBA\numzBVJnMz89HTk4OLCws9LJjZ2o9UOlYSuuBulBZWFg0ustl7tip0T62QO3uHj9+DA8PD1YJLKnV\nauTl5eH+/fvo27cvevToobE2qmmS2fegUqnocpI+pcOZollsa7BkNs1qO1GgSxob2TQ1NaW/JyqV\nCvn5+ejWrZtWJRGFQoF169YhKioK+/fvx9SpU1nzWnOwFy5Y+IdCqUxSWg8JCQkQiUTw9/dH586d\ncfHiRbz//vvYtGmTQXbFlOkPsxmMeUKkdAXKy8uRkZFBj8+xaTckFouRlpYGMzMz1o0dVldXIzU1\nFYQQCIVCrRoFm9rl1pcOb+t7QBlA1dTUQCgUsqrBkumfoK2Qkb5hjjY/evQIcrkcRkZGGgFdUw3G\nDx8+RHh4OCQSCU6cOAEvL692eAYcLyJcsMAB4NmuMi4uDgsWLEBhYSE8PT2RkpICPz8/uuchODgY\ndnZ2BtmFUCdEZvYBeHYB69SpE1xdXdvcCKYrmKN9vXv3NthIqzYw1Q61bXh7HlQ5iXpfqqqqNDJC\nLe3uf54BVHvDLIkIBAJWBaY1NTVISUmhgz+1Wq0R1CkUCloLJT8/HyNGjEBubi7ef/99jB8/Hl99\n9RWrJks42A8XLHAAeCbrOmzYMEycOBFffPEF+Hw+rTKZkJCAq1evIi8vj1aZpJQmmSqT+oLS2Tc3\nN4ejoyOdKieEaGQeDF1fB1onsGQoFAoF0tPTIZVK9aZ2WL+7v7KykjZkYgp41f+MUAZQjx8/hqen\nZ6MGUO0FIQT379/HvXv3WFcSAYCysjKkp6fTOiL1MwjMkc0rV65gy5YtKCoqgqmpKfz9/REZGYnQ\n0FC4u7uz6nmxBc4nonG4YIEDwLN067Vr1zBs2LBGf0/Vbameh4SEBGRmZsLDw0MjeNBljV6pVNIX\nlPo6+9T4KNXZLxaLoVQqG1hz62vcjnlBcXFxYZUTI/Bsx56RkUFLcBtqlFSlUmk4bFIZIWbTpLGx\nMdLT02FkZAShUNgiAyh9QwVYVVVVEAqFrPIRUavVuHfvHoqLi+Ht7a1Vr05ZWRnef/99lJaWYvbs\n2SgtLcXVq1eRnJyMV155RUPyWJ/s27cP+/btQ2FhIQDAx8cH69atw7hx4xo9PioqCpGRkQ1ur6mp\n0WvTa11dHWvGrtkGFyxwtApKZZIpFJWSkgI3NzeN4KG1u7KnT58iIyMDZmZm8PHxafaCUr++TokS\n1W/O08WJgJKSlsvl8PHx0bnAUltgjs95eHigS5cu7bpLIoTQmSCRSISKigqoVCqYmZnR45q6el/a\nikgkQmpqKmxtbeHj48OKNVHI5XKkpKRApVLB19e3WW8YQgiuX7+OiIgIBAUF4dChQxqBT21tLcrK\nytCjRw99Lx0AcP78eRgbG6NPnz4AgCNHjmD79u24e/cufHx8GhwfFRWFxYsXIzs7W+N2XTczP3ny\nBFu2bMFrr72GUaNGAQAyMzMRHR0NZ2dnvPnmmwZ7jdgOFyxw6ARCCMRiMe1tkZCQQKtMUkJR2qhM\nqlQqevfUp08fuLi4tPpiV1NToxE8yGQyjea8phQNn/ccqVFSZ2dnVklJA898HSgHS6FQyKoGS4VC\ngYyMDFRWVqJv377054XS4GAqTerSMl0bKGO3goKCRqdE2pvy8nKkpaXRol7NZcvUajX27NmDLVu2\nYMuWLVi0aBGrsl4UDg4O2L59O2bMmNHgd1FRUViyZAmdmSu4gP8AACAASURBVNIXt27dwtSpUzF8\n+HBs2rQJWVlZGDt2LIYPH474+HiMHj0a8+fPx9ixY/W6jhcBLljg0AtUmSAxMRGxsbF06pNSmQwJ\nCUFoaKiGymRCQgLUajU9Y69LZ03g7xE0qnRBaT0wg4emLlKU26FYLIa3t7dWgjeGgjl22LNnT7i5\nubHq4tCcARTzfaFGAy0sLDRKF/qQRKYem5rE8PX1ha2trc4fo7Uw7a49PT3RtWvXZu8jEonwwQcf\nICUlBTExMRg8eLABVtoyVCoVTpw4gfDwcNy9exfe3t4NjomKisLMmTPRrVs3qFQq+Pn5YdOmTejf\nv7/O1qFWq2FkZIQjR45g9+7dePvtt1FWVoYBAwYgPDwcd+7cwYoVK2BjY4MNGzZAKBTq7LFfRLhg\ngcMgUCqTycnJiI2NRUJCApKSkmBmZobAwEAQQvDHH3/gwIEDePvttw1ysauvaEhZDjNVJi0tLelx\nTTs7O1ZZcAPP0tNpaWmQy+WsGztsrQFU/TFaiUQCExMTDVEiXUzCUMJZDg4O8PLyYlWWiHpfFQqF\n1p4Yt2/fxrRp0+Dl5YXvv/+eVd4oAJCamorg4GDI5XJYW1sjOjoa48ePb/TYGzdu4N69exAKhZBI\nJNi9ezd+/fVX/PXXX+jbt69O1qNQKOjv8urVq/Hzzz+jtrYWP//8M/0Y586dw2effQZfX198+umn\nrPp+GRouWOBoN2praxEdHY3Vq1dDoVDAzs4O5eXlCAwMpMsWzalM6hLKcri+HDIhBM7OznBzc2OF\nHDJFSUkJMjMzDe45oQ0ymQxpaWlQqVRa6zo0RX3XU2oShtnM2hLjMkqc6sGDB6wTzgL+nv5xdHTU\nyt9FrVbj4MGD+Pjjj7Fq1SqsWrWKVT4aFAqFAvfv34dYLMapU6dw8OBBxMXFNZpZqI9arcaAAQMw\ndOhQ7Nmzp03rWL9+PSIiIuDm5oZjx46hrq4OU6ZMwbRp0/D777/jyJEjeP311+njt2/fjjNnzuD1\n11/HypUr2/TYLzJcsMDRbhw/fhyRkZFYsWIFVq9eDR6P16TKJFW2YKpM6hOxWIzU1FSYmJjAwcEB\nVVVVtBwyM/PQHloPdXV1yM7OZqV3AqB/AyiqxMUsXVDGZcyRzcYaFCkXS10EMbqGEEJnYrQNYqRS\nKRYuXIj4+HhER0djxIgRrAp8nseoUaPQu3dv/Pe//9Xq+FmzZqG4uBgXLlxo8WNJpVLY2NigoqIC\n48ePR01NDQICAnD06FGcPHkSb7zxBjIyMjBjxgz06dMHa9euhbu7O4Bnm4jZs2fj5s2bOHz4MAIC\nAlr8+C8DXLDA0W48evQIJSUlGDBgQKO/V6lUyMjIoMsWCQkJePr0KQICAmihqMDAQJ3u9pmSyPUb\nLCk5ZOa4JlPrgdrh6jN4oHwdrKys4O3tzSrvhPYygKJKXMzShUwma+A9IpFIkJ6ezkqHTap3Qi6X\nw9fXVyu9joyMDISFhcHZ2RnHjh3TqqeBTYwcORI9evRAVFRUs8cSQjBo0CAIhUJ8++23LXqcGTNm\nID8/HxcvXoSpqSmuXLmCkSNHwsnJCX/++Se6dOkClUoFY2NjxMTE4PPPP8err76KVatW0e9Dfn4+\n8vLyMHr06NY81ZcCLljgeGFQq9XIzc2lJaqvXr2K4uJi+Pn50aOagwcPbrXKZFVVFVJTU8Hj8SAQ\nCJrddTK1HqiLFKX1wAwgdHFRYtb/2dixzzYDKIVCofG+SKVSAM/0Hrp06QI7OztYWVmx4jV8+vQp\nUlNTYW9vD29v72bLSYQQREdHY9myZZg/fz42b97MqhJUY6xevRrjxo1Djx49IJVKERMTg08//RS/\n/fYbRo8ejenTp6Nbt27Ytm0bAGDDhg0ICgpC3759IZFIsGfPHnz//fe4du0aBg0a1KLHTkhIwNix\nY7F27VqsWrUKMTEx2LNnD5KTk3H48GFMmzYNSqWSfg3Xrl2Ly5cvIyIiAh988EGDv/dPFW3iggWO\nFxZCCAoLCzWCh7y8PPj4+NA9DyEhIXBycnrul5s5TeDq6tpqo6DnaT00lx5/HtXV1UhLS4NarWad\nSiSbDaCAvz0xAMDFxQUymYxWmjQ2NtaYuDB0SYn6/Obn52vdAFpTU4Ply5fj7NmzOHLkCF577TVW\nvd5NMWPGDPzvf//D48ePwefz4evrixUrVtA79eHDh8PNzY3OMixduhQ//fQTSkpKwOfz0b9/f6xf\nvx7BwcEtelxKZGnfvn1YuHAhfv75Z7z66qsAgE8++QSffvopbt26BaFQCLlcDnNzcygUCkydOhV5\neXk4cuQI+vXrp9PX4kWFCxY4XhqepzJJaT3UV5nMzc3FkydP6AuxrhX7qPQ4VbqQyWS0pkBzRkxM\nt8Nu3bqhT58+rEqdy+VypKens9IACnjWO5GZmdmoJwbVNMnse1Cr1RoTF/pUAFUoFEhLS4NMJtN6\nZPPevXuYNm0azMzMcPz4cfTs2VMva3tZoEYjpVIpcnNzMWfOHCiVSpw8eRK9evVCRUUFwsPDkZub\ni8zMTPrzIRaLUV1djRs3buDtt99u52fBHrhggeOlhRCCJ0+eaAQPlMrk4MGDYWZmhmPHjmHDhg2Y\nPXu2QVK5jWk9WFpaagQPFhYWtIiRRCKBj48PK9wOmbDZAEqlUiErKwtPnjyBj4+PVpoYhBBUV1dr\nZIUoMyZmVkgXkzlisRgpKSng8/nw9vZuNtNECMHZs2cxb948hIWF4YsvvmCVqRVboPoOmMTFxWHi\nxIkYNWoU8vLycPv2bYwfPx4//vgjLCwskJ2djfHjx8Pd3R2fffYZNm7ciLq6Ovz444/0a/xPLTvU\nhwsWDMC2bduwevVqLF68GLt27Wr0mPbSQv8nQakG/vLLL9iwYQMePHgAV1dXyGQyDYnq5lQmdQlT\n60EsFkMikaBDhw5QKpWwsrKCp6cn+Hw+a05WbDaAAp51vaempqJDhw4QCoVt+u4ws0LUbpMp4kUp\nTWr73jBLNtr2nSgUCqxduxbfffcd/vvf/2Ly5Mms+SywiY0bN6J79+6IiIigv7tVVVUYPXo0+vfv\nj6+//hpPnjxBUlISJk2ahGXLlmHz5s0AgOTkZEycOBGWlpZwdHTExYsXWTUlwxbYsx14Sbl58yYO\nHDgAX1/fZo+1tbVtoIXOBQq6g8fjITs7Gx9++CFCQ0Nx/fp1mJubIzExEXFxcThx4gT+/e9/g8/n\na5QtvL299ZaO7tChA5ycnODk5ASVSoXs7Gw8fvwYDg4OUCqVuH37NkxMTDS6+ttL64FqADUyMkJg\nYCCrDKAoK+6cnBy4ubmhZ8+ebQ74LCwsYGFhQQdECoWCnri4f/8+0tPTYWpqqvHeNNU0WVdXRzuA\nBgQEaFWyuX//PsLDw2kxMw8PjzY9n5cN5o5fJpM1eM/Lyspw7949rF27FgDg5OSE1157DTt27MCi\nRYswaNAgvPHGGxg0aBCSk5NRUlICPz8/AI1nKf7pcJkFPVJVVYUBAwbg66+/xubNm+Hn5/fczIIh\ntND/6Tx58gS///47pk6d2uCkTln7JiUlIT4+HnFxcUhKSoKpqSktUT1kyBD4+vrq3GSI2hGbmJhA\nIBDQF2K1Wo3KykqNHS6Px9OQqNZ3Yx51Ic7NzUWPHj1Y57BZV1eHzMxMiEQiCIVCvVhxN4ZKpdKw\n5xaLxTAyMtLIPNja2kIqlSIlJQXW1tYQCARalR0uXbqEmTNn4s0338SXX36pc+nzlwmmU2R2djbM\nzc3h6uoKAOjVqxdmzpyJ1atX08FFaWkpgoKCYGNjg+joaAgEAo2/xwUKjcMFC3okPDwcDg4O2Llz\nJ4YPH95ssKBvLXSOllNbW4tbt27RPQ/Xr1+HWq1GUFAQHTwMGDCg1TVkZmpamx0xpfVQvzGPUjO0\nt7eHra2tzk52zN4JgUBgsAuxtlRWViIlJQVWVlYQCATtKsXN1OGgggelUglCCBwcHODq6go7O7vn\n9ncolUps2bIFX331FXbv3o3333+fKzs8h+XLlyMvLw+nT59GTU0NHB0d8eabb2Lv3r3g8/lYuXIl\nrl+/jh07dtA+GaWlpZg4cSKSkpKwcOFCfPHFF+38LF4MuDKEnoiJicGdO3dw8+ZNrY739PREVFSU\nhhZ6SEiITrXQOVqOmZkZ3c+watUqKJVK/Pnnn4iLi0NCQgK+/PJLyGQyBAYG0qWLgQMHwsLCotmT\nPHOawN/fX6tJDCMjI/D5fPD5fLi6umo05olEIjx48AB1dXUawQOfz29VAyLTACooKIhVnhjMIKt3\n795wdXVt94sq872hyg5isRhdu3aljchqa2s1HDb5fD5daiwtLUVkZCQePXqEa9eucSN7WuDq6orv\nvvsOd+7cwYABAxATE4OJEyciJCQECxYswKRJk5CVlYVly5bhm2++gbOzM86fP4/OnTujsLDwhROy\nak+4zIIeePDgAQICAnDp0iX6C99cZqE+utRC59AfarUa6enptNYDpTLp7+9PZx6CgoIa9BkUFBSg\nsLBQ574OlJohU2VSLpfDxsZGo7b+vFR4aw2gDIVCoUB6ejqqqqogFAp1Pu7aViQSCVJSUmBpadkg\n2yGXyzUyD19//TWSk5Ph7e2NW7duISgoCD/88APrnlN7Q41B1icpKQkLFizAv/71L/z73/+Gqakp\nPv74Y+zZswdnz57FK6+8gitXrmDHjh24ePEievXqhcePH+PIkSN46623AEBDkImjabhgQQ+cOXMG\nEyZM0EgFq1Qq8Hg8GBkZoba2Vqs0cVu00Dnah+ZUJgcMGIDjx4+jtLQUJ0+ehLOzs97XRF2gmF39\nzN2tvb09XUbRpQGUPqCyHdqOHRoSZpOltgJVjx8/xrZt23Djxg1UV1fj4cOHcHJyQmhoKMLCwvDa\na68ZZO379u3Dvn37UFhYCADw8fHBunXrMG7cuCbvc+rUKaxdu5bO7mzZsgUTJkzQ6zpXrVoFd3d3\njcmxyZMnIz8/H3FxcXSvz4gRI1BeXo6zZ8+iV69eAIA//vgDEokEgYGBrJvieRHgggU9IJVKUVRU\npHFbZGQkPD09sWLFigYNNY3RUi309evXY8OGDRq3OTs7o6SkpMn7xMXFYdmyZUhPT0fXrl3x0Ucf\nYc6cOc0+Fof2MFUmT548iUuXLqFz587o1KkTBg4cSEtUd+rUyWC798akkC0tLWFmZobKyko4Ozuz\nTjuBMlkqLCxkZbZDqVQiIyOjRU2WT58+xezZs5GRkYGYmBgEBQVBJpMhOTkZCQkJcHd3x+TJkw2w\neuD8+fMwNjZGnz59AABHjhzB9u3bcffuXfj4+DQ4PjExEaGhodi0aRMmTJiA06dPY926dbh69SoC\nAwP1ssZr164hNDQUAPDNN99g9OjRcHFxQVZWFoRCIY4ePUq/XtXV1XBzc8P48ePx6aefNggOuCbG\nlsMFCwaifhlC11ro69evx8mTJ3H58mX6NmNj4yYFaQoKCiAQCDBr1ix88MEHuHbtGubNm4djx45x\nqmU6RqVSYePGjdixYwc2btyISZMmISEhgc48ZGRkwN3dne6NCA0NNahtck1NDdLT01FZWQlzc3PU\n1NTAzMxMY+LC0tKy3S7OcrkcaWlpqK2t1dpkyZBQ0w7m5uYQCARaNbveunUL06ZNg0AgwHfffcc6\n0S0AcHBwwPbt2zFjxowGv5s8eTIkEolG1vPVV1+Fvb09jh071ubHpsoO1H8JIairq8OHH36ItLQ0\nGBsbo1+/fpgyZQoGDhyIKVOmoKSkBOfOnaPVMK9evYqhQ4fiiy++wOLFi1k1wfMiwp6twz+M+/fv\na3x4xWIxZs+eraGFHh8f3yLTFBMTE3Tu3FmrY/fv3w8XFxc6ePHy8sKtW7ewY8cOLljQMUZGRqiu\nrsb169fpHpZ3330X7777Lq0ymZCQgLi4OOzduxezZs2Cq6srnXUIDQ2Fq6urXk52TAOokJAQmJub\nQ6VSobKyEiKRCCUlJcjOzoaxsTEdOBhS66G8vBxpaWno2LEj/Pz8WJftePToEbKzs2lPkeZeE7Va\njQMHDmDt2rVYs2YNPvroI9btcFUqFU6cOIHq6uomvRgSExOxdOlSjdvGjh2rdU9Wc1Cf9cLCQvp1\nNTIyQpcuXWBvbw8/Pz9cvXoV06dPx6+//oqRI0di//79uHnzJkaOHAmVSoUhQ4bg4MGDGDFiBBco\n6AAus/CSsH79emzfvh18Ph9mZmYIDAzE1q1b6XpdfYYOHYr+/ftj9+7d9G2nT5/GpEmTIJPJWFUL\n/idBCEFlZSWdeUhISMDt27fRuXNnetoiJCQE7u7ubToBMk2MmquvUz4KzL4HptYDpSegyxOyWq3G\nvXv3UFxcDE9PT9Z1ratUKmRmZqK8vBxCoVCrzIBEIsGCBQtw7do1HDt2DMOGDWNVKSU1NRXBwcGQ\ny+WwtrZGdHQ0xo8f3+ixpqamiIqKwrvvvkvfFh0djcjISNTW1rZ5LWq1GuvXr8fmzZvx66+/IiQk\nBDY2NkhKSsKUKVNw5swZ9OvXD3PmzMHt27excOFCLFy4EMuXL8fatWuhUCg0GkubapDk0B4uWHhJ\nuHDhAmQyGdzd3VFaWorNmzcjKysL6enpjZ7I3N3dERERgdWrV9O3Xb9+HSEhIXj06BHXAMQSKBts\nSmUyISEBycnJbVKZbKsBlFqtbmDNrVKpNBwc+Xx+q3fMNTU1SElJgVqthq+vL+sEiaqqqpCSktIi\nSem0tDSEhYWhW7duOHbsmNYZQEOiUChw//59iMVinDp1CgcPHkRcXBy8vb0bHGtqaoojR45g6tSp\n9G0//PADZsyYAblcrpP13Lt3D1u2bMFvv/2GOXPmYNGiRbC3t8fMmTORn5+PP/74A8Az+2uRSIQj\nR45AqVSiqKiIO3/pAfbk9DjaBLNrWSgUIjg4GL1798aRI0ewbNmyRu/TmIJhY7dztB88Hg82NjYY\nM2YMxowZ00Bl8sKFC/jkk0+0VplkGkD169evVWl9IyMj2NrawtbWtoHWg1gsxsOHD6FQKMDn8zWy\nD9o8VmlpKTIyMtC5c2e4u7uzLkVPOVlqq2RJCMH333+P5cuXY9GiRdi4cSOrSilMTE1N6QbHgIAA\n3Lx5E7t378Z///vfBsd27ty5QfN0WVmZTqZ7KKXFPn364PDhw/jwww9x5swZXL9+HRcuXMCCBQuw\nbt06nDt3Dm+88QY2btyIP/74A0lJSSgqKgK3/9UP7PzUcrQZKysrCIVC5ObmNvr7pr7sJiYmrGy2\n4ngGj8eDhYUFhg8fjuHDhwN4pjJ5+/Zt2l3zs88+g1qtRmBgIF228PLywocffoju3btj7ty5Ot15\n8Xg8WFtbw9raGj169KC1HqisQ1ZWFmpqamith8YcHFUqFXJyclBSUgJvb2+DjJS2BMq3o6ysDL6+\nvujYsWOz95HJZPjwww/x888/4/jx4xg/fvwLFYgTQposKQQHB+P333/X6Fu4dOkSrZLYEi5fvoyA\ngABaW4J6jaiJhW3btuH8+fNYunQpRo8ejQ8++AD29vZ48OAB1Go1TExMMGbMGAQGBsLW1hY8Ho9z\nitQDXLDwklJbW4vMzEx61Kg+wcHBOH/+vMZtly5dQkBAgFb9Ci0d1YyNjcWIESMa3J6ZmQlPT89m\nH4+jaczMzDB48GAMHjwYK1eupFUmqeBh586dqKurQ6dOndC5c2fk5OSAz+drpTLZGng8HiwtLWFp\naUn3Gsjlcjp4uHfvHu3gSE1aFBcXo0OHDggKCoKFhYXO19QWqqurkZKSAmNjYwQFBWlVdsjJycH0\n6dNhZWWF27dvw83NTf8LbQOrV6/GuHHj0KNHD0ilUsTExCA2Nha//fYbgIbTW4sXL8bQoUPx2Wef\n4c0338TZs2dx+fJlXL16tUWPe+PGDYwZMwb79+9HRESERgBpbGwMQghMTU3x9ttvIyAgAP/3f/+H\no0ePIi8vD7m5uZg7dy6AZ4ENVU7jRJb0A/eKviQsX74cr7/+OlxcXFBWVobNmzdDIpEgPDwcwDMx\nk4cPH+K7774DAMyZMwd79+7FsmXLMGvWLCQmJuLQoUMtGnvy8fFpMKrZHNnZ2fRoE4AmRzs5Wo+J\niQkCAgLg7+8PS0tLXL58Ge+++y4EAgGuX7+OGTNmoKKiolmVSV1ibm6Ozp0707V6ysGxuLgYxcXF\nAJ65PObn59OZB30FMy2hpKQEGRkZ6N69O/r06aNV2eH06dOYP38+IiIisH37dlbJZDdFaWkppk2b\nhsePH4PP58PX1xe//fYbRo8eDaDh9NbgwYMRExODNWvWYO3atejduzeOHz/eIo0FQgiCgoKwZMkS\nrFmzBl5eXg02N9T7r1ar4erqilOnTmHfvn1ITU1FZmYmjhw5gsjISI3PCRco6AeuwfElYcqUKYiP\nj0d5eTmcnJwQFBSETZs20c1JERERKCwsRGxsLH2fuLg4LF26lBZlWrFihdaiTOvXr8eZM2fw559/\nanU8lVkQiUSclK2BuH//PkaNGoX9+/fjlVdeoW+nJg1iY2ORkJCAhIQEWmWSapocPHgw7O3t9Xax\nViqVyMrKQnl5OQQCAezs7DTMsSorK7W2f9YHarUa2dnZKCkpgY+PDzp16tTsfWpra/Hxxx8jOjoa\n33zzDSZOnNjuwQ6bYU4oBAcHQ6VSITo6mu6bqA9VWnjy5Al+/vlnnDlzBj/++GOrTdw4WgYXLHC0\nipaOalLBgpubG+RyOby9vbFmzZpGSxMcukMbpTpqjJIqWyQkJCAvLw8+Pj60UFRISIjOVCYpESMz\nMzMIBIJG0/pMrQfKR4HSeqCCBxsbG71cjGUyGVJSUsDj8eDr66tVWaSoqAjh4eFQKBT48ccf4e7u\nrvN1vYxQJQORSISePXti4sSJ+Pzzz1vkbsqpMRoGLljgaBUtHdXMzs5GfHw8/P39UVtbi++//x77\n9+9HbGwshg4d2g7PgKMpKLEhZvBAqUwyxzW7devWoos10zuhZ8+e6Nmzp9b3p7QemNkHAA2suds6\nS19WVob09HR06dJFKy0LQgh+++03zJ49G2+99Rb27NnDup4LNvG8C/vFixcxbtw4fPnll5g5c6ZW\nGQNOP8FwcMECh06orq5G79698dFHHzU5qlmf119/HTweD+fOndPz6jjaAiEE5eXlGsHDX3/9BVdX\nVzrrMGTIELi5uTV54q6rq0NGRgYqKyshFAphb2/f5jVJpVI6eKC0Hupbc2u746QMwB49eqT1NEZd\nXR02b96M/fv348svv0R4eDhXdngOzEDh8OHDKCoqgrGxMZYsWQIrKysYGRnRjpGnT5/GyJEjudeT\nRXDBAofOGD16NPr06YN9+/ZpdfyWLVtw9OhRZGZm6nllHLqkvsrk1atXcfv2bTg7O2toPVA78//9\n738oKipC//794ePjo5eGP0rrgRk8KBQK2Nra0qULOzu7Rid9KBEoQgh8fX1p58LnUVJSgoiICJSV\nleHEiRMQCoU6f04vK2+99RaSk5MREhKCW7duoWvXrti6dSvd3DhixAhUVFTgxIkT8PDwaOfVclBw\nwQKHTqitrUXv3r0xe/ZsrFu3Tqv7TJw4EU+fPqWV2DheTKgLdWJiImJjY3H16lUkJyfDxsYGvXr1\nwp9//omFCxdi7dq1ButUp8SrqMBBJBJpaD1QfQ+VlZVIS0vTWgSKEIKEhARERERg+PDhOHDggMZ0\nD0fTyOVyLF26FJmZmTh58iQ6duyIxMREhISEYMqUKfjoo4/g5+eHmpoa9OzZEwEBAYiKitJK04JD\n/3DFHo5WsXz5csTFxaGgoABJSUmYOHFig1HN6dOn08fv2rULZ86cQW5uLtLT07Fq1SqcOnUKCxYs\naNHjPnz4EGFhYXB0dISlpSX8/Pxw+/bt594nLi4O/v7+MDc3R69evbB///6WP2GOJqFEmUaPHo0t\nW7YgNjYWWVlZcHNzQ05ODkJDQ7Fv3z64urrinXfewe7du3Hr1i3U1dXpdU0WFhbo2rUrfHx8MGTI\nEISGhsLNzQ1qtRp5eXmIi4vDn3/+CRsbG9jZ2TW7HpVKhe3bt+Ptt9/GmjVrEB0dzQUKz6H+PlSp\nVGLAgAH4/PPP0bFjR3zxxRcYP348wsLC8Ouvv+K7777Dw4cPYWFhgR9++AGVlZVaZXk4DAM3kMrR\nKoqLizF16lSNUc0bN27A1dUVwDNZ3Pv379PHKxQKLF++nD4Z+Pj44JdffmnSqKYxRCIRQkJCMGLE\nCFy4cAGdOnVCXl7ec0cxCwoKMH78eMyaNQtHjx6lrbidnJw4d009IZFIEBwcjNDQUPz+++/g8/lQ\nKBS4devWc1Um/f399ToGR2k92NnZoaqqClZWVujRowdkMhnu37+P9PR0mJub05kHKysrummyoqIC\ns2bNQnZ2Nq5cudIiN9h/Io01MlpbW2PMmDFwdXXF/v37cfDgQRw4cADvvPMOFi9ejJiYGLi5uSEy\nMhIjR47EyJEj22n1HI3BlSE4XhhWrlyJa9euISEhQev7rFixAufOndPoi5gzZw7++usvJCYm6mOZ\nHACSkpIwaNCgJhvUlEol/vrrL9oc6+rVq6iursagQYNoW+6BAwfqXJiJsrx2cnKCp6enxgVNqVTS\nY5oikQjffPMNLly4AIFAgJycHHh4eNDpc0Ozbds2/PTTT8jKyoKFhQUGDx6Mzz777Lk1/aioKERG\nRja4vaamRisVyrZy79497N27F66urujbty9ee+01+neTJk1C9+7d8Z///AcAMHPmTJw8eRICgQAn\nT56kxbu4aQf2wGUWOF4Yzp07h7Fjx+Kdd95BXFwcunXrhnnz5mHWrFlN3icxMRFjxozRuG3s2LE4\ndOgQ6urqOCtuPdGckp+JiQn8/f3h7++PZcuWQa1WIyMjgxaKioqKQnl5Ofz9/enMQ1BQUKu1FdRq\nNfLz83H//v0mLa9NTEzQsWNHOhjw8PCAo6MjYmNjL2p2pwAAG6JJREFUYW1tjZs3b8LT0xOhoaF4\n++23ERYW1uJ1tJa4uDjMnz8fAwcOhFKpxMcff4wxY8YgIyPjua6ctra2yM7O1rhNX4EC88IeGxuL\nUaNGITQ0FFeuXMG9e/ewatUqLF++HHK5nB7FraysRE1NDSQSCS5dugQXFxcNR04uUGAPXLDA8cKQ\nn5+Pffv2YdmyZVi9ejWSk5OxaNEimJmZafRHMCkpKWkwBufs7AylUony8nLOypYlGBkZQSAQQCAQ\nYMGCBbTKZHx8PK00+uDBA/Tr14+ettBWZbK2thapqalQKBQYNGgQrK2tm11PZWUl5s2bh+TkZERH\nR2PYsGGoq6vDnTt3EB8fD4lEoqunrhWURwPF4cOH0alTJ9y+ffu5OiU8Hs9gdtjUhT06Ohr5+fnY\ns2cP5s2bB4lEgjNnziAyMhJdunTBjBkzEBYWhk2bNuHixYvIzc3FuHHj6NIOJ7LETrhggaNJCCH0\nboEN885qtRoBAQHYunUrAKB///5IT0/Hvn37mgwWAM6K+0XEyMgI7u7ucHd3x8yZM0EIQVFREV22\nWLNmDa0ySQlFNaYyWVRUhMLCQjg6OsLPz0+raYyUlBSEhYXB1dUVd+7coYPNDh06IDAwsEX+B/qi\nsrISAJpVOqyqqoKrqytUKhX8/PywadMm9O/fX2/rOnHiBJYvXw6ZTIbTp08DeJbdmD59OlJSUrBi\nxQpMnz4dK1euhJubGx4/foyuXbti8uTJAJ59N7lAgZ1wOR4ODagLqUqlAo/Hg7GxMWsuql26dKG9\nLii8vLw0Ginrw1lxvxzweDy4ubkhPDwcBw8eRHZ2Nh48eIBVq1aBx+Ph008/Re/eveHv748FCxYg\nOjoaixcvxvDhw9GjRw/4+Pg0GygQQnDkyBGMGjUKU6dOxcWLF1lnlQ08W+eyZcswZMgQCASCJo/z\n9PREVFQUzp07h2PHjsHc3BwhISFN2ta3FJVK1eC2wMBAhIWFQSqVQiqVAgBtc71ixQp06NABJ06c\nAPDMz2bp0qV0oECdczhYCuHgqEdSUhJZtGgRCQkJIZMmTSIxMTHk6dOn7b0sMnXqVDJkyBCN25Ys\nWUKCg4ObvM9HH31EvLy8NG6bM2cOCQoKatFjFxcXk/fee484ODgQCwsL0q9fP3Lr1q0mj79y5QoB\n0OAnMzOzRY/LoR1qtZqUlZWRU6dOkZkzZxIbGxtia2tL+vXrR8LCwsi+fftIamoqkUqlpLq6usFP\nWVkZCQsLIx07diS//vorUavV7f2UmmTevHnE1dWVPHjwoEX3U6lUpF+/fmThwoVtXoNSqaT//9Kl\nS+TGjRukpKSEEELIvXv3yPjx44lQKCSPHj2ij8vKyiLdu3cnV65cafPjcxgeLljg0CAlJYV07NiR\njB8/nhw8eJDMnTuX+Pn5kVdeeYXcvXu3XdeWnJxMTExMyJYtW0hubi754YcfiKWlJTl69Ch9zMqV\nK8m0adPof+fn5xNLS0uydOlSkpGRQQ4dOkQ6dOhATp48qfXjPn36lLi6upKIiAiSlJRECgoKyOXL\nl8m9e/eavA8VLGRnZ5PHjx/TP8yTLIfuiYuLI127diWTJk0iRUVF5Pz582T58uUkKCiIdOjQgXTr\n1o288847ZPfu3eTWrVtEKpWSO3fuEB8fHxIcHEyKiora+yk8lwULFpDu3buT/Pz8Vt1/5syZ5NVX\nX9XJWioqKkhwcDBxd3cnffv2JR4eHuTQoUNEqVSSy5cvk4CAADJs2DCSlZVFioqKyCeffEK6dOlC\nUlNTdfL4HIaFCxY4NFi3bh1xd3cnYrGYvi03N5f85z//IdevX9c4Vq1Wk7q6OqJSqQy2vvPnzxOB\nQEDMzMyIp6cnOXDggMbvw8PDybBhwzRui42NJf379yempqbEzc2N7Nu3r0WPuWLFigYZjeagggWR\nSNSi+3G0jX379pGvvvqqQWZArVYTqVRKLl26RD7++GMydOhQYm5uTvh8PjE1NSVLliwhtbW17bTq\n5lGr1WT+/Pmka9euJCcnp9V/IyAggERGRmp9n8a+2yqVipSXl5MRI0aQKVOmkIqKCkIIIUOHDiW9\nevUid+/eJSqVihw4cIDY29sTPp9PIiIiiKenJ0lISGjV2jnaHy5Y4NDgiy++IL179yYZGRkNfqdQ\nKNphRe2Pl5cXWbJkCZk4cSJxcnIifn5+DYKU+lDBgpubG+ncuTN55ZVXyB9//GGgFXM0h1qtJjKZ\njJw6dYp8/PHHrC47EELI3LlzCZ/PJ7GxsRqZKplMRh8zbdo0snLlSvrf69evJ7/99hvJy8sjd+/e\nJZGRkcTExIQkJSVp9ZhUoKBQKEhGRgaprq6mf1dQUED8/f3J48ePCSHPNhnW1tYa3wuRSERWrVpF\nvLy8yMGDBxv8XY4XCy5Y4NCgpKSEDB06lJiampKIiAgSGxtLp86pL/njx4/JgQMHyNixY8nUqVPJ\n2bNnmwwk1Gr1C596NzMzI2ZmZmTVqlXkzp07ZP/+/cTc3JwcOXKkyftkZWWRAwcOkNu3b5Pr16+T\nuXPnEh6PR+Li4gy4co6Xhcb6XwCQw4cP08cMGzaMhIeH0/9esmQJcXFxIaampsTJyYmMGTOmQXaw\nMZiB07Vr10hwcDCZNm0aiY2NpW8/d+4ccXd3JwqFggwfPpx4enqSGzduEEIIkclkJDk5mRBCSGpq\nKgkLCyMDBw4kDx8+JISQF/588E+FU3DkaJTo6GicOnUKFRUVmDNnDqZMmQLg2SjWsGHDYGtri7Fj\nx6KgoADx8fFYvXo1pk2bBuCZtoGZmVmbbYjZgqmpKQICAnD9+nX6tkWLFuHmzZstUoHkLLk5XiT+\n85//4OOPP8aHH36I0NBQDBkyhBaAevLkCQIDA1FUVISpU6di165dtJjViRMn8Pvvv2Pbtm1wdHTE\n5cuXsXXrVhBCcOXKlfZ8ShxtgNNZ4GiUSZMmITAwEFu3bsXs2bPRq1cv9O/fH3v37kVRURHKy8vp\nY8+dO4fp06fjtddeg729PQ4fPoxvvvkGW7duxZ07d+Dq6opJkybBycmpweNQ41dMLQdCCHg8HmvE\nWZoa2Tx16lSL/k5QUBCOHj2qy6VxcOiFs2fP4uDBgzhz5gzGjh3b4PdWVlaYNm0aDhw4gEmTJtGB\nQnJyMjZv3ozhw4fT4lejRo1CVlYW8vLyWPOd5mg5nM4CB83JkyeRk5MD4Jn0be/evbFt2zY4OTkh\nNjYW1dXVuHLlCkQiETp27Ah/f39s3rwZMpkM9vb2KCgoQG1tLUpLS1FSUoKoqCioVCp89dVXmDx5\nMmQyGf1YVJBgbGzcQMuB+t2ECRMwd+5cek67vQgJCWkgmZuTk0ObZmnL3bt3W6QY6ebmBh6P1+Bn\n/vz5Td7n1KlT8Pb2hpmZGby9vWlhHA6OlnD37l306NEDwcHB9G35+fn4888/8fvvv0Mmk2Hx4sUY\nN24c3nnnHYwZMwZTp07F6NGj8corr2D37t0wMzOjv8uzZs3Czp07uUDhBYbLLHDQHDt2DL/88gsi\nIyMRGBiIuro6/PDDD6iqqoKPjw8IIcjKysLevXsxfvx4nDx5EleuXMHevXthY2ODqqoqSKVS3Lhx\nAwMHDsT3338PJycnvPvuu5gwYQK++eYbLF68GCqVCv/73/+wc+dOAMArr7yCyZMnw8XFBQDoE0pS\nUhLmz5//XDEdKguhT5YuXYrBgwdj69atmDRpEpKTk3HgwAEcOHCAPmbVqlV4+PAhvvvuOwDPLLnd\n3Nzg4+MDhUKBo0eP4tSpUy3KRty8eVND+CYtLQ2jR4/GO++80+jxiYmJmDx5MjZt2oQJEybg9OnT\nmDRpEq5evcoK1UGOF4fCwkJUV1dDqVRCoVBgzZo1SE1NRVJSEgDA0dERcXFx+PbbbzFkyBB6k/HT\nTz/RbpHMLII+3UQ5DER7NkxwsAe1Wk3i4uLIlClTiIODA93B7+bmRmbPnk2qqqrI/7d37zFNnW8c\nwL9QoNykMoFIFaqiFgSmRhyCaH4mChOdqEwR48CxKUZFLtmGGnXq5JYsZjNZpnPjYgCnY2xeyKLg\nBYTq5izd5OYcFtwUdchKi1Sh7fP7g/UIUlBUkMv7SfzDl/ec89Jo+/ac50JEZG9vT4cOHepwbEtL\nC1VXV5NOp6OioiISi8Vc9LM+mGnJkiUUGhpKRG352Xl5ebR//37avXs3eXl5kb+/P929e5cLrrp7\n9y4ZGRlRfn5+l2t++PDhS38dutLTlM2UlBRycXEhc3NzsrW1JT8/P8rLy3uhNURHR5OLi0uXkfvL\nly/vlEMfEBBAK1aseKHrMkPPjRs3yNTUlMRiMZmYmNC0adNoz549JJFI6MKFC+Tt7d3lvyudTscy\nHgYhtllgDLp06RKlpqZ2youOi4sjT09PkslkRNSWIdHY2Mj9/MCBA2RnZ0fXrl0joscf6NOmTaPY\n2FiD19LpdOTp6Ulbt27lxjIzM8nOzq7LwkdKpZKCgoK6POdg8+jRIxoxYgQlJCR0OcfJyYn27t3b\nYWzv3r3k7Ozc28tjBqHy8nLKysqio0ePklKpJLVaTURtXwDeeustCg4OJqLHWVL9Pf2UeTHsMQTD\n0el0XCOXrhrm7Ny5E3fu3MG8efMgFovh4eEBS0tLREVFYdSoUaioqIBKpeKezfP5fKjVapSVlSEu\nLg4AUF5ejszMTJSWlsLe3h7vv/8+hg8fjqamJu7W5YkTJzBlyhQucEqP/nvsIJfL0djYCEtLS27t\ng7md7Y8//giFQoHVq1d3OaerDptP9sZgmGcxadKkToG9AKBSqfDw4UOu26X+/x3r6zC4Dd53V6bH\njI2NuWeM9F/HyfaICMOGDUNWVhbOnz+PJUuWcK2Fx4wZg1u3bqG2thbm5ubYs2cPAKCurg7btm2D\npaUlli1bhoaGBixevBjFxcUICAgAn8/Hhg0bUFxcjFGjRkGj0QAAioqK4Ofn16mdMP2X6VtWVga1\nWv3UZ/FEBI1G0+l3GWi++eYbzJ8/H0KhsNt5hjpssjdx5mV48OABSktLMX/+fKhUqm47vTKDD7uz\nwBikj7x/ckz/4WPoW4dcLkddXR2ioqJw8+ZNeHp6gs/no7m5GUlJSTA1NUVBQQEUCgWOHj3Ktcr9\n448/4OPjAycnJ/D5fPz777+4c+cO3njjjU7R0/pvMRUVFTAzM4Onpye3Nj39XQb9Wp+lLXF/Vltb\ni4KCAuTm5nY7r6sOm/2xcyIzsOzduxeXLl1CaWkpfH19kZGRAWDw39FjHhvY76JMn2tfC0Gn08HI\nyIh7s5DL5VAqlQgLC8OoUaOQnp6Ou3fvIiQkhNtYCAQC2NjYQCqVYurUqZDJZEhOTgafz4eLiwsA\nID8/HwKBgPv7k9RqNaqrqzFy5EiMGTOmw7qAtg1FZWUlsrKycPbsWYwdOxZhYWGYN2+ewTe29o9f\n+qO0tDQ4ODhgwYIF3c7z8fFBfn4+YmNjubHTp0/D19e3t5fIDHI+Pj64d+8eVq9ejcDAQACARqMZ\n8BtxpgdeUawEM8g8evSI1q5dS2KxuNt5Wq2WYmNjycLCgtzd3SkyMpLMzMxo+fLlJJfLiehxZsGT\nTZj0AVRlZWU0Z84c2rZtG3fO9mQyGTk5OVFISAh99dVXFBERQa+//jqdOXOGm1NdXc01wOnPtFot\nOTs7U3x8fKefPdkLoKSkhHg8HiUnJ1NlZSUlJyeTiYkJV4b3WYlEIoOlhdevX29wflpamsH5+oC4\noSAxMZG8vLzI2tqa7O3tKSgoiKqqqp56XE5ODrm5uZGZmRm5ublRbm5uH6z2+bQv6c6yHYYetllg\nXoqWlhbKycmh5ORkIiJqbW0ljUbT5ZtKQ0MDnTx5kuRyOQUFBdHWrVtJpVIREZGtrS1t2bKFWltb\nOxyjP9eRI0fI29ubazOt0Wi4jcSdO3fonXfeIS8vrw7HJiQk0MSJE4morXb9mjVrSCwWU15eHoWF\nhdGBAweooaHB4Fo1Gk239ex7Mwr81KlTXKvrJz3ZC4CI6LvvviOxWEympqbk6upK33//fY+vee/e\nvQ7NivLz8wkAnTt3zuD8tLQ0srGx6XCMvsHQUBEQEEBpaWlUVlZGMpmMFixYQM7OzlzKsSESiYR4\nPB4lJiZSZWUlJSYmPtfmjmH6AusNwfQ5MhB0p8+CaG1thbe3N3bu3IlFixYZPG7Xrl04c+YMUlNT\nMX78+A4/KyoqQnR0NCorK2FlZQVnZ2esXLkSCoUCeXl5OHXqFHQ6HSIjI1FUVITw8HBYWVkhJycH\nfn5+SE1NfWpQYPvntEPhVmxMTAxOnjyJ69evG3xd0tPTERMTA4VC8QpW1z/9888/cHBwQGFhIZc1\n8KSQkBAolUr89NNP3Nibb74JW1tbHD58uK+WyjDPhEWmMH2ufdyD/g+PxwMRwdTUFFKptNNGQX9c\nS0sLZDIZiAgCgaDTObVaLWpqalBSUgKJRIKwsDAUFhYiPT0dAoEALS0tqKurg1QqRVxcHD7//HMk\nJiYiLi4O586dg0Qi4a5TUFCAwMBA+Pn5ISMjAyqVCsDjIEsiwtixY5Gdnd0h4+LMmTPYtGkT1Gp1\nr76OfUFffTIiIqLbDVRTUxNEIhFGjx6NhQsXorS0tA9X2f80NjYCAF577bUu51y8eBH+/v4dxgIC\nAjo0LGOY/oJtFphXpn2/A/3fdTpdt2mODx48gKOjI0pKSjBx4kTMnDkT27dvx9mzZ/Hw4UOIRCI0\nNzfDyMgIYrEYsbGxOHnyJGpqapCVlQUnJyf8/vvvsLS0xNKlS7nzuri4YNiwYVAqlQCAffv2ISIi\nAtbW1vD398fp06exadMmzJ07F1euXIFKpcLBgwfB4/Ewfvx4mJiYwNjYGK2trbhw4QIOHjwICwsL\nDPQbd89S38HV1RXp6ek4fvw4Dh8+DHNzc8ycORPXr1/vu4X2I0SEuLg4+Pn5wcPDo8t5rC4GM6C8\nimcfDPMylJSU0NatW8nT05OEQiFXhnrZsmU0Z84cunnzJhERNTU1kUKhIKK22Ir4+PhOMQ2pqak0\nevRoun37NhG1xU188sknXHXKvLw8sre3J19fXyovL6eSkhISCARkZGREbm5utHbtWqqpqaH6+npa\nunQpvf3229y5tVrtgA0I8/f3p4ULF/boGK1WS5MnT6aoqKheWlX/tn79ehKJRPTXX391O8/U1JSy\ns7M7jGVmZhKfz+/N5THMcxncD1uZQYf+S9nk8Xjw9fWFr68vEhISALTddQCAhIQEbNy4EZMnT4aH\nhwdEIhEmTJiAmJgYNDc3o7q6Gm5ubtw51Wo1KioqYGdnB0dHRxQUFKCpqQnvvfcebGxsAACBgYGw\nsLCAs7MzhEIhJk2ahKlTp2LEiBHw9fVFTk4O5HI5XF1d8dtvvyEmJgYPHjyAsbExLCws+v6Fegme\ntb7Dk4yNjTF9+vQheWchKioKx48fR1FREUaPHt3tXFYXgxlI2GMIZkAxMjLi6iHodDpoNBquM6OV\nlRV0Oh0mTJiAU6dOobi4GMHBwRAKhfDx8YGNjQ2qqqoglUrh5eXFnbO+vh4VFRWYMmUKAODq1asQ\nCoVwdHTkKkr+/fffsLa2hpubG4YPHw61Wg25XI7Zs2cjLi4OEokE//vf/3DlyhU0Njbil19+wcqV\nK2Fra4uQkBDcv3+/j1+pF/es9R2eRESQyWQ9ascNtAWLbtu2DWPHjoWFhQXGjRuH3bt3P7X6ZmFh\nIaZNmwZzc3OMGzcO+/fv79F1XwYiwsaNG5Gbm8vV9ngafV2M9lhdDKa/YncWmAHL2Ni4U5Gl9pUb\nDVWZdHJywpIlS7g2ugBQXV2N8vJyhISEAGgLTrO1tUV9fT3Xm+Ly5ctobW3lsi9+/vlnEFGHwlFa\nrRZlZWVQKBQQi8WIjIzEjRs3sGzZMhw7dgwRERG98jr0Bp1Oh7S0NISHh3fK9tAX3UpKSgIA7Nq1\nCzNmzMCECROgVCqxb98+yGQyfPHFFz26ZkpKCvbv34+MjAy4u7vj119/xbvvvguBQIDo6GiDx8jl\ncgQGBmLNmjXIzMxESUkJ1q9fD3t7ewQHBz/fL/8cNmzYgOzsbBw7dgzDhg3j7hgIBALuztKTr1t0\ndDRmz56NlJQUBAUF4dixYygoKEBxcXGfrZthntkrfQjCML1Ip9N1W+tBTyKRkLe3N1cU6uLFiyQS\niejLL78kIqLS0lKaNWsWubm5kVQqJSKijz/+mLy9venq1avceRoaGig4OJjmzp3LjSmVSgoODqag\noCBuTQNBT+o7xMTEkLOzM5mZmZG9vT35+/uTRCLp8TUXLFhAERERHcaWLl1Kq1at6vKYjz76iFxd\nXTuMRUZG0owZM3p8/RcBA0WpAFBaWho3p7fqYjBMX2CbBWZIedZgwx07dpCVlRV5eHjQihUraOTI\nkRQaGspVfVy0aBGtWrWK6uvruWOqqqrI1dW1Q5tohUJBAQEB3IfEQA107AtJSUkkEom4DYpMJiMH\nB4dOQYDtzZo1izZt2tRhLDc3l0xMTDpUHGQY5sWwxxDMkNJVbwh9CmdLSwuampqwa9cuREVFoaqq\nCiYmJrh27Rrc3d25vHkHBwfcvn0bw4cP585TW1uLuro6zJ07lxurr6/HlStX8NlnnwFgbXy7Ex8f\nj8bGRri6uoLH40Gr1SIhIQGhoaFdHtNV+qFGo0F9fX2P4yYYhjGMBTgyQ56xsTH3Id7c3Iz09HSk\np6fDzs4OYrEYX3/9Ne7fv9+hgE54eDjKysogFAqxceNGAG2BkdbW1lwnTAC4ceMG7t+/j3nz5gFg\nm4XuHDlyBJmZmcjOzoZUKkVGRgY+/fRTrsNhVwy15TY0zjDM82N3FhimHQsLC7S0tCA+Ph4ffPAB\nbG1tYWlpid27d2P69OncPD8/P/z555/Iy8vjCjldvnwZI0eOBPA4xVMqlcLR0REODg5PLSM91H34\n4YfYvHkzVqxYAQDw9PREbW0tkpKSEB4ebvCYrtIPTUxMMGLEiF5fM8MMFWyzwDDt8Pl8bN68GZs3\nb8b169dRVVUFHx8fLitCj/4rTb148WJu7Ntvv0VdXR2Atm+1zc3NOHHiBJdBoa8PwRjW3Nzc6TER\nj8frNnXSx8cHJ06c6DB2+vRpeHl5wdTUtFfWyTBDEWskxTAvoH1TKUPKy8tBRPDw8GB3Fp5i9erV\nKCgowIEDB+Du7o7S0lKsXbsWERERSElJAQBs2bIFt27dwqFDhwC0pU56eHggMjISa9aswcWLF7Fu\n3TocPny4T1MnGWawY5sFhmH6BZVKhe3bt+OHH37AvXv3IBQKERoaih07dsDMzAxA24aipqYG58+f\n544rLCxEbGwsysvLIRQKER8fj3Xr1r2i34JhBie2WWCYXsTuJjAMMxiwbAiG6UVso8AwzGDANgsM\nwzAMw3SLbRYYhmEYhukW2ywwDMMwDNMttllgGIZhGKZbbLPAMAzDMEy3/g911SZz8hdt8wAAAABJ\nRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\nm8OHDwtvb2/x6KOPipSUlKo+9GrPBx98IObMmSOEEGLNmjVi8uTJQgghcnNzRWZmpjh8+LDw8vIS\nM2fOFBqNRrz66qvCyclJrFixQgghhF6vF+np6VW2foWyoYgFhTJjMBiETqcTBoOh3PY5btw40axZ\nM2FjYyMaNGggevfuLQsFIYR45JFHxOjRo01+54cffhC+vr7C2tpatG7dWmzbtq3c1qNQMzAYDOLq\n1ati48aNYtKkScLPz0+oVCrh6+srxo4dK7744guRkJAgi4esrCzxzTffiJ07d4r4+HizoiInJ0d8\n+umnwsHBQcydO1cUFhZW9WGWYMmSJaJjx47C0dFRNGjQQAwePFicOXOmStc0depUERwcLHr06CHU\narXYtGmTyevTp08XY8aMEXl5eUIIIZYvXy4aNGggGjZsKP766y95O71eX6nrVrg7lJoFhTsi/i4e\nVLzXFaozQghu3bolt2pGRERw6tQpPD096dSpE8nJyVy9epVDhw7h7u5e4vdzc3N57bXX2Lt3L998\n8w39+/evlkWz/fv359lnn6VTp07odDrmzJlDTEwMcXFxZs2jKhKpGPHixYt06NCB/Px8Pv/8c0aO\nHGmSHhoyZAg6nY6ff/4ZgClTpuDu7k7//v1p3759pa5Z4d5RxILCv3L06FG+++47Tpw4gbu7O0OH\nDqVv377UqVOnqpdW6dytPXVoaChjx44t8Xx+fj62trYVudQHGiEEmZmZfPnllyxYsAAnJyeys7Nx\ncnIy8Xrw9fXl7NmzjBo1CmdnZzZv3oynp2dVL7/MSJ0cBw8eLDFcqaIofuPw22+/sWvXLo4cOULb\ntm158803adWqlSwYVqxYwRdffIG3tze3b98mKyuL/fv3y6JNKN1MNQKlwFHhjsTExPD444+TlJTE\n2LFjqVevHsuWLWPYsGGcOnWqqpdX6Xh4eLBs2TKOHz/O8ePHefTRRxk8eDCxsbGl/o6zszPXr183\neShCoWJRqVTs2rWLefPmMW/ePC5dusTVq1f56quvaNWqFdu2baNbt254eHjQuXNn+vTpQ1hYWI0S\nClBUiAlFrqeVgbFQOHnyJKmpqTzyyCOsXLmSadOmceLECUJDQ8nOzpadFl988UVef/11nJ2d6dix\nI6dPn8bd3V0WE4pQqBkokQWFO/L222+zefNmjh49iouLCwBJSUns2rWLzp07m4yxFkKg1+uxsLB4\n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\nrkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "iris = DataSet(name=\"iris\")\n", - "\n", - "show_iris()\n", - "show_iris(0, 1, 3)\n", - "show_iris(1, 2, 3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can play around with the values to get a good look at the dataset." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DISTANCE FUNCTIONS\n", - "\n", - "In a lot of algorithms (like the *k-Nearest Neighbors* algorithm), there is a need to compare items, finding how *similar* or *close* they are. For that we have many different functions at our disposal. Below are the functions implemented in the module:\n", - "\n", - "### Manhattan Distance (`manhattan_distance`)\n", - "\n", - "One of the simplest distance functions. It calculates the difference between the coordinates/features of two items. To understand how it works, imagine a 2D grid with coordinates *x* and *y*. In that grid we have two items, at the squares positioned at `(1,2)` and `(3,4)`. The difference between their two coordinates is `3-1=2` and `4-2=2`. If we sum these up we get `4`. That means to get from `(1,2)` to `(3,4)` we need four moves; two to the right and two more up. The function works similarly for n-dimensional grids." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Manhattan Distance between (1,2) and (3,4) is 4\n" - ] - } - ], - "source": [ - "def manhattan_distance(X, Y):\n", - " return sum([abs(x - y) for x, y in zip(X, Y)])\n", - "\n", - "\n", - "distance = manhattan_distance([1,2], [3,4])\n", - "print(\"Manhattan Distance between (1,2) and (3,4) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Euclidean Distance (`euclidean_distance`)\n", - "\n", - "Probably the most popular distance function. It returns the square root of the sum of the squared differences between individual elements of two items." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Euclidean Distance between (1,2) and (3,4) is 2.8284271247461903\n" - ] - } - ], - "source": [ - "def euclidean_distance(X, Y):\n", - " return math.sqrt(sum([(x - y)**2 for x, y in zip(X,Y)]))\n", - "\n", - "\n", - "distance = euclidean_distance([1,2], [3,4])\n", - "print(\"Euclidean Distance between (1,2) and (3,4) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hamming Distance (`hamming_distance`)\n", - "\n", - "This function counts the number of differences between single elements in two items. For example, if we have two binary strings \"111\" and \"011\" the function will return 1, since the two strings only differ at the first element. The function works the same way for non-binary strings too." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hamming Distance between 'abc' and 'abb' is 1\n" - ] - } - ], - "source": [ - "def hamming_distance(X, Y):\n", - " return sum(x != y for x, y in zip(X, Y))\n", - "\n", - "\n", - "distance = hamming_distance(['a','b','c'], ['a','b','b'])\n", - "print(\"Hamming Distance between 'abc' and 'abb' is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mean Boolean Error (`mean_boolean_error`)\n", - "\n", - "To calculate this distance, we find the ratio of different elements over all elements of two items. For example, if the two items are `(1,2,3)` and `(1,4,5)`, the ration of different/all elements is 2/3, since they differ in two out of three elements." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Boolean Error Distance between (1,2,3) and (1,4,5) is 0.6666666666666666\n" - ] - } - ], - "source": [ - "def mean_boolean_error(X, Y):\n", - " return mean(int(x != y) for x, y in zip(X, Y))\n", - "\n", - "\n", - "distance = mean_boolean_error([1,2,3], [1,4,5])\n", - "print(\"Mean Boolean Error Distance between (1,2,3) and (1,4,5) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mean Error (`mean_error`)\n", - "\n", - "This function finds the mean difference of single elements between two items. For example, if the two items are `(1,0,5)` and `(3,10,5)`, their error distance is `(3-1) + (10-0) + (5-5) = 2 + 10 + 0 = 12`. The mean error distance therefore is `12/3=4`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Error Distance between (1,0,5) and (3,10,5) is 4\n" - ] - } - ], - "source": [ - "def mean_error(X, Y):\n", - " return mean([abs(x - y) for x, y in zip(X, Y)])\n", - "\n", - "\n", - "distance = mean_error([1,0,5], [3,10,5])\n", - "print(\"Mean Error Distance between (1,0,5) and (3,10,5) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mean Square Error (`ms_error`)\n", - "\n", - "This is very similar to the `Mean Error`, but instead of calculating the difference between elements, we are calculating the *square* of the differences." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Square Distance between (1,0,5) and (3,10,5) is 34.666666666666664\n" - ] - } - ], - "source": [ - "def ms_error(X, Y):\n", - " return mean([(x - y)**2 for x, y in zip(X, Y)])\n", - "\n", - "\n", - "distance = ms_error([1,0,5], [3,10,5])\n", - "print(\"Mean Square Distance between (1,0,5) and (3,10,5) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Root of Mean Square Error (`rms_error`)\n", - "\n", - "This is the square root of `Mean Square Error`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Root of Mean Error Distance between (1,0,5) and (3,10,5) is 5.887840577551898\n" - ] - } - ], - "source": [ - "def rms_error(X, Y):\n", - " return math.sqrt(ms_error(X, Y))\n", - "\n", - "\n", - "distance = rms_error([1,0,5], [3,10,5])\n", - "print(\"Root of Mean Error Distance between (1,0,5) and (3,10,5) is\", distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PLURALITY LEARNER CLASSIFIER\n", - "\n", - "### Overview\n", - "\n", - "The Plurality Learner is a simple algorithm, used mainly as a baseline comparison for other algorithms. It finds the most popular class in the dataset and classifies any subsequent item to that class. Essentially, it classifies every new item to the same class. For that reason, it is not used very often, instead opting for more complicated algorithms when we want accurate classification.\n", - "\n", - "![pL plot](images/pluralityLearner_plot.png)\n", - "\n", - "Let's see how the classifier works with the plot above. There are three classes named **Class A** (orange-colored dots) and **Class B** (blue-colored dots) and **Class C** (green-colored dots). Every point in this plot has two **features** (i.e. X1, X2). Now, let's say we have a new point, a red star and we want to know which class this red star belongs to. Solving this problem by predicting the class of this new red star is our current classification problem.\n", - "\n", - "The Plurality Learner will find the class most represented in the plot. ***Class A*** has four items, ***Class B*** has three and ***Class C*** has seven. The most popular class is ***Class C***. Therefore, the item will get classified in ***Class C***, despite the fact that it is closer to the other two classes." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "Below follows the implementation of the PluralityLearner algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(PluralityLearner)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It takes as input a dataset and returns a function. We can later call this function with the item we want to classify as the argument and it returns the class it should be classified in.\n", - "\n", - "The function first finds the most popular class in the dataset and then each time we call its \"predict\" function, it returns it. Note that the input (\"example\") does not matter. The function always returns the same class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "For this example, we will not use the Iris dataset, since each class is represented the same. This will throw an error. Instead we will use the zoo dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "mammal\n" - ] - } - ], - "source": [ - "zoo = DataSet(name=\"zoo\")\n", - "\n", - "pL = PluralityLearner(zoo)\n", - "print(pL([1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output for the above code is \"mammal\", since that is the most popular and common class in the dataset." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## K-NEAREST NEIGHBOURS CLASSIFIER\n", - "\n", - "### Overview\n", - "The k-Nearest Neighbors algorithm is a non-parametric method used for classification and regression. We are going to use this to classify Iris flowers. More about kNN on [Scholarpedia](http://www.scholarpedia.org/article/K-nearest_neighbor).\n", - "\n", - "![kNN plot](images/knn_plot.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how kNN works with a simple plot shown in the above picture.\n", - "\n", - "We have co-ordinates (we call them **features** in Machine Learning) of this red star and we need to predict its class using the kNN algorithm. In this algorithm, the value of **k** is arbitrary. **k** is one of the **hyper parameters** for kNN algorithm. We choose this number based on our dataset and choosing a particular number is known as **hyper parameter tuning/optimising**. We learn more about this in coming topics.\n", - "\n", - "Let's put **k = 3**. It means you need to find 3-Nearest Neighbors of this red star and classify this new point into the majority class. Observe that smaller circle which contains three points other than **test point** (red star). As there are two violet points, which form the majority, we predict the class of red star as **violet- Class B**.\n", - "\n", - "Similarly if we put **k = 5**, you can observe that there are three yellow points, which form the majority. So, we classify our test point as **yellow- Class A**.\n", - "\n", - "In practical tasks, we iterate through a bunch of values for k (like [1, 3, 5, 10, 20, 50, 100]), see how it performs and select the best one. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "Below follows the implementation of the kNN algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(NearestNeighborLearner)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It takes as input a dataset and k (default value is 1) and it returns a function, which we can later use to classify a new item.\n", - "\n", - "To accomplish that, the function uses a heap-queue, where the items of the dataset are sorted according to their distance from *example* (the item to classify). We then take the k smallest elements from the heap-queue and we find the majority class. We classify the item to this class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "We measured a new flower with the following values: 5.1, 3.0, 1.1, 0.1. We want to classify that item/flower in a class. To do that, we write the following:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], - "source": [ - "iris = DataSet(name=\"iris\")\n", - "\n", - "kNN = NearestNeighborLearner(iris,k=3)\n", - "print(kNN([5.1,3.0,1.1,0.1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output of the above code is \"setosa\", which means the flower with the above measurements is of the \"setosa\" species." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DECISION TREE LEARNER\n", - "\n", - "### Overview\n", - "\n", - "#### Decision Trees\n", - "A decision tree is a flowchart that uses a tree of decisions and their possible consequences for classification. At each non-leaf node of the tree an attribute of the input is tested, based on which corresponding branch leading to a child-node is selected. At the leaf node the input is classified based on the class label of this leaf node. The paths from root to leaves represent classification rules based on which leaf nodes are assigned class labels.\n", - "![perceptron](images/decisiontree_fruit.jpg)\n", - "#### Decision Tree Learning\n", - "Decision tree learning is the construction of a decision tree from class-labeled training data. The data is expected to be a tuple in which each record of the tuple is an attribute used for classification. The decision tree is built top-down, by choosing a variable at each step that best splits the set of items. There are different metrics for measuring the \"best split\". These generally measure the homogeneity of the target variable within the subsets.\n", - "\n", - "#### Gini Impurity\n", - "Gini impurity of a set is the probability of a randomly chosen element to be incorrectly labeled if it was randomly labeled according to the distribution of labels in the set.\n", - "\n", - "$$I_G(p) = \\sum{p_i(1 - p_i)} = 1 - \\sum{p_i^2}$$\n", - "\n", - "We select split which minimizes the Gini impurity in childre nodes.\n", - "\n", - "#### Information Gain\n", - "Information gain is based on the concept of entropy from information theory. Entropy is defined as:\n", - "\n", - "$$H(p) = -\\sum{p_i \\log_2{p_i}}$$\n", - "\n", - "Information Gain is difference between entropy of the parent and weighted sum of entropy of children. The feature used for splitting is the one which provides the most information gain.\n", - "\n", - "#### Pseudocode\n", - "\n", - "You can view the pseudocode by running the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "pseudocode(\"Decision Tree Learning\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "The nodes of the tree constructed by our learning algorithm are stored using either `DecisionFork` or `DecisionLeaf` based on whether they are a parent node or a leaf node respectively." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(DecisionFork)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`DecisionFork` holds the attribute, which is tested at that node, and a dict of branches. The branches store the child nodes, one for each of the attribute's values. Calling an object of this class as a function with input tuple as an argument returns the next node in the classification path based on the result of the attribute test." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(DecisionLeaf)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The leaf node stores the class label in `result`. All input tuples' classification paths end on a `DecisionLeaf` whose `result` attribute decide their class." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(DecisionTreeLearner)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The implementation of `DecisionTreeLearner` provided in [learning.py](https://github.com/aimacode/aima-python/blob/master/learning.py) uses information gain as the metric for selecting which attribute to test for splitting. The function builds the tree top-down in a recursive manner. Based on the input it makes one of the four choices:\n", - "
      \n", - "
    1. If the input at the current step has no training data we return the mode of classes of input data recieved in the parent step (previous level of recursion).
    2. \n", - "
    3. If all values in training data belong to the same class it returns a `DecisionLeaf` whose class label is the class which all the data belongs to.
    4. \n", - "
    5. If the data has no attributes that can be tested we return the class with highest plurality value in the training data.
    6. \n", - "
    7. We choose the attribute which gives the highest amount of entropy gain and return a `DecisionFork` which splits based on this attribute. Each branch recursively calls `decision_tree_learning` to construct the sub-tree.
    8. \n", - "
    " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NAIVE BAYES LEARNER\n", - "\n", - "### Overview\n", - "\n", - "#### Theory of Probabilities\n", - "\n", - "The Naive Bayes algorithm is a probabilistic classifier, making use of [Bayes' Theorem](https://en.wikipedia.org/wiki/Bayes%27_theorem). The theorem states that the conditional probability of **A** given **B** equals the conditional probability of **B** given **A** multiplied by the probability of **A**, divided by the probability of **B**.\n", - "\n", - "$$P(A|B) = \\dfrac{P(B|A)*P(A)}{P(B)}$$\n", - "\n", - "From the theory of Probabilities we have the Multiplication Rule, if the events *X* are independent the following is true:\n", - "\n", - "$$P(X_{1} \\cap X_{2} \\cap ... \\cap X_{n}) = P(X_{1})*P(X_{2})*...*P(X_{n})$$\n", - "\n", - "For conditional probabilities this becomes:\n", - "\n", - "$$P(X_{1}, X_{2}, ..., X_{n}|Y) = P(X_{1}|Y)*P(X_{2}|Y)*...*P(X_{n}|Y)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Classifying an Item\n", - "\n", - "How can we use the above to classify an item though?\n", - "\n", - "We have a dataset with a set of classes (**C**) and we want to classify an item with a set of features (**F**). Essentially what we want to do is predict the class of an item given the features.\n", - "\n", - "For a specific class, **Class**, we will find the conditional probability given the item features:\n", - "\n", - "$$P(Class|F) = \\dfrac{P(F|Class)*P(Class)}{P(F)}$$\n", - "\n", - "We will do this for every class and we will pick the maximum. This will be the class the item is classified in.\n", - "\n", - "The features though are a vector with many elements. We need to break the probabilities up using the multiplication rule. Thus the above equation becomes:\n", - "\n", - "$$P(Class|F) = \\dfrac{P(Class)*P(F_{1}|Class)*P(F_{2}|Class)*...*P(F_{n}|Class)}{P(F_{1})*P(F_{2})*...*P(F_{n})}$$\n", - "\n", - "The calculation of the conditional probability then depends on the calculation of the following:\n", - "\n", - "*a)* The probability of **Class** in the dataset.\n", - "\n", - "*b)* The conditional probability of each feature occuring in an item classified in **Class**.\n", - "\n", - "*c)* The probabilities of each individual feature.\n", - "\n", - "For *a)*, we will count how many times **Class** occurs in the dataset (aka how many items are classified in a particular class).\n", - "\n", - "For *b)*, if the feature values are discrete ('Blue', '3', 'Tall', etc.), we will count how many times a feature value occurs in items of each class. If the feature values are not discrete, we will go a different route. We will use a distribution function to calculate the probability of values for a given class and feature. If we know the distribution function of the dataset, then great, we will use it to compute the probabilities. If we don't know the function, we can assume the dataset follows the normal (Gaussian) distribution without much loss of accuracy. In fact, it can be proven that any distribution tends to the Gaussian the larger the population gets (see [Central Limit Theorem](https://en.wikipedia.org/wiki/Central_limit_theorem)).\n", - "\n", - "*NOTE:* If the values are continuous but use the discrete approach, there might be issues if we are not lucky. For one, if we have two values, '5.0 and 5.1', with the discrete approach they will be two completely different values, despite being so close. Second, if we are trying to classify an item with a feature value of '5.15', if the value does not appear for the feature, its probability will be 0. This might lead to misclassification. Generally, the continuous approach is more accurate and more useful, despite the overhead of calculating the distribution function.\n", - "\n", - "The last one, *c)*, is tricky. If feature values are discrete, we can count how many times they occur in the dataset. But what if the feature values are continuous? Imagine a dataset with a height feature. Is it worth it to count how many times each value occurs? Most of the time it is not, since there can be miscellaneous differences in the values (for example, 1.7 meters and 1.700001 meters are practically equal, but they count as different values).\n", - "\n", - "So as we cannot calculate the feature value probabilities, what are we going to do?\n", - "\n", - "Let's take a step back and rethink exactly what we are doing. We are essentially comparing conditional probabilities of all the classes. For two classes, **A** and **B**, we want to know which one is greater:\n", - "\n", - "$$\\dfrac{P(F|A)*P(A)}{P(F)} vs. \\dfrac{P(F|B)*P(B)}{P(F)}$$\n", - "\n", - "Wait, **P(F)** is the same for both the classes! In fact, it is the same for every combination of classes. That is because **P(F)** does not depend on a class, thus being independent of the classes.\n", - "\n", - "So, for *c)*, we actually don't need to calculate it at all." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Wrapping It Up\n", - "\n", - "Classifying an item to a class then becomes a matter of calculating the conditional probabilities of feature values and the probabilities of classes. This is something very desirable and computationally delicious.\n", - "\n", - "Remember though that all the above are true because we made the assumption that the features are independent. In most real-world cases that is not true though. Is that an issue here? Fret not, for the the algorithm is very efficient even with that assumption. That is why the algorithm is called **Naive** Bayes Classifier. We (naively) assume that the features are independent to make computations easier." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "The implementation of the Naive Bayes Classifier is split in two; *Learning* and *Simple*. The *learning* classifier takes as input a dataset and learns the needed distributions from that. It is itself split into two, for discrete and continuous features. The *simple* classifier takes as input not a dataset, but already calculated distributions (a dictionary of `CountingProbDist` objects)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Discrete\n", - "\n", - "The implementation for discrete values counts how many times each feature value occurs for each class, and how many times each class occurs. The results are stored in a `CountinProbDist` object." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the below code you can see the probabilities of the class \"Setosa\" appearing in the dataset and the probability of the first feature (at index 0) of the same class having a value of 5. Notice that the second probability is relatively small, even though if we observe the dataset we will find that a lot of values are around 5. The issue arises because the features in the Iris dataset are continuous, and we are assuming they are discrete. If the features were discrete (for example, \"Tall\", \"3\", etc.) this probably wouldn't have been the case and we would see a much nicer probability distribution." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.3333333333333333\n", - "0.10588235294117647\n" - ] - } - ], - "source": [ - "dataset = iris\n", - "\n", - "target_vals = dataset.values[dataset.target]\n", - "target_dist = CountingProbDist(target_vals)\n", - "attr_dists = {(gv, attr): CountingProbDist(dataset.values[attr])\n", - " for gv in target_vals\n", - " for attr in dataset.inputs}\n", - "for example in dataset.examples:\n", - " targetval = example[dataset.target]\n", - " target_dist.add(targetval)\n", - " for attr in dataset.inputs:\n", - " attr_dists[targetval, attr].add(example[attr])\n", - "\n", - "\n", - "print(target_dist['setosa'])\n", - "print(attr_dists['setosa', 0][5.0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we found the different values for the classes (called targets here) and calculated their distribution. Next we initialized a dictionary of `CountingProbDist` objects, one for each class and feature. Finally, we iterated through the examples in the dataset and calculated the needed probabilites.\n", - "\n", - "Having calculated the different probabilities, we will move on to the predicting function. It will receive as input an item and output the most likely class. Using the above formula, it will multiply the probability of the class appearing, with the probability of each feature value appearing in the class. It will return the max result." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], - "source": [ - "def predict(example):\n", - " def class_probability(targetval):\n", - " return (target_dist[targetval] *\n", - " product(attr_dists[targetval, attr][example[attr]]\n", - " for attr in dataset.inputs))\n", - " return argmax(target_vals, key=class_probability)\n", - "\n", - "\n", - "print(predict([5, 3, 1, 0.1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can view the complete code by executing the next line:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(NaiveBayesDiscrete)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Continuous\n", - "\n", - "In the implementation we use the Gaussian/Normal distribution function. To make it work, we need to find the means and standard deviations of features for each class. We make use of the `find_means_and_deviations` Dataset function. On top of that, we will also calculate the class probabilities as we did with the Discrete approach." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "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" - ] - } - ], - "source": [ - "means, deviations = dataset.find_means_and_deviations()\n", - "\n", - "target_vals = dataset.values[dataset.target]\n", - "target_dist = CountingProbDist(target_vals)\n", - "\n", - "\n", - "print(means[\"setosa\"])\n", - "print(deviations[\"versicolor\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can see the means of the features for the \"Setosa\" class and the deviations for \"Versicolor\".\n", - "\n", - "The prediction function will work similarly to the Discrete algorithm. It will multiply the probability of the class occuring with the conditional probabilities of the feature values for the class.\n", - "\n", - "Since we are using the Gaussian distribution, we will input the value for each feature into the Gaussian function, together with the mean and deviation of the feature. This will return the probability of the particular feature value for the given class. We will repeat for each class and pick the max value." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "setosa\n" - ] - } - ], - "source": [ - "def predict(example):\n", - " def class_probability(targetval):\n", - " prob = target_dist[targetval]\n", - " for attr in dataset.inputs:\n", - " prob *= gaussian(means[targetval][attr], deviations[targetval][attr], example[attr])\n", - " return prob\n", - "\n", - " return argmax(target_vals, key=class_probability)\n", - "\n", - "\n", - "print(predict([5, 3, 1, 0.1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The complete code of the continuous algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(NaiveBayesContinuous)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Simple\n", - "\n", - "The simple classifier (chosen with the argument `simple`) does not learn from a dataset, instead it takes as input a dictionary of already calculated `CountingProbDist` objects and returns a predictor function. The dictionary is in the following form: `(Class Name, Class Probability): CountingProbDist Object`.\n", - "\n", - "Each class has its own probability distribution. The classifier given a list of features calculates the probability of the input for each class and returns the max. The only pre-processing work is to create dictionaries for the distribution of classes (named `targets`) and attributes/features.\n", - "\n", - "The complete code for the simple classifier:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(NaiveBayesSimple)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This classifier is useful when you already have calculated the distributions and you need to predict future items." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Examples\n", - "\n", - "We will now use the Naive Bayes Classifier (Discrete and Continuous) to classify items:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "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" - ] - } - ], - "source": [ - "nBD = NaiveBayesLearner(iris, continuous=False)\n", - "print(\"Discrete Classifier\")\n", - "print(nBD([5, 3, 1, 0.1]))\n", - "print(nBD([6, 5, 3, 1.5]))\n", - "print(nBD([7, 3, 6.5, 2]))\n", - "\n", - "\n", - "nBC = NaiveBayesLearner(iris, continuous=True)\n", - "print(\"\\nContinuous Classifier\")\n", - "print(nBC([5, 3, 1, 0.1]))\n", - "print(nBC([6, 5, 3, 1.5]))\n", - "print(nBC([7, 3, 6.5, 2]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice how the Discrete Classifier misclassified the second item, while the Continuous one had no problem.\n", - "\n", - "Let's now take a look at the simple classifier. First we will come up with a sample problem to solve. Say we are given three bags. Each bag contains three letters ('a', 'b' and 'c') of different quantities. We are given a string of letters and we are tasked with finding from which bag the string of letters came.\n", - "\n", - "Since we know the probability distribution of the letters for each bag, we can use the naive bayes classifier to make our prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "bag1 = 'a'*50 + 'b'*30 + 'c'*15\n", - "dist1 = CountingProbDist(bag1)\n", - "bag2 = 'a'*30 + 'b'*45 + 'c'*20\n", - "dist2 = CountingProbDist(bag2)\n", - "bag3 = 'a'*20 + 'b'*20 + 'c'*35\n", - "dist3 = CountingProbDist(bag3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have the `CountingProbDist` objects for each bag/class, we will create the dictionary. We assume that it is equally probable that we will pick from any bag." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "dist = {('First', 0.5): dist1, ('Second', 0.3): dist2, ('Third', 0.2): dist3}\n", - "nBS = NaiveBayesLearner(dist, simple=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can start making predictions:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First\n", - "Second\n", - "Third\n" - ] - } - ], - "source": [ - "print(nBS('aab')) # We can handle strings\n", - "print(nBS(['b', 'b'])) # And lists!\n", - "print(nBS('ccbcc'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results make intuitive sence. The first bag has a high amount of 'a's, the second has a high amount of 'b's and the third has a high amount of 'c's. The classifier seems to confirm this intuition.\n", - "\n", - "Note that the simple classifier doesn't distinguish between discrete and continuous values. It just takes whatever it is given. Also, the `simple` option on the `NaiveBayesLearner` overrides the `continuous` argument. `NaiveBayesLearner(d, simple=True, continuous=False)` just creates a simple classifier." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PERCEPTRON CLASSIFIER\n", - "\n", - "### Overview\n", - "\n", - "The Perceptron is a linear classifier. It works the same way as a neural network with no hidden layers (just input and output). First it trains its weights given a dataset and then it can classify a new item by running it through the network.\n", - "\n", - "Its input layer consists of the the item features, while the output layer consists of nodes (also called neurons). Each node in the output layer has *n* synapses (for every item feature), each with its own weight. Then, the nodes find the dot product of the item features and the synapse weights. These values then pass through an activation function (usually a sigmoid). Finally, we pick the largest of the values and we return its index.\n", - "\n", - "Note that in classification problems each node represents a class. The final classification is the class/node with the max output value.\n", - "\n", - "Below you can see a single node/neuron in the outer layer. With *f* we denote the item features, with *w* the synapse weights, then inside the node we have the dot product and the activation function, *g*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![perceptron](images/perceptron.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "First, we train (calculate) the weights given a dataset, using the `BackPropagationLearner` function of `learning.py`. We then return a function, `predict`, which we will use in the future to classify a new item. The function computes the (algebraic) dot product of the item with the calculated weights for each node in the outer layer. Then it picks the greatest value and classifies the item in the corresponding class." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(PerceptronLearner)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the Perceptron is a one-layer neural network, without any hidden layers. So, in `BackPropagationLearner`, we will pass no hidden layers. From that function we get our network, which is just one layer, with the weights calculated.\n", - "\n", - "That function `predict` passes the input/example through the network, calculating the dot product of the input and the weights for each node and returns the class with the max dot product." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "We will train the Perceptron on the iris dataset. Because though the `BackPropagationLearner` works with integer indexes and not strings, we need to convert class names to integers. Then, we will try and classify the item/flower with measurements of 5, 3, 1, 0.1." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], - "source": [ - "iris = DataSet(name=\"iris\")\n", - "iris.classes_to_numbers()\n", - "\n", - "perceptron = PerceptronLearner(iris)\n", - "print(perceptron([5, 3, 1, 0.1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The correct output is 0, which means the item belongs in the first class, \"setosa\". Note that the Perceptron algorithm is not perfect and may produce false classifications." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LEARNER EVALUATION\n", - "\n", - "In this section we will evaluate and compare algorithm performance. The dataset we will use will again be the iris one." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "iris = DataSet(name=\"iris\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Naive Bayes\n", - "\n", - "First up we have the Naive Bayes algorithm. First we will test how well the Discrete Naive Bayes works, and then how the Continuous fares." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for Discrete: 0.040000000000000036\n", - "Error ratio for Continuous: 0.040000000000000036\n" - ] - } - ], - "source": [ - "nBD = NaiveBayesLearner(iris, continuous=False)\n", - "print(\"Error ratio for Discrete:\", err_ratio(nBD, iris))\n", - "\n", - "nBC = NaiveBayesLearner(iris, continuous=True)\n", - "print(\"Error ratio for Continuous:\", err_ratio(nBC, iris))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The error for the Naive Bayes algorithm is very, very low; close to 0. There is also very little difference between the discrete and continuous version of the algorithm." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## k-Nearest Neighbors\n", - "\n", - "Now we will take a look at kNN, for different values of *k*. Note that *k* should have odd values, to break any ties between two classes." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for k=1: 0.0\n", - "Error ratio for k=3: 0.06000000000000005\n", - "Error ratio for k=5: 0.1266666666666667\n", - "Error ratio for k=7: 0.19999999999999996\n" - ] - } - ], - "source": [ - "kNN_1 = NearestNeighborLearner(iris, k=1)\n", - "kNN_3 = NearestNeighborLearner(iris, k=3)\n", - "kNN_5 = NearestNeighborLearner(iris, k=5)\n", - "kNN_7 = NearestNeighborLearner(iris, k=7)\n", - "\n", - "print(\"Error ratio for k=1:\", err_ratio(kNN_1, iris))\n", - "print(\"Error ratio for k=3:\", err_ratio(kNN_3, iris))\n", - "print(\"Error ratio for k=5:\", err_ratio(kNN_5, iris))\n", - "print(\"Error ratio for k=7:\", err_ratio(kNN_7, iris))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice how the error became larger and larger as *k* increased. This is generally the case with datasets where classes are spaced out, as is the case with the iris dataset. If items from different classes were closer together, classification would be more difficult. Usually a value of 1, 3 or 5 for *k* suffices.\n", - "\n", - "Also note that since the training set is also the testing set, for *k* equal to 1 we get a perfect score, since the item we want to classify each time is already in the dataset and its closest neighbor is itself." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Perceptron\n", - "\n", - "For the Perceptron, we first need to convert class names to integers. Let's see how it performs in the dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error ratio for Perceptron: 0.31333333333333335\n" - ] - } - ], - "source": [ - "iris2 = DataSet(name=\"iris\")\n", - "iris2.classes_to_numbers()\n", - "\n", - "perceptron = PerceptronLearner(iris2)\n", - "print(\"Error ratio for Perceptron:\", err_ratio(perceptron, iris2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Perceptron didn't fare very well mainly because the dataset is not linearly separated. On simpler datasets the algorithm performs much better, but unfortunately such datasets are rare in real life scenarios." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/learning.py b/learning.py deleted file mode 100644 index f5bc5d835..000000000 --- a/learning.py +++ /dev/null @@ -1,1224 +0,0 @@ -"""Learn to estimate functions from examples. (Chapters 18, 20)""" - -from utils import ( - removeall, unique, product, mode, argmax, argmax_random_tie, isclose, gaussian, - dotproduct, vector_add, scalar_vector_product, weighted_sample_with_replacement, - weighted_sampler, num_or_str, normalize, clip, sigmoid, print_table, - open_data, sigmoid_derivative, probability, norm, matrix_multiplication -) - -import copy -import heapq -import math -import random - -from statistics import mean, stdev -from collections import defaultdict - -# ______________________________________________________________________________ - - -def euclidean_distance(X, Y): - return math.sqrt(sum([(x - y)**2 for x, y in zip(X, Y)])) - - -def rms_error(X, Y): - return math.sqrt(ms_error(X, Y)) - - -def ms_error(X, Y): - return mean([(x - y)**2 for x, y in zip(X, Y)]) - - -def mean_error(X, Y): - return mean([abs(x - y) for x, y in zip(X, Y)]) - - -def manhattan_distance(X, Y): - return sum([abs(x - y) for x, y in zip(X, Y)]) - - -def mean_boolean_error(X, Y): - return mean(int(x != y) for x, y in zip(X, Y)) - - -def hamming_distance(X, Y): - return sum(x != y for x, y in zip(X, Y)) - -# ______________________________________________________________________________ - - -class DataSet: - """A data set for a machine learning problem. It has the following fields: - - d.examples A list of examples. Each one is a list of attribute values. - d.attrs A list of integers to index into an example, so example[attr] - gives a value. Normally the same as range(len(d.examples[0])). - d.attrnames Optional list of mnemonic names for corresponding attrs. - d.target The attribute that a learning algorithm will try to predict. - By default the final attribute. - d.inputs The list of attrs without the target. - d.values A list of lists: each sublist is the set of possible - values for the corresponding attribute. If initially None, - it is computed from the known examples by self.setproblem. - If not None, an erroneous value raises ValueError. - d.distance A function from a pair of examples to a nonnegative number. - Should be symmetric, etc. Defaults to mean_boolean_error - since that can handle any field types. - d.name Name of the data set (for output display only). - d.source URL or other source where the data came from. - d.exclude A list of attribute indexes to exclude from d.inputs. Elements - of this list can either be integers (attrs) or attrnames. - - Normally, you call the constructor and you're done; then you just - access fields like d.examples and d.target and d.inputs.""" - - def __init__(self, examples=None, attrs=None, attrnames=None, target=-1, - inputs=None, values=None, distance=mean_boolean_error, - name='', source='', exclude=()): - """Accepts any of DataSet's fields. Examples can also be a - string or file from which to parse examples using parse_csv. - Optional parameter: exclude, as documented in .setproblem(). - >>> DataSet(examples='1, 2, 3') - - """ - self.name = name - self.source = source - self.values = values - self.distance = distance - if values is None: - self.got_values_flag = False - else: - self.got_values_flag = True - - # Initialize .examples from string or list or data directory - if isinstance(examples, str): - self.examples = parse_csv(examples) - elif examples is None: - self.examples = parse_csv(open_data(name + '.csv').read()) - else: - self.examples = examples - # Attrs are the indices of examples, unless otherwise stated. - if attrs is None and self.examples is not None: - attrs = list(range(len(self.examples[0]))) - self.attrs = attrs - # Initialize .attrnames from string, list, or by default - if isinstance(attrnames, str): - self.attrnames = attrnames.split() - else: - self.attrnames = attrnames or attrs - self.setproblem(target, inputs=inputs, exclude=exclude) - - def setproblem(self, target, inputs=None, exclude=()): - """Set (or change) the target and/or inputs. - This way, one DataSet can be used multiple ways. inputs, if specified, - is a list of attributes, or specify exclude as a list of attributes - to not use in inputs. Attributes can be -n .. n, or an attrname. - Also computes the list of possible values, if that wasn't done yet.""" - self.target = self.attrnum(target) - exclude = list(map(self.attrnum, exclude)) - if inputs: - self.inputs = removeall(self.target, inputs) - else: - self.inputs = [a for a in self.attrs - if a != self.target and a not in exclude] - if not self.values: - self.update_values() - self.check_me() - - def check_me(self): - """Check that my fields make sense.""" - assert len(self.attrnames) == len(self.attrs) - assert self.target in self.attrs - assert self.target not in self.inputs - assert set(self.inputs).issubset(set(self.attrs)) - if self.got_values_flag: - # only check if values are provided while initializing DataSet - list(map(self.check_example, self.examples)) - - def add_example(self, example): - """Add an example to the list of examples, checking it first.""" - self.check_example(example) - self.examples.append(example) - - def check_example(self, example): - """Raise ValueError if example has any invalid values.""" - if self.values: - for a in self.attrs: - if example[a] not in self.values[a]: - raise ValueError('Bad value {} for attribute {} in {}' - .format(example[a], self.attrnames[a], example)) - - def attrnum(self, attr): - """Returns the number used for attr, which can be a name, or -n .. n-1.""" - if isinstance(attr, str): - return self.attrnames.index(attr) - elif attr < 0: - return len(self.attrs) + attr - else: - return attr - - def update_values(self): - self.values = list(map(unique, zip(*self.examples))) - - def sanitize(self, example): - """Return a copy of example, with non-input attributes replaced by None.""" - return [attr_i if i in self.inputs else None - for i, attr_i in enumerate(example)] - - def classes_to_numbers(self, classes=None): - """Converts class names to numbers.""" - if not classes: - # If classes were not given, extract them from values - classes = sorted(self.values[self.target]) - for item in self.examples: - item[self.target] = classes.index(item[self.target]) - - def remove_examples(self, value=""): - """Remove examples that contain given value.""" - self.examples = [x for x in self.examples if value not in x] - self.update_values() - - def split_values_by_classes(self): - """Split values into buckets according to their class.""" - buckets = defaultdict(lambda: []) - target_names = self.values[self.target] - - for v in self.examples: - item = [a for a in v if a not in target_names] # Remove target from item - buckets[v[self.target]].append(item) # Add item to bucket of its class - - return buckets - - def find_means_and_deviations(self): - """Finds the means and standard deviations of self.dataset. - means : A dictionary for each class/target. Holds a list of the means - of the features for the class. - deviations: A dictionary for each class/target. Holds a list of the sample - standard deviations of the features for the class.""" - target_names = self.values[self.target] - feature_numbers = len(self.inputs) - - item_buckets = self.split_values_by_classes() - - means = defaultdict(lambda: [0 for i in range(feature_numbers)]) - deviations = defaultdict(lambda: [0 for i in range(feature_numbers)]) - - for t in target_names: - # Find all the item feature values for item in class t - features = [[] for i in range(feature_numbers)] - for item in item_buckets[t]: - features = [features[i] + [item[i]] for i in range(feature_numbers)] - - # Calculate means and deviations fo the class - for i in range(feature_numbers): - means[t][i] = mean(features[i]) - deviations[t][i] = stdev(features[i]) - - return means, deviations - - def __repr__(self): - return ''.format( - self.name, len(self.examples), len(self.attrs)) - -# ______________________________________________________________________________ - - -def parse_csv(input, delim=','): - r"""Input is a string consisting of lines, each line has comma-delimited - fields. Convert this into a list of lists. Blank lines are skipped. - Fields that look like numbers are converted to numbers. - The delim defaults to ',' but '\t' and None are also reasonable values. - >>> parse_csv('1, 2, 3 \n 0, 2, na') - [[1, 2, 3], [0, 2, 'na']]""" - lines = [line for line in input.splitlines() if line.strip()] - return [list(map(num_or_str, line.split(delim))) for line in lines] - -# ______________________________________________________________________________ - - -class CountingProbDist: - """A probability distribution formed by observing and counting examples. - If p is an instance of this class and o is an observed value, then - there are 3 main operations: - p.add(o) increments the count for observation o by 1. - p.sample() returns a random element from the distribution. - p[o] returns the probability for o (as in a regular ProbDist).""" - - def __init__(self, observations=[], default=0): - """Create a distribution, and optionally add in some observations. - By default this is an unsmoothed distribution, but saying default=1, - for example, gives you add-one smoothing.""" - self.dictionary = {} - self.n_obs = 0.0 - self.default = default - self.sampler = None - - for o in observations: - self.add(o) - - def add(self, o): - """Add an observation o to the distribution.""" - self.smooth_for(o) - self.dictionary[o] += 1 - self.n_obs += 1 - self.sampler = None - - def smooth_for(self, o): - """Include o among the possible observations, whether or not - it's been observed yet.""" - if o not in self.dictionary: - self.dictionary[o] = self.default - self.n_obs += self.default - self.sampler = None - - def __getitem__(self, item): - """Return an estimate of the probability of item.""" - self.smooth_for(item) - return self.dictionary[item] / self.n_obs - - # (top() and sample() are not used in this module, but elsewhere.) - - def top(self, n): - """Return (count, obs) tuples for the n most frequent observations.""" - return heapq.nlargest(n, [(v, k) for (k, v) in self.dictionary.items()]) - - def sample(self): - """Return a random sample from the distribution.""" - if self.sampler is None: - self.sampler = weighted_sampler(list(self.dictionary.keys()), - list(self.dictionary.values())) - return self.sampler() - -# ______________________________________________________________________________ - - -def PluralityLearner(dataset): - """A very dumb algorithm: always pick the result that was most popular - in the training data. Makes a baseline for comparison.""" - most_popular = mode([e[dataset.target] for e in dataset.examples]) - - def predict(example): - """Always return same result: the most popular from the training set.""" - return most_popular - return predict - -# ______________________________________________________________________________ - - -def NaiveBayesLearner(dataset, continuous=True, simple=False): - if simple: - return NaiveBayesSimple(dataset) - if(continuous): - return NaiveBayesContinuous(dataset) - else: - return NaiveBayesDiscrete(dataset) - - -def NaiveBayesSimple(distribution): - """A simple naive bayes classifier that takes as input a dictionary of - CountingProbDist objects and classifies items according to these distributions. - The input dictionary is in the following form: - (ClassName, ClassProb): CountingProbDist""" - target_dist = {c_name: prob for c_name, prob in distribution.keys()} - attr_dists = {c_name: count_prob for (c_name, _), count_prob in distribution.items()} - - def predict(example): - """Predict the target value for example. Calculate probabilities for each - class and pick the max.""" - def class_probability(targetval): - attr_dist = attr_dists[targetval] - return target_dist[targetval] * product(attr_dist[a] for a in example) - - return argmax(target_dist.keys(), key=class_probability) - - return predict - - -def NaiveBayesDiscrete(dataset): - """Just count how many times each value of each input attribute - occurs, conditional on the target value. Count the different - target values too.""" - - target_vals = dataset.values[dataset.target] - target_dist = CountingProbDist(target_vals) - attr_dists = {(gv, attr): CountingProbDist(dataset.values[attr]) - for gv in target_vals - for attr in dataset.inputs} - for example in dataset.examples: - targetval = example[dataset.target] - target_dist.add(targetval) - for attr in dataset.inputs: - attr_dists[targetval, attr].add(example[attr]) - - def predict(example): - """Predict the target value for example. Consider each possible value, - and pick the most likely by looking at each attribute independently.""" - def class_probability(targetval): - return (target_dist[targetval] * - product(attr_dists[targetval, attr][example[attr]] - for attr in dataset.inputs)) - return argmax(target_vals, key=class_probability) - - return predict - - -def NaiveBayesContinuous(dataset): - """Count how many times each target value occurs. - Also, find the means and deviations of input attribute values for each target value.""" - means, deviations = dataset.find_means_and_deviations() - - target_vals = dataset.values[dataset.target] - target_dist = CountingProbDist(target_vals) - - def predict(example): - """Predict the target value for example. Consider each possible value, - and pick the most likely by looking at each attribute independently.""" - def class_probability(targetval): - prob = target_dist[targetval] - for attr in dataset.inputs: - prob *= gaussian(means[targetval][attr], deviations[targetval][attr], example[attr]) - return prob - - return argmax(target_vals, key=class_probability) - - return predict - -# ______________________________________________________________________________ - - -def NearestNeighborLearner(dataset, k=1): - """k-NearestNeighbor: the k nearest neighbors vote.""" - def predict(example): - """Find the k closest items, and have them vote for the best.""" - best = heapq.nsmallest(k, ((dataset.distance(e, example), e) - for e in dataset.examples)) - return mode(e[dataset.target] for (d, e) in best) - return predict - -# ______________________________________________________________________________ - - -def truncated_svd(X, num_val=2, max_iter=1000): - """Computes the first component of SVD""" - - def normalize_vec(X, n = 2): - """Normalizes two parts (:m and m:) of the vector""" - X_m = X[:m] - X_n = X[m:] - norm_X_m = norm(X_m, n) - Y_m = [x/norm_X_m for x in X_m] - norm_X_n = norm(X_n, n) - Y_n = [x/norm_X_n for x in X_n] - return Y_m + Y_n - - def remove_component(X): - """Removes components of already obtained eigen vectors from X""" - X_m = X[:m] - X_n = X[m:] - for eivec in eivec_m: - coeff = dotproduct(X_m, eivec) - X_m = [x1 - coeff*x2 for x1, x2 in zip(X_m, eivec)] - for eivec in eivec_n: - coeff = dotproduct(X_n, eivec) - X_n = [x1 - coeff*x2 for x1, x2 in zip(X_n, eivec)] - return X_m + X_n - - m, n = len(X), len(X[0]) - A = [[0 for _ in range(n + m)] for _ in range(n + m)] - for i in range(m): - for j in range(n): - A[i][m + j] = A[m + j][i] = X[i][j] - - eivec_m = [] - eivec_n = [] - eivals = [] - - for _ in range(num_val): - X = [random.random() for _ in range(m + n)] - X = remove_component(X) - X = normalize_vec(X) - - for _ in range(max_iter): - old_X = X - X = matrix_multiplication(A, [[x] for x in X]) - X = [x[0] for x in X] - X = remove_component(X) - X = normalize_vec(X) - # check for convergence - if norm([x1 - x2 for x1, x2 in zip(old_X, X)]) <= 1e-10: - break - - projected_X = matrix_multiplication(A, [[x] for x in X]) - projected_X = [x[0] for x in projected_X] - eivals.append(norm(projected_X, 1)/norm(X, 1)) - eivec_m.append(X[:m]) - eivec_n.append(X[m:]) - return (eivec_m, eivec_n, eivals) - -# ______________________________________________________________________________ - - -class DecisionFork: - """A fork of a decision tree holds an attribute to test, and a dict - of branches, one for each of the attribute's values.""" - - def __init__(self, attr, attrname=None, default_child=None, branches=None): - """Initialize by saying what attribute this node tests.""" - self.attr = attr - self.attrname = attrname or attr - self.default_child = default_child - self.branches = branches or {} - - def __call__(self, example): - """Given an example, classify it using the attribute and the branches.""" - attrvalue = example[self.attr] - if attrvalue in self.branches: - return self.branches[attrvalue](example) - else: - # return default class when attribute is unknown - return self.default_child(example) - - def add(self, val, subtree): - """Add a branch. If self.attr = val, go to the given subtree.""" - self.branches[val] = subtree - - def display(self, indent=0): - name = self.attrname - print('Test', name) - for (val, subtree) in self.branches.items(): - print(' ' * 4 * indent, name, '=', val, '==>', end=' ') - subtree.display(indent + 1) - - def __repr__(self): - return ('DecisionFork({0!r}, {1!r}, {2!r})' - .format(self.attr, self.attrname, self.branches)) - - -class DecisionLeaf: - """A leaf of a decision tree holds just a result.""" - - def __init__(self, result): - self.result = result - - def __call__(self, example): - return self.result - - def display(self, indent=0): - print('RESULT =', self.result) - - def __repr__(self): - return repr(self.result) - -# ______________________________________________________________________________ - - -def DecisionTreeLearner(dataset): - """[Figure 18.5]""" - - target, values = dataset.target, dataset.values - - def decision_tree_learning(examples, attrs, parent_examples=()): - if len(examples) == 0: - return plurality_value(parent_examples) - elif all_same_class(examples): - return DecisionLeaf(examples[0][target]) - elif len(attrs) == 0: - return plurality_value(examples) - else: - A = choose_attribute(attrs, examples) - tree = DecisionFork(A, dataset.attrnames[A], plurality_value(examples)) - for (v_k, exs) in split_by(A, examples): - subtree = decision_tree_learning( - exs, removeall(A, attrs), examples) - tree.add(v_k, subtree) - return tree - - def plurality_value(examples): - """Return the most popular target value for this set of examples. - (If target is binary, this is the majority; otherwise plurality.)""" - popular = argmax_random_tie(values[target], - key=lambda v: count(target, v, examples)) - return DecisionLeaf(popular) - - def count(attr, val, examples): - """Count the number of examples that have attr = val.""" - return sum(e[attr] == val for e in examples) - - def all_same_class(examples): - """Are all these examples in the same target class?""" - class0 = examples[0][target] - return all(e[target] == class0 for e in examples) - - def choose_attribute(attrs, examples): - """Choose the attribute with the highest information gain.""" - return argmax_random_tie(attrs, - key=lambda a: information_gain(a, examples)) - - def information_gain(attr, examples): - """Return the expected reduction in entropy from splitting by attr.""" - def I(examples): - return information_content([count(target, v, examples) - for v in values[target]]) - N = float(len(examples)) - remainder = sum((len(examples_i) / N) * I(examples_i) - for (v, examples_i) in split_by(attr, examples)) - return I(examples) - remainder - - def split_by(attr, examples): - """Return a list of (val, examples) pairs for each val of attr.""" - return [(v, [e for e in examples if e[attr] == v]) - for v in values[attr]] - - return decision_tree_learning(dataset.examples, dataset.inputs) - - -def information_content(values): - """Number of bits to represent the probability distribution in values.""" - probabilities = normalize(removeall(0, values)) - return sum(-p * math.log2(p) for p in probabilities) - -# ______________________________________________________________________________ - - -def RandomForest(dataset, n=5): - """An ensemble of Decision Trees trained using bagging and feature bagging.""" - - def data_bagging(dataset, m=0): - """Sample m examples with replacement""" - n = len(dataset.examples) - return weighted_sample_with_replacement(m or n, dataset.examples, [1]*n) - - def feature_bagging(dataset, p=0.7): - """Feature bagging with probability p to retain an attribute""" - inputs = [i for i in dataset.inputs if probability(p)] - return inputs or dataset.inputs - - def predict(example): - print([predictor(example) for predictor in predictors]) - return mode(predictor(example) for predictor in predictors) - - predictors = [DecisionTreeLearner(DataSet(examples=data_bagging(dataset), - attrs=dataset.attrs, - attrnames=dataset.attrnames, - target=dataset.target, - inputs=feature_bagging(dataset))) for _ in range(n)] - - return predict - -# ______________________________________________________________________________ - -# A decision list is implemented as a list of (test, value) pairs. - - -def DecisionListLearner(dataset): - """[Figure 18.11]""" - - def decision_list_learning(examples): - if not examples: - return [(True, False)] - t, o, examples_t = find_examples(examples) - if not t: - raise Exception - return [(t, o)] + decision_list_learning(examples - examples_t) - - def find_examples(examples): - """Find a set of examples that all have the same outcome under - some test. Return a tuple of the test, outcome, and examples.""" - raise NotImplementedError - - def passes(example, test): - """Does the example pass the test?""" - raise NotImplementedError - - def predict(example): - """Predict the outcome for the first passing test.""" - for test, outcome in predict.decision_list: - if passes(example, test): - return outcome - predict.decision_list = decision_list_learning(set(dataset.examples)) - - return predict - -# ______________________________________________________________________________ - - -def NeuralNetLearner(dataset, hidden_layer_sizes=[3], - learning_rate=0.01, epochs=100): - """Layered feed-forward network. - hidden_layer_sizes: List of number of hidden units per hidden layer - learning_rate: Learning rate of gradient descent - epochs: Number of passes over the dataset - """ - - i_units = len(dataset.inputs) - o_units = len(dataset.values[dataset.target]) - - # construct a network - raw_net = network(i_units, hidden_layer_sizes, o_units) - learned_net = BackPropagationLearner(dataset, raw_net, - learning_rate, epochs) - - def predict(example): - - # Input nodes - i_nodes = learned_net[0] - - # Activate input layer - for v, n in zip(example, i_nodes): - n.value = v - - # Forward pass - for layer in learned_net[1:]: - for node in layer: - inc = [n.value for n in node.inputs] - in_val = dotproduct(inc, node.weights) - node.value = node.activation(in_val) - - # Hypothesis - o_nodes = learned_net[-1] - prediction = find_max_node(o_nodes) - return prediction - - return predict - - -def random_weights(min_value, max_value, num_weights): - return [random.uniform(min_value, max_value) for i in range(num_weights)] - - -def BackPropagationLearner(dataset, net, learning_rate, epochs): - """[Figure 18.23] The back-propagation algorithm for multilayer network""" - # Initialise weights - for layer in net: - for node in layer: - node.weights = random_weights(min_value=-0.5, max_value=0.5, - num_weights=len(node.weights)) - - examples = dataset.examples - ''' - As of now dataset.target gives an int instead of list, - Changing dataset class will have effect on all the learners. - Will be taken care of later - ''' - o_nodes = net[-1] - i_nodes = net[0] - o_units = len(o_nodes) - idx_t = dataset.target - idx_i = dataset.inputs - n_layers = len(net) - - inputs, targets = init_examples(examples, idx_i, idx_t, o_units) - - for epoch in range(epochs): - # Iterate over each example - for e in range(len(examples)): - i_val = inputs[e] - t_val = targets[e] - - # Activate input layer - for v, n in zip(i_val, i_nodes): - n.value = v - - # Forward pass - for layer in net[1:]: - for node in layer: - inc = [n.value for n in node.inputs] - in_val = dotproduct(inc, node.weights) - node.value = node.activation(in_val) - - # Initialize delta - delta = [[] for i in range(n_layers)] - - # Compute outer layer delta - - # Error for the MSE cost function - err = [t_val[i] - o_nodes[i].value for i in range(o_units)] - # The activation function used is the sigmoid function - delta[-1] = [sigmoid_derivative(o_nodes[i].value) * err[i] for i in range(o_units)] - - # Backward pass - h_layers = n_layers - 2 - for i in range(h_layers, 0, -1): - layer = net[i] - h_units = len(layer) - nx_layer = net[i+1] - # weights from each ith layer node to each i + 1th layer node - w = [[node.weights[k] for node in nx_layer] for k in range(h_units)] - - delta[i] = [sigmoid_derivative(layer[j].value) * dotproduct(w[j], delta[i+1]) - for j in range(h_units)] - - # Update weights - for i in range(1, n_layers): - layer = net[i] - inc = [node.value for node in net[i-1]] - units = len(layer) - for j in range(units): - layer[j].weights = vector_add(layer[j].weights, - scalar_vector_product( - learning_rate * delta[i][j], inc)) - - return net - - -def PerceptronLearner(dataset, learning_rate=0.01, epochs=100): - """Logistic Regression, NO hidden layer""" - i_units = len(dataset.inputs) - o_units = len(dataset.values[dataset.target]) - hidden_layer_sizes = [] - raw_net = network(i_units, hidden_layer_sizes, o_units) - learned_net = BackPropagationLearner(dataset, raw_net, learning_rate, epochs) - - def predict(example): - o_nodes = learned_net[1] - - # Forward pass - for node in o_nodes: - in_val = dotproduct(example, node.weights) - node.value = node.activation(in_val) - - # Hypothesis - return find_max_node(o_nodes) - - return predict - - -class NNUnit: - """Single Unit of Multiple Layer Neural Network - inputs: Incoming connections - weights: Weights to incoming connections - """ - - def __init__(self, weights=None, inputs=None): - self.weights = [] - self.inputs = [] - self.value = None - self.activation = sigmoid - - -def network(input_units, hidden_layer_sizes, output_units): - """Create Directed Acyclic Network of given number layers. - hidden_layers_sizes : List number of neuron units in each hidden layer - excluding input and output layers - """ - # Check for PerceptronLearner - if hidden_layer_sizes: - layers_sizes = [input_units] + hidden_layer_sizes + [output_units] - else: - layers_sizes = [input_units] + [output_units] - - net = [[NNUnit() for n in range(size)] - for size in layers_sizes] - n_layers = len(net) - - # Make Connection - for i in range(1, n_layers): - for n in net[i]: - for k in net[i-1]: - n.inputs.append(k) - n.weights.append(0) - return net - - -def init_examples(examples, idx_i, idx_t, o_units): - inputs = {} - targets = {} - - for i in range(len(examples)): - e = examples[i] - # Input values of e - inputs[i] = [e[i] for i in idx_i] - - if o_units > 1: - # One-Hot representation of e's target - t = [0 for i in range(o_units)] - t[e[idx_t]] = 1 - targets[i] = t - else: - # Target value of e - targets[i] = [e[idx_t]] - - return inputs, targets - - -def find_max_node(nodes): - return nodes.index(argmax(nodes, key=lambda node: node.value)) - -# ______________________________________________________________________________ - - -def LinearLearner(dataset, learning_rate=0.01, epochs=100): - """Define with learner = LinearLearner(data); infer with learner(x).""" - idx_i = dataset.inputs - idx_t = dataset.target # As of now, dataset.target gives only one index. - examples = dataset.examples - num_examples = len(examples) - - # X transpose - X_col = [dataset.values[i] for i in idx_i] # vertical columns of X - - # Add dummy - ones = [1 for _ in range(len(examples))] - X_col = [ones] + X_col - - # Initialize random weigts - num_weights = len(idx_i) + 1 - w = random_weights(min_value=-0.5, max_value=0.5, num_weights=num_weights) - - for epoch in range(epochs): - err = [] - # Pass over all examples - for example in examples: - x = [1] + example - y = dotproduct(w, x) - t = example[idx_t] - err.append(t - y) - - # update weights - for i in range(len(w)): - w[i] = w[i] + learning_rate * (dotproduct(err, X_col[i]) / num_examples) - - def predict(example): - x = [1] + example - return dotproduct(w, x) - return predict - -# ______________________________________________________________________________ - - -def EnsembleLearner(learners): - """Given a list of learning algorithms, have them vote.""" - def train(dataset): - predictors = [learner(dataset) for learner in learners] - - def predict(example): - return mode(predictor(example) for predictor in predictors) - return predict - return train - -# ______________________________________________________________________________ - - -def AdaBoost(L, K): - """[Figure 18.34]""" - def train(dataset): - examples, target = dataset.examples, dataset.target - N = len(examples) - epsilon = 1. / (2 * N) - w = [1. / N] * N - h, z = [], [] - for k in range(K): - h_k = L(dataset, w) - h.append(h_k) - error = sum(weight for example, weight in zip(examples, w) - if example[target] != h_k(example)) - # Avoid divide-by-0 from either 0% or 100% error rates: - error = clip(error, epsilon, 1 - epsilon) - for j, example in enumerate(examples): - if example[target] == h_k(example): - w[j] *= error / (1. - error) - w = normalize(w) - z.append(math.log((1. - error) / error)) - return WeightedMajority(h, z) - return train - - -def WeightedMajority(predictors, weights): - """Return a predictor that takes a weighted vote.""" - def predict(example): - return weighted_mode((predictor(example) for predictor in predictors), - weights) - return predict - - -def weighted_mode(values, weights): - """Return the value with the greatest total weight. - >>> weighted_mode('abbaa', [1,2,3,1,2]) - 'b' - """ - totals = defaultdict(int) - for v, w in zip(values, weights): - totals[v] += w - return max(list(totals.keys()), key=totals.get) - -# _____________________________________________________________________________ -# Adapting an unweighted learner for AdaBoost - - -def WeightedLearner(unweighted_learner): - """Given a learner that takes just an unweighted dataset, return - one that takes also a weight for each example. [p. 749 footnote 14]""" - def train(dataset, weights): - return unweighted_learner(replicated_dataset(dataset, weights)) - return train - - -def replicated_dataset(dataset, weights, n=None): - """Copy dataset, replicating each example in proportion to its weight.""" - n = n or len(dataset.examples) - result = copy.copy(dataset) - result.examples = weighted_replicate(dataset.examples, weights, n) - return result - - -def weighted_replicate(seq, weights, n): - """Return n selections from seq, with the count of each element of - seq proportional to the corresponding weight (filling in fractions - randomly). - >>> weighted_replicate('ABC', [1,2,1], 4) - ['A', 'B', 'B', 'C'] - """ - assert len(seq) == len(weights) - weights = normalize(weights) - wholes = [int(w * n) for w in weights] - fractions = [(w * n) % 1 for w in weights] - return (flatten([x] * nx for x, nx in zip(seq, wholes)) + - weighted_sample_with_replacement(n - sum(wholes), seq, fractions)) - - -def flatten(seqs): return sum(seqs, []) - -# _____________________________________________________________________________ -# Functions for testing learners on examples - - -def err_ratio(predict, dataset, examples=None, verbose=0): - """Return the proportion of the examples that are NOT correctly predicted. - verbose - 0: No output; 1: Output wrong; 2 (or greater): Output correct""" - if examples is None: - examples = dataset.examples - if len(examples) == 0: - return 0.0 - right = 0.0 - for example in examples: - desired = example[dataset.target] - output = predict(dataset.sanitize(example)) - if output == desired: - right += 1 - if verbose >= 2: - print(' OK: got {} for {}'.format(desired, example)) - elif verbose: - print('WRONG: got {}, expected {} for {}'.format( - output, desired, example)) - return 1 - (right / len(examples)) - - -def grade_learner(predict, tests): - """Grades the given learner based on how many tests it passes. - tests is a list with each element in the form: (values, output).""" - return mean(int(predict(X) == y) for X, y in tests) - - -def train_and_test(dataset, start, end): - """Reserve dataset.examples[start:end] for test; train on the remainder.""" - start = int(start) - end = int(end) - examples = dataset.examples - train = examples[:start] + examples[end:] - val = examples[start:end] - return train, val - - -def cross_validation(learner, size, dataset, k=10, trials=1): - """Do k-fold cross_validate and return their mean. - That is, keep out 1/k of the examples for testing on each of k runs. - Shuffle the examples first; if trials>1, average over several shuffles. - Returns Training error, Validataion error""" - if k is None: - k = len(dataset.examples) - if trials > 1: - trial_errT = 0 - trial_errV = 0 - for t in range(trials): - errT, errV = cross_validation(learner, size, dataset, - k=10, trials=1) - trial_errT += errT - trial_errV += errV - return trial_errT / trials, trial_errV / trials - else: - fold_errT = 0 - fold_errV = 0 - n = len(dataset.examples) - examples = dataset.examples - for fold in range(k): - random.shuffle(dataset.examples) - train_data, val_data = train_and_test(dataset, fold * (n / k), - (fold + 1) * (n / k)) - dataset.examples = train_data - h = learner(dataset, size) - fold_errT += err_ratio(h, dataset, train_data) - fold_errV += err_ratio(h, dataset, val_data) - # Reverting back to original once test is completed - dataset.examples = examples - return fold_errT / k, fold_errV / k - - -def cross_validation_wrapper(learner, dataset, k=10, trials=1): - """[Fig 18.8] - Return the optimal value of size having minimum error - on validation set. - err_train: A training error array, indexed by size - err_val: A validation error array, indexed by size - """ - err_val = [] - err_train = [] - size = 1 - - while True: - errT, errV = cross_validation(learner, size, dataset, k) - # Check for convergence provided err_val is not empty - if (err_train and isclose(err_train[-1], errT, rel_tol=1e-6)): - best_size = 0 - min_val = math.inf - - i = 0 - while i60': 'No', '0-10': 'Yes', - '30-60': T('Alternate', - {'No': T('Reservation', - {'Yes': 'Yes', - 'No': T('Bar', {'No': 'No', - 'Yes': 'Yes'})}), - 'Yes': T('Fri/Sat', {'No': 'No', 'Yes': 'Yes'})} - ), - '10-30': T('Hungry', - {'No': 'Yes', - 'Yes': T('Alternate', - {'No': 'Yes', - 'Yes': T('Raining', - {'No': 'No', - 'Yes': 'Yes'})})})})}) - - -def SyntheticRestaurant(n=20): - """Generate a DataSet with n examples.""" - def gen(): - example = list(map(random.choice, restaurant.values)) - example[restaurant.target] = waiting_decision_tree(example) - return example - return RestaurantDataSet([gen() for i in range(n)]) - -# ______________________________________________________________________________ -# Artificial, generated datasets. - - -def Majority(k, n): - """Return a DataSet with n k-bit examples of the majority problem: - k random bits followed by a 1 if more than half the bits are 1, else 0.""" - examples = [] - for i in range(n): - bits = [random.choice([0, 1]) for i in range(k)] - bits.append(int(sum(bits) > k / 2)) - examples.append(bits) - return DataSet(name="majority", examples=examples) - - -def Parity(k, n, name="parity"): - """Return a DataSet with n k-bit examples of the parity problem: - k random bits followed by a 1 if an odd number of bits are 1, else 0.""" - examples = [] - for i in range(n): - bits = [random.choice([0, 1]) for i in range(k)] - bits.append(sum(bits) % 2) - examples.append(bits) - return DataSet(name=name, examples=examples) - - -def Xor(n): - """Return a DataSet with n examples of 2-input xor.""" - return Parity(2, n, name="xor") - - -def ContinuousXor(n): - "2 inputs are chosen uniformly from (0.0 .. 2.0]; output is xor of ints." - examples = [] - for i in range(n): - x, y = [random.uniform(0.0, 2.0) for i in '12'] - examples.append([x, y, int(x) != int(y)]) - return DataSet(name="continuous xor", examples=examples) - -# ______________________________________________________________________________ - - -def compare(algorithms=[PluralityLearner, NaiveBayesLearner, - NearestNeighborLearner, DecisionTreeLearner], - datasets=[iris, orings, zoo, restaurant, SyntheticRestaurant(20), - Majority(7, 100), Parity(7, 100), Xor(100)], - k=10, trials=1): - """Compare various learners on various datasets using cross-validation. - Print results as a table.""" - print_table([[a.__name__.replace('Learner', '')] + - [cross_validation(a, d, k, trials) for d in datasets] - for a in algorithms], - header=[''] + [d.name[0:7] for d in datasets], numfmt='%.2f') diff --git a/learning_apps.ipynb b/learning_apps.ipynb deleted file mode 100644 index 339d407a2..000000000 --- a/learning_apps.ipynb +++ /dev/null @@ -1,786 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# LEARNING APPLICATIONS\n", - "\n", - "In this notebook we will take a look at some indicative applications of machine learning techniques. We will cover content from [`learning.py`](https://github.com/aimacode/aima-python/blob/master/learning.py), for chapter 18 from Stuart Russel's and Peter Norvig's book [*Artificial Intelligence: A Modern Approach*](http://aima.cs.berkeley.edu/). Execute the cell below to get started:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from learning import *\n", - "from notebook import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* MNIST Handwritten Digits\n", - " * Loading and Visualising\n", - " * Testing\n", - "* MNIST Fashion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MNIST HANDWRITTEN DIGITS CLASSIFICATION\n", - "\n", - "The MNIST Digits database, available from [this page](http://yann.lecun.com/exdb/mnist/), is a large database of handwritten digits that is commonly used for training and testing/validating in Machine learning.\n", - "\n", - "The dataset has **60,000 training images** each of size 28x28 pixels with labels and **10,000 testing images** of size 28x28 pixels with labels.\n", - "\n", - "In this section, we will use this database to compare performances of different learning algorithms.\n", - "\n", - "It is estimated that humans have an error rate of about **0.2%** on this problem. Let's see how our algorithms perform!\n", - "\n", - "NOTE: We will be using external libraries to load and visualize the dataset smoothly ([numpy](http://www.numpy.org/) for loading and [matplotlib](http://matplotlib.org/) for visualization). You do not need previous experience of the libraries to follow along." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading MNIST Digits Data\n", - "\n", - "Let's start by loading MNIST data into numpy arrays.\n", - "\n", - "The function `load_MNIST()` loads MNIST data from files saved in `aima-data/MNIST`. It returns four numpy arrays that we are going to use to train and classify hand-written digits in various learning approaches." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "train_img, train_lbl, test_img, test_lbl = load_MNIST()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check the shape of these NumPy arrays to make sure we have loaded the database correctly.\n", - "\n", - "Each 28x28 pixel image is flattened to a 784x1 array and we should have 60,000 of them in training data. Similarly, we should have 10,000 of those 784x1 arrays in testing data." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "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", - "Training labels size: (10000,)\n" - ] - } - ], - "source": [ - "print(\"Training images size:\", train_img.shape)\n", - "print(\"Training labels size:\", train_lbl.shape)\n", - "print(\"Testing images size:\", test_img.shape)\n", - "print(\"Training labels size:\", test_lbl.shape)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing Data\n", - "\n", - "To get a better understanding of the dataset, let's visualize some random images for each class from training and testing datasets." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAKqCAYAAAAZl5BAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xm8VdP/x/FXQoOEigoRUilShpCSIclQSIlMkaGoZAiZ\nIjJGhgxlyJQppIQiY5JEREjDV6RJJKk0Or8//D5rr3PPubd7T+fes/e+7+fj4XG3vc7dZ93VPsPe\nn8/6rDKJRCKBiIiIiIhITGyW6w6IiIiIiIhkky5yREREREQkVnSRIyIiIiIisaKLHBERERERiRVd\n5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFY0UWOiIiIiIjEii5yREREREQkVnSR\n41mzZg1XX301O+64IxUqVOCggw7i3XffzXW3Qm/FihX069ePNm3aUKVKFcqUKcNTTz2V625FwpQp\nU+jRowcNGzZkq622YpddduHUU09l5syZue5aqH333Xd07NiR3XffnYoVK1KtWjUOO+ww3njjjVx3\nLZIGDBhAmTJl2HvvvXPdlVD78MMPKVOmTNr/Pvvss1x3LxKmTp1Ku3btqFKlChUrVmTvvffmgQce\nyHW3Qq1Lly75nndlypRh/vz5ue5iaM2aNYvTTjuNnXfemYoVK1K/fn369+/PqlWrct210Pvyyy9p\n06YNlStXZuutt6Z169Z8/fXXue5WkWye6w6ESZcuXXjllVfo3bs3e+65J0899RTHHXccH3zwAc2b\nN89190Lr999/p3///uyyyy7su+++fPjhh7nuUmTceeedTJw4kY4dO9KoUSMWLVrE4MGD2W+//fjs\ns8/0pTMfP//8M3///TfnnHMOO+64I6tWreLVV1+lXbt2DBkyhAsvvDDXXYyMX3/9ldtuu42tttoq\n112JjF69enHggQcm7atTp06OehMd77zzDm3btqVJkybccMMNVKpUiTlz5vDrr7/mumuhdtFFF9Gq\nVaukfYlEgm7dulG7dm122mmnHPUs3ObNm0fTpk3ZZptt6NGjB1WqVGHSpEn069ePL7/8klGjRuW6\ni6E1depUmjdvTq1atejXrx///vsvDz/8MC1btuTzzz+nXr16ue5i4SQkkUgkEpMnT04Aibvvvtvt\n++effxJ77LFH4pBDDslhz8Jv9erViYULFyYSiURiypQpCSAxbNiw3HYqIiZOnJhYs2ZN0r6ZM2cm\nypUrlzjjjDNy1KtoWr9+fWLfffdN1KtXL9ddiZROnToljjzyyETLli0TDRs2zHV3Qu2DDz5IAIkR\nI0bkuiuR89dffyWqV6+eOPnkkxMbNmzIdXcib8KECQkgMWDAgFx3JbQGDBiQABLTp09P2n/22Wcn\ngMTSpUtz1LPwO+644xLbbbdd4vfff3f7FixYkKhUqVKiffv2OexZ0Shd7f+98sorlC1bNukOcPny\n5enatSuTJk1i3rx5OexduJUrV44aNWrkuhuR1KxZM7bccsukfXvuuScNGzbkhx9+yFGvoqls2bLU\nqlWLZcuW5borkfHxxx/zyiuvcN999+W6K5Hz999/s379+lx3IzKef/55Fi9ezIABA9hss81YuXIl\n//77b667FVnPP/88ZcqUoXPnzrnuSmgtX74cgOrVqyftr1mzJptttlnKZ68EJkyYQKtWrahatarb\nV7NmTVq2bMmYMWNYsWJFDntXeLrI+X9fffUVdevWpXLlykn7mzZtChC5PESJrkQiweLFi6lWrVqu\nuxJ6K1eu5Pfff2fOnDkMGjSIt99+m6OOOirX3YqEDRs20LNnT84//3z22WefXHcnUs4991wqV65M\n+fLlOeKII/jiiy9y3aXQGz9+PJUrV2b+/PnUq1ePSpUqUblyZbp3787q1atz3b1IWbduHS+//DLN\nmjWjdu3aue5OaB1++OEAdO3ala+//pp58+bx0ksv8cgjj9CrVy+l6BZgzZo1VKhQIWV/xYoVWbt2\nLdOnT89Br4pOc3L+38KFC6lZs2bKftu3YMGCku6SlFLDhw9n/vz59O/fP9ddCb0rrriCIUOGALDZ\nZpvRvn17Bg8enONeRcOjjz7Kzz//zPjx43PdlcjYcsstOeWUUzjuuOOoVq0a33//PQMHDqRFixZ8\n+umnNGnSJNddDK1Zs2axfv16TjzxRLp27crtt9/Ohx9+yIMPPsiyZct44YUXct3FyBg3bhx//PEH\nZ5xxRq67Empt2rThlltu4bbbbmP06NFu/3XXXcett96aw56FX7169fjss8/YsGEDZcuWBWDt2rVM\nnjwZIDLFLnSR8//++ecfypUrl7K/fPnyrl2kuM2YMYNLLrmEQw45hHPOOSfX3Qm93r1706FDBxYs\nWMDLL7/Mhg0bWLt2ba67FXp//PEHN954IzfccAPbb799rrsTGc2aNaNZs2bu/9u1a0eHDh1o1KgR\nffv2ZezYsTnsXbitWLGCVatW0a1bN1dNrX379qxdu5YhQ4bQv39/9txzzxz3Mhqef/55tthiC049\n9dRcdyX0ateuzWGHHcYpp5xC1apVefPNN7ntttuoUaMGPXr0yHX3Quviiy+me/fudO3alauuuop/\n//2XW2+9lYULFwLR+U6sdLX/V6FCBdasWZOy38Lo6cJ2Itm0aNEijj/+eLbZZhs3R0wKVr9+fVq1\nasXZZ5/t8oTbtm1LIpHIdddC7frrr6dKlSr07Nkz112JvDp16nDiiSfywQcfsGHDhlx3J7TsM/T0\n009P2m9zSiZNmlTifYqiFStWMGrUKI455pik+RKS6sUXX+TCCy/k8ccf54ILLqB9+/Y88cQTnHPO\nOVx99dX88ccfue5iaHXr1o1rr72W559/noYNG7LPPvswZ84crrrqKgAqVaqU4x4Wji5y/l/NmjXd\nFarP9u24444l3SUpRf766y+OPfZYli1bxtixY3W+ZahDhw5MmTJF6wwVYNasWQwdOpRevXqxYMEC\n5s6dy9y5c1m9ejXr1q1j7ty5LF26NNfdjJRatWqxdu1aVq5cmeuuhJa9p+WdBL7DDjsA8Oeff5Z4\nn6Lo9ddfZ9WqVUpVK4SHH36YJk2asPPOOyftb9euHatWreKrr77KUc+iYcCAASxevJgJEybwzTff\nMGXKFFcspG7dujnuXeHoIuf/NW7cmJkzZ7pqHMbyDxs3bpyLbkkpsHr1atq2bcvMmTMZM2YMDRo0\nyHWXIstC6H/99VeOexJe8+fP599//6VXr17stttu7r/Jkyczc+ZMdtttN80HK6L//e9/lC9fPjJ3\nN3Nh//33B1Jz+W2+q9ImC2f48OFUqlSJdu3a5borobd48eK00dV169YBqDpiIWy33XY0b97cFacZ\nP348O++8M/Xr189xzwpHFzn/r0OHDmzYsIGhQ4e6fWvWrGHYsGEcdNBB1KpVK4e9k7jasGEDnTp1\nYtKkSYwYMYJDDjkk112KhN9++y1l37p163jmmWeoUKGCLhQLsPfeezNy5MiU/xo2bMguu+zCyJEj\n6dq1a667GUpLlixJ2Tdt2jRGjx5N69at2WwzfaTmx+aPPPHEE0n7H3/8cTbffHNXCUvyt2TJEsaP\nH8/JJ59MxYoVc92d0Ktbty5fffVVSmT/hRdeYLPNNqNRo0Y56lk0vfTSS0yZMoXevXtH5r1OhQf+\n30EHHUTHjh3p27cvv/32G3Xq1OHpp59m7ty5KW/Kkmrw4MEsW7bM3ZV744033CrWPXv2ZJtttsll\n90LriiuuYPTo0bRt25alS5fy3HPPJbWfeeaZOepZuF100UUsX76cww47jJ122olFixYxfPhwZsyY\nwT333KM76gWoVq0aJ510Usp+WysnXZv8p1OnTlSoUIFmzZqxww478P333zN06FAqVqzIHXfckevu\nhVqTJk0477zzePLJJ1m/fj0tW7bkww8/ZMSIEfTt21cpuoXw0ksvsX79eqWqFVKfPn14++23adGi\nBT169KBq1aqMGTOGt99+m/PPP1/nXAE+/vhj+vfvT+vWralatSqfffYZw4YNo02bNlx66aW57l7h\n5Xo10jD5559/EldeeWWiRo0aiXLlyiUOPPDAxNixY3PdrUjYddddE0Da/3766adcdy+0WrZsme+4\n6eWZvxdeeCHRqlWrRPXq1RObb755Yrvttku0atUqMWrUqFx3LbJatmyZaNiwYa67EWr3339/omnT\npokqVaokNt9880TNmjUTZ555ZmLWrFm57lokrF27NnHTTTcldt1118QWW2yRqFOnTmLQoEG57lZk\nHHzwwYkddtghsX79+lx3JTImT56cOPbYYxM1atRIbLHFFom6desmBgwYkFi3bl2uuxZqs2fPTrRu\n3TpRrVq1RLly5RL169dP3H777Yk1a9bkumtFUiaRUBkiERERERGJj2gk1YmIiIiIiBSSLnJERERE\nRCRWdJEjIiIiIiKxooscERERERGJFV3kiIiIiIhIrOgiR0REREREYkUXOSIiIiIiEiub57oD6ZQp\nUybXXQiFTJYw0tj9R2OXOY1d5oo6dhq3/+icy5zGLnMau8xp7DKnsctcUcdOkRwREREREYkVXeSI\niIiIiEis6CJHRERERERiRRc5IiIiIiISK6EsPCAiIiLxV716dbd9zTXXANCrVy8AWrdu7dree++9\nku2YiESeIjkiIiIiIhIriuRI1hx++OEA9OvXD4Dbb7/dtb3zzju56JKIiITQLrvsAsCYMWPcvn32\n2QeAoUOHAoreiMimUSRHRERERERipUwik1WJillxL3pUrlw5ACZOnAhAkyZNXNuECRMAuPnmmwGY\nPXu2a1u4cCEA69evL9b+mSgsGNWqVSu3PXLkSAAqVqwIJI+T5VZ/9NFHJdKvKIxdUVmkzH4CtGzZ\nMmnfEUcc4do+/PDDjJ4njmNXUuK2GGilSpUA+Pvvv92+Rx99FIDu3btn7XmicM7Zaw2gU6dOAFx0\n0UUAbLZZcL/w33//Tfq9Bx54wG1fdtllWe9XFMbOV7NmTQB+/fXXlL70798fgHvvvReA5cuXF2tf\nojZ2YaKxy5zGLnNaDFREREREREo1XeSIiIiIiEislMrCA5ae1rhxYyA5/NWiRQsA3n333ZTfu+SS\nSwAYMmRIcXcx9GzS6GOPPeb2WZqa8dM2Fi9eXDIdiwk/Je2DDz7I6PcyTVfLhRNOOMFtX3HFFUDy\n32Lpo3/99VfWnnPQoEFZO1bc+a/lgw46KIc9KTkNGjQA4MILLwTgzDPPdG3bbLMNkJqalm5fCDPC\nS1zVqlXdtqXvWYpfnz59XNvAgQNLtmMSeX4a15ZbbgkEqfI77rija7vggguSfm+33XZz2/5rOy+b\nwmCpu0ceeaRrW7ZsWabdDr1030HSvd/Z5+iXX34JwAsvvFD8nSsCRXJERERERCRWSk0kx48yXHnl\nlRkd4/rrrweCxctskmRpcuyxxwIwfPhwILijmc66devc9owZM4q3YzFRWu/6nnXWWW7boqn+XSN7\n7RXE7ugVdgz3228/ILhT/88//xSus6Vc7dq1gSAS/vXXX+ewN8XnkEMOAYIIfkFmzZrltvOef3/8\n8Ud2OxZBZ5xxhtvu0KEDEESaH3/88Vx0SSLOIoF+hObhhx8G4I033gBgr732cm116tRJ+v0NGza4\n7YIKXNj7gD3fLbfc4tp69uyZUd/DyIpIWRn3AQMGuLYHH3wQCDIqevfu7dq6desGBN+La9So4doW\nLVoE5Da6o0iOiIiIiIjESqkpIV2rVi23/dNPP230uQsaFrvDPHXqVLfv5JNPBoIy09kQljKDFr0B\nePbZZwHYbrvtNvp7K1eudNuVK1fOer8KEpaxS+emm24CgkVTN8bueNpdFD9XNu8x7DH+8xRVSY6d\nLfp30kknuX1VqlRJOWZh+lTUSI49/sknnwTg/vvvd23Tp08v1DHyimsJ6XRzoex9IRsL/Ybx9Wp3\netPloU+bNg2Ajz/+GIDLL7+8WPtSkDCOndl7772BYF4DwLbbbgsEWQDFXSa6IMU1dvZ3A3Tp0gUI\nzpFx48a5to4dOwKwYsWKIvcj13J93u2xxx4AzJw5M6XNXrt+BskTTzyR9JhffvnFbdvyF+lYpPHc\nc88FgmgRZB7JyfXYVatWDYBzzjnH7bPvC5tv/l+Clx99Oe+88/I9ln0fmTt3LhB8pkMQSbPHzJkz\nZ5P6DSohLSIiIiIipZwuckREREREJFZKTeGBG264wW3nDfu9+eabbttSE6xMqp9+ZiE+S3078MAD\nXZuVlW7fvj0QlDCMAz8kmzdNzdI1AA4++GAgKONoqW3yHwvZFiZNzS//fMQRRyS1FVRSOkplowEa\nNmwIBClquWBpCO3atXP7TjzxRAA+++yznPQpCqzEcjbS1cKioGIyCxYscNtWclYFVQp2/PHHA0GK\nGgTLM0QxRauwLEUN4LLLLgOCNJvWrVu7ts8//xxILtIzatQooHCvKz/V75tvvklq899TmzdvDiRP\nmjd2XvspSdlMuy8u6VJEf/vtNyCYGP/SSy9ldOwDDjjAbdt3ujixJRvuvPNOt89KQA8ePBgo/Pe3\nvN85vv/+e7dt5bbtMVdddZVrK6liBIrkiIiIiIhIrMQ+kmOLQXXt2tXtszsqVtrz/PPPd212J8AW\nL9tzzz1d29KlS4FgsUL/mMcddxwQlFX94osvsvhX5NYPP/zgto855hggWNBt0qRJrq1Zs2ZJv/fr\nr7+WQO+iozARGIv2fPTRR0X6fYv2RC2SM3r0aCAcC0z6CxbuvPPOOexJ4fkFG6677jogufjEmDFj\niu25/YX2oq5Xr15AMIYQfD7Y+7yVpZWNszLRVobWPlchKNmerqBDXPhRhoImSterVy9lnxUt8M/F\nvCwbxR/XvAuY++9hhx12WL7Hsuez6DXAo48+mu/jw8wKpGQawTH777+/2867TIaf+RMlp59+utu+\n9957gaBYAARR199//32Tnsdf7sHOfXs/8DOq7Luj34fioEiOiIiIiIjEii5yREREREQkVmKfrtap\nU6d82y666CIgOeRrLFUh3WrV1157LRCkbkEQGrbni1O6mh9+fOSRRwCYN28eAOXKlXNty5YtA4IC\nDZLMUsosJc1PLcubZuavhWPb/r68opamZmzio62MDMGKy4VdJ8fSiNKl+BlLX7CwOQQrWEcxbcb6\nfumll7p9++23H5D8vrSp6Wply5bNt238+PGbdOwwsfPLPxcmT54MKE0tE/vuuy8QnD82llD86Sml\nyfbbb++2O3funMOehEONGjWAIP3ZP+8KwwoO3H777SltVuTBJuiHnX0PsyIDlqIGMH/+/JR9m5qm\n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\nY5fL1+t1110HBHct/btutohjcb/HmTC/11lExy88MHTo0KTHpIvkWJEBP3ozY8aMrPcvzGMXdlEd\nu7xFU9LxiyD5i85mS1jGzoowQMELxdqYFVSAwIph+IVB7P3RIv0FLTlQWGEZu2w66qijgORCIv/7\n3/8AaNy4cdaep6hjp0iOiIiIiIjEii5yREREREQkVkp1ulrYxTGkWVI0dpkrybE77bTTgORVpG1C\nfLp0NSscMHjw4HyP+eOPP7rtkp7wHKV0tTDR6zVzGrvMRW3s7r33XgAuu+wyoODUqXr16rntMKTm\nQvGMnX/M6tWrA0FRqBo1ari2888/P+n3fvrpJ7dt6yhaUQIrUgCZ/Z0bE5axyyZLV/PPSdv+6KOP\nsvY8SlcTEREREZFSTZGcEIvj1X5J0dhlTmOXOUVyMqNzLnMau8xFYez22GMPt/3xxx8DULNmTSB9\n/5csWQIkT/ZetGhR1vsVhbELK41d5hTJERERERGRUq3ULAYqIiIiEiVbbbWV27Y5JnZXP91d7See\neAIonuiNSNQokiMiIiIiIrGiixwREREREYkVFR4IMU1Oy5zGLnMau8yp8EBmdM5lTmOXOY1d5jR2\nmdPYZU6FB0REREREpFQLZSRHREREREQkU4rkiIiIiIhIrOgiR0REREREYkUXOSIiIiIiEiu6yBER\nERERkVjRRY6IiIiIiMSKLnJERERERCRWdJEjIiIiIiKxooscERERERGJFV3kiIiIiIhIrOgiR0RE\nREREYkUXOSIiIiIiEiu6yBERERERkVjZPNcdSKdMmTK57kIoJBKJIv+Oxu4/GrvMaewyV9Sx07j9\nR+dc5jR2mdPYZU5jlzmNXeaKOnaK5IiIiIiISKzoIkdERERERGJFFzkiIiIiIhIrusgREREREZFY\n0UWOiIiIiIjESiirq4mIiEg8lC9f3m1fffXVAHTq1AmA+vXru7YJEyYAcMYZZwDw66+/llQXRSSG\nFMkREREREZFYKZPIpGB3MVM98P+olnrmNHaZ09hlTuvkZEbnXObCPHYWwXn22Wfdvnbt2gEwfPhw\nAB5++GHXNmjQIAC23XZbAA488EDXtnr16qz3L8xjF3Yau8xp7DKndXJERERERKRU00WOiIiIiIjE\nitLVNmLvvfd22xdeeCEADRo0AODII490bdbna6+9FoA77rjDtWU6xFEPaX7zzTduu2HDhgCceuqp\n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\nE78hKPoQt+iNz8rW+xNfbSymTJkCFL5crEU07I7d7NmzXVthzuOomjFjhtu2JQasCIhNsAVYuHAh\nEEy2jWOEelPYHeKPP/44xz0JN/tc9D8f9913XyCIRqRjkQM/um8lo++99958f88+j1555ZUMexwe\nFiX0o81WhKBPnz5A+u9/9v713nvvuX22beftokWLXNvDDz+cbx/suT/88MMi9z+X7O+06A2kRnAs\negNBsQbLWknHysYXVDrfL83tH784xftbt4iIiIiIlDqxiuRY7nS6uRH+HIeCIjh5jRgxwm3bIm+1\natUC4Pvvv3dtllPbqVMnACpXrpxyLCvjCsl3RuPqxx9/dNv+omVxYwsC+rm7t956K1D08sTXXHMN\nkJyPffvttwPxLTcr2WElZ9NFstKVAy1IxYoVgaDkrP9et3z58ky7GFq1a9cGkiOvFv2y+SVxjmAV\nF0W4is4W2y3Morv2+oRgqQp/n7HvMXGI4BgrYzx9+nS375BDDgGC17E/n66gKPbRRx8NQO/evYFg\nLmM68+bNc9v2fe+zzz4rUt9zwZ9/c+211wLpy41bhMUWTYWCIzi24LQ9fptttkl5zPvvvw8E32VK\nkiI5IiIiIiISK7rIERERERGRWIlFutr1118PJK9WbWxyml9CujBpaubll19229988w0QpCf55TG/\n++47IAiPpisfesQRR7htW/U+zvwUwTiXEk03ebSozjrrLCC5ZLmxkrQiBbnuuuuA5HQVS12z9LOC\nytJut912bvvyyy9PaiuoLGgcWNlefwxs8nGNGjWA0pFinG2FSdf1y5pb8SA7b4855piUY40aNQpI\nX968tGnXrp3btmUvbOys2Aokp2HGzeOPP+62LV3NCvc88MADrs1Syyyd6pZbbnFt6QpGGZss/9pr\nrwHw0ksvubYolY72/8bCpKn5Zc2NFXbwp14MGzYMgL333jvf57bpCrlYfkCRHBERERERiZXIRnL8\nuz9W6tNKNFvJXShakYGNsfKi6a6CTUFXqkOHDt3kPkh87L///m7b7jjZOexHb6JWnlJyw6Kl6QoP\nWEEL+1lUcS4cAkHREL90u5XytUnFfqbA66+/XoK9iy5/wcW8Dj/8cAAeeught2+vvfYC4KeffgKC\nIj8QLLRtyzvYZHGApUuXZqfDEdGoUSMArrzyynwf8+yzz7rtOGdS+MWhbEHyjh07AsmRruHDhwNB\n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\npe1uuz9vYvz48UAQwfEjsRbFtX8PmxcVV126dAGgfPnyKW2leXmGgmy22X/37a2ke7r3MYv4ly1b\n1u1bv359CfQuWk466SS33ahRo6S24cOHu+2wn4uK5IiIiIiISKzoIkdERERERGIlsulqd9xxh9s+\n/PDDgaCUoJ8iZGltfrneglJY8pZo9NnENQuv+yG7go4ZZ59//nmuuxBKv/32W667EGtVqlRJ2Wep\nqelei/batVKhAH/99Vcx9S4att1226SfcWcFP+zcWbp0acpj/OIC7dq1A4LzyS/FPmjQICAoR/v7\n779nv8Mx4qdxW5q3fYZfeumlrq1p06YALF68GEhORX/ggQeA5GIucWSFBlq3bg0kF0ixog2bWlAp\nrqxMtL0+C0vpaoEzzzwTSC4IYj777DMAbrzxxhLt06ZQJEdERERERGIlspEc/26tXVXa3aL27dun\nPN6fZFYU3377rdu++OKLAfj0008zOlYcTZo0yW1baU+RsLj++usBmDZtGqDyvoXVsGFDIF7l4K0M\n+YEHHggEE9ghuViFsQWdrXSxX1wg7tGEkmALE/fs2TPHPQmXzp07A0FUwv+u89NPP+WkT2HkR1Y3\nlX23K82sAI0t6plukWgrtLJ27dqS69gmUiRHRERERERiRRc5IiIiIiISK5FNV/NNnjwZCFawPeig\ng1zb6aefDsB+++3n9tlKubNmzQJg3LhxKce01ITvv//e7Us3UbW089M24pTaItExatQoIAil+2xl\n+oULF5Zon6LA0ktt0ryf0mupWnGyYsUKAD744IOknyK55qdLWsEL46cGaT2mwEUXXQQEr2sIiopY\n0YaJEye6NlsfccyYMUCw7hLAhx9+WKx9jYK+ffsC6dPUbL0hf33KqFAkR0REREREYqVMIoS1j/2S\niaVZJv80Grv/aOwyp7HLXFHHTuP2H51zmdPYZS4sY2cFUgD69+8PBH2zMuWQXG4718IydlEUxrG7\n4IILAHj00UdT2k488UQgiILlUlHHTpEcERERERGJFUVyQiyMV/tRobHLnMYuc4rkZEbnXOY0dpkL\ny9gdeuihbvuZZ54BgrlyNvcE4Ouvv876c2cqLGMXRRq7zCmSIyIiIiIipZouckREREREJFaUrhZi\nCmlmTmOXOY1d5pSulhmdc5nT2GVOY5c5jV3mNHaZU7qaiIiIiIiUaqGM5IiIiIiIiGRKkRwRERER\nEYkVXeSIiIiIiEis6CJHRERERERiRRc5IiIiIiISK7rIERERERGRWNFFjoiIiIiIxIouckRERERE\nJFZ0kSMiIiIiIrGiixwREREREYkVXeSIiIiIiEis6CJHRERERERiRRc5IiIiIiISK7rIERERERGR\nWNk81x1Ip0yZMrnuQigkEoki/47G7j8au8xp7DJX1LHTuP1H51zmNHaZ09hlTmOXOY1d5oo6dqG8\nyBEREZFo2n333QGYNWsWAAMHDnRt119/PQDr1q0r+Y6JSKmidDUREREREYkVXeSIiIiIiEislElk\nkhxYzJR7+B/lbWZOY5c5jV3mNCcnMzrnMhfGsRs2bBgAZ511Vkpb48aNAZg+fXqx9qEwwjh2UaGx\ny5zGLnNFHTtFckREREREJFZUeEBEREQ2Se3atd322WefDWR2x1pEJFsUyRERERERkVhRJEckRy69\n9FK33bx5cwBat24NwNZbb+3aLBf3mWeeAaB79+6ubdWqVcXez7Dbf//9Adhrr70AOPnkk13bSSed\nBMAnn3wCwA8//ODaxo0bB8DIkSNLpJ8icdahQ4d82yZNmuS258yZUxLdERFRJEdEREREROJFFzki\nIiIiIhIrKiEdYlEvM9igQQO3balBX3zxBQAXXniha1uyZEnWnzuMY1e/fn0AOnfuDECPHj1cW6VK\nlQCYNm0akJxW1bZtWwC22WYbAHr16uXaBg8enPV+hnHs8nr22Wfdto2n9dvvi+378ccfAahXr55r\n++eff4BgknQ20taiXEL6zTffdNu2Un3v3r1L5LmjcM4Vh5122sltH3vssQCccsopbt8xxxwDwFNP\nPQVAjRo1XNtxxx0HhGfsZs+e7bZ32203IOib/zeNGjUq68+dqbCMXRSFeews/fu6665z+9q0aQPA\nBx98AMCRRx5ZIn1JJ8xjF3YqIS0iIiIiIqWaCg9IsfGjNXYH8oQTTgBgv/32c20W5Ykj/+98+umn\nAWjYsCEAH330kWu76KKLAJg5c2bKMQ499FAAxo4dC0CzZs1cW3FEcqJgwIABbnvChAkAvPbaawD8\n/vvvhTqGjb8VeyitBQjeeustIIgaAHz55Ze56k6s2UKYFtnwi49YsRGLdkNwJ/rJJ58EYNmyZSXS\nz6L4+uuvgSB6A7DZZv/dP7WIoEWoZdPYuFqRlU6dOrm2bt26AbD99tun/F7NmjUBWLRoUXF3scRU\n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\n46233hoIViC20B8EaSGPPPJIkfoeNVYOMx2/rKDkz8owtmzZ0u2z8qJPPvlkTvpU0mw1bz+dyAoP\nWNpjOiNHjgTSv2afffZZICjBCsHk6RkzZmxah0PMUgisXL6voHKgVobbykX77L00SilC6fjv0QsW\nLADg7bffzlV3IqWg12Fh2Wr077//vtuX7jzNy1Js7NwGOPnkkze5P1Hkl/KuXLlyUptNJIdoLdnw\n0EMPue2JEycC0K9fPwBatWrl2ixlypYCyLsNyam4HTt2BGDWrFlAchGDQYMG5dsfvxhJXNjY+UUC\nLO1s+PDh+f6epc5bEQ1ILeHtF/T566+/Nr2zm0iRHBERERERiZVYRnLsDhEEpSwrVaqU8ji7YvWj\nPLZYZVE1adIECO4O+hP9Cio1HXVWjhvggAMOyGFP4sHKmvuljm0CfqbnZtTYXcf77rvP7fO3M2FR\nm88//9ztO+WUUwAYMGDAJh07bPxSx3knj1ohASj4Ltttt90GBFHv5cuXu7aXX345K/3MtREjRrjt\nM844Awju9gI89thjJd6nuGjYsCGQvryvRQcts8EvPOAXFNmYxo0bu20rjb5w4cKidzaCtttuOwB6\n9eqV72PSLTAaBbbALgSRHIvUHXLIIa7t+uuvB5JLwee1/fbbu+0PP/wQCD5Hv/zyS9dWUPGMr7/+\nurBdj4xtt90WSH4N3XHHHUD61+C+++4LBJFuP/pq32+tuI19hwkLRXJERERERCRWYhHJsavS+vXr\nA8G8GggiOLZ4GwR3My0PM29O4cbY3JOqVau6fXZ389dffwXg4osvdm2fffZZkY4fBZazbwtVAuyw\nww5AUEbb5lZAdBcMLClWcrx79+5AMLcLNj2KIUFutpWfBTj//PMBGDJkCBCtvPV0bFE2Py/dL/UJ\nyYt6Wnn8ZcuWAcllgfMuvnrFFVe4bSshHXVnnXWW27aytZZzDsHnio2PBPwFie1140cQb7jhBgBO\nO+20lN/t27cvkLwwbSb8ubVdunQBgvmvcdesWTMA6tatm9K2ePFiAB599NES7VNxsujO+PHj3T6L\nElapUsXtswiXzec87rjjXJvNrbF5XwXN/7LvcQBXXnnlJvU9jPxsJ2OvR/tO588L7tSpExB8RvTp\n08e1TZkyBQgyovyofxgokiMiIiIiIrGiixwREREREYmVWKSrWWjSJqL5rEygn6bhTzgril133RUI\nSk7vvvvuKY+xiat5V96NGwttXnDBBW5f3rQ/P1xeWiaEFkWFChXcthXIsLC8Hw6OeqneMPnxxx/d\ntpWitbSFqKerWXnVgiZ+Wpqpv92gQQMAmjdvnvJ4m4T6xRdfZK2fYXTXXXcBQcotwLvvvgvAp59+\nCiSXlx47dmwJ9i58Zs6c6bYXLVoEJE/ytvLOV111FZCcynbwwQcnHcvSm6FwqeP2eP+xKnoTsBK+\nlrYWV/adIt13i08++QSAgw46yO2zNF6/qE9+rEgBwIoVKzalm6Fk34H9AgI2fWP16tVA8vlz7bXX\nAkEhGytMA8G0jbCmiiqSIyIiIiIisRLZSI4/4d0mMhq/BOGpp54KpI/e2MKLNWrUSGmz8rL+BNz9\n9tsPgDVr1gDw0UcfubbOnTsD0b8bnA02Ls8991yOexJOO+20EwD33nuv22d3Pm1xLn/io2SP/3q2\nYgRxec3a3Wy/BKhFH6zYir9Qmz3OysA/9dRTrs0m3a9btw6IZxnVdH777Te3bXd+rajMeeed59ps\nIVWblLx27dqS6mLoWHTUCv8AVKxYEUi+42vylqj1IzKFKSFtj/cfG6dJ9oWx55575ts2e/bsEuxJ\nuE2ePNltW9bJ9OnTgeA9Lh2/YMakSZOAeC3mbkucWOl8gD322AMICq34haOMZfD06NHD7bvzzjuL\nrZ/ZoEiOiIiIiIjESmQjOf4iWGXLlk1q83MoK1euDCQvWmlXr5aL37Rp00I9py1MZXcEZsyYUdRu\nx4Y/nnlZ+eOCFhsszezc9RcetPKLWoCweNj8E7vDDDB16lQgPousWk61v/hwYSIwln/ul/60u5z+\nHbvSxqJg9jrt1q2ba7Nxsc8em3sCyZkEpYGVl12wYIHbZ8ssFKf//e9/bttey6WFjXk6/hIaErA5\nh+kiOPad0cpM20+Ae+65BwjOt3HjxhVrP0uSP++mMHO4/GitsSUYwkqRHBERERERiRVd5IiIiIiI\nSKyUSRRmpl8JK1OmzEYfc+6557ptC5dtvnn+2Xf+Me1P/vvvv4GgkAAEIbvXXnsNCFLUIJhQ7z++\nOGXyT1OYscsGm2yaroy2rbyeS2Ecu65duwLw8MMPA8mpRDbJ2SYE7r333q7NJjX7ZVuN/Ttks1BB\nSYydrZJsq84XV+qnhddfffVVAOrVq+faDj/8cCAoN5oNRR27knq9FsTSb4cOHer2/fDDDwDss88+\nAGzYsKFY+xDG12tefolkK6l66aWXAsFkZoBGjRqVaL/CMnZnn32227YS+HvttVeR+lKYv2X48OFA\n8BkNMGrUqEL30xeWsSusZs2aAUHKlJ9+a2m3hxxyCBCU9i4uURg7//vJtGnTgCB12b7/ARx11FFA\nUNDBCotAkLo2b948AOrWrevaMv0uGIWxS+ehhx4C4NBDD3X7GjduXKJ9KOrYKZIjIiIiIiKxEtnC\nA/6V9ty5c4GgDO++++7r2mwS6LPPPptyjM8//xwIrtBl4+6//34A6tSpk9IW9wUDM+FHHK0EpUUc\nDzzwQNfmLzRYFHZ+W+npZ555JqPjlIQLL7zQbVu54/333x/IbiSnTZs2bvvpp58GgjuefrGHbEZw\noszKIPvsfCruCE4u+XcgLeJgi92lYyXHAQYMGAAExWtatmxZHF2MFP+9xyINhx12GJC8WOc555wD\nJC8QamyM072P2funfd6XRukKqBiLxBZ3BCdK7PMFgrGz97Q77rjDtdl3F/vpL1Br3x1r1aoFwMUX\nX+zarNhL3FlmiRVfsddwFCiSIyIiIiIisRLZSI7vgw8+SPop2dWgQQO33aJFCyBYkM1fENVfLK80\n8uci3X333UBwRxxSS51PmDDBbVt+uZXd/vPPP13be++9l+9z7rDDDkD07t7Z+WORltq1a7s2u0te\nWHa32Bb6tHkSEOTvWgRn5MiRmXU4huwup+Wt+6W0S8OCgldccYXbtpz8r776yu0rKLpoC8havn4I\np7bmlM1tHTFiRNJPgKuvvjonfYqDJk2a5Ns2evTopP/3I5WlZTHfvG655ZaUfe+//z4At99+e76/\n9+677+bbZvMUSyNbHPqbb77JcU8KT5EcERERERGJFV3kiIiIiIhIrMQiXU2K16677uq2LVRrYUs/\nRTAuK8dnyk/D6NWrV0r7E088AQQlz/1Vui19q6hspeYo8EsU9+7dGwhKOt96662urX///gC8/vrr\nbp+lA1nqpF8K2kpr2mPeeecd12Ylqi29SAKdO3dO+n9/FfXSUIzFnzR89NFHA8HEWoBrrrkGgNWr\nV6f8bvfu3QFo3bo1kLzUgEhxOe644/Jts9evpTovXLjQtZXWdLV0hVMsxbtLly4pbeXKlQOgR48e\nKW1WLtreF0ojO6eUribyf+zdeaBV0///8WcfQxQpIVMlYxSihAwpMmVOxk9kyExISOaEDBER3yhz\nRKZMIRQyhpAh8qlIpMxKRL8/+r3XXvucc889Z99zz9lnn9fjn7vba99z1l3tM+z9fq/3EhEREREp\nEUVyJJKZM2cC+U8STzJ/8vzUqVOBcAnpyZMnA5qkDEFJ2X79+gFBQQufFRKAYMwsauMvBGgTxK2o\ngB8hk6rZuWlRxzfffLOU3Sk6/zyxO7dDhw51+6wYgZVp9xfjswng8+fPBzKX4RYppv79+wNByeNK\nKW+cjWUMADz33HNAsMTIiBEjcnoM++yxsuZz584tZBfLgl98qtwokiMiIiIiIomiixwREREREUkU\npatJtWwVYICxY8cCwQrhEjj++ONL3YWysWDBAgAuuuiiEvekctnr2l/DpFI98sgjAHz11Vdu3223\n3QZA+/btAZg9e7Zr69u3LwBPP/00UBnrCkl5eOONN0rdhdjw17s5+OCDgWA9v65du1b5e/7redSo\nUQBccskltdHFsuCvuVRuFMkREREREZFEqbMkhrOg/QmelSzKf43GbimNXXQau+jyHTuN21I656LT\n2EVXbmM3YMAAAC644IK0tt69ewNwyy23ALVf4Kbcxi5Oym3srrzySgAOP/xwAFq0aFGyvuQ7dork\niIiIiIhIoiiSE2PldrUfJxq76DR20SmSE43Oueg0dtFp7KLT2EWnsYtOkRwREREREalousgRERER\nEZFE0UWOiIiIiIgkii5yREREREQkUWJZeEBERERERCQqRXJERERERCRRdJEjIiIiIiKJooscERER\nERFJFF3kiIiIiIhIougiR0REREREEkUXOSIiIiIikii6yBERERERkUTRRY6IiIiIiCSKLnJERERE\nRCRRdJEjIiIiIiKJooscERERERFJFF3kiIiIiIhIoixb6g5kUqdOnVJ3IRaWLFmS9+9o7JbS2EWn\nsYsu37HTuC2lcy46jV10GrvoNHbRaeyiy3fsFMkREREREZFE0UWOiIiIiIgkii5yREREREQkUXSR\nIyIiIiIiiaKLHBERERERSRRd5IiIiIiISKLEsoS0iIjE2/rrrw/AW2+95fZtsskmAPz4448l6ZPE\nX9OmTQF46KGHANh+++1d2+DBgwHo06dP8TsmIomjSI6IiIiIiCRKnSVRViWqZXFY9OiGG24A4PTT\nT3f7evbsCcDChQsBGDNmTK32QQtGRRfHsdt3330BaN26NQBdunRxbZ06dQLg33//Tfs9OxcnT54M\n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\nJTFt1/iFByx9LFPampWXzrVQQervbb/99kB4zP3y1UkzcOBAt73llltWedzzzz8PlFd530JLLR1t\nKWoAl156KRCkomVKbbPfV7pa2Kabbhr6t19Uxf8eHEeK5IiIiIiISKJUZCRn/PjxQHA3zi8W4C96\nV5UffvgBCEpWA/z444+F7GLitGnTBghK35YrW0AWco/gpLIIwueff+722SJvZuzYsW7bzle7KzVp\n0qRIzxtnH374odu2idu33nqr22eRmDlz5uT1uJtssgkAvXv3TmuzSFySJ+quvfbaQPC+dtZZZ7m2\nfKNBUrVZs2a5bYvmW6GaG264wbWdcMIJxe1YiVgRgkyRHH+sIHuk2j9fU4sLZColnSS2uHmm5QiM\nvS9CuAS8LGXRGymsr776ym2/9957JexJ9RTJERERERGRRElUJGfkyJFAeNG2TOzupsl18Sy7gz58\n+HBA0Zvq7Lzzzm67QYMGJexJ4fg59f/88w+Qfd6W76effgLgvvvuA8J3KW0eSufOnUP/Bth1112B\nINrjl0G2/PQ111wz7THLib+A5RVXXAGEX5f/+9//AHj99dcBuOaaa1zbL7/8EnosP9p26KGHArDW\nWmulPWe5RxWr4s/9skWJLSo2ZMiQkvSpnFk00F7vAH/99RcAvXr1AsLzm1KjsvPmzavtLsaOzbex\n158tkArB3BqT7xySZs2a1bB35cHOKSv17rOy5P7ckUqdi5M6DwfCc3GMRXWyLRSquTgBm2cO6Vkr\n77zzTrG7E5kiOSIiIiIikii6yBERERERkUSpsySGMc6oJXPt9/x0lf/7v/8DwqsG58Imj/ppQ5au\nVqwVrKP81xS73PDWW2/ttq1kqpkwYYLb7tKlCwCLFy8uSr+KMXZHH300AP379wfCIV0reTxs2DC3\n76WXXgLCBQdStW7dGgivbN2zZ08gWLU+E3ue008/Pef+V6XU513dunWB8KRl227cuHG1fcjU//nz\n5wNw6qmnun1PPPEEAIsWLaphjwP5jl1tvF5PPvlkt922bVsgmPBuRS/iptTnnKlXr57bthLFlkLq\nj529j9nk8Ez9t8IOfnqpX3q1UOIydrmyggH2Oe2nxaTyiw1YMYN8S09nE8exW3bZpbMIPvroIwA2\n3njjtGOsWFIpC1nEceyifp0t9ushjmOXyqZlQLC0in0H8b8XW/p9seQ7dorkiIiIiIhIoiQqkpPJ\n7rvvDoTvAK+33noAXHnllQCccsopru3nn38GgrtFpVzoqByu9rNFcl588UW3bf8PxVIOY5cru5vp\nR3eM3UWxib0ff/xxjZ8vjmNni3h26tQJCBcXscV8d9ppJwBGjx7t2saMGQMEE0rnzp1bq/2MQySn\nHMX5nDvzzDOBcIaAnXP2OWGfGwDTp08H4PjjjweCgiO1JY5jVy7iOHYbbrghkDniP3XqVAA6duwI\n1P65lU0cxy6XPtlnSCmLDMRx7Ixlk/jjY5lQv/32GwBbbbWVa5sxY0ZR+mUUyRERERERkYqmixwR\nEREREUmUxKerlbM4hzSNv+aQhTeXX355IFyP/u677y5qv8ph7OJKYxed0tWi0TkXncYuujiO3bRp\n04AgJdJn64T5a9CVShzHrlzEeexsasEzzzyT1mbr49j6fKWgdDUREREREaloy5a6A1Levv32W7ed\nqdSliIiI5Ob7778HMkdyRErJCvmUE0VyREREREQkURTJEREREYmBAQMGAPDss88CwULGkHkZAZFC\nsgWkk0KRHBERERERSRRd5IiIiIiISKKohHSMxbnMYNxp7KLT2EWnEtLR6JyLTmMXncYuOo1ddBq7\n6FRCWkREREREKlosIzkiIiIiIiJRKZIjIiIiIiKJooscERERERFJFF3kiIiIiIhIougiR0RERERE\nEkUXOSIiIiIikii6yBERERERkUTRRY6IiIiIiCSKLnJERERERCRRdJEjIiIiIiKJooscERERERFJ\nFF3kiIiIiIhIougiR0REREREEmXZUncgkzp16pS6C7GwZMmSvH9HY7eUxi46jV10+Y6dxm0pnXPR\naeyi09hFp7GLTmMXXb5jp0iOiIiIiIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSRRd5IiI\niIiISKLEsrqaiIiIVKa1114bgOuvv97tO+ywwwA46KCDAHjssceK3zERKSuK5IiIiIiISKIokiMi\nIhWtUaNGABxxxBFun0UM6tevD8B6663n2n7++WcA/v33XwBef/31Kh/73nvvddsTJ04sTIcTqm7d\nugCMGjUKgB133NG1LViwAIA5c+YUv2MiUpYUyRERERERkUTRRY6IiIiIiCRKnSVLliwpdSdS1alT\np9RdyJulMnTq1AkI0hkg+gTJKP81cR277bbbDoA33ngDgOuuu8619e3bt+DPl6SxK7Y4j91mm20G\nwEknneT2bbLJJgB06dKlyr5MmjQJgCeffNLtu+uuuwD4/vvvC9a/fMcurufcgw8+CMAhhxwCwNtv\nv+3a9tprLwB++umngj1fKc45/xw677zzAGjevHmNHjOTxYsXu+3evXsDMGzYsII9fpxfr7n4z3+C\ne63nnnsuAAMHDgTCY2ephGPGjCnYc5f72JVSMcdu5ZVXBoL3eoCDDz447bhlllkGgD59+uTVl3fe\neQeAl156CYBx48a5tpdffjlCj7PTeRddvmOnSI6IiIiIiCSKIjlVWGWVVQDYaaed3L5ll11ap+HK\nK69MO97uNKyzzjoA/PXXX67to48+AoISmADTp0+vtg9Jutq3O8Pdu3cHggm7AMstt1zBn69cx65X\nr14ArLTSSpF+//fff3fbw4cPj/QYcRk7ew0C3HjjjQAcfvjhQGHOmW+++QaADTbYAAjfNY4qKZGc\nr7/+GgjezwYPHuza7G67/xquqVKccw899JDbtgnua621VtpxFnV+//3383r8XXfdFYAWLVq4fSNG\njADg/vvvz6+zWcTl9RrVnXfe6bZ79uwJBJ+PHTp0cG3z5s0r+HOX+9iVUjHGziI3zzzzDBAu/lFI\nM2bMCD3+H3/84dp22203IBzNrimdd9EpkiMiIiIiIhVNJaSBrbfe2m23atUKgDPPPBOArbbaqsrf\ne/fdd932a6+9BkDDhg2B4OofoG3btgAceOCBbp8/JyWpmjZtmrZtdyP8POxysPHGGwPwyCOPuH0W\nabD5V1dccYVr23nnnQHYb7/9cnp8G5cmTZoAQW5xtmMh/a7G/Pnz3faECRMAmDZtWk59iAv7+yzq\nB3DUUUcV/HnWXXfd0PNJwO6aWyTn6aefdm2FjOCUkl8u+vLLLwegX79+bt9nn30GwMUXXwzAn3/+\nmdfjWxlkyWyfffYBoFu3bm7fokWLALjwwguB2oneFJt9J7D5XvbZUB07burUqW6f//4O4feuu+++\nG4BffvklemdjwDJmAK6++mogewRn7ty5bnvmzJlVHmeR+0xR1GeffRYIxu6rr75ybSpZHrC51Qcc\ncIDbZ5H9bOyz9ttvv62djmVRXt80RUREREREqqGLHBERERERSZTEp6vZBOVmzZpVeYyfitGgQQMg\nCFH6k039dCSAsWPHuu3USct+W9euXQFo3LhxXn0vdxbaBGjfvj0QpFeVW8rLKaecAgQljH2W0uOn\n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\nftntK5e1H/Idu7i+102aNAmAv//+GwhSPAB+/fXXgj9fnF+vcaexiy7OY2fv+5n6OG8MYHu6AAAg\nAElEQVTePCD8Whw2bBiQvVBBIcV57DKxdddszaZLLrnEte29996hY/1xve2224DgM8hP1Yq6PmK5\njZ39zVaQwV8nZ+bMmUXtS75jp0iOiIiIiIgkiiI5MVZuV/txUg5j17FjR7e91VZbVXmcTcD3V7eu\nTeUwdnGVlEhOsemci05jF12cx+6WW24B4MQTT0xr++GHH4Ag6g1w5plnArBgwYIi9C7eYxd35TB2\n6623ntueMmUKAM8//zwQLglfbIrkiIiIiIhIRVMJaZES8cvyJr1Er4iI5M4WtPz000/T2qyE9Icf\nfljUPknlWGmlldy2zWcaP358qboTmSI5IiIiIiKSKLrIERERERGRRFHhgRgrh8lpcaWxi05jF50K\nD0Sjcy46jV10GrvoNHbRaeyiU+EBERERERGpaLGM5IiIiIiIiESlSI6IiIiIiCSKLnJERERERCRR\ndJEjIiIiIiKJooscERERERFJFF3kiIiIiIhIougiR0REREREEkUXOSIiIiIikii6yBERERERkUTR\nRY6IiIiIiCSKLnJERERERCRRdJEjIiIiIiKJooscERERERFJlGVL3YFM6tSpU+ouxMKSJUvy/h2N\n3VIau+g0dtHlO3Yat6V0zkWnsYtOYxedxi46jV10+Y6dIjkiIiIiIpIousgREREREZFE0UWOiIiI\niIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSZRYlpAWERGR+FtttdUAeOedd9y+Qw89FIC3\n3367JH0SEQFFckREREREJGEUyZGimDVrFgBNmzYFkrmw1cYbb+y2u3btGukxnn76aQCmTZtWkD6J\niNSmzTffHIB11lnH7XvkkUcA2GyzzQD4/fffi98xEal4iuSIiIiIiEii6CJHREREREQSpc6SJUuW\nlLoTqeKaytShQwcAdtttt7S2yZMnA/Dhhx8CsGjRItc2d+7cSM8X5b8mrmOX+rfUdj9LMXYDBgxw\n2/369av2eTL18ccffwRg4cKFbl/fvn2BIOXvzTffrFE/qxPH865+/foAtG/fHoCLLrrItXXq1AmA\nf//9N9Jjjxw5EoDjjz++Jl0E8h+7uL5eiy2O55zZZ599gPBr+pVXXgFg6NChAMyZM6cofckkLmP3\nww8/uO1VV10VgP322w8I0nDjJi5jV47iMnarrLKK295mm22A4Dta586dXVu7du2q7dfNN98MwPPP\nP+/aJk2aBMA///wDwC+//FLjPsdl7MpRvmOnSI6IiIiIiCSKCg/k4dJLLwUyR3JSTZ061W1vt912\nAPzxxx+10q+4sr+7Uuy88841fgy7A+obNWoUAPPmzQPg2GOPdW1xvUNaE3Xr1gXgnHPOcfvOPvts\nIHzXzlgEx+7w+HfaFixYEDq2cePGbnv55ZcHYIsttgCCaBFU3msVCvP316tXD4C7777b7VthhRUA\n2HfffWvQu9LZZJNNANh+++3dPtvu3r07AOeee65re/zxx4vYO0mq1q1bA9CzZ0+374033gDg4IMP\nBuCwww5zbWeccQYQRCOSyN5LAHbaaScAHnjgAbcv0+enyRYBsLZTTz019NNnWRZDhgxx++644w4A\nvvvuu2r7ngR2vtl3EgjGbtiwYUDmsSslRXJERERERCRRFMmpQvPmzQG47bbb3L5sEZzUeRatWrVy\nbZ988gkQ3DGGwuR1xt3o0aNL3YWiuvbaa912s2bNgPD/8xVXXBE63j8fLEJhOewNGzZ0bQ0aNACC\nKMT555/v2pIYybnuuusAOPnkk3M6/ssvvwRg3LhxANx0001pbVbe9tFHH3Vtbdu2BWDKlClAZUZv\nIBjnY445xu0777zzAHj55Zer/f211lrLbdsdPrvLmgS22KV/fthdSxuzhx56yLXZOffwww8D8NJL\nL7m2GTNmAMH8OpFUHTt2BGDs2LEArLTSSq5t9uzZQPB58fPPP7u2ddddt1hdLLr11lsPCEdMTzzx\nxLwe488//wTgo48+SmuzMuh+pCiVRYkuu+wyt2+XXXYBgnl7/vMkyeGHHw7APffcA4SjYrZt310U\nyREREREREalFusgREREREZFEUboa4RDlaaedBsBxxx0HBJNOM/FDxTbR1tKUDjzwQNfWtGlTIDwR\n31Jrksz+bp+lcCTRU089lXG7KrYquK93795AkLIA4XSXSuCn8aX6+OOPAZg4caLbZxNuM7HX3Jgx\nYwBo0qSJa7PXb9LSKhs1auS2Uws13HrrrWltVpb7P/8J7nlZekIu6Wr2+xCkqfkFHy6++OKc+x5H\nu+66KxAu3W5pMzbpuX///q7NJozb3+3//Vb6fODAgbXYYyln+++/PxCULG7RooVrs1Lllh7vp+Za\n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\nv/xp6vjceOONbjtTuWIrlWqFCvyJoY0bNwYyp7pYoYVbbrkFCKeoLVy4ML8/IGFs3KxYhZ8mWMlp\nauacc84BglXTR40alXZM3bp1ARgzZozb17ZtWyBId/NXXa9Us2bNctsHHHAAAG3atAGgd+/ers0m\nNtsxEyZMcG1PPfVUrfdTyo9fsnjIkCFVHmfnlqVHdu3atcpjL7zwwgL1LhksPfyMM84AYPbs2a5t\n//33B+K7fIoiOSIiIiIikiiJiOSk8ifQKtJQc/4Ynn322QAMHjwYCO52VjIrGuAvVOZvS/X8idsW\nrfFl2pdqwYIFQLhk79ChQ4HyKMxQbLaA8TPPPANkjlRUsvHjxwMwcOBAIBzFXmmllQDYb7/9gHCJ\nZDvnHnzwwaL0s1x98MEHABxzzDEl7omUs5EjR7rt1KipX4Lcykpb5kUmVrTGXsOylBUOsYV8X3nl\nFdcW96i/IjkiIiIiIpIousgREREREZFESWS6mtSeG264IfRTJFfff/+92z7yyCOBYIJnrusS3HTT\nTUB4kuPixYsBuPbaa4EgbU2ys0m62SbrVjJb1btVq1YAXH311WnH2BpZNiEXgjWgRGrbv//+W+ou\nlNywYcPc9hNPPAHA9ttvD8Duu+/u2qxISCapaWrZ1muqFDvvvLPbtvG0Yl2XXXZZSfoUhSI5IiIi\nIiKSKHWWxPCS1UqaVroo/zUau6U0dtFp7KLLd+w0bkvpnItOYxdduY1dr169gCBq7Re8sKhisZTb\n2MVJOYxd69at3bZFyyyS071796L2xZfv2CmSIyIiIiIiiaJIToyVw9V+XGnsotPYRadITjQ656LT\n2EWnsYtOYxedxi46RXJERERERKSi6SJHREREREQSRRc5IiIiIiKSKLrIERERERGRRIll4QERERER\nEZGoFMkREREREZFE0UWOiIiIiIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSRRd5IiIiIiI\nSKLoIkdERERERBJFFzkiIiIiIpIousgREREREZFE0UWOiIiIiIgkii5yREREREQkUXSRIyIiIiIi\nibJsqTuQSZ06dUrdhVhYsmRJ3r+jsVtKYxedxi66fMdO47aUzrnoNHbRaeyi09hFp7GLLt+xUyRH\nREREREQSRRc5IiIiIiKSKLrIERERERGRRNFFjoiIiIiIJEosCw+IiIhIvCy77NKvDBdeeKHbd9FF\n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\nrI4dOwLQv39/ALbYYotGj/n4448B2HzzzcO+SZMmVWF0ZpZPz549ATjjjDPCvrPOOqtGozGzeuVI\njpmZmZmZZYojOWaWKd27dw/bI0eOBGCuueZq8vErrLACANdcc03Yt/XWW1dodNaSLbnkkgAssMAC\nQHLuAfTo0QOADTfcMOxTlHHHHXes1hBToVu3bgBMmTIl7Bs1alSthmNmdcqRHDMzMzMzyxRf5JiZ\nmZmZWaY4Xa0IShkYPnw4AN9880041qdPHwBGjx5d/YGlhBaGquznbLPNVsPRVMbVV18dtnv16vWH\nj/+//0vuI/z+++9/+Pinn34ayE2deuWVV3L+teattdZaYXvGjBkA9OvXD4CxY8eGY+uuuy4AgwcP\nBmD++ecPx/R7K+R3Zo3NM888YXv69Ok1HEllzDHH/746F1poISBJQ4Mk1Uo22GCDsL3pppsC0KpV\nKwAWXHDBcGzatGlAUioZ4Oabby7nsFNPhQZ23313AI444ohw7I033qjJmCyd2rVrB8BBBx3U6Nh6\n660HwFZbbVXUc+pvlssvvzzs+/bbbwE477zzgGx+nmWZIzlmZmZmZpYps82cOXNmrQfRUBoiAKuu\nuioAp5xyStinspb5xjds2DAADj/88LKNoZRfTbXnrkuXLmF7/PjxOcceffTRsN21a9cqjeh/KjV3\nv/32W9gu5C5/sZGcfBEELT5WWeM4yqPI4VdfffWHz12oejjvykHFCJ544gkguTMISTTos88+K+o5\ni527epy35uy5555ActcTYMUVV/zDn0vjObfooosC0Lt3bwDWX3/9cExRP5Ukj8dSyP/LPffcA8Ad\nd9wR9j3yyCNA7mL7QqRx7ooRfzfcfffdANx3330A7LPPPuFYJaKqtZ47feY8+eSTYd+VV14JJGXv\n4++cNKnF3O27775hWxkjbdu2Leo5pk6dCsD333/f5GPi55x99tmB5Jzcaaedinq9fGp93uVz4IEH\nAnDyyScDuZ/bDf8uiSPM+szX70bFfiql2LlzJMfMzMzMzDLFa3IaUP70Qw89BMAiiyxSy+GkXhzJ\nUeRG++JjWXH22WeX7bmOOuqosN26desmH6cys/q3U6dO4dj1118PFLY+yHLpLrxK9j7zzDPhWLER\nnJZs0KBBYfuvf/0rAIcddlithlM2q622GpD/Pf/+++8D8M477wC5d1lvv/12ILlTHN/Z1Bqxr7/+\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# takes 5-10 seconds to execute this\n", - "show_MNIST(train_lbl, train_img)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzkAAAKqCAYAAAAZl5BAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XncTOX/x/GXIksiS0WWKFvRokVo0SJpIRTtKIUW2qSk\nVaRFaS+lVLKmtCgt+rUISXtpIaWFEFKKbM3vj76f61xzz9zjnrnnvmfm3O/n49HD6TozZy6XM8s5\nn8/1uUpFIpEIIiIiIiIiIbFNpjsgIiIiIiKSTrrIERERERGRUNFFjoiIiIiIhIouckREREREJFR0\nkSMiIiIiIqGiixwREREREQkVXeSIiIiIiEio6CJHRERERERCRRc5IiIiIiISKrrIERERERGRUNFF\njmfDhg1cddVV7LrrrpQvX56DDz6YN954I9Pdynp//fUXN9xwA+3bt6dq1aqUKlWKJ554ItPdygnz\n5s3j4osvpmnTpmy//fbUrVuXbt26sWDBgkx3LavNnz+frl27svvuu1OhQgWqV6/O4YcfzksvvZTp\nruWkYcOGUapUKZo1a5bprmS1t99+m1KlSsX97/33389093LCxx9/TMeOHalatSoVKlSgWbNm3Hvv\nvZnuVlbr2bNnvuddqVKlWLJkSaa7mLUWLlzIaaedRu3atalQoQJNmjRhyJAhrFu3LtNdy3offfQR\n7du3p1KlSuywww60a9eOTz/9NNPdSkrpTHcgm/Ts2ZMpU6Zw6aWX0rBhQ5544gmOP/543nrrLQ49\n9NBMdy9rrVy5kiFDhlC3bl323Xdf3n777Ux3KWfcdtttzJo1i65du7LPPvuwbNky7r//fvbff3/e\nf/99/ejMx48//sjatWvp0aMHu+66K+vWrePZZ5+lY8eOjBo1it69e2e6iznjl19+4ZZbbmH77bfP\ndFdyRv/+/TnooIOi2ho0aJCh3uSO119/nQ4dOtC8eXOuu+46KlasyKJFi/jll18y3bWs1qdPH9q2\nbRvVFolE6Nu3L/Xq1aNWrVoZ6ll2+/nnn2nRogWVK1fm4osvpmrVqsyZM4cbbriBjz76iBdeeCHT\nXcxaH3/8MYceeih16tThhhtu4N9//+XBBx+kTZs2fPDBBzRu3DjTXSyYiEQikUhk7ty5ESByxx13\nuLb169dH9thjj0irVq0y2LPs988//0R+/fXXSCQSicybNy8CRMaMGZPZTuWIWbNmRTZs2BDVtmDB\ngkjZsmUjZ555ZoZ6lZs2b94c2XfffSONGzfOdFdyyqmnnho56qijIm3atIk0bdo0093Jam+99VYE\niDzzzDOZ7krO+eOPPyK77LJLpHPnzpEtW7Zkujs5b+bMmREgMmzYsEx3JWsNGzYsAkS+/PLLqPbu\n3btHgMjq1asz1LPsd/zxx0eqVKkSWblypWtbunRppGLFipEuXbpksGfJUbra/0yZMoVtt9026g5w\nuXLl6NWrF3PmzOHnn3/OYO+yW9myZalRo0amu5GTWrduzXbbbRfV1rBhQ5o2bcrXX3+doV7lpm23\n3ZY6deqwZs2aTHclZ7z77rtMmTKFu+++O9NdyTlr165l8+bNme5Gzhg/fjzLly9n2LBhbLPNNvz9\n99/8+++/me5Wzho/fjylSpXijDPOyHRXstaff/4JwC677BLVXrNmTbbZZpuY714JzJw5k7Zt21Kt\nWjXXVrNmTdq0acO0adP466+/Mti7gtNFzv988sknNGrUiEqVKkW1t2jRAiDn8hAld0UiEZYvX071\n6tUz3ZWs9/fff7Ny5UoWLVrEyJEjmT59OkcffXSmu5UTtmzZQr9+/TjvvPPYe++9M92dnHLOOedQ\nqVIlypUrx5FHHsmHH36Y6S5lvRkzZlCpUiWWLFlC48aNqVixIpUqVeKCCy7gn3/+yXT3csqmTZuY\nPHkyrVu3pl69epnuTtY64ogjAOjVqxeffvopP//8M5MmTeKhhx6if//+StFNYMOGDZQvXz6mvUKF\nCmzcuJEvv/wyA71Knubk/M+vv/5KzZo1Y9qtbenSpcXdJSmhxo0bx5IlSxgyZEimu5L1rrjiCkaN\nGgXANttsQ5cuXbj//vsz3Kvc8PDDD/Pjjz8yY8aMTHclZ2y33XacfPLJHH/88VSvXp2vvvqKESNG\ncNhhhzF79myaN2+e6S5mrYULF7J582ZOOukkevXqxfDhw3n77be57777WLNmDRMmTMh0F3PGa6+9\nxqpVqzjzzDMz3ZWs1r59e26++WZuueUWXnzxRdc+ePBghg4dmsGeZb/GjRvz/vvvs2XLFrbddlsA\nNm7cyNy5cwFyptiFLnL+Z/369ZQtWzamvVy5cm6/SFH75ptvuOiii2jVqhU9evTIdHey3qWXXsop\np5zC0qVLmTx5Mlu2bGHjxo2Z7lbWW7VqFddffz3XXXcdO+20U6a7kzNat25N69at3f937NiRU045\nhX322YdBgwbx6quvZrB32e2vv/5i3bp19O3b11VT69KlCxs3bmTUqFEMGTKEhg0bZriXuWH8+PGU\nKVOGbt26ZborWa9evXocfvjhnHzyyVSrVo2XX36ZW265hRo1anDxxRdnuntZ68ILL+SCCy6gV69e\nDBw4kH///ZehQ4fy66+/Arnzm1jpav9Tvnx5NmzYENNuYfR4YTuRdFq2bBknnHAClStXdnPEJLEm\nTZrQtm1bunfv7vKEO3ToQCQSyXTXstq1115L1apV6devX6a7kvMaNGjASSedxFtvvcWWLVsy3Z2s\nZd+hp59+elS7zSmZM2dOsfcpF/3111+88MILHHvssVHzJSTWxIkT6d27N6NHj+b888+nS5cuPPbY\nY/To0YOrrrqKVatWZbqLWatv375cc801jB8/nqZNm7L33nuzaNEiBg4cCEDFihUz3MOC0UXO/9Ss\nWdNdofqsbddddy3uLkkJ8scff3DcccexZs0aXn31VZ1vKTrllFOYN2+e1hlKYOHChTzyyCP079+f\npUuXsnjxYhYvXsw///zDpk2bWLx4MatXr850N3NKnTp12LhxI3///Xemu5K17DMt7yTwnXfeGYDf\nf/+92PuUi55//nnWrVunVLUCePDBB2nevDm1a9eOau/YsSPr1q3jk08+yVDPcsOwYcNYvnw5M2fO\n5PPPP2fevHmuWEijRo0y3LuC0UXO/+y3334sWLDAVeMwln+43377ZaJbUgL8888/dOjQgQULFjBt\n2jT22muvTHcpZ1kI/Y8//shwT7LXkiVL+Pfff+nfvz/169d3/82dO5cFCxZQv359zQdL0vfff0+5\ncuVy5u5mJhxwwAFAbC6/zXdV2mTBjBs3jooVK9KxY8dMdyXrLV++PG50ddOmTQCqjlgAVapU4dBD\nD3XFaWbMmEHt2rVp0qRJhntWMLrI+Z9TTjmFLVu28Mgjj7i2DRs2MGbMGA4++GDq1KmTwd5JWG3Z\nsoVTTz2VOXPm8Mwzz9CqVatMdyknrFixIqZt06ZNPPXUU5QvX14Xigk0a9aMqVOnxvzXtGlT6tat\ny9SpU+nVq1emu5mVfvvtt5i2zz77jBdffJF27dqxzTb6Ss2PzR957LHHotpHjx5N6dKlXSUsyd9v\nv/3GjBkz6Ny5MxUqVMh0d7Jeo0aN+OSTT2Ii+xMmTGCbbbZhn332yVDPctOkSZOYN28el156ac58\n1qnwwP8cfPDBdO3alUGDBrFixQoaNGjAk08+yeLFi2M+lCXW/fffz5o1a9xduZdeesmtYt2vXz8q\nV66cye5lrSuuuIIXX3yRDh06sHr1ap5++umo/WeddVaGepbd+vTpw59//snhhx9OrVq1WLZsGePG\njeObb77hzjvv1B31BKpXr06nTp1i2m2tnHj75D+nnnoq5cuXp3Xr1uy888589dVXPPLII1SoUIFb\nb701093Las2bN+fcc8/l8ccfZ/PmzbRp04a3336bZ555hkGDBilFtwAmTZrE5s2blapWQFdeeSXT\np0/nsMMO4+KLL6ZatWpMmzaN6dOnc9555+mcS+Ddd99lyJAhtGvXjmrVqvH+++8zZswY2rdvzyWX\nXJLp7hVcplcjzSbr16+PDBgwIFKjRo1I2bJlIwcddFDk1VdfzXS3csJuu+0WAeL+98MPP2S6e1mr\nTZs2+Y6b3p75mzBhQqRt27aRXXbZJVK6dOlIlSpVIm3bto288MILme5azmrTpk2kadOmme5GVrvn\nnnsiLVq0iFStWjVSunTpSM2aNSNnnXVWZOHChZnuWk7YuHFj5MYbb4zstttukTJlykQaNGgQGTly\nZKa7lTNatmwZ2XnnnSObN2/OdFdyxty5cyPHHXdcpEaNGpEyZcpEGjVqFBk2bFhk06ZNme5aVvvu\nu+8i7dq1i1SvXj1StmzZSJMmTSLDhw+PbNiwIdNdS0qpSERliEREREREJDxyI6lORERERESkgHSR\nIyIiIiIioaKLHBERERERCRVd5IiIiIiISKjoIkdEREREREJFFzkiIiIiIhIqusgREREREZFQKZ3p\nDsRTqlSpTHchK6SyhJHG7j8au9Rp7FKX7Nhp3P6jcy51GrvUaexSp7FLncYudcmOnSI5IiIiIiIS\nKrrIERERERGRUNFFjoiIiIiIhIouckREREREJFSysvCAiIiIlCyzZ88GoHbt2gDUrVs3k90RkRyn\nSI6IiIiIiISKIjkiIpJQu3bt3PYNN9wAwCGHHJKp7kiIdOvWzW23atUq332TJ08utj6JSDgokiMi\nIiIiIqGiSI6kZMGCBQDssccerq1SpUoA/P333xnpUxi0bNkSgDlz5ri2H374AYA2bdoA8PPPPxd/\nx6REu+CCCzLdBQmpSy+9NKbNPuP8z0ERkWQpkiMiIiIiIqGiixwREREREQkVpatJSiKRSNSfAJ07\ndwbg6aefzkifcln58uUBaN++PRA9rvXq1QPgnHPOAWDkyJFu37p16wDYsmVLcXQza2yzTXB/pkyZ\nMlH7zj//fLe9yy67pHT8m2++GYCNGzem9PywqFChAgCHH364a/vmm28y1R0JESsqkLfYAASfcUrN\nFZHCUCRHRERERERCpVTEv2WcJUqVKpXpLmSFVP5pimvs3n//fQAOPPDAmH2lS2c+QJjNY2d22GEH\ntz1x4kQAjjvuuKSOMWjQIABGjBgBpCeik81j16BBAwCGDBni2k477bS0v45NeE62THKyY5ftn3U2\n3vPnz3dtY8aMAaBv375pe51MnHOnnHKK2/76669TOkazZs0AOPTQQ2P2WXTWIrA+6/t3333n2vbf\nf38A/vrrr6T6kM3v10Rs4U8/kmORG3vfFXUkJ1fHLhtkeuy22247AB599FHXdvbZZ+f7etbfd999\nF4BRo0a5ffPmzYt63q+//uq2i6KQUqbHriC23XZbt23FQc477zwANm/e7PY9++yzQPAbJNnPr2Ql\nO3aK5IiIiIiISKgokpOHlfAtV64cENy1BPj333+3+ny7O/XAAw+4Not6JCubr/ZPOukkAK677jrX\nts8++wBQt25dAJYtW1YsfYknm8fOym6/+uqrMW2psjst9957b6GOA9k5djVr1gTg7bffBqBhw4b5\nPvaPP/5w2wWJbFWpUgWI/jvYdrJ/r7BFcg444AAg+k7nmWeeCcCECRPS9jrFec5ZdOqjjz5ybdtv\nv32+xy9I3+LdMS7I4/3H2jn+22+/bfX5vmx8vyZic3EmTZoUs8+iOql+ZyYrE2PnP9+iETvttJNr\n6927d9Tjd9ttN7fdvXv3fI/78MMPA8H5c99997l9K1euBFL7++Yn0+dd69atAZg5c6Zrs6iCLbfg\nj6v1N957L2/b0qVL3T6b9/rcc89FvQbAjz/+CITrPWsRbj9bYs8994x6zIYNG9y2ncMWIfOzUdav\nX5/2/imSIyIiIiIiJZouckREREREJFQyP0M8g66++moAGjVq5Nq6dOkCBOkLfqnagqSrWblffzKl\npUeEyQsvvBDTNnnyZCBIYbvooouKtU/ZLm+aWqIUNT8cfPvttwNQuXJlAPr37x/zeEsrCiubCPrJ\nJ58A0elqVuZ57ty5QPSE8rxpBFYSGeDGG28EoF+/fgCULVvW7bNzuaQ76KCDgOgUgVQn6WcLm+z/\n4IMPurYrr7wy7a+zatUqIP73hqXYfPnll67N0mLCzn9/QlDkA4ovTa04WZpR165dATjyyCPdvryp\naVuT6DdI3mMNHjzYbVua27hx45J6vWxmBQcsjQxg2LBhQHCO3XDDDW7f2LFjgeA74LXXXnP77L1q\nhXz89FX7TWgFbq666qqYvrzzzjtu2//3zSX77bcfAKNHjwaC3xsQnHeWtmzTFSAoONC0aVMg+nu0\nKNLVkqVIjoiIiIiIhEroIzk1atQAou/MHnbYYUD8uyI2Wd7uDlghAQiucE2TJk3c9sCBA4GgXGj9\n+vXdvuuvvx6InsgVFlZkAIKSg2eddRZQsiM5Nhb77ruva7OJtvEiOBap+PbbbwG49dZb3b7XX38d\ngBNOOAGIH8kpKezv/sYbb7g2myQ6ffr0fJ9Xq1YtIJicC8F4Gr9crZ3DJd0ZZ5wBwO+//+7aPv30\n00x1J63++eefhPsXLlwIwJIlS4DoSMuTTz4JBHd3q1at6vY9//zzQFCi1o/KllR16tRx2xbRMHff\nfXdxd6dY2TmSaJFsv0CKLbb72GOPpfR6e++9NwA9evRwbVZQKUyRHIsqDB061LXZpHeLPH/44Ydu\n3+LFi6Oeb8V6AMaPHw/AV199BQQFBQCmTJkCBBPsrdQ7BL8Pky08kC38TKVOnToBQQTnzz//dPvs\nHI73HWu/dSxqs2bNmqLpbIoUyRERERERkVDRRY6IiIiIiIRKqNLVSpf+769z8cUXuzZbAdfWcIEg\nTc3SXPx0gvPPPx+At956a6uvZ2FlgHPPPRcIUmD89IUws7+3RKfu3XPPPUD0BD1jE+VnzZrl2mxi\nqKXGSHwrVqwAEqdy+OtKWHqbrdS8ww47uH22ns5LL70EQK9evdy+TZs2panHmWWTQG3yrKVeQOK/\no028tbUo/BXASwr7u69evRqA8uXLu309e/YE4M033wSi1+rwiwnIf+68886YtmeeeQYIf5EPW6PG\n0h394ifGX9vLfrN89tlnhXrdo48+2m3bujH2vv77778Ldexs9fjjjwPBb0BLs4LgvWrfv376aZky\nZQDYcccdgeh0NWPP84tj7LLLLkDupqv5v1msSMPatWsBGDBggNuXKBV80aJFQPwxywaK5IiIiIiI\nSKiEIpJjpe/sbriVhM3PTTfdBASTR9N5BWrlBe+44w7XZuUF/YlutnJ7rk/inTp1qtu2CY8ljd0F\nmjFjhmuLVzb8p59+AoIoz8iRI4uhd+G3++67A0GhCyv+AcGdObNgwQK3bSVXbaXmMLr88suBoLTq\n559/7vbNnz8/3+dVr14dCCam+mVaw8JKswN06NABgObNm7u2vfbaCwhK8bZr1y7fY/mrkVuJassU\n8EvVPvHEE0DJiYx169YNiC02AHDXXXcVd3cywoqkHHvssUDs6vF5FcXE7bzlfcMQybHfbf7vN4tO\nX3PNNUAQLYTgcz5eFoCNR7LjkqsRHHPZZZfFtP3yyy9AUKJ7a6yYj31nZBtFckREREREJFRCFcmJ\nF8GxuyJ+2d0JEyYUeZ/8fForzXfBBRe4NstRzvVIjt1FL8nsbrcfvdm8eTMAN998s2uzu7h+qWJJ\nTsWKFQE45phjXNsjjzwCQLVq1WIeb6WPX3zxRSC6rHlJWHzRxss+B61E/tbYHB4TxkiOv1Cd5ZXb\ndwkEEXgrR+sviJqIfSban4ceeqjbZ98Bfi58mOVd+BOCz78wLvyZiJUb9pelkNT5C33m9eyzzwLR\n0UKLTNgcKVtKBIJz0aKwYVepUiUATj/9dNdmc3Fs2YBEbC4SBKXRbUFyf078U089VfjOFpIiOSIi\nIiIiEiq6yBERERERkVAJRbpaojLGlqZWHClqAO+99x4AX3/9dUybb+DAgUAwqTVX+WlDxlJk+vTp\n49ps9e8wssmO/sRka7OUl6KWreUbC8MvtWqTdq2sZatWrWIebylZtuI8wL333gvkflpoMvxJ8Icf\nfnjUvoKmXFnJWWMrgYeVrYx+8sknx+yzJQZuu+021/bQQw9FPcYf544dOwKw6667AtErpFubpVj6\nqR1WojYM6tSpA8QvOOBPBpfiYWXQt2zZkuGeFC8rQADBxHgrluR/Ft54443F2q9M+/PPP4Ho36n1\n69cHEn9X7rzzzgA8+OCDru2II46Ieoy/FIPS1URERERERNIsFJEcm0Bmi3z6inuSn01cs4nnEExM\nDyN/scuhQ4cCwV33tm3bun1hjuTYeeeXkE4nm1Afr7DG//3f/wEwfPjwInntTKhduzYQfcf34IMP\n3urz7E67f8e9JLI7cgCHHHIIENyxszu68fglQC2SY2VXc71U6tbMmzcv330WbRkzZky+j7GJznm3\nIbqYgY2n3e30F50urmyD4hCv4ICZO3cuEER74kVla9WqBUQvXquCLQVz5JFHAtHvZyt64y86WhL4\n0VErOtOjR4+Yx4V5GYFE/vrrrwI9rl69ekBQyKFz5875PtbPpMgG4f31LSIiIiIiJVIoIjl2Jz1e\nJMfuZmRyzkK8ft16660Z6En6WS47BPNPbJ5Oy5YtM9KnsLEF9eItRmgLkYYpWmhzcQoSvfFdeeWV\nQHRZ8yuuuAIo+B2rMIh3F33EiBFAcL5AMG/MHH300W67cuXKQLgjsFtjZaUnT55cqOP4Oe5nn302\nEJTk9nPbX331VSAoe57L4kVnjEVpZs2aBQQRna0dx97LiugkZuPpz2kUuPbaa4Hgu8CPTt9yyy1A\n8B0bhsVSC8LeUxAsFG0LR/vfmbaQvc3JiWfVqlVAEDXMFuH5ZSQiIiIiIoIuckREREREJGRCka5m\nE52sdKdv0qRJQHQKR1GWk7VJpt27d4/Zt3jxYrftT6iUkslWHYYgVcgm3Z9zzjluX8OGDfM9hhXd\nGD16NBBdvnHdunUxj2/UqBEQFMiIl0qZaZaOcscdd7i2vfbaC4AWLVoAsNNOO8U8r2rVqgCcf/75\nrm2HHXaIagtzGoKVJ45XoOKxxx4DgpQNCCbSz58/H4ifHmgpL4nS3HJV6dLB11/jxo2B6LHLWyY6\nHV544QUgSFO78MIL3T5b7uCmm25K++sWN/sci8dfhT6vOXPmRD0/XglqS9+V+OrWrZvpLmQNv/iR\nFRC5/fbbgehiA9OmTQOCVKuePXu6fWH+zrCUXAhSQy01rUOHDm6fFayYOXMmAE2bNnX77Hv3p59+\nAmDt2rVF2OPkKZIjIiIiIiKhUipS0NXhipG/mF1BtG/fHoCnn34aCCbN+uzqHWDs2LEAfPPNN6l2\nEYAdd9zRbVsExyapVqlSxe2zCI5fbrkgi+ul8k+T7Nil06BBg4CglPTSpUvdvkSTS4tCNo7d9ttv\nDwRRvssvv9zt22OPPdLyGgsXLnTb8RYXtAiI/XvEuyufjWNnbJwsQuO32XjGm/ScN4JVVJIdu8KO\n23bbbee27W6kf/fSCq7YgsQW+YPgjq/1IV7flyxZAkTfubOF5NIpE+ecP4nWyjf7xReKkhVnmT59\numv77LPPADjggAOSOla2vF/9z3i7q1sQp556qtu270/7M14kxx5f2IIQkD1jl07ffvstAA0aNHBt\n9pn4wQcfpO11cmHsfvjhB7dtv8OsxLbPMiBskV7/96L9rkmnXBi7mjVrum0rQmBFQ6xIAQRR/uuv\nvx6Am2++uUj7lezYKZIjIiIiIiKhEoo5OVZ688wzzwSgd+/ebp/N0xk4cKBrs7tDdnfTZ2VorRye\n7+qrrwaCu8K77LKL22elB62U74oVK9w+mw9UkOiNhEPZsmWB6LuUnTp1ivozWW+//TYQfX5bKfIu\nXboA8efv2EKQADfccAMQvVhtLvFziI3NsbOITqLytWHjlw63z6Nx48a5tr59+wLx88oPPPBAIFjY\nzb9jabnXJ554IpB9edbp1rp1awD23Xdf12aRlaLgR7mNzanKVXaXN55E83D8iIxFgxLN6ZH4LDpo\nY+eX2vYj/GFm798+ffoA0e+zRHO5bM7iPvvsA8BVV13l9k2cOBEo2s+DbPTrr7/GtFl0x5+jaVEe\n/3snmyiSIyIiIiIioaKLHBERERERCZVQpKuZ1157DYDy5cu7Nts+9thjXZul9MSb7N2jR4+o//fT\nQQpSbtfCpFbStyQ566yzov6/XLlybttC6L/88kux9ilTbIJ3Olb/ffnllwG47rrrgOjJ83a+2uv4\nZcptgrifahSG1dTzssIjfhpfSfHPP/+4bSuv7X9OJSr3/OGHHwKw2267xeyzIi5hTlOzsqgQjMV5\n553n2uKV4i5K8VLYcsn777/vti1VytLP/AIChxxyCBCkt/lpRCNGjIh6nu+ZZ54B0lNwIIyqVasG\nBN+7r7/+utsXxs/9eCxtu3r16kAwjQAKVgr6kksuAeCoo45ybYMHDwZUuhyix8XYNIzvv/++uLtT\nIIrkiIiIiIhIqIQqkmNscVAIJmvbhDII7iT5Cyfmxy/bl7d0nRUpgKBQgb/AVEljE9CMX0bbytqm\nI7KRrY444gi3PXXq1EIdy0r3Alx22WVA/PLHdnfKygeHnU2uv+iii1ybvQ+t2IPP7i6FOSJhNmzY\nkNLz/PPWzJo1q5C9yX7+eFkU5bTTTnNtRRnJ8QuSGFsoNAwsqmMRmVTLS9vioABXXHFFmnoXTnvu\nuWfU/5eUQkf+b7Q2bdoA8OyzzwKpL+RpGTkQv0CV5A5FckREREREJFRCGcnxrVmzBoiOsNj28OHD\nM9KnsLIImpWmLSlsQcZXXnnFtfnzkZJhcwP8BR2LYvHFbGELpPbs2dO1Va1aFYALL7ww5vFWutIe\nE4+/AJzN11m+fHmh+xpWtkCsH4n97bffMtWdjLC7tVbuH4JS735mQGHZAo02v86fP2Vlu8PAoi5T\npkwB4OCDD3b7/EWQ87LIjc2/GTlyZFF1MXRsPop57rnnMtST4mXzbyCYC9u/f/+0HT+VhTvDyha9\n97300ksU4LnYAAAgAElEQVQZ6EnBKZIjIiIiIiKhooscEREREREJldCnq4kUNStkkWyK2sqVK932\nLbfcAsCoUaMAWL9+fZp6l3nbbrstAAMGDHBtAwcOBIIS7ZUrV075+JbaYkVGxo4d6/blLYYhsSxN\n6vjjj89wTzLniy++AKJTU+w8uvbaawGYMWOG2zd//vx8j2WFHCwN0C9jawUHLE3NzlkI1wRnKyFt\nf/pln1VAIH0GDRrktm1pjJJs3bp1QFCA4PPPP0/q+ZY+/eijj7q2klLAIZEmTZoA8b8jUi14U1wU\nyRERERERkVBRJEfSxiaNzp49G4gu253sHZVcYpPht8bKPP/f//0fAA888IDbl2jRxlxnhRP8RXqT\nZSW57c73mDFj3D6Lem3ZsiXl45dkdh7652NJY59Z/iLO559/PgB33nknENwlzrsN0WVsK1WqBCT+\nXLAI49ChQ11bmD8DJL3q1asHQN++fV2bnW/ffvstUHKi2H6RFHvPWiRmxx13dPtuvvnmrR7r7rvv\nBqBu3bqurXnz5mnpZy6zjAv701fY5TKKmiI5IiIiIiISKrrIERERERGRUFG6mqSNpRJZrfqS4vXX\nXwfih3IlSPeJx1IqLE0gP5s3bwai1xURSZeNGzcC0ek/tiaErftVoUIFt8/fhuh0tbzrathabQCf\nffYZAL179wZg0aJFhe67lDznnHMOALVr147Z98EHHwCwevXqYu1TNpg4cSIQFGGwAjcA3bp1A4JU\nNv99uueeewLQsmVLAHbffXe3r6StGRZPrVq1ov7/jz/+cNtr164t7u4kRb/KREREREQkVBTJEZEi\ndf3112e6CyJJszK0e+yxBwAHHXSQ29ezZ08AvvzySwCaNWvm9lnbvHnzAHjnnXfcvh9//LHoOiwl\nhl+WXGJZkYGFCxe6NovgWNaAXwb+m2++AeDYY48FFL3Jq1WrVlH/70egly9fXtzdSYoiOSIiIiIi\nEiqlInkTiLOAn99ckqXyT6Ox+4/GLnUau9QlO3Yat//onEudxi51uTp2tlxDixYtXJstWnnUUUcB\nRR+NyNWxywYau9QlO3aK5IiIiIiISKjoIkdEREREREJF6WpZTCHN1GnsUqexS53S1VKjcy51GrvU\naexSp7FLncYudUpXExERERGREi0rIzkiIiIiIiKpUiRHRERERERCRRc5IiIiIiISKrrIERERERGR\nUNFFjoiIiIiIhIouckREREREJFR0kSMiIiIiIqGiixwREREREQkVXeSIiIiIiEio6CJHRERERERC\nRRc5IiIiIiISKrrIERERERGRUNFFjoiIiIiIhErpTHcgnlKlSmW6C1khEokk/RyN3X80dqnT2KUu\n2bHTuP1H51zqNHap09ilTmOXOo1d6pIdO0VyREREREQkVHSRIyIiIiIioaKLHBERERERCRVd5IiI\niIiISKjoIkdEREREREIlK6uriYiISHYZNGgQAKVLBz8dRowYAcD69esz0icRkfwokiMiIiIiIqGi\nSE4SrrzySgBuv/12ILpe95o1awAYMmQIAHfffXcx9y432J3AoUOHxuy75pprALjtttuKtU/Fzerd\nn3LKKa6tXbt2AJx33nkALFy40O27+eabAXj55ZeB6PPu999/L9rOZpm99toLgOOPP961nXTSSQBU\nrVoVgG+//dbtO/nkk4HU1iXINTvuuCMAt9xyi2u79tprAVi9enXaXmennXYCYMWKFQA0bNjQ7fvu\nu+/S9jqSvW688Ua3PXjwYADq16/v2n799dfi7pJIgRxxxBFRf/puuOGGfJ935JFHAvD2228XQa+k\nqCiSIyIiIiIioaKLHBERERERCRWlq+Vjt912A+DUU091beeccw4A//77b8zjK1euDMAVV1wBKF0t\nL5uoWqdOHSB++lBJSCkCeOCBBwDo06dPzD47t/bYYw/X9sQTT0Q95q+//nLbdt6FXcuWLYEgVWC7\n7bbL97F77rmn2549ezYAF1xwAQCffvppEfUw85o3bw5En1eW+pnOdLXGjRsD8T8Hw8Q+s2rUqAFA\n7969C33Miy66CAhSKz/88EO37/DDDweyewL/li1bYtqefPJJAJYvX17c3REpMEtPs5S0eOlqBXm+\n0tVyiyI5IiIiIiISKork5HH66acDcP311wPQqFGjpJ5fs2ZNAP744w/X9sILLwDQvXv3dHQxZ/hl\nRi+//HIg/t3Qn3/+GYBp06YVT8cyZJdddgGgR48ehTpOuXLl3Hb79u0BePXVVwt1zGxnhQbKli0L\nxC++YHeSmzRp4vYdfPDBAMyZMwcIohAAP/30UxH2uHhUrFjRbd97770AtGjRwrWlqzBFs2bN3PaL\n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\nzJkDQP369YHo1dKtoIOlxviTqeU/dm77pePzlpHPVVbgAuCCCy4AolPLLNXRlg7wC9tYWmi8yd07\n7LADEP875+CDDwaCz4AwsPSogqZJ7bHHHkDwff3LL7+4ffbeF0nFkUceCUSXMU6GpYTbcaTgVq9e\nDcDs2bNd2/777w8U/t+lMBTJERERERGRUAlFCelEbOHFa665xrXZ3WDjTzC18tImk3eZirPMoE3I\n9v/+J510UszjrByqFSXwFwPNJsU5dttuuy0QPRn3+uuvB6IX27KSpy+99BKQ3jLI6ZSN5S0tqnPh\nhRcC0WXfLUoTr4ysLaA6f/58IIh4AaxcuRIIIrTpEJYS0sYihVbgAoL3/qRJk9L2Opk45/wFLYti\n8WYriGGlpCGIqiZauDpZ2fh+zRW5Nnb2e8YK/liJXghKa9v39jvvvFOkfcnmsbPy0H6xgbyLevrj\nY23FteBnNo9dYVnxEIBzzjkHgMsuuwyAe++9t9DHVwlpEREREREp0XSRIyIiIiIioRL6dLVcFuaQ\nZlHT2KVOY5e6sKWrFZdMnHO2sjdAy5YtATjssMNcm61H1aVLFyC68IClZNStWxeITlW19Z1uvPFG\nIDrluSjo/Zq6XBs7S/u54447YvbZ2laWvlvUcm3sskmYx65bt25u++mnnwaCNejSsYaT0tVERERE\nRKREUyQni4X5ar+oaexSp7FLnSI5qdE5lzqNXepybewSRXLee+89IJhgX9RybeyySUkZuyFDhgBB\nIaZ0UCRHRERERERKNEVyslhJudovChq71GnsUqdITmp0zqVOY5e6XBu7Ro0aATBt2jQAdt99d7fP\nFledMmVKsfQl18Yum2jsUqdIjoiIiIiIlGi6yBERERERkVApnekOiIiIiEhiCxYsAGDw4MEATJgw\nIZPdEcl6iuSIiIiIiEioZGXhARERERERkVQpkiMiIiIiIqGiixwREREREQkVXeSIiIiIiEio6CJH\nRERERERCRRc5IiIiIiISKrrIERERERGRUNFFjoiIiIiIhIouckREREREJFR0kSMiIiIiIqGiixwR\nEREREQkVXeSIiIiIiEio6CJHRERERERCRRc5IiIiIiISKqUz3YF4SpUqlekuZIVIJJL0czR2/9HY\npU5jl7pkx07j9h+dc6nT2KVOY5c6jV3qNHapS3bsFMkREREREZFQ0UWOiIiIiIiEii5yREREREQk\nVHSRIyIiIiIioaKLHBERERERCZWsrK4mIiIi4bfbbru57Y8++giAzZs3A7Dffvu5fcuWLSvejolI\nzlMkR0REREREQkWRnCS0a9cOgOnTpwPw4Ycfun033nhj1D6RrWnQoIHbPv300wE46qijAKhVq5bb\n17BhQyB+ffi1a9dGPc/uhIqkU+nSwVfFeeedF7Vv9OjRbtvuwIsU1IUXXui2q1atCsDYsWMB+P33\n3wt0jG22+e9+rb+WyJYtW9LVRQmROnXqANC6dWvXdtJJJwFw6qmnxjx+6dKlAJQvXx6AatWquX1T\np04FoHv37q7tr7/+SnOPpTAUyRERERERkVDRRY6IiIiIiIRKqUi8HJgM80PO2cTS1V555ZWYfRs2\nbABgypQpACxevNjte+yxxwD46aefknq9VP5psnXsElm/fj0Aq1evBuDAAw90+3799deUjpnNY2dp\njnvvvbdr89OBUmGpGX/88Ydr22mnnVI6VjaPnalcubLb7tKlCwAnnngiAJ07d07qWJMmTQLg3HPP\ndW12TiYr2bErrnFr1KhRTNuCBQsK/PwWLVq47dmzZ0ftGzp0qNu2tN1k5cI5l61ydexq1qwJwM8/\n/+zaLO3snHPOAeDJJ58s0LEsvdf/zPv000+3+rxcHbtskAtjZ6lpAKNGjQJg//33B6B69eox/SrI\n38n/O9jj7VwG+O2337Z6jFwYu2yV7NgpkiMiIiIiIqGiSM5WNGvWzG3bXcpOnTrFPC7RnQCLRnTo\n0MG1lfS7TH379nXbDzzwABDcxfPHfP78+SkdP1vG7rTTTnPbdiepQoUKQPD3Bfjll18AePbZZwF4\n6qmn3L7vvvsu3+OfffbZANx///0x+y6//HIA7rnnnqT6nC1j56tYsSIQFGjo16+f22fnS2E/ytq2\nbeu233rrrZSOkW2RHLsjfttttwHwf//3f26ff25uzZIlS9z2LrvsErXPjwjttddeKfUzG885Y39f\ni/hBMFn+q6++KpY+JJLNYxdP06ZNgeBc9KMvs2bNAuD4448HgsIqRSXXxi6bZPPY7bzzzkD053jj\nxo2jHvPuu++67XfeeQeA559/HgiKDcRTpUoVt22foXfeeadr+/vvv7fav2weu2ynSI6IiIiIiJRo\nKiGdh91lOuyww4DofPMdd9wxpWNavqbdhYaCRXLCyObb3Hvvva7NIhqWm71q1ari71ia9ejRA4Ah\n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\n0UWOiIiIiIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSRRd5IiIiIiISKLoIkdERERERBJF\nFzkiIiIiIpIousgREREREZFEWbbUHUinVq1ape5CLCxZsiTn52js/qOxi05jF12uY6dx+4+Oueg0\ndtFp7KLT2EWnsYsu17FTJEdERERERBJFFzkiIiIiIpIousgREREREZFE0UWOiIiIiIgkSiwLD4iI\niEj8NWvWDID99tvP7evduzcADRo0AGDkyJGurV+/fkXsnYhUMkVyREREREQkUWotiVLLrsBUKu8/\nKjMYncYuOo1ddEktIX399de77ZNOOgmAyy67DIALLrigxq+vYy66Uo/dTjvtBECPHj2qtHXt2hWA\n5ZZbzu3bfffdAZg1a1be+hBVqceunGnsotPYRacS0iIiIiIiUtEUyUmx7bbbAnDiiSeG/utbZpn/\nrg0XL17s9l1++eUADBw4MG99SeLVfqNGjQD45JNP3L5jjz0WgNtvvz1v7xPnsVt33XUB6NSpk9tn\n27/++isA3377bZV+PfnkkwBMmzbNtf35559571+cx26FFVYAoF69em7fjjvuCARjaJEGgPnz5wPQ\nsWNHAObMmVPQ/iU1kvPvv/+6bfsbv/zySwB23nln1/bZZ59Fev04H3PpNG/eHIArrrgCCI4vgEmT\nJgGwww47ADB+/HjX9vjjjwPwzz//APD333+7tqlTp0bqS5zHbvLkyUAQvQE45phjALjrrruK0odM\n4jx2cVduY3fEEUcAcP755wPw5ptvurZTTjkFgIULFxalL+U2dnGiSI6IiIiIiFQ0XeSIiIiIiEii\nVGS62tprrw3A6NGjAWjatKlrW3311QFYc801q32+9c8fOks7+PTTTwHo1q2ba3v//fcj9TOJIc06\ndeoA8OKLL7p9PXv2BKKPUzpxGTv/ONh///2BIGyebR9Tj7dnn33WtR133HFA9DShdOIydj5L/Rk6\ndCgQTn9J7UO6/o8bNw6Ao48+ukA9pNr3ziTun1dLL507d67bl/o3WuoWwHvvvRfpfeJ4zGVy5513\nAukn22fDPq9+2m779u0jvVYcx26dddYB4KmnngKC4wiC8+Bzzz1X0D5kI45jVy7KYexuvPFGt33C\nCScA6fttx+eCBQuK0q9yGLu4UrqaiIiIiIhUtIpZDNQiNAB33HEHAHvttVeVx2W6G5yJlcjcZJNN\nADj77LNdW69evYDwJNNKs+yy/x1q999/PxCOnn388ccl6VMhWXndk08+2e1beeWVl/o8m8ztRxJt\nsr3xoxh2Fz2fkZy48CMEjzzyCADrrbdepNfaY489gHDBgh9//LEGvasMBx54YLVtdqwuWrSoWN0p\nKf9O6syZM0NtfhEav0gDwC+//OK2rbiKRYCmTJmS937GgUWwt956awA++OAD1xaHCI4kk31v3nzz\nzQDss88+WT3PyuAPHz4cgI8++qgAvZNSUCRHREREREQSJfGRHLv79vDDD7t9bdu2rdFrPv/880A4\nGrHWWmuFHnPkkUe6bbuLNWzYMLcvhlOhCsqiZvvuuy8AzzzzjGv766+/StKnfPPn31gEJ1305vjj\njwfg9ddfr9Jmd8VXWWUVt69z585AMB/F1717dyAoTZskls8PmefIZcMiQHanDoLS5RKNzb9JYhTR\nZ8ee//m2MrSDBg0CYMKECa7trbfeWupr9u/fP489jAc/SnrqqaeWsCelY3NyGzRoUO1jzjrrrJxe\nM9PxpKhY2KabbgoE877SsQi0P642t/Wggw4CYMSIEa5t8ODBee9nuWvZsqXbtuychg0bAvDQQw+5\nNvuNc9111wHBEhnFpEiOiIiIiIgkii5yREREREQkURKZruYXGbA0tagpamPGjHHbJ554Yqhtyy23\ndNuWLrTRRhtVeY0hQ4YAMH36dLfPT8VJqtq1a7vtCy+8MNT24IMPum1/0m45snKpVlYWoG7dukB4\ntfPTTz8dgG+++San1//hhx+A9OlqSXTbbbcB4RTQTOmdb7zxBhCExnv37l3tY61cOShdLRfLLBPc\nD7PP69VXX12q7hSVpcBYSgsE6RdKZQlYqg+EU7krgRUXql+/PpD5fHXVVVe57WzS1v0Un9THpyv6\nka540qhRowCYP38+ADNmzHBt5T7J3tKkICgqZWPgp5F26dKl2tewJQrsu2Tvvfd2bfqMQ5s2bYDg\nN44/5v7vPIADDjigyrb9e1x++eUF7Wc6iuSIiIiIiEiiJDKS498BjhrBsUWkzjnnnGof4y9eaSVB\n/UUuU/l34j/88EMguLOSRFa2F6BFixZAUEb7zTffLEmfCsHutNm/KcD2228PBKWkIfcIjjnzzDOB\n9IuBJXHiaadOnYBw9MCKU3z//fcAnHvuua7Nj6BB+C6llRKVaOxc6kdbK61oih1P/pIDP/30U6m6\nE1t9+vSpts2P3CeRFZixu9o///yza8t1gdzNNtss9Bobb7yxa7PP3rx584DwIqsmXSQn9Q66X/yg\n3CM5ffv2ddtNmjQBgr/dX8IhEytGYOe5cs8uyQf/t69loURdwiE12lNMiuSIiIiIiEii6CJHRERE\nREQSJZHpaieddFJOj//222/d9jHHHAMEa+H89ttvWb3Gu+++CwSTpv1Jqmabbbap8j62zkIS+RMs\nzRVXXAEEE/ySwNLVrMAEBIUWsj1+MrGUIQvB+yuov/DCCzV+/bg57bTTABg4cKDbd8899wBw5ZVX\nLvX5lsoByU2tsrWW/M+RX9gkX/xCDZXAJo5DkJqxcOFCIHxcSXb+/fdfIP2aYLmqU6cOAH/88UeN\nX6vQ/LT1/fbbL6fntmrVCoDvvvsOgObNm1d5jH3W07Xdd999Ob1fEj377LNA9ini/toulcrOd7aG\n4SabbOLall9++dBjLW0cgnXS0h2LcaBIjoiIiIiIJEoiIznZlq+0CI4/ofSdd96J9J52N/+EE04A\n0kdyfKkrZidJx44dAdhqq63cPis48Oijj5akT8XwyCOPpN2Owp8YanfTLSpx7733urY5c+bU6H3i\nyMpu++W3M2nXrh0QFLo4+uijq31suRf6WH/99YHg/GF3twHWXXfdvL1P48aNq7x+km2wwQZAUCAF\nguPP7qhvvvnmrs2iOxIUWVl77bWrtFmBGb+Ubzbse3G55ZZz+3bddVcgyLJYsGCBa7NCQaViBWDs\nvF2TaMorr7wS+v9M53i/rWvXrpHfM2nsPL/CCiu4fVa8xsp92zkUgnOnZUn4hW2SbMUVV3Tb9tss\n3e9ni8geeuihQDhSefvtt1f7+va7uJSFRxTJERERERGRRElUJMdKNPsLOWVi82KiRm8yOeOMM9z2\niBEj8v76cWZ3s/ySx3a1n6TS0YXUr1+/Kvus1OfZZ59d7O7Ejl/e8uKLLwaCu76Z5uGU+8JuzZo1\nA4LIg8/mA+ZjkVMrGbrqqqtWabMI+CeffFLj94mL7bbbDggW+YTg7mW9evWAYN4lBDnqVl7aL+Vu\n88bsznHS2R3gNddcs0qbRV3SsYi/LcQIQcn9TCV8d9555yr7bMHWdOfNYnjrrbdC/y0Fi3RZ6f10\nY2hlqd9+++3idayI7DeHnQP9c2G60trmiy++AGD//fcHkv87xRYrnzp1qtu34447hh5jZbUBDjvs\nMCCIHPrz3jP93rbfff7yGsWmSI6IiIiIiCSKLnJERERERCRREpWudsABBwBLLxtr6RZ+6eh86GgQ\nYQAAIABJREFU8/uQ1DK2qSzcaRPB/XSN1FXpJT1bmdrKRkNQhtqKWviraVcaW+H71FNPdfuWXTb7\n01j37t3d9h133JGvbhVN27ZtgXAqqNltt93y9j72Gbb3sRQYCCZVJ6noxeOPPw7AxIkT3b4999wT\nCNJ+/LKp++yzDwAXXXQREBS9gCANa9y4cQCMHj26UN2OBft+S/c999RTTwFByh8E5XqtVLJfXMDG\nOt1r3X333QCsvPLKQHiivZ0P/OO0b9++uf4pZcefOG4pe5nG8MwzzwTC6ZXlrnPnzm47m99a6R5j\n6XuWBv3EE0+4NksTt8f8+eef0TsbE5bamJqiBjB27Fgg+LxBUD5/5syZAKy22mrVvralTUO4gFIq\n+xy3bNnS7ZsyZcrSup4zRXJERERERCRREhHJWX311YHwHaFMbAG9QkwuszKadte9kpx33nlAcGf9\ngQcecG3Tpk0rSZ/KRbdu3QDo379/lTYbR79sY6Xz79imRhsyTVq2O/AQ3L3PdbG+UrISx+nuRl5y\nySV5e5/Uu/N+yeRrrrkmb+8TN//884/b9qM6qWwirRVfsDvkAG3atAFgiy22AKBLly6urZyOtXyw\n70O/HLxFI9OxiL8VE/GzAWxhx9q1awOw7bbbujaLLvbo0cPtu+mmm4DSTnouNL/Yg39uS/Xee+8B\nNV/aIE5sMrxFsCA4X9lioK1bt3ZtftQLgggNQJMmTYDgO8SygnxjxowBYPjw4Wlfo5z456RUVtzG\nL/tsC/BmiuBY5McvSuCfT1PZb5011ljD7VMkR0REREREZCkSEck58sgjAdhwww2zerzlBOeT3bGy\nHOQtt9zStSV5Ts5GG23kti2H3ZR7ud5C80unXnvttUBwrFheLCx9YdlKYrnBfqTUFm6zHF//82aL\nWlqbb/fddwdgl112AeCll17Kf4fzwP4GCBZeTMc/Zqpjc5ogGEvb5x+PG2+8ceh5v//+e5XnVTJb\nNPCuu+4CwotdnnzyyQD07t0bgE6dOrm2fffdFwjn/JcjP2KyzjrrVPu4kSNHAukXCn3ttdeAYCkH\ngFmzZi31ve3u8OzZs90+K3e70047uX3t27cHkhnJsUUus80YueGGG4DwvLJy5y/maayEt33O/EiX\nRQBNurmtlhVgkR2ACy64AAi+h/2IkP32LDdWHj8d/3vArLLKKtU+3jInbJwyRW98dl58+eWXs3p8\nVIrkiIiIiIhIougiR0REREREEiUR6WpWDi9dWVVjK1NDMOG4pvzUDwu522RIf2J0uonQffr0yUsf\nSs3CwgArrbQSAB9//DEA8+fPL0mf4q558+ZAeBLoeuutF3rMgAEDitqncuOnB/nbqaygg6287Ket\n1alTBwhSs+KaruanCviTNFNNnz4dyJwe65cmt9QVS+nw3yddep9U74cffnDbo0aNAoJUFpswD8lJ\nV7NiP5C5hHu6NDUrwWvl8rNJUfNZ2Vs/XcnS1PxlIfyJ00mz3XbbAdl/T/i/f5LCzlf+76vUghWW\nxpgrK04FwQR5K5iRz1L9pWLpix06dHD7rFBKOvZbzp+eYK6//nog9zRm+/7JZ8GcdBTJERERERGR\nRElEJCebRUD9xa++++67Gr2fTZi67LLL3L6tt9461Af/7oLt80uS2oTVcjdixIgq+wYNGgRU9qKV\nmVhxCn9SpN1xuu6664DwnWGJ7uGHHwbgwgsvBILPaTnx705nuqOWeg5amvXXXz+nx0t27N/Bn7xs\nkjLx249O2V3z5ZdfPqfXyJR5YZOf/cnitrjn3nvvDcCqq65a5XmWRZDax6RJXazXZ1kkG2ywgdv3\n+eefF6VfxWTnrS+++MLtyxTVj8o+sxaBTML50opxHH744W5faiRn8uTJbtuyTix7yR+DqFlJQ4YM\nAQp/TlQkR0REREREEiURkZxs+DnEtmjo33//Xe3jbX6Jv+DYwIEDgeBOUrZX9BbB8UtlLlq0KKvn\nxpXlRftzj8wLL7xQ7O6UFZsX4R8/tljbFVdcUZI+xYmV3n399dfdPj9HutL4dyqtXLaV6/Tn2Nhd\nXf+4sshPuvkJU6dOBYKxtflLEF68EeD555+P3P+4WXfddQH46quvCvL6O++8c+j//ah+UhZS9Rd6\ntsURLTK4NFb+2OaV+HNbbb6DLWyZab7Pp59+6rZHjx4NwLhx47LqQ7lq2LAhAEcddRSQ/jdIpsWQ\nk8gv6WzRqwULFuTt9W2pAZtf5i8GWu5sHmfqNgTfwxCc0+x4S7doea6Ktbi5IjkiIiIiIpIousgR\nEREREZFESUS6mqViWAGCdNKtTJsuZcxSPjbccEMA9ttvv0h98tM7jjjiiGrfr9zY5FIryeunq9lE\nsnyGipPESpfbmPlpBVdffXVJ+hQX/irLw4YNA8KfoQMPPBAIxu7XX3+t8hpWUtSflP/YY49V2Wfs\nNWyV7HJgaUJ+ulC+nHjiiW47NQ0mSemCVoRm8803z9trNm7c2G1bOrPxS6SWe+nodM444wwgnIqX\nWhI/nXQr1qdLuTRff/01EJTovuOOO1xboVIP4+bQQw8FYNNNN632MZbeagUhkurWW28FgkJHEKRY\n2dSCqPzUS0sNNkk/1urWrQvAaaed5vbZ964VsCin8uyK5IiIiIiISKIkIpJjE5i6d++e1eN79uxZ\nbVu6u+y5PMbuPtsCSZCMCI6xyaJbbbUVAL/88otru+qqqwD4999/i9+xMmAlTe248e9WHnTQQaHH\nvP/++64tU4GMzTbbDAjuvth/AVq0aFHl8XZ37+abb879DyigLbfc0m3b3+DfEbey29bmj4/Zfvvt\nAWjatGmVtnR3hu0zmu61RDLZZpttADjnnHOA8KJ6VgzCypdbhDup7K6uLXIMQVlZf1J4Lmz5AVsw\nFOCWW24B4Mcff4z0mklw6qmnLvUxVoTBLz2fRBZR8ctoW2ntqKywg18AyH7rDB48GEi/bEaS2O/j\ndIuD2vGX68KfpaRIjoiIiIiIJEqtJTFc2SjTImHprLbaagC8/fbbQDCfpibvnWlY7DFWghWCq3sr\nn5yP6E2Uf5pcxy5XV155JQBnnnkmEI4I+CUHSy2OY2elUufOnQtk7qM/H8UiOeke36pVKwBWXnll\nIPw32OMfeught8/mB1jJ6nRKMXb+nDmb75Xub8mmD9kuCrzHHnvk3M+lyXXsCn3M5aJ9+/Zu2+b8\nWOl9K10NQcQ2n4p5zNmCkR999JHbZ/PlbN4HQOvWrQGYPXs2AJtssolrs0jFH3/8AYTLfPfo0QMI\nSrIWOrId53PdIYccAgTldyGItNriiq+++mqVftkcxULPK4nj2GViJeEbNGhQ7WMyld3Op7iMnc27\nhOD70DIj/PN9Kn8xbpvjZPO8/IV87fvTynb//vvvNe5zXMYunXfffRcIIlgQZD1Y5Pq3334rSl/S\nyXXsFMkREREREZFE0UWOiIiIiIgkSiLS1cyuu+4KBCUtIZg8lankYrr3tmHxw+W20u1LL70EhFOK\nChG+i2NI8+mnnwaCVJ9Jkya5NlulOg7iOHbGVgseOnRoVo/PJg3L2ORcgBtuuAEIUhwgmNCbSSnG\nrl69em571qxZQDidIGq62pQpUwB49tlngfBq1f/8808NepxeOaer+ewcuu+++wLQpUsX15aufHdN\nFfOYs1Tb008/3e2zldIz+fTTT922pUgfdthhQHDMQvEn5cb5XBd35TB2/u+ZbFJFa9euXcjuOHEZ\nu2bNmrltK9FuBS/uu+8+12a/1zp37gxAy5YtXZv9PrRUtJNPPtm1PfLII0B2353ZisvY+SxF7513\n3gHCaY8777wzEI+lBJSuJiIiIiIiFS1RkZxMr3XKKadEev7ChQvd9rhx4/LSp2zF8WrfFsa6+OKL\ngWCSLcC9995b0PfORRzHztidNn+yvZVLtkUvfXZ3ySIzvjvvvBMIyoVaCeqaKPXY2SRlf+FEf7HQ\nVHZ3ySaZTpw40bVNmzYNKN7CeEmJ5BRbKY45mxQPwZ1KK0MOwefOJsr757fJkycD8Mwzz9SoD/lQ\n6s9rOSuHsfMjOVb4J5NKKzzgs6iOFQno1auXa7PFotP128pu23fOhAkTCtrPOI6dFZGyMbMCQADH\nHXdcQd87F4rkiIiIiIhIRdNFjoiIiIiIJEri09XKWRxDmuVCYxedxi46patFo2MuOo1ddOUwdtdc\nc43bthXnM7HCGiNHjixYn6A8xi6u4jJ266yzjtu2tfPWWmstIFwYaeDAgXl/76iUriYiIiIiIhWt\nODPURERERCQnfoGaTKxI0tSpUwvYG0mShg0buu011lgDgMWLFwPxKBedD4rkiIiIiIhIomhOTozF\nJW+zHGnsotPYRac5OdHomItOYxddOYydX9bcFuO2xWjHjh3r2q6//noA3nrrraL0qxzGLq7iOHaz\nZ88GgsXDO3ToUND3i0pzckREREREpKLpIkdERERERBJF6WoxFseQZrnQ2EWnsYtO6WrR6JiLTmMX\nncYuOo1ddBq76JSuJiIiIiIiFS2WkRwREREREZGoFMkREREREZFE0UWOiIiIiIgkii5yREREREQk\nUXSRIyIiIiIiiaKLHBERERERSRRd5IiIiIiISKLoIkdERERERBJFFzkiIiIiIpIousgREREREZFE\n0UWOiIiIiIgkii5yREREREQkUXSRIyIiIiIiibJsqTuQTq1atUrdhVhYsmRJzs/R2P1HYxedxi66\nXMdO4/YfHXPRaeyi09hFp7GLTmMXXa5jp0iOiIiIiIgkii5yREREREQkUXSRIyIiIiIiiaKLHBER\nERERSRRd5IiIiIiISKLEsrqaiIiIJEPt2rXddq9evQA45phjABg1apRrGzduXHE7JiKJpkiOiIiI\niIgkiiI5UlSnn346ACNGjHD7Lr/8cgAGDhxYkj5J+WjQoAEAL774otv31VdfAfD5559Xefxzzz0H\nwAMPPADAN99849oWL15csH6KCCyzzH/3Ua+88kq3r2/fvqHH3HbbbVUef+eddxahd1JJLHJ4ySWX\nVGnbYIMNgPRrsBx88MEAjB8/voC9k0JRJEdERERERBJFFzkiIiIiIpIotZaki8+VWK1atUrdhViI\n8k8T97H7+uuvAVhzzTXdvtmzZwPQtGnTvL1POYxdkyZN3PY555wDQM+ePas8br/99gNg8uTJQHjs\njj/+eAAmTpwIwDvvvFPjfsV57AYPHgyEUxt//fVXAJZffnkA/vrrL9e20korhZ5/yimnuO0bb7wx\n7/3Ldezi/nktljgfc3EX57GzFKExY8ZU+5hvv/3WbVu/tthiCwB++OGHAvauNGPXvHlzt23ptP5r\njh49utrnrrLKKgAcd9xxAPzvf/9zbeuvvz4Ab731FgBffvmla7PiDn/++WeN+u6L83FnTjjhBLc9\naNAgAOrXrw/AF1984dpuvfVWIPib3nzzTdf21FNPAfDPP//krV/lMHZxlevYKZIjIiIiIiKJokhO\njJX71b7dWQfo168fAEOGDAHCf1ulRnLeeOMNt7399ttX+7i5c+cCsHDhQiC4ywlBpGLevHkANG7c\nuMb9ivPY2R23ww8/3O1r1KgRAOuttx4QFCIAaNGiBRDcSa5Tp45r23zzzas8vqYUyYkmzsdc3MVx\n7LbccksguCO+wgoruLa77roLgNNOOw2Ahg0burb/+7//A4JIbaaoRj6UYuxskjvAhAkTAGjWrFlW\nfbL3zvUxl112GQAXXnhhhB6nF8fjzqy99tpAOCKzzjrrANCpUycAXnvtNddm2QDZqFu3rtvu3r07\nAI8//rjbt2jRoqW+RpzHLu4UyRERERERkYqmEtLAIYcc4rbXWGMNIMjXfPTRR0vSpyTYcMMN3fal\nl15a7eMqpTTjZpttBsBjjz0GwCabbJLV87J53FprrQXATjvt5Pb5d6qSxuYwQVAW2i8PbZ544gkA\nFixYAMB2223n2vyojmSvVatWAPTo0QMIomsAM2bMKEmf4sQWvuzSpQsADz/8sGuzY27dddcFYLfd\n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\nJFGUrhZj5R7SLCWNXXQau+iUrhaNjrnoNHbRxXHsmjVrBsDEiROBcEEfe29Lyxo/fnxB+5JJHMeu\nXJT72LVp08Ztv/DCC0Cwxli3bt0K+t5KVxMRERERkYq27NIfIiIiIiKFZuWzGzZsWOKeiKTnL/lg\nLPIYN4rkiIiIiIhIoiiSIyIiIiIiOZkzZw4At9xyS4l7kp4iOSIiIiIikii6yBERERERkURRCekY\nK/cyg6WksYtOYxedSkhHo2MuOo1ddBq76DR20WnsolMJaRERERERqWixjOSIiIiIiIhEpUiOiIiI\niIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSRRd5IiIiIiISKLoIkdERERERBJFFzkiIiIi\nIpIousgREREREZFE0UWOiIiIiIgkii5yREREREQkUXSRIyIiIiIiiaKLHBERERERSZRlS92BdGrV\nqlXqLsTCkiVLcn6Oxu4/GrvoNHbR5Tp2Grf/6JiLTmMXncYuOo1ddBq76HIdO0VyREREREQkUXSR\nIyIiIiIiiaKLHBERERERSRRd5IiIiIiISKLoIkdERERERBJFFzkiIiIiIpIosSwhLSIiIuWtd+/e\nAFx//fVu32mnnVZln4hIISiSIyIiIiIiiVJrSZRViQosToseDR482G2ff/751T7uuuuuA+CSSy4B\n4LvvvnNtUYdYC0ZFF+exW3HFFQHo1auX29ehQwcA9tlnnyqPX2aZ/+5FLF68GIBTTjnFtd16660A\n/PPPP3nrX1zG7qCDDnLb//vf/6p9nP3tL730Uui/AI8++igA06dPDz22ULQYaDRxOebKUZzH7qGH\nHgKga9eubp99N9avX78ofcgkzmMXdxq76DR20WkxUBERERERqWi6yBERERERkURRutpSTJ061W23\nbds26+f17NnTbd99992R3jvJIc0VVljBbY8bNw6AAw88EIA//vjDtdWtWzfS68dl7JZbbjm3ffLJ\nJwNw1llnAbDeeuvl1K90f5Olq5100kk16qcvLmPnp6vde++9S33vTP2+4YYbABg0aJDb98MPP9Sw\nh1WVc7raK6+84rbfeustIDhmCy0ux1y27Ni8//77gXD/b775ZgDOOOMMIHw+K4Q4jt1aa60FwMSJ\nEwHYfvvtXdvPP/8MwOqrr17QPmQjjmNXLuI8dpbi3ahRI7fvmGOOqfbx9tvuhRdeAGDUqFGu7Ztv\nvsl7/+I8dnGndDUREREREaloKiG9FE8++aTb3mqrrUJt/p3P1Anjdrce4OGHHwbgt99+K0QXy8oq\nq6wCwDbbbOP2HXDAAUAwsb527dqu7bDDDgMy38mPM/+YGT58+FIfv3DhQiBcuMLGY+ONN67y+F12\n2QWAlVZaCYBff/01emdj5vXXX3fbxx9//FIfv8ceewDQokULt88ihhaRaNasmWvr1KkTAH/++WfN\nOxtTduyMHj0agDfffNO1pZbwfe6559z23nvvDQSTw7/++uuC9jOO+vTpA8BGG20EwNy5c13biBEj\nABgzZgwAc+bMcW37778/AE8//TSQWwZAUjRu3BgIR3DMzJkzi90dSTCL2kCQQdOuXbvQ/2dr1113\nBYLjF+DII48Egt8nUl4UyRERERERkUTRnJxqrLnmmlX2ff/996H/b9Kkidvec889gaDkdL169Vyb\n3U3IdW5OEvM2b7/9diDzHRY/h90iFLmKy9htscUWbnvatGkArLrqqtU+3qIR/l31ZZf9L+BqEUGL\nQPiOO+44AMaOHVvDHsdn7PLBxj/d2F966aVAeJ5OTcVtTs7KK68MBPMgHnjgAdd28MEHp30swFNP\nPQXANddcU+V5hRDHY87O4Y899hgAO++8c5XHHHXUUQB8+umnbp9FDW0+QKtWrQrZzdiM3RprrOG2\n7Ty/7777AuFo6aGHHgoE41pKcRm7bA0cOBAIfmdcccUVrm3AgAGhx7Zs2dJtWwlve8yLL77o2qJG\nGks9dpblsddee7l92URufvrpJyC8nMBqq60GhLNIjH2O/c94TZV67Mzmm2/utps2bVrt49q0aQNA\nv379qn1MurmxX331FRCcE/3zgM3Xy5Xm5IiIiIiISEXTRY6IiIiIiCSKCg+ksImStlK6b7fddgPg\n448/BsKTTW377LPPBsLpaueccw4A48ePd/uSPNk5HSs00Llz52ofY2NuKTJJ8OGHH7rtjh07AkF5\nVT+VzSYrv/vuu1Vew8Lql19+OZA+Xc3KY+YjXS1JbPxffvllIJzaYCl+t9xyCwBffPFFkXtXeP/+\n+y8QpGg8++yz1T72l19+cdtWAMM/j1WaH3/8EYB77rkHCKedWQEHK0Dgp7m89NJLQLj4TCXo0qWL\n27Y0NeMXUolDmlo56du3r9u+6KKLgCBl58svv3Rt7du3B+Dcc88N/T8Ex6c9r1x/f1haGcAFF1wA\n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\n5Ro+fDgA3bp1c/vsePbL78eJIjkiIiIiIpIousgREREREZFEUeGBGCvXyWlxoLGLTmMXnQoPRKNj\nLjqNXXQau+g0dtFp7KJT4QEREREREalosYzkiIiIiIiIRKVIjoiIiIiIJIouckREREREJFF0kSMi\nIiIiIomiixwREREREUkUXeSIiIiIiEii6CJHREREREQSRRc5IiIiIiKSKLrIERERERGRRNFFjoiI\niIiIJIouckREREREJFF0kSMiIiIiIomiixwREREREUmUZUvdgXRq1apV6i7EwpIlS3J+jsbuPxq7\n6DR20eU6dhq3/+iYi05jF53GLjqNXXQau+hyHTtFckREREREJFF0kSMiIiIiIomiixwREREREUkU\nXeSIiIiIiEiixLLwgIiIiFSWNm3aADB06FAATjvtNNc2ffr0kvRJRMqXIjkiIiIiIpIoiuSIiIhI\nSbRr185t33DDDQA8+eSTALzzzjul6JKIJIQiOSIiIiIikii1lkRZlajA4rDo0ZFHHgnABRdc4PZt\nuummAFx33XVAOF+4EMp1wagZM2YA8Morr7h9J554YlH7UG5j17x5cwCeeuopANZaay3XVrt27aL2\npdzGLk60GGg0OuaiK9ex23DDDQGYMGGC2/f7778DsNdeewHw448/FrQP5Tp2cVDuY7fSSiu57W7d\nugFw3nnnAbD55pu7tgMPPBCAhx9+OG/vXe5jV0paDFRERERERCqaLnJERERERCRRVHgAaNy4sdvu\n378/AL169QLCIcLFixcD0Lt3bwCWWSa4RjzllFMK3s9yYeFEG0OABx54AIBnnnmmJH2Kk+WWWw6A\nM8880+2z42fNNdcEwiHZo446CoCxY8cWq4sSc9dccw0QTmUcPnw4APPmzcv7+62//vpu+9prrwWC\nNA6RKE499VQAGjVq5Pa1bt0aKHyamlQuS0074ogj3L6uXbsCwe89//v3zjvvBKBFixYAfPjhh0Xp\np+SHIjkiIiIiIpIoiuQQ3CkHOOGEEwB48MEHAViwYIFr22+//YAg8pNuMr0iOgGbRAqK4EBwx/L2\n228HoG3btlk976abbgKCY3HKlCn575yUlY4dOwLhCbIPPfQQUJhIjkUfAbbZZhsARo4cCUCfPn3y\n/n6VaKuttlrqY+bMmeO2//zzz0J2p2Ds+/ass84CwhHt9957ryR9kmRae+213fbpp58OBMUF/Cwd\ni9ykm9xvBQrsPGeZPJXEfrvY7+MBAwa4tkyFAJ544gkgyOr5+uuvC9TD6imSI067Y8gAACAASURB\nVCIiIiIiiVLRkZyLLroICF+VWpnA888/H4CPPvrItdlCZRMnTgTCc3nsCvf1118H4I477ihQr8vH\n+PHjS92FkvOPkUmTJgGwySabANmXQlx++eUBuPXWWwE47LDDXJtfpruc2B22IUOGANCqVSvX9sEH\nHwDB3A8I7rB9/PHHAHzxxRdF6WfcHHTQQUBwDBVLvXr13HaDBg2AILddkZzs1alTBwiyAg499FDX\ntv/++wOZzwv+98rxxx9fgB4WRocOHdy2fY/aXIdRo0aVpE9JsOyywU+4fv36AXDJJZcAsMIKK7g2\nO29aBHju3LnF6mJJ2PeLLSoLsP322wPpP1/2PWTPs3Obv69S2Fzzgw8+2O278sorgWBupj+Gmc5X\nnTt3BmCfffYBgiyWYlIkR0REREREEkUXOSIiIiIikigVk67WpEkTt21FBbbYYgsAnn/+edd2+OGH\nA/DXX39VeQ2b9DlmzBggCHFCEOKzdIRKZqlFbdq0KXFPSs8mO0I4da0677//PgDffvut29euXTsA\nGjZsCMAqq6ySxx4WjoWqL7/8cgA22mgj12ZpFvZ58SckNmvWDAinDNjnyz6X//zzj2uzCff33HNP\nlT5Y+mhSStLWrVsXCKepFMOsWbPc9ksvvQQE58+kWm211YAg7cc/5n744YfQYy2lFOCkk04CYI01\n1gCgS5curm2DDTYItWXrp59+AmD06NE5Pa/UrMT5wIED3b758+cDcMEFFwDhcZXMbImBI488Eggm\n0fttxpa8gGDiuH1mk5quZqll9r1rKWoQ/C6xEtDdu3d3bbbPvqMOOOCAKs978cUXC9XtWLn55psB\nOPbYY6t9zPfff++2X3jhhVBbp06d3LadFy1dVelqIiIiIiIiNZT4SI5FcCZMmFBln5XktVKWkD6C\nk8omTPqLXdqdEiuvWol69uwJQNOmTYHi322OI78kpW2nRiUguHsyePBgIFzWfPfddwfCd+bKgd29\ntdK4M2fOdG1WOGDGjBkAPP30067Njhs/+mJ301u2bAnAXnvt5doswmULzvqRLrvjNGzYMOD/27vz\n+Kum/Y/jL1wyFbdbFF1ThmRWyBgaDNcsZUjkmkIariHhd4luhBRumbtRpkiJjOXWvSoyl+J+zVFJ\n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\nQJia8OSTTwZtn3zyCQCzZ88uVRelQrRr1y44tlRTt3CHpTN27twZSE3Nte8HfRdEs4XxPXv2LHNP\n/DRz5sxyd6HsLM24Q4cOwblBgwYB4fKE3XffPWizdC/77LpbXQwZMqS4na1ANpYQlsq3sRswYEBZ\n+hSHIjkiIiIiIuIV7yM5VrrYvfNMn9U999xzg+OnnnoKCBeMjxgxothdrEg2e+IuhrPyxBMnTixL\nn8rNjdSUq2S2RS4A5syZA8D2228fnLP3fqVGNmyGuEePHmXuiVQ6N8pgi9rdWWF3I+h09vkpdvEZ\nqV5RGxebqGIE1cpdBP+f//wHCAte2OaeAA0bNgSgf//+ANxyyy1BWyGLz/jCojcu23T81VdfLXV3\nYlMkR0REREREvKKbHBERERER8Yr3++RUskqopZ5UGrv4NHbx+bpPju3ZAdC3b18g3DOhUvfJcTVp\n0gQI97CCzHQ1K3AB0KtXLyDcf6mcyj12lSzJYzd37lwANtlkk4w2K4bx4IMPlqQvUZI8dklXCWPn\npgFaAS+7Pp511lkl7YtL++SIiIiIiEhV877wgIiI1I47Y1zO2eNi+eyzzwA4/PDDg3PbbrttymMW\nLFgQHFuRFZFiWbp0abm7IALAN998A8BLL71U5p7kT5EcERERERHxitbkJFgl5G0mlcYuPo1dfL6u\nySk2vefi09jFl+Sxs3VwbrnoefPmAeFGtrYBcjkkeeySTmMXn9bkiIiIiIhIVdNNjoiIiIiIeEXp\nagmmkGZ8Grv4NHbxKV0tHr3n4tPYxaexi09jF5/GLj6lq4mIiIiISFVLZCRHREREREQkLkVyRERE\nRETEK7rJERERERERr+gmR0REREREvKKbHBERERER8YpuckRERERExCu6yREREREREa/oJkdERERE\nRLyimxwREREREfGKbnJERERERMQruskRERERERGv6CZHRERERES8opscERERERHxyh/K3YEoq622\nWrm7kAi//fZb3j+jsfudxi4+jV18+Y6dxu13es/Fp7GLT2MXn8YuPo1dfPmOnSI5IiIiIiLiFd3k\niIiIiIiIV3STIyIiIiIiXknkmhyRajB79uzgePvtt09p69evX3A8cOBAAJYuXVqajomIFNDf//73\n4LhLly4AdOrUCYBXX321LH0SEf8pkiMiIiIiIl5Z7bc4ZR6KTFUkfqcKHPFVwth17949OB4yZMhK\n+7JkyRIAjjnmGAAmTpxY1H5VwtgllaqrxaP3XHxJHrsDDzwQgFGjRgXnli1bBsBNN90EwO23316S\nvkRJ8tglncYuPo1dfKquJiIiIiIiVU2RnASrtLt9m7Wz/OuDDjqobH2phLGrqakJjps2bbrSvti/\n5fvvvwegTZs2QVsx8tmTOHbbbbcdAH379gXg1FNPXelj3Vnj/v37A/Duu+8WsXchRXLiSeJ7rlIk\ncezq1q0LwIcffgjAiBEjgrY+ffoAYb9XrFhR1L5kk8SxqxQau/g0dvEpkiMiIiIiIlVNNzkiIiIi\nIuIVlZBO07p1awB22mmnlT5m+PDhgEr6prN0NfvzxRdfDNrKmbqWVHfffXdwvNVWWwHw/PPPA3Dl\nlVcGbfZetBSQVq1aBW0+l19t1qxZcGzjsskmmwDZQ9Ynn3xycLx48WIAevbsWYwull2HDh2C4zff\nfBOA999/v+CvY9c8gK233hqAE044AYAFCxYU/PWS7qqrrgJSSyObXNJK7OdXda5SdevWDYDly5cD\nYZEBgF9++aUsfRKR6qNIjoiIiIiIeKUqCw907doVCDdcfO6554I2m51cb731MvpiQ/XFF18AMHPm\nzKDtlFNOAWDRokUF62elLk6L6vfVV18NlG62slLHzqy77rrBsZWM3muvvYCwAAHA6aefDsDjjz9e\nsNdOytjZZxHgoYceSml75JFHguP58+cDYYntzTffPGh77733AGjevHnB+xelVIUHNtxwQwDeeuut\n4Nx3330HZI9C52vXXXcFYPz48cE5i6ZZdHbKlCm1fp2kvOeysQg1pEap09m1zlh2QPpzpLPx/Pe/\n/51Xv5I4dvY9eMcddwBw+eWXF/X14ir32FkBlXPPPTc4d+eddwLwxBNPAPD1118X7PUKqdxjV8kq\nbexatGgBhN+xDRs2DNqOPfbYlHNz5swJ2saMGQPAgAEDgLB8fG2o8ICIiIiIiFS1qlmT4878HnbY\nYUA4W26z4bnaeOONU/4EeOWVVwAYOnQoAA888EDQNm/evPw7LFXNnfH4y1/+AoSz9ptuumnQ1qtX\nL6CwkZyksJlMCKOujz32GBBGaAB23313AM4777wS9q68evToAYRRlfTjQrGIUaNGjQr+3JUiao1h\nNlHrdPJ5nXwjOUlhawYB6tSpA5SudHslsXL4ALfddhuQOnZ77703EP7OYuubILlRnUrkjvnqq/8+\n33/WWWcBMHLkyKDNMidyXYNtWUCHHnooEH5nVYoDDjgAgMsuuyw41759eyCMokRlONmf7vvbtnyw\n64C7vUOpKJIjIiIiIiJe0U2OiIiIiIh4xct0tcaNGwfHtnjZQoeQuqg7H5999hkQLvB1FzPbYufr\nr78egKOPPjpo69ixIxAukBbJx1dffQXArbfeCsB1110XtO22225AuEDcygj74McffwyO0xdzuyys\nvuaaa2a0bbDBBgBMmDABgA8++CBomz59OlCeEHpcTZo0AaB79+5l7kn1iJt+FsVS0SZPnpzRVukl\npN3vWPPMM8+UoSfJdvjhhwfHbspUOvu9wdLrISy//cknnwAwbdq0WH2oV69ecGzFD3zXtm1bAC6+\n+GIAttlmm6DNthqw1OeBAwcGbZYafcEFFwBhISCXLcwH6N27NwA1NTVAstPVLLUO4L777gPCQgLu\nAv/0ogdRRRCynbPndot8ffnll3G7nRdFckRERERExCteRnLatWsXHN988815/azNkNissC1Ig3AB\nuN31uxvx9e/fHwjvjPfZZ5+g7dFHHwXguOOOC85ZGWqfZCuPKrUX9Z6xKM8333xT6u6U1ejRo4Nj\n9/OezhbMRy2ct7KttrnqsGHDgrbZs2cXpJ+F9oc//H7JtghVsZ1xxhkleZ0kskIDtb2uuRshV2pR\ngVy4ZZAtCluq2dpKYpvp5ioq2vPHP/4RCCP4+VqyZElwbBtRf/jhh7GeK8ks+gJwyy23pLS5WzHY\neNj36Z/+9KegzRbSR/0/7LjjjkBqhOLjjz8Gwm1FkqxPnz7BsWUfpRcScFlJ6LFjxwbnLPITFQEy\nds4eA2Gp9GJTJEdERERERLyimxwREREREfGKl+lqnTt3zuvxQ4YMCY6tbv3aa6+d8bj0FBZbCA7h\nviaDBw8GUosbWDrMuHHjgnPpqW8+yJbW4XOaRqnY4vn3338/OGepD7YTsb3/fGU1/N3Fu1Gf1VxY\nKqrtr+OmI+S7d1apuWm0xbT//vtnvJ4d+7h7ubsXTqHSb93ntNQ1n66H9j5wU3yiFmfnw8a+U6dO\nGW2WmjtlypTgnBU4iLOTfKnNnTu33F3g119/DY6tmIFPLrzwQgBuuOGG4Jy9N2xPQ3e5gaWp2XfJ\npEmTgrYXXngBgGeffRYI96YDuPbaa4HU8ezatWuB/hXFY2ljV1xxRXDO/g32eXb33nPHKl3Pnj1T\nfs6VhO8IRXJERERERMQrXkVyjj/+eCDcMXhVbBdWi95A/MV399xzDwAnnngiAAcffHDGY/bYY4/g\n2GYFWrZsGev1Ko1PM5flYot43TLRFsmxxfe+R3IsQhoVvYma4X344YcBmDVrVsbjN9xwQyAs5+tG\ngKdOnQqUbnFkvtyZw1K8TtTrVcKseTZupMbKRBe7eIpFdXyK6NiWDTvvvHNwzrZSyMVaa60VHFt5\nfJsd/vTTT4M2Wyhu5ywCC+FWEe4C8KSyogEr89///hdI/fflwwocWRQWoE2bNimPcRfdu2Nc6bbY\nYgsArrnmGiAs1ALw2muvAWEWwNdff53x8z/88AMQ/i7pPoe9t9yiUj/99BOQWqDl7bffrt0/ogT6\n9u0LpF7X7XpuEZwuXbrk9ZzZChbYOStcUEqK5IiIiIiIiFe8iOTUqVMHgOHDhwOr3uzTykQfeeSR\nQHlKJ9omjtXCNrqr9A3vysnWQribXlrO688//1yWPpWabX531113Becs/3/mzJlAGKFdlQYNGqT8\n3c0fbtiwYa36KcnnrpXJhbshbfp1zI0A2XHr1q0z2tJfOwk568WQS+lou565n2XbmNKiGPadDqmb\nA0O4DhHgjjvuAFJLKn/77bf5drsknnrqqeDYNqZ0WXaH/V5jEYhcWdTaNmCMYhtc+sbKmK+//vpA\nuFYawmhLVAQnnUUGIfysW8TR/X3RNqK2bUIqTbZ1NNtvv31Gm33m3EiXldjO9lyWxbRo0aJa9jh/\niuSIiIiIiIhXdJMjIiIiIiJe8SJdrXfv3gCst956OT3ewrg+7vCbVD4ssC23bt26AeHOxBCWk467\nSLXSWAqKu7t6MdhC3f79+xf1dfK1fPlyIEy53XzzzTMe46ZHWZEKK8ogubP0NLt2ZbuGuW3pj8tW\nltpNe6vUVN7NNtss49yMGTNW+XNW8Kd9+/bBOTu2FNRsxS2seA+EhUjc3wGSmq62KvZvufLKK4HU\ntLxcWLpbx44dM9pWrFgBwMCBA2vTxcSy66OlSVlpcYguPmOsEEi/fv0A2HfffTMeY2WlrUgJwEsv\nvVTLHpeX+/myY3u/ub9n2HjaY9zUtPTPqPt3K2KQawp5MSiSIyIiIiIiXvEikmOyLeK0mU+A+++/\nvyCvZwuuIFxAaDPAvi4ojavaIjlWVrVZs2bBOVtUe++99wKwYMGCjJ+z6KKVNwZYY401gHC2yWXl\nLe0xkruoGWhT280Mi8XeM3YNczdzM27fbSbziy++AMJS9wB//etfgdTyH75AiQAADEhJREFUp8Zm\n89wNHquB+xkr1DXLLViQHslxZ4UrNZKz8cYb5/X4Ro0aAWHhn5NPPjloy6cYhJX7hTCi7ZZNtvLx\nSRNVtjfq94X69evHev4RI0YAqaW5jX3+K6HUdhxbbrklEI5rVLnuQw89FIChQ4cG5zbddFMg/D51\nS2xb1Mu2E8ilqEbSWWSlRYsWGW25bOqZ7TFucYFsm4iWiiI5IiIiIiLiFS8iOTYbli1/t6amJjj+\n4IMPCvK67gxo165dU/oQ1RfbOApSSxRKZbNojeXzQrghrc0QuU4//fSVPtfYsWMB2GabbYJzlqPd\ntGnTjMfPnTs35U/Jzp3dtPKfxv3Mzps3r2R9isOiA+57ySJTVpoXwllLc9ppp2U8l127Fi5cGJyz\nXPO6detmPN6ev9Kj1aXqv+9RbPd7zTRp0gSIXhdjm+5aRMc23i2EqPdr0thmnwA33ngjkFpKev78\n+UD+6ywt+hr1PWFr8pK2xrDQ5syZk/J3N7L3xhtvALDLLrsA0b+jWblu97shqVH92rCskptvvjk4\nZyWj08fQbbMooSt9HP/xj38UrJ+FoEiOiIiIiIh4RTc5IiIiIiLiFS/S1SwFJVu62uuvv16w17Nw\nXM+ePfP6OXcB6pNPPlmw/kh52GL/a6+9FoDjjjuu1s9pKQfZSjS66tWrB8COO+4IZC+TWc3sGuEu\n7k7///rXv/4VHLs7rSeZ++8ZMmQIkJqy4y5yXhV3obOlefz8889AdGGLbO9LCWUrKOB+J1QqS79y\nC6lYiffu3btnPH769OlAuMi7devWQVs+C+Lt5yG8DlZaqfRLL70USE1hsyJJ+V7Lr7vuOiC81rnf\nIYMHDwb8SmteZ511ALjkkkuCc1bMwrjvkZ133jmlbfTo0cHxY489BoRlohcvXlzYziaU+3txtt+R\njz32WCB8T0Wl+tpn176HkkKRHBERERER8YoXkZx33nkHgObNm6/0MY8++mis53bLRFuhAYvguLME\n2VhZzDvuuCNWH3xgs5mVWiY1ytlnnw1ER3C+++47IPtmYQcccEBwnOtGtulsdsrKUlufINwIUsJx\nsplTl81u3nDDDSXtUyG4C0FtFrtLly7BuaOOOirW8956661AWKggW7ntSpF+7SnVtcgtE+0jK7f7\n+eefB+essE6vXr0A+OWXX4K2r776CgijjHHL37tRIitiUKmLxMePHx/r59zrvVusBlKjQ+4C80pk\nmQpHHHFEcM6KNbhlotM3rYxiEa++ffsWvJ++srGKGlc7Z8UMkkaRHBERERER8YoXkRxbI2OzmlEz\nQ+6meRaRsRklK9ELsN9++wHQvn17AE466aSgbZNNNlllX2wGf8KECcG5Hj16APD111+v8ud95WMZ\n1Wz54/beiiq5aJYvXx4cW85rNjNmzABSy7K2bdsWgJYtWwJhTjGEs/G+zyRns8MOOwDRGwMuWbIE\nCMssv/fee6XrWBGMGzcOSJ3NTt/M0za2c9ss2mjRQAijQnvttRfgRyQn/XPg/t02AS3kdSqXSJFP\nkW0rhwwwatQoIIwguFGX2bNnA+HGlHfffXfQZu9B99poLDJh78UBAwYEbYcddhhQPd+xG220ERBe\n4yFznYQ7s+5ublmJhg0bBsA+++yT0WbftQCvvPIKEGb39O7duwS985NtOA3ZNwO1TVLdTUCTRJEc\nERERERHxim5yRERERETEK16kqz344IMA3H777QCsv/76GY9xSwtampGFtuvUqRO07bvvvik/l2sp\nX2PlDO+6666c+l4tDjzwQMCvtLWPPvoICMO6bnrAFltsAcBDDz1U69ex9KPjjz8egB9//DFos/B9\nnz59AGjXrl3QZgUy3EW/11xzTa37k69NN90UgDZt2gTnRo4cCeRX4nhVrHSqW9r9nHPOAcL/jxUr\nVgRtli7z7rvvFqwPSWBpeOnHAJ06dcrruawYg6Xv+sqKw7jXJ0thiytbmqgPpaPTuSmhVozFFsYv\nW7YsaBs0aBAAF154IZCa2t2gQQMg/N61z7T7nLZjvftdbTvV+2711X+fl+7Xrx+QOj72+4n9HuRT\nuWhLn3W/L2ws3PRcS4+091aUqVOnFqOL3mjWrBkQbmcB4XvL/nRT05L+u64iOSIiIiIi4hUvIjnm\nlFNOAVIX17oloM1uu+2W83Nmi+S4ZR9tI8FsJYOrmU8LbI3NKj399NNAYUoo2izc888/H5x79tln\ngdTZUGMz0DY7ZT8PYflfW1gPcP311wPw008/1bqvufrss8+A1Fm4MWPGAJmRhly5M5hWXvSyyy4D\nsm/K6i5y1qLU3NmsqXsctSFckln0JFuExSLOEF7vcylK4P6cfSaj2HP4FNGO0rlzZyAsCuR+1iya\nOHbsWCA64mCzyG60xmbsLVJbjSXy99hjDyCMkLm/k1hxAduc2o1aVzrLxHEjoFZMqkOHDsE5K10e\nlXXz4YcfAtVTnCIuK+Kx7rrrBufSr/VWWASybyKaBIrkiIiIiIiIV1b7LZeFJiVW2xnCpk2bBsej\nR48GUjcKXXPNNXN+LncG02ZKbKbO3XTPLetbKHH+a8o5u2rRmqiZ0lL3q5RjV79+fSCcQQM499xz\nMx5na3cssuEaMmQIAF9++SUQr/+QukGtzXhefvnlwbkmTZoAsHTp0pU+R6HHzsrBup+7oUOHAqnr\nhYzlVVsetss2vLOoDWQvv71w4UIgLDf7wgsvBG1WyraQ8h27pEdDWrVqBcAzzzwTnKtbty4QzqTf\ncsstQVu2kunZlPLzalGXbBEXl80eR0Wj832uYvx/V8L3hJUiB+jYsSMQboZsawAgjHDZ7PCUKVOC\nNhvjQq7jq4SxszWNANOnT884Zw455BAgNQugmMo9drY9wEUXXRSc22mnnYDwe8L9XD722GNAamnk\ncin32GUzefJkIDWKmr7Jqm2+C6UvHZ3v2CmSIyIiIiIiXtFNjoiIiIiIeMXLdLUotiANwt2C8zVz\n5kwgNYReTEkOaUap1nQ13xR67CzlyU2jcBc1For124qAAEybNg0Iy0UXm2/pasZ2ooewoIWlDbll\nya20bb7K8Xl1U1ncwgHpLIXK0jgAWrduvcqfM24p6mIUHNC1Lr4kj13Dhg0BeOqpp4JzLVu2XOnj\n7Zpq6cHFlsSxs+1AbBuRxYsXF/X14kri2Nl2C1a8KKpctxUUcQsPlJrS1UREREREpKp5VUI6GytA\nIKVT2830xA+2WNYWrEO4aa5tZupu1psLdwMyK0E7b948AIYPHx6/s5IzmzH++OOPy9uRmKI25IyK\nzNi5XKI2rlxKT4uk22CDDYAwgpMtejNp0qTguJTbAiSVbZTtbpgtK2fRQoAzzzwTCCM4bsTEzs2Z\nM6eEvSsMRXJERERERMQruskRERERERGvVE3hgUqUxMVplUJjF5/GLj5fCw+4eyZY4RXbcdz2IKqN\ncr/nolLScikuEFWUIGo/nWIq99hVsiSOXdeuXYHsxVJqamqA1Pfm/Pnzi9qvdEkcu0qRlLFzUyFf\nfvllICwy4BYesH2rDjvsMKD0e+O4VHhARERERESqmiI5CZaUu/1KpLGLT2MXn6+RnGLTey4+jV18\nSRw7201+1qxZANSvXz9omzhxIgBdunQBSh+9cSVx7CpFUsbO3crBIjnNmzcHYMyYMUFbt27dgPJG\ncIwiOSIiIiIiUtUUyUmwpNztVyKNXXwau/gUyYlH77n4NHbxaezi09jFp7GLT5EcERERERGparrJ\nERERERERr+gmR0REREREvKKbHBERERER8UoiCw+IiIiIiIjEpUiOiIiIiIh4RTc5IiIiIiLiFd3k\niIiIiIiIV3STIyIiIiIiXtFNjoiIiIiIeEU3OSIiIiIi4hXd5IiIiIiIiFd0kyMiIiIiIl7RTY6I\niIiIiHhFNzkiIiIiIuIV3eSIiIiIiIhXdJMjIiIiIiJe0U2OiIiIiIh4RTc5IiIiIiLiFd3kiIiI\niIiIV3STIyIiIiIiXtFNjoiIiIiIeEU3OSIiIiIi4hXd5IiIiIiIiFd0kyMiIiIiIl7RTY6IiIiI\niHhFNzkiIiIiIuIV3eSIiIiIiIhXdJMjIiIiIiJe0U2OiIiIiIh4RTc5IiIiIiLiFd3kiIiIiIiI\nV3STIyIiIiIiXtFNjoiIiIiIeEU3OSIiIiIi4hXd5IiIiIiIiFd0kyMiIiIiIl7RTY6IiIiIiHjl\n/wGjgMWJk2e4ogAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# takes 5-10 seconds to execute this\n", - "show_MNIST(test_lbl, test_img)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's have a look at the average of all the images of training and testing data." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "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": "iVBORw0KGgoAAAANSUhEUgAAAzkAAACDCAYAAACuq9WXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJztnXmsVdXZxh8mGUQog0wCgjLJBZRaoRKVDoSiDVgRta1G\nbbEOLVITW41trQ0VbdM2djC2Gq22qViHxjo02koi0SggKg4ICKJYZFJAUGa47O+P+pz93HUXx8v9\n5O7B55eQe9j7DGu/+11r7fVOq1mSJAmMMcYYY4wxpiQ0z7oBxhhjjDHGGPNJ4kWOMcYYY4wxplR4\nkWOMMcYYY4wpFV7kGGOMMcYYY0qFFznGGGOMMcaYUuFFjjHGGGOMMaZUeJFjjDHGGGOMKRVe5Bhj\njDHGGGNKhRc5xhhjjDHGmFLhRY4xxhhjjDGmVHiRI+zatQtXX301evXqhbZt22L06NF44oknsm5W\n7tm6dSuuu+46TJgwAZ07d0azZs1w1113Zd2sQrBgwQJMmzYNNTU1OPTQQ9G3b1+cffbZWLZsWdZN\nyz2vvfYazjrrLBx11FFo164dunbtilNOOQWPPPJI1k0rHDNnzkSzZs0wbNiwrJuSa+bMmYNmzZpF\n/82bNy/r5hWCF198EZMmTULnzp3Rrl07DBs2DL///e+zblauufDCC/erd82aNcPq1auzbmJuWb58\nOb7+9a+jd+/eaNeuHYYMGYIZM2Zg+/btWTct97zwwguYMGECOnTogMMOOwzjx4/HSy+9lHWzDoiW\nWTcgT1x44YV44IEHcMUVV2DgwIG46667cNppp+HJJ5/ESSedlHXzcsuGDRswY8YM9O3bF8ceeyzm\nzJmTdZMKwy9/+Us888wzOOusszBixAisW7cON998Mz772c9i3rx5fuiswttvv40PP/wQF1xwAXr1\n6oXt27fjH//4ByZNmoRbb70VF198cdZNLATvvPMObrjhBhx66KFZN6UwTJ8+HSeccEKdYwMGDMio\nNcXhP//5DyZOnIiRI0fi2muvRfv27bFixQq88847WTct11xyySUYN25cnWNJkuDSSy9Fv379cMQR\nR2TUsnyzatUqjBo1Ch07dsS0adPQuXNnzJ07F9dddx1eeOEFPPTQQ1k3Mbe8+OKLOOmkk9CnTx9c\nd9112LdvH2655RaMHTsWzz33HAYPHpx1ExtGYpIkSZL58+cnAJJf/epXlWM7duxIjj766OTEE0/M\nsGX5Z+fOncnatWuTJEmSBQsWJACSO++8M9tGFYRnnnkm2bVrV51jy5YtS1q3bp2ce+65GbWquOzd\nuzc59thjk8GDB2fdlMJwzjnnJF/60peSsWPHJjU1NVk3J9c8+eSTCYDk/vvvz7ophWPLli1J9+7d\nkzPOOCOpra3NujmF5+mnn04AJDNnzsy6Kbll5syZCYBk0aJFdY6ff/75CYBk06ZNGbUs/5x22mlJ\np06dkg0bNlSOrVmzJmnfvn0yefLkDFt2YDhc7SMeeOABtGjRoo71t02bNpg6dSrmzp2LVatWZdi6\nfNO6dWv06NEj62YUkjFjxuCQQw6pc2zgwIGoqanBkiVLMmpVcWnRogX69OmDzZs3Z92UQvDUU0/h\ngQcewG9/+9usm1I4PvzwQ+zduzfrZhSGWbNmYf369Zg5cyaaN2+Obdu2Yd++fVk3q7DMmjULzZo1\nwze/+c2sm5JbPvjgAwBA9+7d6xzv2bMnmjdvXm/uNSlPP/00xo0bhy5dulSO9ezZE2PHjsWjjz6K\nrVu3Zti6huNFzkcsXLgQgwYNQocOHeocHzVqFAAULg7RFJckSbB+/Xp07do166YUgm3btmHDhg1Y\nsWIFbrrpJjz22GP48pe/nHWzck9tbS0uv/xyXHTRRRg+fHjWzSkU3/rWt9ChQwe0adMGX/ziF/H8\n889n3aTcM3v2bHTo0AGrV6/G4MGD0b59e3To0AGXXXYZdu7cmXXzCsWePXtw3333YcyYMejXr1/W\nzcktX/jCFwAAU6dOxUsvvYRVq1bh3nvvxR//+EdMnz7dIbpV2LVrF9q2bVvveLt27bB7924sWrQo\ng1YdOM7J+Yi1a9eiZ8+e9Y7z2Jo1a5q6SeZTyt13343Vq1djxowZWTelEFx55ZW49dZbAQDNmzfH\n5MmTcfPNN2fcqvzzpz/9CW+//TZmz56ddVMKwyGHHIIzzzwTp512Grp27YrFixfj17/+NU4++WQ8\n++yzGDlyZNZNzC3Lly/H3r17cfrpp2Pq1Km48cYbMWfOHPzhD3/A5s2bcc8992TdxMLw73//Gxs3\nbsS5556bdVNyzYQJE/Dzn/8cN9xwAx5++OHK8R//+Me4/vrrM2xZ/hk8eDDmzZuH2tpatGjRAgCw\ne/duzJ8/HwAKU+zCi5yP2LFjB1q3bl3veJs2bSrnjTnYLF26FN/73vdw4okn4oILLsi6OYXgiiuu\nwJQpU7BmzRrcd999qK2txe7du7NuVq7ZuHEjfvrTn+Laa6/F4YcfnnVzCsOYMWMwZsyYyv8nTZqE\nKVOmYMSIEbjmmmvw+OOPZ9i6fLN161Zs374dl156aaWa2uTJk7F7927ceuutmDFjBgYOHJhxK4vB\nrFmz0KpVK5x99tlZNyX39OvXD6eccgrOPPNMdOnSBf/6179www03oEePHpg2bVrWzcst3/3ud3HZ\nZZdh6tSpuOqqq7Bv3z5cf/31WLt2LYDiPBM7XO0j2rZti127dtU7Tjd6zG1nzCfJunXr8NWvfhUd\nO3as5IiZj2fIkCEYN24czj///Eqs8MSJE5EkSdZNyy0/+clP0LlzZ1x++eVZN6XwDBgwAKeffjqe\nfPJJ1NbWZt2c3MI59Bvf+Ead48wpmTt3bpO3qYhs3boVDz30EL7yla/UyZcw9fn73/+Oiy++GLff\nfju+853vYPLkybjjjjtwwQUX4Oqrr8bGjRuzbmJuufTSS/GjH/0Is2bNQk1NDYYPH44VK1bgqquu\nAgC0b98+4xY2DC9yPqJnz56VFarCY7169WrqJplPEVu2bMGpp56KzZs34/HHH7e+/T+YMmUKFixY\n4L2G9sPy5ctx2223Yfr06VizZg1WrlyJlStXYufOndizZw9WrlyJTZs2Zd3MQtGnTx/s3r0b27Zt\ny7opuYVjWpgE3q1bNwDA+++/3+RtKiL//Oc/sX37doeqNYBbbrkFI0eORO/evescnzRpErZv346F\nCxdm1LJiMHPmTKxfvx5PP/00XnnlFSxYsKBSLGTQoEEZt65heJHzEccddxyWLVtWqcZBGH943HHH\nZdEs8ylg586dmDhxIpYtW4ZHH30UQ4cOzbpJhYZu9C1btmTcknyyevVq7Nu3D9OnT0f//v0r/+bP\nn49ly5ahf//+zgc7QN588020adOmMNbNLDj++OMB1I/lZ76rwyYbxt1334327dtj0qRJWTcl96xf\nvz7qXd2zZw8AuDpiA+jUqRNOOumkSnGa2bNno3fv3hgyZEjGLWsYXuR8xJQpU1BbW4vbbrutcmzX\nrl248847MXr0aPTp0yfD1pmyUltbi3POOQdz587F/fffjxNPPDHrJhWGd999t96xPXv24K9//Sva\ntm3rxeJ+GDZsGB588MF6/2pqatC3b188+OCDmDp1atbNzCXvvfdevWMvv/wyHn74YYwfPx7Nm3tK\n3R/MH7njjjvqHL/99tvRsmXLSiUss3/ee+89zJ49G2eccQbatWuXdXNyz6BBg7Bw4cJ6Xv177rkH\nzZs3x4gRIzJqWTG59957sWDBAlxxxRWFGetceOAjRo8ejbPOOgvXXHMN3n33XQwYMAB/+ctfsHLl\nynqDsqnPzTffjM2bN1esco888khlF+vLL78cHTt2zLJ5ueXKK6/Eww8/jIkTJ2LTpk3429/+Vuf8\neeedl1HL8s8ll1yCDz74AKeccgqOOOIIrFu3DnfffTeWLl2K3/zmN7aq74euXbvia1/7Wr3j3Csn\nds78j3POOQdt27bFmDFj0K1bNyxevBi33XYb2rVrh1/84hdZNy/XjBw5Et/+9rfx5z//GXv37sXY\nsWMxZ84c3H///bjmmmscotsA7r33Xuzdu9ehag3khz/8IR577DGcfPLJmDZtGrp06YJHH30Ujz32\nGC666CLrXBWeeuopzJgxA+PHj0eXLl0wb9483HnnnZgwYQK+//3vZ928hpP1bqR5YseOHckPfvCD\npEePHknr1q2TE044IXn88cezblYhOPLIIxMA0X9vvfVW1s3LLWPHjt2v3Nw9q3PPPfck48aNS7p3\n7560bNky6dSpUzJu3LjkoYceyrpphWTs2LFJTU1N1s3INb/73e+SUaNGJZ07d05atmyZ9OzZMznv\nvPOS5cuXZ920QrB79+7kZz/7WXLkkUcmrVq1SgYMGJDcdNNNWTerMHz+859PunXrluzduzfrphSG\n+fPnJ6eeemrSo0ePpFWrVsmgQYOSmTNnJnv27Mm6abnmjTfeSMaPH5907do1ad26dTJkyJDkxhtv\nTHbt2pV10w6IZkniEkTGGGOMMcaY8lCMoDpjjDHGGGOMaSBe5BhjjDHGGGNKhRc5xhhjjDHGmFLh\nRY4xxhhjjDGmVHiRY4wxxhhjjCkVXuQYY4wxxhhjSoUXOcYYY4wxxphS0TLrBsRo1qxZ1k3IBY3Z\nwsiy+x+WXeOx7BrPgcrOcvsf1rnGY9k1Hsuu8Vh2jceyazwHKrtcLnKMMcYYU0yqPZDx3IE+rHjf\ncmPMgeJwNWOMMcYYY0yp8CLHGGOMMcYYUyocrmbMQUTDNvg6/Bu+DmGYBv/u27ev3jljjGkqYmNX\n8+apzbRly5Z1/h5yyCGVc61bt67zV8/xOzjG7d69u3Jux44ddf7u2rWrcm7v3r11Pgd4bDTG2JNj\njDHGGGOMKRmfak9ONYt67BwJLesfd+7TYlEKZaX/ryaDossnZsls1aoVAKBt27aVY3zdrl07AMCh\nhx5a7xwtnyoTWiy3bt0KAPjggw8q57Zv3w4gtW7SogkAtbW1jb+oHKD6Q9nyb7U+G+t71bxg1frz\np5VQlgda2aeMsozJoNo80RDvbOxYEeYOvbYWLVoASMc8IPXScKxr37595dxnPvMZAEDXrl3r/F+/\ng2PXhx9+WDn37rvvAgDWr18PAHj//fcr5zgO7tmzp3KMfT2vMjT5Ieyr1pnyYE+OMcYYY4wxplSU\n3pPDFTqtTUBqLWrTpg0AoGPHjpVznTt3rnNMz9HKTsu6WtQ3btwIILUu6bmdO3cCqGtlL6qlgPKk\nLNRT0aFDBwCp1U5jrWlVi8VaU56hV0Lfp16JvMiOXoWYLKg33bp1qxzr1asXAKBv374AgD59+lTO\n8X2UnV4vdem///0vAGDFihWVczy2evVqAHWtm9u2bQNQV+/yQtgv1QpMOaqni/Kk1Vctw+zH/E69\nXnq/Yv2SVmLKSXWS8s+LrjWEA/VMh9dWzXOmXsrwmOoqX8c8iupFywMfl1dCnQz/6muOcTrWcTwg\net2UC/+q7Kh/mmvC1zyXtT7G5MQ+rDKgB+ewww4DAHTp0qVyrmfPngCAHj16AIh7ctgndd7esmUL\ngFS+ei7m4TWfDmJjE3WEHkWgfiSF6ithv+Qzm74O+6K+37lg+cWeHGOMMcYYY0yp8CLHGGOMMcYY\nUypKGa4WK2UZCyWi27x///6Vc4MGDapzrHv37pVzDIthCMw777xTObd8+XIAwJIlSwAAK1eurJxj\noqQmUeYxhGh/xMJYGFbAcAQgDcdiGALD1xS6fjVsaNOmTQDSkCJ198ZCXbJ0B6ssqFt0f2tIRu/e\nvQEARx11VOXYwIED6/w98sgjK+coM4Zh6e+E4WqLFi2qnHv55ZcB1A2lIZQdwwCBbEOGtF8yjIAh\naRqyQln069evcoz9kceoa0AaYsrwFQ13ZLIyQ/yWLVtWOcdjDPV77733KufYx/MWYhqGC2nITixs\nKAztUb0K+5aeCxPHOfbpd/HzGr7B/s1wI33NcI+s5RiTHWWmIZIcv9ivqWdAqq+cS3R+ocz5O6pD\nlAFlonMCxz+GPgOpTvKYhrJlIcdY2GOsTDTlQRlq2C7nXR5T2fH6qEebN2+unOM4yPGsqOGlDd06\n4EALV1Q7VwS5NITYs52OTXwe4XObzrGcOxgmrvM1v4vjPucEAHjrrbcAAG+//TYAYN26dZVzfHbR\nOTYMsS+K7MMwZA275Vip8idhKkIsfDlW+KepsCfHGGOMMcYYUypK5cmJrUBpJWK5SiBN/B4yZAgA\nYNiwYZVzPMb36Gqf1nJa5mglBoAjjjgCQGrZ04Q3rl61vCUteUVZ5ZPQkqwehNCjobIjarkklEW1\nEsB5IWbBpPfl8MMPr5yjp0GLC1BHqItqwaTFgxbMWDlWfr96OJiMy7/qIaNVSpMos7CkUGaxxGTq\niMppwIABAIDBgwdXjh199NEAUg+ZWtVpvYslklIGvB+qk7Tah2VrgbSv5qHgRTVPasx6rt5Vypnv\n12ugXqgVklA2lJd62mjV4+e1T9PyHiuBnnXyfFjsImYB1j5MXWN/45wApN6ITp06AWj4hpZhIYwN\nGzZUznE+USsy20oZqleoKaMBQq/Cx1nUOSZSf+idBVIPDmWu8yIt46tWrarzF0jlwzFOvVoxq3le\nPP68h7EiK9Sb2LHwc+H3hvB6Yx5Wyop/VeZFSJ6PealDHQPSvnrMMccAAGpqairnOIdQ/9Rry2tn\n/1yzZk3lHL1CHAM5pgLpfdN+zPGQss7LVg6xeSQ2J3NM4/MKkHrEOI/qHENdYsQSI06A1PvFvqtz\nBeVzsJ9J7MkxxhhjjDHGlIpSeHJC74J6UbgqVSscV/cjRowAUNdizNUrY4l19csVJy1XGmccWlHU\nek5PBa0Eer5IuTlA9Y0TaRXgKl+t7aF8NO6clgDKJM8busU8ObRgqmeGOqjtph7ENrML8wRUh0OP\ng1pfqN+0ZmkeFNuj3p0siHlYKTNem1rVeH1qAaOsqBuaDxduvKoyoBz52+qRYP/l/eBfILUo56Ek\nbcwqHMs1pC6o15qeZcpIrd+0qsVyR9iHKSP1cPC3Y16bmFcob3035nmgXmiuF3PnOD/QswOkMtZ+\nSqi31FWVCWXM31arMF+rjlLGPJd1X45tycD+qtfCa6AVXPWHOsnvUis4PTe0Bq9du7Zyjvoa21Yg\n63kifAaJWch53TovxvK9+JrjWGxeiZXRZhuod5rPxLGNlnW1tjPvS59Psva6ktBzrVsHcGzSyIbQ\ng6PPfZxjGPWgOZi83lheSZhX9nHREqG3LGsPWTjuAaksVO/orTn22GMBAMcff3zlHKOdOAbq2Ml+\nyRzXhQsXVs49//zzAIDFixcDqDtvUz/V43gwvDr25BhjjDHGGGNKhRc5xhhjjDHGmFJRqnC1amWN\nGXoAAEOHDq1zLBZ2RveulkKl+5G/EwuLoXtUXcV0i6rrneE3RQtXI7GwNbrOKRcNUaA7l9et7t1q\npUGzDkMIqbYrvIbZ0Y2txSnoxmZisbpm6R7nd6luMcmZuqwhCgxl4F8Nk4iVDc6SWOgn77X2F8pA\nwwLUPa6fB9LrZDiIJkyyoAHd86pH1cor50VmQPXCAxrKwhAhTfIOy2vHwsmoqyobypufpw7q+zh2\nMbRPj31cUngWVCs8QNnFSh1TnhpGxmsJxy59zVLmei4MXY6VkNZjHFOqhQk3JdVCTzWUiGFYlKcm\nh/P91BsNYWE4FedKHQNi4T95gXKJyYLzIMdv3bKCWwxoyBXfx89pKG+1cLVwHtK5h1tbPPfcc3Xe\nq+/XeZf9OIuk+Vh4brjlAJDqlIaYMpyK86eOQ3ymo75puDj7FZ8dNeSXvx0LMeV91rBV3pus55Dw\nuVhlxzBSbpkCAKNHjwYAnHDCCQDSQg1Aeu2cp3WbhlBHdNsVzsV8Btb+zHExtk3DJznO2ZNjjDHG\nGGOMKRWl8OSEVhT1IDCZKlaOlpYAXUnS+sHVviYj08LGVbtajPmdXNmrdYHenTfeeKNyjAmWuiIu\nErEVN+USKxvK5FJaVnRFT7lSFno/8mi1I2wbr0kTN7lhmFplqZ+UWWwzO1qBVHa0ZjGxXD2VtNLE\nNunKG7FNEZkEql4wWti0rGpoFVMLJvscrXiUE1B/o0u1OtGSxPumfZFtzdpyHhImkap1jtetukOL\nJK9DrbuhHmpfC8dStc5RTrTOqbWUMlVPbeiNyIrQk6PWV3oBde6gF0L1iVBHOT9o8jx1ml6bmJeH\n51ROsY1UQ09R1uNhtcT6WFEP/tVz1B+OkfTe6LHYFgvU+djGglmXQQ7LQ8c2H6cstIAFvTq6aTT7\nWmxjaPZV/tVxkGMBP6eeSsqcBQdic4j+Tl7Kb4eew1jZd9Ut6iLHHPUy8/nrzTffBFD3GYTfRc9/\nLEonVtI7pot5kR3bSV1Ubyr1TosL8DX1Tz2sr7/+OoB0Y1SdrzlmUq9VPtR9yjMWaXKwyf+TkTHG\nGGOMMcYcAF7kGGOMMcYYY0pFKcLV6G6la0xDxRhGpu5gDUkA6hYEoFuOrk2tJ08XOt1/+p2EYXGx\nxPFYMltRiblkKRderyYr023MUA7dJyfc/yDrkIxqxEIkGAqgMmEIlN5nupL5PnX5EuqNhhPwN8NC\nB/pdbEtsJ+usw4TCNgL1QxM1pCcWFkA3d8z1zjCQAQMGAKibTMmxgLqlIYUM3YolReZlnwggHoIQ\n7kkFpGEGGkbLUA5em94DJpGy/2mIDb+XoW86ZjJEi2FqGpIZ7vYNZNufY8UkGPoS29dFxyzKkcUX\n9DrDpHndIZ1jG8c61bkwnE/D1Xhv9B5RD9lfspJlGOqnYScMk9I+GeqNvp+yYpiahoRTbzhu6j1i\nG8KiJfpa9e5gF2toaGI5Q2RjYx37oOpPuH8I9QhI+zGvU+UThubrMwjnjNhYHNO7PIx7QP39h7Tg\nRaz4AokVtOF4z74bC89lX9cQOP52bLyLhTpnWSxEdZJ9jv1Ti6pQRzSNg8/PK1euBADMmzevcu6F\nF14AkMpQ5cP9Jjl2qt7xfZxbYvs6HWzsyTHGGGOMMcaUisJ6cnQVGCa86y639LaohY6eH1qQXnvt\ntcq5V155BUC6e6sm6tI6EEsI5PfT+qerWa6QNYE1LIlbNGLWCV4nk9p0N11aOihz9eTQmplnDw7R\n6w4tc2pZDHem3993EOoD9UYTysMylfr5cFd1tRLS8pS1VY6/r0n/4TH1QMVKXtKzwFKrQ4YMqZzj\nbsw8Fit3zIRJ7c+0njJpXC3ueUiWj1m6wmRSHVM49qgnh7JkorwmyPM1+yb7L5B6hZhMqh4jlkCn\nVVktzezLsXudNaE1WK3gHKs0KZyWccolVk6XeqIeBI4D9Pxr8jOtwOynqvf8fh0H+TrrUvqhF0w9\nMxyztDgFPTmUnVrUWVyAHlSVK+dw6ncs4oH6qv2Vuqh9JlbI5pNE7wXvT6yEOu85r1dlx8+pN4s6\nwffrmBV6ZNXDOmrUKACpLqvsKCv2Vb0f1Ur5Zk3oDYl5OWNeKepBrEw8xyidXxjxw2gA/Rwjfai3\n6nXjPVJdZLuyKL+tUR7UMz4/aP9kgQV9RuM49fzzzwMAnn322co5enc4/6hXiDrI79S5gnrG+6H3\nKiafg6F39uQYY4wxxhhjSkVhPTm6YuVKlRZc3WyLljldtXPVzbwbem+A1KvD1bpaxkNrglowaSml\n9U43A6M1VS2Has0pEqFlRe8D8x9oAVUrJT03oRVY35cX61FDoSUiZlGixVOPUVaxEra0htICGtvQ\nkTqjcqUcaS38OG9EmBfUFMR+K/Taaawu5aKWp5qaGgBpmcuRI0dWzjGumO9XnaQVlLLQ8ry09NLq\nmkfvAxDPyeH4onpCD7bmJHKMop6oB5V6S6u5ypsWTY6fmjsSWtL1XMwbm4XOhb+tr9k3NQcpVn6b\nlkm+T63ztF5SBqq/tAJrCXTC8SDm8YptdpmXTUAbks+k+hPm4uhcSR3kd+lGmPwcv1M94ZQ/rcO0\nrOv7YjmTTbEZLX+X91BzNNj3qCM6PvGa9Bjfz+tT7yv1plpOL/VVIwsocz7X0AMBpM84WXgeYsQ8\nZJSrjjWc89QrxfGd/VnHQuosnw/VC86+zj6rudgsOb1s2TIA6fYfQOr9yHr7gTB3CajfVzWPRr32\nhB4rRj1on+XzM/s452MAOO644wCkc4beI+ogdToLOdmTY4wxxhhjjCkVXuQYY4wxxhhjSkVhw9U0\nPIBuOCbcauEBJjKqG5tlPxcvXgwAWLJkSeUcXZF0hcbCjRiOoO7dsExkLOQg5krMMpTjk0DDAAcO\nHAgglbm6den+je2SXqRr17aG7Y7dXw0rYBgBQ43UZcxQSxbKiJU853eqe57ucoYjaDgWdTK2g3QW\niczVfkv7MxMXtYAAy0LTTa5loikfXpu6xOkuZxiCJloyXIE6rO75PJUzV72iPrHtmijPcU9L+VIW\n1AFNCmWIBq+fpUABYPjw4QDS8C0N3wgTuWNlXfVYrPBEFlAGsdCOWAhpWDREw9uoc7wmPRf2bw3t\n4nfGZBIrPJCXsbFauBplocnIvPYw4R1I5c7wFp2vqW+Up+oav4NJ+np/wgIsQBo20xQFWML7qaFi\n7IOxcLVYcQSG9jBMTcd0/g6/S0OQGCbOMU5DwhkmznC1WLn8vBALVwuLeQDpPKiFGbhNB58FOcYB\ndecMoO78S/lzC5GlS5dWzjGFgWFcGvLL+6ch5FkWCYnN9bFiIdQffQ7jtbBvsxgDkM4RDC1liJq+\nZmggw/qA+ts0aP90uJoxxhhjjDHGNILCenLUikPLJVfvmjzKVakm2nFFvnz5cgB1SwKGG1PGkrZj\nVj9antgutdBxtVxU70UMXqfKmt4HntPSqUzeo3zzYCFvDLEkcOqBFpuglUgtbdRTWj41UZcWeeqw\nnqMO0yoa25SQFi7Vu9D6Gp4HsrMah1Z19eTELE9sGy2QLGkJ1C2/CsRLofL7tbwy9TWUIRD35GSl\nszFPDnUpVspTLZS0ztFqrjpKObHoxTHHHFM5x7Lc1D1N8mYbaN3T74wlMYceiqy8h2HhGL3ftM6q\nx4rXzusPFiC+AAATAElEQVRVK2Q4jmnJWcqf903HjDCBWueEalEAWc8X4Vii95yeAy1nzL4bK7BA\nDy09OOrJ4ffyc1pIJfRC6/2j10PvQxgtcTDh/QlLSQP1N3SNeXLUE8Dr0gRuEnqktZQ+X7NfcrNV\nII1eqRZJESvSkbXehfJUmdCzp54cPo/w/Tr/Us/Yn9WDRc8NvRCM8gHSMYG/p22oViwka0KdjHkX\nVU8pq6FDh9b5HJBGAPC5RIt7sT9Tr3U+5jzN8VWjLJpqPrAnxxhjjDHGGFMqCuvJUS8K4zDDDciA\ndLUY8+TEyhmHGzmp1YVWFFo++btAalmhJSm2GVhsw6iiQXlQBpo7QhnQOqDWdpYnLGq5aKIeB3rv\neN3q1aLHQEtY8nVs00ZaQ6i7+jthXLt6cmj1o55r2VrqoupwKP+m9E7ELIX8q+2gpUwtQoyVpgw0\nFyzMsVBrbjg2aE4KLXvh5oRAKvNYrHVTEcoISMc9/lUvXax9zN2hZ4YeHYUyUX2khyhmiefvVMtt\naQrr+YESlqNl2X8g3fxZ+w8t4fRKxLx6MW9p6OHVUrXsr/xtzVXJW3y/wuukfDQHiWOW9i3KgO3X\n/kprMPMltL/Sq0q5xMry87f1OylrHTfDtjcFsXGV9zPWttA7BaR9LebRpqeLZfM/97nPVc4xGoDP\nFuqVpCeH41rW+XEHCuUTK7muOsL3hZsmA/U309bcGj6rUGZatjv0euQ5CiVWQp0eaB3v6P1Sjyxl\npc8shPIM/wKpPPn9jNoBUr2L5bg31ZhmT44xxhhjjDGmVHiRY4wxxhhjjCkVhQ1XUxcuwwGYOKXu\nb4aNaSgKw1MYphYLD6AbWcPi+P1057FkI5CGG8V2eKZrUBPxY0mFeUXd/ZRtGHIApO51uoFZ2AFI\n3eRZh100lpg+MEyNSXgausdSi6ojDJniXy2RHO7wrQl6YciQuuzDRGAtkczQEv0uuq5jJWwP1r2h\n7GJhTTymv802arI73d3UKf0uvmbf0/Ag3hP+nrriGXJJmWmYK8cLTW5u6p2sY0nnvF9slxZNoQ7o\nOEMdiLWZ8qJOa6gWx02OXQzt1d/k72hCPj8XC0vIuqRqGEqn/YJhKhoKSnnyc7FQUOqM6hz7MsOp\ndD4KizXoOd4PDQUJy3VnRRg6GSu6EytRy2OaAM73U/6qwwxrph5pSDgLG8T0KJbwn0VYUSxcLSwr\nrWNurKx0OJ5puW6GpLFsrxYL4T3hGKmlfClXzsN56Z8NJVagJuyDQKojHNP1PlDPWHpaw6E513Cu\njRXC4d9Y/8w6PDemd9Q3jmnazzgO6bMvi9lwnFMdCQs5aMEbPkdzDGU6CJA+C7I/x543XHjAGGOM\nMcYYYw6Awnpy1JJES0cs0ZorSLXI0oIU2yyRq9iYBYpWeVpPdHMpWpxihQ64glbLAdtQBOuJWjBp\nNaFFSS1tofWXSWdA/URdlXmeZUBovdFEPXpk6C1gMiiQJrVrWdVqHscwUVctLGE5c02mpPwpe7Wm\n0mKlXkXKPSxlezAIrW+qR7SKxbw8vE61qmvRDv1u/X7KU6+Jsmb/V7mGib16P9jWWLJwUxHztvE6\n2Le073CcUR3ltfFa9R6EnkiVDa+bCbmvvvpq5RyT9Gkd1oRWtk8Lq2SZqKv3j/MEPXixeUK9hyTc\nVE+/gx5t/S5aSWO6w/vB+xDbfFQ/l7WFuCHErOyUNcc81Qf2T45PMY9trCw1vyu2sSA/93HlfZuK\nmPc1LGcPxO95OC5pf2ZfZSER9dzTas7yxxpJQRlzHNX7EbYvT4SFPbTYBOc+LWfMuZgyi3lrqHfq\nyaU3gv1Y51jOC2FZdKD+vK1tzkKesYIX7Bscr4HUM6MFFjimhZsgA6kM+IyjfY9y5bygHqPQc1ht\nM/WDhT05xhhjjDHGmFJRWE9OzPIbWxmGscFAusrnylU/F5ZI1pwTbrY1fPhwAGneBZCudLla1o24\nVq1aBaDuqllLTOeJmIVcY4JpPWFMploiGaPP69XS3GG52WoWyjxalGKb4FEGzPPQHBta2KhH+lp1\nkdCyxr+xXBB+Tq13tNbE2kdrlFoJqXfq3TnYhKVfgbS/qGeBxDYvowzCjSWB+n1cv5PyiMmC3xF6\nGfV9edBF9eTQKsccGVolgVSm1coZa/w6xy9et8qb1x1unAykljp6cNSqR32MlZzOApUFdYH9Vvsh\nryGWCxcr9x/qjH5XaPmtlicSK6ueR0IPs8opthFxaBXWc7p5I1A3WoIRArFIAY5Z9FiolZ7HdNzM\ncrsC/c2wDHjsnOpp6BljrgSQloDnXKPe1zfeeANA6snRZxD2Veq0fi7mycnDuAfU99Lr+EUd0bxX\nzo30IGheEr3SvHb1CoW/p3NVOK/oveJ35SUyRX873EA1tk2DltHmHBGLbOBzML9fIys4FlC+mhNa\nLY+1qaJ67MkxxhhjjDHGlAovcowxxhhjjDGlorDhaup6C0MN9BxDFDTsjMlTdJOp642uOiaUakja\nwIEDAaQ7g2uIAl3nTL7iXyAN39IQIXUX54HY7uUxFzHDB3hMwxCYgBaWAQXqJ1jGSqPmxUUeI3Sb\nA6m7m7LQsALqj4ZbUBdj4Wp0HzMcSUP9wt2CtQ1aunZ/36khTWGpyYMp8zBhW0MAwjK7GgJAndIE\nT76Oud4pT8paS3nzNe+HhrLxuzhuqL7Gwq6y0k+91rAUpxZniBVx4PVyN3oNDYjthE0YosW+rCEI\n/FysJG5T6NWBECsIwFAfDfvktegYTdnyXKzwAEPftJ9Tt6nveo/CsMtYKFsew4bYNvYZ1RnOfaoj\nRx99NIB0rtTQIMqdehQrbMM+rQV8WKKWoZMMjwHSUPAsS77vj/D3Y+Gb2oeos+yz+uzCEC2GFmky\n+ZIlSwCkYWsqO8q62riWtZxItaIyOt9xTNd+zHvOUD19DuPzCWWnv8O+GhZ90PfHyn3nOcSU95My\niRUl0FBj9kPKQot+hOXt9ZmCfY66mLc+aE+OMcYYY4wxplQU1pOjVldaLJjQqJ4ZJoXX1NRUjtEK\nR49OzJND6wCtBfo5rkq1VN7rr78OoHr5Rl3hZpmMG4PWCbWqseCAJobyNeWk10TrEK18ai0Kk/bU\nghkmPuYliS+Gti20vKqll3JSCy9lxutVb02ow2opDa332gZaZChP7Re00ug94vmm9CTGNlKlxTb0\nDOr7tI28hljJa3rIaOVkci6QenJoFVULFJMu+TdWCll1OCtiyaQxXYiVOg69OzEvIq815jGiZ0Pl\nnueSs4Ry0Wvia1qFqS9Aqn+qc5wXwi0HgFTn6L3VzfF4ju9X7xDlSJlrAj89RrGNGrOGsmN7tXgA\nk7tZUh9I582hQ4cCqOuNoHeH16mFHShzemleeumlyrnnnnsOAPDaa68BSCMkgLRf56V0eYxq91Ln\nXY5V9DhyOwKgfmK9enJYJIRziT7XUC559hbGCD05WsiHzyfqWaF+xspEh4WUtKAS5R8rLhAWS4oV\njlBdy4s8q3kQY947XiflRD0E6j4DAnULFnDepCc3b0W17MkxxhhjjDHGlIrCenI0lpDlVOk9iZXy\npfUISK1KXOXrap/Wt1gJWa5UGe9JixIALFq0CACwdOlSAHU3wqQlL48WunD1rpZeWjq0LDEtKrQK\nqDeCliP+VcsBLSP8W7QS0tQLtY5RHxiTriVNGTscswgxRl/fH24Yq9Zf6k0s54Ln+P7Y5mdaurza\n5lyfNGH+j1rCef9jpdppEVZLW2iZj+VH0CukuVF8H2Wg1l/Ga7M/q3WK40sePDlKaIFTXSBaJpv9\nmbJUb1pYDlSt4LTGVZND7LfzstlvtY1U2f+0jfQ8xHSH3xHzTIflooFUjrSoq/eQekhd0/GEXp68\nlN9W2A7qhfYVenL0PlNvOAYxRwdIvWaUk45ZnMM5n/IvUN9TESsXnRd5xYjlvVKPdI5lLgTHRM2N\noIwpA+YpAakcOSerRb0I3tcY4WagOrbFntEoT8pM80D5PvZZHQv5DEi91e8MoyViUSh51rsYoVyB\nVFb02uhYyPmDOqV9j+NbmPcFVN8EvqmwJ8cYY4wxxhhTKrzIMcYYY4wxxpSKwoaraSIsQ31effVV\nAPHkWnUnMuGUbjlNeg53gtXwFhYXYJgaSzYCaaIk3fMahpBnV3roQlf3Jd25eozXQHdlrBQ0Xb+x\nc7HkvSK40HkPNYyMukHZadgjE0K15GUYrqZhZEzkjSVMUuZhAqS2KyxBrd+lbW7KhHre17CN2k7t\nJ4T9sX///pVjDD9gKVoto039pJxUBmFo6csvv1w5FyYwa+EBhtIUQTdJtT7MMVF1h6EHPKbhanzN\ne1atL+e5jKrqOfWC91v7JkMetRwtdY4JuJocTqjbqnOcO6h7b775ZuUcjzHcSPtmWGAkj7BtGq7C\ncHHtPyxj/MQTTwCoG3LF0JdYGfQwnE/lwzExNp/muZ+Gc6zqEccz1TuG27OYhY514bipoX5h2FAs\nPD7PcorBe8xr0TkkVhCEfZqhyyo7wn6mJc8Z9hcWLgBSmVPnixoGqOM05wiVD8dAhqlpsQGGBsYK\npoThkbFw29hc0VShzfbkGGOMMcYYY0pFYT05aqXgipzlmzUZnlYmLRLAsrK0LmkyGy1H/Jxa4fia\nlkAto1ltNZvnVX5o4YmVkVVrOy1stBbFko957WopCZObP66cYd6IWR1pUaQFUzceo1VEvYqUVazc\nMy1UPNZQ+YRJ/dovKGu10DelVzHcjEz1iH0ullAaK8vJ76CFTuVKmbE/MkEZSL2vTI6mJR1oWKJu\n3vk4y1hYsCFWgpvXrfeAehKzXoZFK2Je2bz0ZdUhWh/pZY1dr3oOmCxPy7omh/N7+X7dToDjAHVO\nN62kjsZKc8c27csr2sZw7AJSSzivXeeJcM6oVpI3Jou86FZDYR+kvmnCO3VKPTl8TY9XzMMalu0F\n6kdXFMXTFRJL+ufcoQUv2Oe0rDS9D/ToxAoPsO/p8xuf7eiB1HmCXtdwc2CgGJ6cWMELzp8qH+pi\nzHPNaw4LNOix2LNvGH0Sm5sONvbkGGOMMcYYY0qFFznGGGOMMcaYUlHYcDV1D9JNxqRFDTlg6MBT\nTz1VOUY3MJOu1I1HV1tD3HKxeuB5dlvGYLt5LepqZBiCusQZXhRLgg/dj+rW5XfFwtWKQBh6BaQu\ndIYJaCGBaknZDXHTVtOjakUbYp/LusgDdUpDc8JjGobAkAHucA6kYQhM1NU+y/7IsDP9LuouxwRN\nmObnmmLPoE+aartvq46GibR6D9iXGZagehkm+mqiKcfEWIGRvPVrlQ/HHspCx2/qiYYnhwm4mqQb\n7hOmYyTHAf6OhmmGc0dRQ4pixMaZvOlDUxGbFxmupnrE8Yx/gTScLRbmSx3mGKeh+dUKMxQVyoDX\nqc8nHIcYTgak/ZepCLEQU/ZLFokC0tC32DMkx8DYM1Ke+2z4DBLbY0hD0jSMEoiHb/OYziNhYaGG\nzgdNJTt7cowxxhhjjDGlolmSw6VonkuSNiWNuTWW3f+w7BpPU8ou5hGklSmWrFztd2LJytUSmQ/G\n0Heg3/lJ6hxlpHKjLGPJp7H3k7CgRaws6CeZdJtFf9XrpldLy29TdmoBJWxvTD7hLugHu8iKx7rG\n0xSyCwsOMLEbSAupsFw0APTo0QNAWkpfdZKeHHoaNHqAHg16FbVITmhl/yTGwSz0Tj/fkPEu5lGL\neRmr9VlStD5bbXsQehNVF8MtVbQoQbjNgHp5KCse02gJeiHpdYsVsDlQXTxQ2dmTY4wxxhhjjCkV\n9uTkGFvoGo9l13gsu8aTpSenyORZ56r9Th6mzzzLLu80pUU9tgFjLCeHeSS0pKunIiwFrznDtKDH\nrOa0wBfd+1oWmlJ2sc/FvNRhjmZDPNhK6OHX1zGPd1N5EO3JMcYYY4wxxpQKL3KMMcYYY4wxpcLh\najnG7uDGY9k1Hsuu8ThcrXFY5xqPZdd4sk6ejx0LE8Zj56qVkI8l1h+MctLWu8Zj2TUeh6sZY4wx\nxhhjPtXk0pNjjDHGGGOMMY3FnhxjjDHGGGNMqfAixxhjjDHGGFMqvMgxxhhjjDHGlAovcowxxhhj\njDGlwoscY4wxxhhjTKnwIscYY4wxxhhTKrzIMcYYY4wxxpQKL3KMMcYYY4wxpcKLHGOMMcYYY0yp\n8CLHGGOMMcYYUyq8yDHGGGOMMcaUCi9yjDHGGGOMMaXCixxjjDHGGGNMqfAixxhjjDHGGFMqvMgx\nxhhjjDHGlAovcowxxhhjjDGlwoscY4wxxhhjTKnwIscYY4wxxhhTKrzIMcYYY4wxxpQKL3KMMcYY\nY4wxpcKLHGOMMcYYY0yp8CLHGGOMMcYYUyq8yDHGGGOMMcaUCi9yjDHGGGOMMaXCixxjjDHGGGNM\nqfAixxhjjDHGGFMqvMgxxhhjjDHGlAovcowxxhhjjDGlwoscY4wxxhhjTKnwIscYY4wxxhhTKrzI\nMcYYY4wxxpQKL3KMMcYYY4wxpcKLHGOMMcYYY0yp+D9R0W+z4Wzf3QAAAABJRU5ErkJggg==\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": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Average of all images in training dataset.\")\n", - "show_ave_MNIST(train_lbl, train_img)\n", - "\n", - "print(\"Average of all images in testing dataset.\")\n", - "show_ave_MNIST(test_lbl, test_img)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Testing\n", - "\n", - "Now, let us convert this raw data into `DataSet.examples` to run our algorithms defined in `learning.py`. Every image is represented by 784 numbers (28x28 pixels) and we append them with its label or class to make them work with our implementations in learning module." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(60000, 784) (60000,)\n", - "(60000, 785)\n" - ] - } - ], - "source": [ - "print(train_img.shape, train_lbl.shape)\n", - "temp_train_lbl = train_lbl.reshape((60000,1))\n", - "training_examples = np.hstack((train_img, temp_train_lbl))\n", - "print(training_examples.shape)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we will initialize a DataSet with our training examples, so we can use it in our algorithms." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# takes ~10 seconds to execute this\n", - "MNIST_DataSet = DataSet(examples=training_examples, distance=manhattan_distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Moving forward we can use `MNIST_DataSet` to test our algorithms." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plurality Learner\n", - "\n", - "The Plurality Learner always returns the class with the most training samples. In this case, `1`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "pL = PluralityLearner(MNIST_DataSet)\n", - "print(pL(177))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 8\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\nat8D/EG1jwa/LngO3vYDLVbaZ35JMrOTJP1N0vPuvnGK+jxJf3P3Cwueh/ADLVbaiT1WO+3rUUlj\nk4OffRF41PWS3jzWJgFUp55v+xdJeknSG5KOXsd5raSVki5S7W3/Hkm3Zl8Opp6LPT/QYqW+7S8L\n4Qdaj/P5ASQRfiAowg8ERfiBoAg/EBThB4Ii/EBQhB8IivADQRF+ICjCDwRF+IGgCD8QFOEHgiq8\ngGfJDkn6YNL9WdmyTtSpvXVqXxK9NarM3n5Y7wPbej7/917cbJe791TWQEKn9tapfUn01qiqeuNt\nPxAU4QeCqjr8AxW/fkqn9tapfUn01qhKeqv0Mz+A6lS95wdQkUrCb2ZLzOxtM3vPzNZU0UMeM9tj\nZm+Y2WtVTzGWTYM2YWZvTlp2hpltN7N3s99TTpNWUW/3m9m+bNu9ZmbXVNTbXDP7p5mNmtlbZvab\nbHml2y7RVyXbre1v+81shqR3JF0taa+knZJWuvtoWxvJYWZ7JPW4e+Vjwmb2M0mfSxo8OhuSmf1R\n0sfuvj77w3m6u/+uQ3q7X8c4c3OLesubWfpXqnDblTnjdRmq2PNfJuk9d3/f3b+U9KSkZRX00fHc\nfUTSx99ZvEzS5uz2ZtX+87RdTm8dwd33u/vu7PZnko7OLF3ptkv0VYkqwn+WpA8n3d+rzpry2yW9\nYGavmllf1c1MoXvSzEgfSequspkpFM7c3E7fmVm6Y7ZdIzNel40v/L5vkbv/WNJSSXdkb287ktc+\ns3XScM3Dks5TbRq3/ZI2VNlMNrP0Fkl3ufunk2tVbrsp+qpku1UR/n2S5k66f3a2rCO4+77s94Sk\nYdU+pnSSA0cnSc1+T1Tczzfc/YC7f+3uRyQ9ogq3XTaz9BZJj7v7ULa48m03VV9Vbbcqwr9T0vlm\ndq6ZnSzpRklbK+jje8xsZvZFjMxspqTF6rzZh7dKWp3dXi3pmQp7+ZZOmbk5b2ZpVbztOm7Ga3dv\n+4+ka1T7xv+/ku6tooecvn4k6T/Zz1tV9ybpCdXeBv5Pte9GbpbUJWmHpHcl/UPSGR3U259Vm835\nddWCNqei3hap9pb+dUmvZT/XVL3tEn1Vst04wg8Iii/8gKAIPxAU4QeCIvxAUIQfCIrwA0ERfiAo\nwg8E9X/46I56sOIdFgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "\n", - "print(\"Actual class of test image:\", test_lbl[177])\n", - "plt.imshow(test_img[177].reshape((28,28)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is obvious that this Learner is not very efficient. In fact, it will guess correctly in only 1135/10000 of the samples, roughly 10%. It is very fast though, so it might have its use as a quick first guess." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Naive-Bayes\n", - "\n", - "The Naive-Bayes classifier is an improvement over the Plurality Learner. It is much more accurate, but a lot slower." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7\n" - ] - } - ], - "source": [ - "# takes ~45 Secs. to execute this\n", - "\n", - "nBD = NaiveBayesLearner(MNIST_DataSet, continuous=False)\n", - "print(nBD(test_img[0]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### k-Nearest Neighbors\n", - "\n", - "We will now try to classify a random image from the dataset using the kNN classifier." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n" - ] - } - ], - "source": [ - "# takes ~20 Secs. to execute this\n", - "kNN = NearestNeighborLearner(MNIST_DataSet, k=3)\n", - "print(kNN(test_img[211]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To make sure that the output we got is correct, let's plot that image along with its label." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 5\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "\n", - "print(\"Actual class of test image:\", test_lbl[211])\n", - "plt.imshow(test_img[211].reshape((28,28)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hurray! We've got it correct. Don't worry if our algorithm predicted a wrong class. With this techinique we have only ~97% accuracy on this dataset." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MNIST FASHION\n", - "\n", - "Another dataset in the same format is [MNIST Fashion](https://github.com/zalandoresearch/fashion-mnist/blob/master/README.md). This dataset, instead of digits contains types of apparel (t-shirts, trousers and others). As with the Digits dataset, it is split into training and testing images, with labels from 0 to 9 for each of the ten types of apparel present in the dataset. The below table shows what each label means:\n", - "\n", - "| Label | Description |\n", - "| ----- | ----------- |\n", - "| 0 | T-shirt/top |\n", - "| 1 | Trouser |\n", - "| 2 | Pullover |\n", - "| 3 | Dress |\n", - "| 4 | Coat |\n", - "| 5 | Sandal |\n", - "| 6 | Shirt |\n", - "| 7 | Sneaker |\n", - "| 8 | Bag |\n", - "| 9 | Ankle boot |" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since both the MNIST datasets follow the same format, the code we wrote for loading and visualizing the Digits dataset will work for Fashion too! The only difference is that we have to let the functions know which dataset we're using, with the `fashion` argument. Let's start by loading the training and testing images:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "train_img, train_lbl, test_img, test_lbl = load_MNIST(fashion=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing Data\n", - "\n", - "Let's visualize some random images for each class, both for the training and testing sections:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nvSY4PlafKVOmVG1YmhjfPi6wJvn4LtN6J+3h0EMPrT5jeVxppZUkNZ/feAZBRqIU2V7MHc+LpZde\nWpL0pS99qWr76le/Kql+PnHrDcfCw2CoBXyT/ictQUmSJEmSJEmSDBT5EpQkSZIkSZIkyUDRt+5w\nkcke95nHHnus2lam45Q6A9k9kLqsUOwuXQRdYjKNzqFMyftS58z+3VJsTxRXXXWVpGaKR0zJ1113\nXcf+M2fOlFS7QLgr4W233dbY1+9BP6RwhjvuuKP6PM8880iK0xWXAZqjoUzpGVW65u8FF1xQteGS\ndO211476HMYaP29SPXtCAFxucIHxIGzkjHF/3333VW2l26YHU7cdElpceOGF1TbcHZ966qmO/aOE\nEr3CZbCcszx4GVcld5dK+gvup9/zbimrjzrqKEnSKqusUm0j5T2uTe4yjPzg2uSuR/w28n322WdX\nbaXMly7WUnOd9/UnaRd+Lw855JAhf8/ncxIduDslbpHM85FLpLteJ0lagpIkSZIkSZIkGShe9p82\nR6EnSZIkSZIkSZL0mLQEJUmSJEmSJEkyUORLUJIkSZIkSZIkA0W+BCVJkiRJkiRJMlDkS1CSJEmS\nJEmSJANFvgQlSZIkSZIkSTJQ5EtQkiRJkiRJkiQDRb4EJUmSJEmSJEkyUORLUJIkSZIkSZIkA0W+\nBCVJkiRJkiRJMlDkS1CSJEmSJEmSJANFvgQlSZIkSZIkSTJQ5EtQkiRJkiRJkiQDxSsm+gQiXvay\nl/XsWPPMM48kaeedd662bb755pKkF198UZL02GOPVW133323JOk3v/mNJGn++efvONYmm2wiSXrz\nm99ctf3P//yPJOnb3/62JOnvf//7qM/9P//5z7C/08u+23rrrSVJ73//+6ttv/vd7yRJb3vb2yRJ\nb3nLWzq+94Mf/ECStMsuu1TbXv7yl0uSnn32WUnSr3/966pt7rnnliTdcMMNkqSjjjpq1Oc+0X3X\nDfpi+vTp1bYbb7xxtvsvvfTSkqT/+q//01nceeedY3h27ey7LbfcUpK00korSZK22267qu2mm26S\nJF177bWSpNVXX71qQ07ps9NOO61qG4t+HG7fjbbf/PvdfnubbbaRJE2dOrXju3zvrW99a9XGPHjb\nbbdJkm699dZRnedL0UaZ6xfGs++i73X7fdbIiy++uNrG2so86Md84xvfKKk5hmfHK1/5yurzP//5\n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\nFEIIIYQQQpgoFpUlCK24+x+jSWqlLB4m+DLz256q8LOf/ayk8dXIO6RKxBK0yiqrdG2kzG3xhCc8\nQVLRTHu6xnGi5dtepw2Xin/zMsss021DU1pbhFq4rLAfhcpa8WbgVpBxTyXr18J1YrXwQrxonYlf\nOffcc7s2l0+pr3XeeOONh3zGc88gjffXvvY1Sf0CcyussIKkdorsukihz1n8DnLssk1qWdKYLoZ5\nLcyMVvzd2Wef3X1mnl955ZUl9ePN6sKUPg/WcZPOe9/7XknFqun7xBIUQpgNsQSFEEIIIYQQJoq8\nBIUQQgghhBAmivv9ZQTtyNMJmncTeu2Osfrqq3efqWbu5nhcsUgR6y5OQLf4sXFjoqKxp4bF1Yn9\nL7/88q6NYOGZBhDP5tbMV8KBrbfeWpL0rGc9q9t29NFHSyrpdZ1NN91UkrTSSitJkm6++eau7ctf\n/vLQz2+u+s4rXRO4v95660mSdt55566tlap6PvjYxz7WfaYa9KWXXtptu+SSS+7zGKMid37Mxz72\nsZKKO+ahhx7atR122GGSinvW+973vq7tgx/8oKTierPccst1bV69eljMtO/merzijokLJVXEpeI+\niHuRJ4Mh6QEy5JXF54JRkblxZBz67mlPe1r3GRnERd3XQpIeUE2+dvcdNuPQd6NK+m72pO9mz7Bf\nWWIJCiGEEEIIIUwUI2kJCiGEEEIIIYS5IpagEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJE\nkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGX\noBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJE8YCFPoEW97vf/eb0+Msv\nv7wk6bDDDpMkrbLKKl3br371K0nSL37xC0nSAx/4wK7tYQ97mCTpa1/7miTpta99bdf25z//eejn\n+Ze//GXG35mLvnvc4x7XfT7wwAMlSddee+2U/X73u99JKn3461//umt7yEMeIqn06/3vf/+u7Qtf\n+MKQz3h++47v3ddvPuUpT5Ekffvb357V7+yxxx6SpGOPPXZW358uoyJ3Lf7hH/5BUpEjSfrNb34j\nqcjUn/70p67tSU96kiTp5z//ee+vNP37NhNmeqy56Le11lqr+7zmmmv2fmedddbp2v7u7/5OUpm7\n/vd//7dru+OOOyRJ9957ryTpr/6q6MvuvvtuSdKFF144tHMeFZkbdEw/x1p2Wt9rXVP9Pe6BJO26\n666SpP/6r//qtnFv6P/WOjMqfTeId73rXd3npz/96ZKkL33pS5L61/Q///M/koYrW4MYh74bVUal\n7/yYfG6Nk7XXXluStN9++0mSPv7xj3dtF1100RKPOcz1YWmOGbn7fwz7fozkS9DSsvHGG3efd999\nd0nSRhtt1G3jxeZnP/uZpP5D049//GNJ5SHrAQ8oXcRD1iabbCKp/yLwy1/+UpL01a9+VZJ05pln\ndm28NI0rPEhK0iMe8QhJ0l//9V9LKg+gkvSgBz1IkvR///d/U9ron9aD6rjTGpRbb721JOn9739/\nt42Xb/BJ+Jvf/KakIpvPfe5zu7ZtttlGUpnYP/KRj3Rt733veyVJb33rW5d4fnM9oc8V/uDNta+0\n0kqSpOuvv75rQ85aC98yyywjSbrnnnsk9V+COP44yWK9ELbu50knndR9diWO1L9W+uKhD32opL5i\nAvmjjx784Ad3bbfddpuk9oMq+/t5jZPMDWLQOJruNdb7Ic+StP7660vq378f/OAHksq9mQtl21zC\n+rnjjjt221CSfe9735PUl9F/+Zd/kSTdfPPNkspLkTPohTBMHi4/v//97yVJf/u3fytJet/73te1\n/ehHP5JUlNnrrrtu14YCAsX4t771rTk84zBKxB0uhBBCCCGEMFHkJSiEEEIIIYQwUdzvLyPoqzBb\n38dDDz1UkrTlllt223Bv+8lPftJtw12Lvy94wQu6NtxncP9wP/lrrrlGUjHHuxmWY8FjH/vY7jNu\nI29/+9tndD2j4jf67//+791n4nzoF1wKpeKyQV/gAidJf/zjHyVJf/jDHyQVtzpJuvXWWyXNPlam\nxbD7blD8yCtf+UpJ0nHHHddtw1WD65aKDOJ+9PCHP3xa51W7FxJfJfX7Ueqb//fff/8ZXQeMity1\nOOussySVeAJJOuKII5a4P77euBh97GMf69oYv8jkMFjImCBcQG644YZuGzLHX5c55jjGdO06J5Ux\njfurVFzqnvWsZw3t3EdF5loub60xs/nmm0sq7lseo/bTn/5UUll73AURVxyPBQJiZU444YRu2yc/\n+UlJg2V1Pvtuuq5oq6++uqQSB3nFFVd0bf/xH/8hSdp5550llVhHqbj+Mm++4Q1v6Np8rRkWoyJ3\n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\nscTfGRX8vJE7AmNb7nD0oad6MNhKpQAACKxJREFUrvtznFJkg8sQ7qhHH330lP1IIUy1dKmMN/qr\n5R5G0g93WWI+a6VXZeyvssoqU87hyiuvlFTSZ0vlPuIqN2zcFaV2a/GxgmvggQceKKk/73MMP0fc\n3z75yU9Kks4666yuDXcvXMAOOOCAro20rtyjQam1nVbboNTG80ntVuouLMiKu9aQ/prUvX6PWDNw\nlXPZ4v6xtnqCDX6b+XbQefr+YfTYa6+9us9f//rXJZXx6bLCnF67Q0vl/rbWgpZrae3K7rLi8lzT\ncoEH5pfWs91MS2AMG5JXffrTn+79nU923nnnef/NmRJLUAghhBBCCGGiWPSWILQLLe05Fh23EqEJ\nJLVnK7itLmAnFc0j2kVPrd0qXjhOeLpPNNFo6txKNB3oJy+CN8qWILcq1CBHaCu/8IUvdG3+eT6h\nsJs0NbW249rXUQVtslTG1SCtHGO1lTgCGRtkuRw1SDzgMsi4ufrqq6fsT3+5RYd+QyPqgebMY8iH\ntyEf9Klb5dD8088e5Mx84EkTOP5cpQ1uWTpbSRhe97rXSSrzvcsJ6XlJay1J733veyUVDeq2227b\ntV1zzTWSSuFC/94//dM/9X53uh4Ag4oGLnSR1PrcvM/57H2OFpo5yNfRel7yPuEzyTr8mHxvUCKd\nWH/GAzwXpDJvURLAqS1A/hzXKuRczwU+bpCt1phijLKtJUetxEScn58X+7lFPowusQSFEEIIIYQQ\nJoq8BIUQQgghhBAmikXvDofrhpvca5On556nFhD7eGKE2m2EoE+puNHhfuLHxB1uoQPlZsu1117b\nfabK93Tck5xB+fdHGe4dyTTc9I78nHrqqVO+V7sh1Z+HBf2Ju4lXct5uu+16+0jFVYo6T6MMLqlO\ny+WN8djqX8Zhyx1s1MF1z10tcLG45ZZbpuxP37QCi3Ff9QQuyMVPfvITSX23O36TY7kLEmOACuZ8\nX5K+9rWvSZJe/vKXd9voe99vmAxyMXM5oT/pExJJSKU/L7room7bW97yFknSmmuuKUm6++67u7bV\nVltNUkmIcM4553Rt3/ve9yQNrunUYlD9koV2h6vxsVa7R0pFRgYFtLOPu0Yjw4xT7zv2H7TmJDHC\neLD33nt3n0kkwpzj97xO0OKJbeq1z48BLXc4tnkb63Wrra5N16o91KodNK7Pe5NGLEEhhBBCCCGE\niWJRWILq9J1OnQTBISDPtQtoPKli7cF6WHsI+m1pqdAoeGAwqbjHVTP1wx/+sPuM9gUNTSuYsQUW\nNfrH09OOMlwfWu+nPvWpXRvbTjzxxCnfQyM11/e81jJT5V4q5+eySFXuZZddVlK/KvSoQVVrqcgg\n/dqy0JJ23dOvA/3kgdZoqeejsvds4DoIvpdKwDmWC9eKM8e5hbrWYrqGk3kTC0mrVEC9rx+D1Npr\nr71213b++edL6s8ZK664oqSi8R02bjF89atf3Ttfv15SetNPfo7/+I//KKmktpdKP+6yyy69fSTp\njDPOkCTdeuutkqT3vOc9U85rttablvW41nAvNK3z8XHHtdPXbklk7aCtlbad45MgwdvcclQzrmvs\nJMM4Y73yew4tD5JWCYh6PfR5C7lpWWjZjzaXI2Sx1cYxfD160pOeJGnhkiOFmRFLUAghhBBCCGGi\nWBSWoEHaH97wifWRimWGvz/4wQ+6NrTDaCfQmEtFY4XGywvr4cOMpnnllVfu2rAqjauWyn3h0XiQ\nntLT4w4CTSBakkFpTkcJNL3cX7caDoqrma97PcgKSh+75hTL1ihbgGCTTTbpPq+wwgqSiiz6uCTl\nMffGrZO0ERPj6fAZ4y7fowTFNnffffduW32ubm0gPbpfP/MZVh6PiapTG7fihepCtFJJrc3fm266\nacq5u+X9hhtumHKMYeLz9+233y6pyIIX20TDzHjwNPHIwqc+9aluG9ew//77S+prdi+77DJJJe22\nM5OCqPc1TyCvj3rUowbuN9/4vcSSuOOOO3bbWP8oqbDGGmt0bVzLTjvtJKnfB8RgsrZ6mnyO1UoP\nH8afVjkKZKUVLwetVNctsDSxf6vAPc92rBdSmTM5F59TmI/9vM477zxJ/Xk7jC6xBIUQQgghhBAm\nirwEhRBCCCGEECaKReEONwiCcd18TxID0h57FXlcJHD18LSutLUqV9fptu+6664hXsXogLsCbnHT\nTbVM2ljccsbBHcsh+PvJT35yt22Qe88gN7VhMuj4m222maS+289cpSmeC/bcc8/u82233SapuCK4\n28OVV14pSfrZz34mSdpqq626Nlyl6qB4aXTd4ODkk0/u/b0vjjvuuDk8m5nxvOc9b95+ywPyPUX8\nfeFjmeQKvg3+4z/+Q5J05513dtuYB6HlptMam4PGa6sNF76TTjppid+bDzi31rx22GGHSZLWX3/9\nbhvj7uc//7mk/nrI3M9Y9BIMdQIT79fTTz9dUjsJRRhfDjzwQEnFxdkTHTzsYQ+TNDVxgePpqXF1\nw53Nk+tstNFGwzztsEiIJSiEEEIIIYQwUdzvL+MarR9CCCGEEEIIsyCWoBBCCCGEEMJEkZegEEII\nIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGE\nEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDC\nRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSR\nl6AQQgghhBDCRJGXoBBCCCGEEMJEkZegEEIIIYQQwkSRl6AQQgghhBDCRJGXoBBCCCGEEMJEkZeg\nEEIIIYQQwkSRl6AQQvj/2q8DAQAAAABB/taDXBYBACsSBAAArEgQAACwIkEAAMCKBAEAACsSBAAA\nrEgQAACwIkEAAMCKBAEAACsSBAAArASZCRhw34kEgQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# takes 5-10 seconds to execute this\n", - "show_MNIST(train_lbl, train_img, fashion=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\ne3f06NEDBQoU8Is8nBw5cgQAkCNHDq+PsaSyadMmNG/eHMWKFcNLL72EK1euYMqUKahTpw6+//57\nFClSBC1btkTGjBmxaNEi1K9f33b8woULUb58eSsg8eeff0adOnVQoEABPPfcc4iIiMCiRYvQtm1b\nfPLJJ3jwwQdtxw8cOBC5cuXCyJEjvT5Gbzfdu3fHCy+8gA0bNlj99Pr162jWrJnVl2np27x5M5o3\nb46oqCiMGjUK6dKls15sv/rqK1SvXh0A8Oijj2LJkiUYPHgwypUrh3PnzuHrr7/Gvn37cM899yAm\nJgbNmjXD1atX8fjjjyNv3rw4deoUVq1ahfPnzyNLliwpJo9bsXLlShQrVgy1a9e+5b59+/bFnDlz\n0L59ezz99NPYvn07XnvtNezbtw/Lli2z9ps9ezYyZsyIp556ChkzZsTmzZsxcuRI/PPPP5gwYQIA\nYPjw4bhw4QJ+++03TJ48GQDiFYh7O4iMjMTWrVuxd+9en0G67777LsqXL482bdogffr0WLlyJQYO\nHIjY2FgMGjTItu/hw4fRvn17PPLII+jZsyc+/PBD9OrVC1FRUShfvjwA4I8//kDDhg1x/fp1q9/N\nmDHD1YIRHxkHIvGVLXDTHXzp0qUYOHAgMmXKhLfffhsPPfQQTpw4gRw5cvg89sCBA9b4369fP5Qu\nXRpz585F3759Ub16dfTv3x8AULx4cb/dW3zxtwyio6NRs2ZN66MpV65cWLt2LR555BH8888/lrvp\nP//8gw8++ABdunRBv379cPHiRcycORPNmjXDjh07ULlyZdc63LhxA3369MHChQuxbNkyy1Pl33//\nRf369XHq1CkMGDAAhQsXxrfffovnn38ep0+f9or3mzVrFv777z/0798foaGh1rtMSnLhwgWcPXsW\nxhicOXMGU6ZMwaVLl2xeL2+99RbatGmDrl27IiYmBgsWLECHDh2watUqm9dOr169sGjRInTv3h01\na9bEF198cdu8eubNm4d27dohJCQEXbp0wbvvvoudO3eiWrVqXvvOnz8fFy9exIABAxAUFITx48ej\nXbt2OHr0aJyhHTt37kSzZs1QtWpVLF++PE6ramxsLNq0aYOvv/4a/fv3R9myZfHTTz9h8uTJOHjw\nYLyU73///TdatGiBjh07okuXLli0aBEee+wxhISEoE+fPgBuvgs2aNAAhw8fxuDBg1G0aFEsXrwY\n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\n8MILp7I2KUErrrhi+sx9ReFxy+Rjjz0mqa4OYeXke64McgysMKVYtHxhVKmv325JXfJ4uPXW8RGt\n9AAAIABJREFUW2+W1zicEBPkfZLzfvzxx9M2LNAorE3pO0sQ/zJ58uS0DTWZ3+Zc2o6rtfStadOm\nSZKWW265VMbCkrRVrKhSpSjSfl25Jv3saKRJ2S6Na3vvvbek+th+2223Deh3II/9K/GFL3whfWYh\nwuFg3Lhxkqp77/Mi82EpLpFxbZ555knbaFMolr/61a9SGSoRypMvuE0fZhz02Dfqc8stt0zbfvKT\nn/Tz6kaeUnsoxWY0tcUtttiitv+111476PNhnGCcZfzoJrxtwI477iipijdz8piepoWgN91007SN\neZ1xspSSe7SDMnPPPfdIqjxQpOo+oAT58jD0/5JKxGdXglCO8MpoiukaKkIJCoIgCIIgCIKgp4iX\noCAIgiAIgiAIeorWucMBwWpStUIt7gTI5VKz2wFpY0spX5H7vYzvIYG6SwDyNIGZHFuqViPGXa/N\n4A4xWHc4XCfcZQeJtQ0QIOh4ilegDZZcJ5HhXUqn3SC1+/cI/KQOvX1TxrEINvZj+O94u+wmSslG\nfvrTn6bP3/3udyVVUvusUmoDdc3+kyZNSmW5u8xoCfj3pDG4Kpx//vmSpCOPPDKV4eJG3XtiBNrR\nWWedJanusrDBBht04Ky7g5I7XGk8I2HEZpttJklaffXVU9nuu+8uSTrggAMkldPDlo5JW/U5B7dh\nykouQMPBMsssI6nqR77UAUlZfBX5m266SVKVUtvdiEltTcIWd6NbY401asd3l6755ptPUuWq5an/\n2R+X47bQn7T+nlwnDw7/yle+kj7jDsdzxqWXXprKcA9j/Dz33HNT2dVXXy2pvlzHOeecI6lKlY+b\n2UhTcoMeO3Zsn20XXHBBn+/mfc7/z5NXuUvrdtttJ0n6zne+I6k+nza5J7aVkpsg8wDhEP4su/TS\nS0uq6tD7JZ+ZP0r90/fn2WarrbaSVHeH61QdhxIUBEEQBEEQBEFP0VolyEFJ2GmnnSTVg68I6PJk\nCViNeHN1Sz5v+Vjc3ArD2yzWMLfKsI2/HkjsKRzbDgGr1JNbsvhcWpgyp63B1Ysvvnj6zH1FXXEr\nLdYNtwJ7MKF/X6oCCLGEeBntrLQILZaxUlkpYQDpubsFgpu9HWFZ9sDvo48+WlLf9PYOZX6svO/d\n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\nEZLq6371xw3L++zOO+8sqVqTydfHm501/pr62de+9jVJ9WvinnNfS89q7rb5+OOP147h58pzDG3Z\nj0XdldytqX/GAZ9D9tprL0lVX5eqJCn77rtvn/1Lc9NI0OSSWbpHe+65pyRpvfXWk1Rvk7iwkVTC\nE07Qn/1ZOT8HrxO+u80220iq1mbqJN1xR4IgCIIgCIIgCIaJ1ilBRx55pCTp8ssvT9sI7MWC5hZN\n0nx6sBbBrFgCSlZl3nT9DRZLAFYtt0DwOw8++KAkacqUKamMhAEEzEqVxaKtlCwJN998s6S65Rpy\nC52numwTHnTuqYhzSinAm6xAefKDUmr2koKE5apkVYF8Fea24AoD9VEKdKU+6MduwaJsdqyXI41b\nwGl/JCpw6y2qsgfubr311pKk5557TlK9XVEn7O91RJpTVERPe0rg8tprr107J6lq96X71DboS1iJ\nXXlYbbXVJFXq99VXX53KuHbSyO6///6pDJUOBWj11VdPZbR3Dwxn3iql3PdkFUMJAeA+hlEXKDN+\njoztnhwit/SXjsX86+0uTwHv14tVmfnX2x3jnytrnaYp4N3H4Sblh3TLnhyCBAF8D+u7JD366KOS\npN12201SZX2XKu+KXXfdVZK05pprprK777679rueUIXnp5LHB+flyRauuuqqmV7PYOCeoap4wg/G\nPtqK1zP9EpVUkq677jpJVV/Nl1aQqvbmCg1tiSQfPn6RWIh76u2uNOdsuummkqox4tZbb01l3ZIY\noSkJQgnULb7nz8U815bmGJa5KCUt4r57nTBm7rPPPpKq8VUq38uhIJSgIAiCIAiCIAh6itaa61Bc\n8s9S3T/7kEMOkVRP0czbaGlRq9wHvvSmjL+8+z4usMACkqo3WFd9RiMlSy/+8f3ZH6tBW+D+enug\n3TS1lZJqw7bSsdhWsjJiFXMLFpZSju1WlSZ1qG2guubXK1XXV1o8cjRcu6egBsYeV2juvfdeSVUs\ngZfT5jyGCDUWy6ars4suuqikKlWsl1GnxMh4mljacckHvJspWWhzVcHVD+J3UNquueaaVEY8BZZ4\nV/KOO+44SdJ5550nqa4mcw5e11jisfJ7LGWnlhkoLThKf+O+okhIVdpuX/QQVQuLvJ9r0yKvuRLu\n/ReFCmuxtzsUKvfO6DRNVn0f91ESqBOPEaPOPKaENlFK973hhhvW/i8tl8DixNSXVC30WbLIoyZ5\n+6adsSQES3pIs6cENS0ETAyoP1exP4qo9yWUb3/u4FpQt7090BapM28/9DN+z9sy8Vf8tvdBxghf\nEoXfLD0jDbUS1BRj1Z/FT/u7Dc8r1DpfMPbCCy+UJI0dO1ZSXfmiLZLi3+crlnm49tpr0zbUHsag\nz33uc6nsoIMO6nNeQ0H7nxCCIAiCIAiCIAgGQLwEBUEQBEEQBEHQU7TOHa7k4sM2ZHYPMkSaLLkX\n4cbkUj1BnsjxHiyIfEpgXWmFbORjh+A5339WaTK7FQIUS1KvByjm5NJs29zhSKbh0I5K7m0lF7n+\nSOEll7rcVa7k4lVyHyklAyglV+hWvM7zFb29j+fX2da+NTP8Wrk2ErF44CguQe5ac9JJJ0mqXGPc\nTQ2XD1Jre8Av4yZuT7gzSJU7JsHV3q4JoMVFqpuZVd/EJRBXWN+H5DvUnbfBFVZYoba/J/FhPsFt\nx10dS2Mi7R33EG/bnerDuPi4Wx6uQLgZkSJcqtwv3U2XNlsas7gGzr9U94yffkzq4Pbbb5dUX10e\nFye/D8zXQ51AopSKP3+m2GyzzVLZDjvsUNvHkxkwxrmLFf2Q/dwFDBci8GQdfGZu9uca7qWPJcDY\n6q5juM2yv7vDDTXcJ8am0hzIs52PUfRB7xO33XabpMqV0OuOY3B8vw98pu48WRb9ge95m+R5yBN/\n5K7bnaTpmWKwrndN38OtkiVhJGnHHXeUVLW/VVZZJZWxJMAll1wiqZ7cALfP+++/P22jrunH3u46\nlfQklKAgCIIgCIIgCHqK1ilBvKX623+ejtiD1FAnSsoFb5tuecBShyXALS1YAPI0tVI5UBlKaY/b\nChalkhrhKVJz8v3dCtMGPMgU8jSTvvhaKXVm/r1SWdNCnyXyduoBnbQ77w+LLLKIpHakaPe+h5UQ\ntcPrrmlh2tGAWzNph4w3rr5itb3iiivSNvoZllEPfiZ1OoG/JEHw38FKjDVbqgKjuRf+PdoaaXel\nzlnk+0OT2jMrSymB2lj13Qr91FNPSaosop5M4KKLLpJUBcS7YsP4WaoLju8WfM6/lJq6U+l2uV9u\n8UZ5/MUvfiGpfv5Yvpv6XylFdq5w+36lBCi0bxQzHxepH6+70jw9FPBbft6cC7/vS0LQhzgP1EOp\n8hxx5YHjMv6VFscGX8A3X2DWlZ08qc5DDz2UyjxZCtCPad+erKC/aZX7iyetkurnTXvn3rs6yRjj\nS0AQlI9q4Aob7Zrzd1WcZBXUr7fX3OPD2x37+/1mqZZTTjmlzzmQRGAwNCVBGAo4PonFfJkXFGAW\na/Y5hmUUWMjbE1XQJhk/XPlmuQD3ntpggw0kVX3X5zeS0Qw1oQQFQRAEQRAEQdBTtE4JKpFbJtwa\nDm7VytNK+ps1VgisBO6HiJWnZNnEajNardGA2lFKzdl07bkS59bjNuCqBHC9WIHct9UXowOsRk2W\nnCYrG5YoPxf8alEgffFM2rxbtbDatEEJKsURlNpdntbeyeu6jf3TlQT6DbEEbkHGaur1wGf28/2x\nqmKd83gBlA7GuMmTJ6cyFJIf/vCHkqTtttsulWHB83qnvY6EEtTU1zxFLnOGx5QwBxx11FGSpI02\n2iiVYdkkRsPVuk9+8pOSqtSvfv/y1L1e54ytbgnnftOXXW3uFFj9va9wD4n5cqss5+Z1kNe7j/+5\nB0bpe7RNb6+MB1jWPT6GOKySmjnUiyxyz/yZgmugv5111lmpjM9crysvKIgec0e75D54e6AOSksi\noJAxtntbQdlhjCgtjDqc+DImp59+uqRq7PB7SFspeUhQ/6UFoEsxstQVyre3YRb1pG35PIOazv1z\n1Yf6dA8gxg3GO44tVSmjB0N/nhv6qxKV9qfdsQg2XiNSFX9X8ihgaQbifsaNG5fKlltuOUlVW/Tn\naeJ9Sp5Y3DePC/Y+MpSEEhQEQRAEQRAEQU8RL0FBEARBEARBEPQUo8IdLpdKXaYGl/2QrpFO3QUi\nT3no3+N3cJ1wGZb9hiMt4kiCm0LJPSy/dr8P+T3yAMc2UEqMAEjn06dPT9uQj0sJOUoub7krl9cX\nn6lPDyQkuJBUlAcccEAqQ7J2SdmDSNtEng64yW3Q65I+2qlg0k6SB5A73EdPVVpKGsPnkrsX26gv\ndw/BBWTTTTeVVLkbSZXLAm5GHmBMoHbJjWmoKbl0NK2SznngkuF9mrELd6/SMdwlENcMXD88LSxB\nw6UAdeoMlxqvG+6HJ43BRaVTdViC8cLbCvVDP1x66aVTGe3Bx7r+uPWWaFoGADc0fsfTdBMkX3LD\nHGpoN54oA3co3Km8jLpj/HbXKT5PnTq1I+c6M2ibUtVXfdxkG3Obt+GhcKWbOHFi+sxvkEoel1Gp\nav+lNkN4go93eXpwvyZc0dif1O5SNXdzj3yepB3heu5tk/vnbZ85Gbc7XMikuhvZQOnvnDez75Xq\nyZ/ZSOBx5513SpK23XbbVHbHHXdIks477zxJ0uqrr57KuEckhHAXX/oo7afkGuxubvlzll/zfffd\nN9NrnB1CCQqCIAiCIAiCoKcYFUpQbiXwt3Le7N2qxZs91gK3GOVv235sAhWx1LlFgLfoUrrJ0QRK\nWX/SZFInUl+rXBsW63Q84cDMuP7669PnXXbZRVJZlWiilD6b9kyducKG5d2tZ1Cq4zYpQa4wePC0\nVE9+ki8AWKpn2mtJmetWUAtKFnmsi55ylbbgdYVFl0QH3naw5tNOWGhQqhYKxbrnwcCMcVgHS9ZN\nT4LQ1EZnh/4sFOjjDuldCbz2lP4kOvBkCU2JHA477DBJlWriC6Lm/c6t7vwOwcQEIfu5Pvjgg31+\nj7lmOALa874mVf0Ga7q3B+ZRtyqzP+ddSujA2Ojtm98unQPeAyxe64oZv+OW5E71dVIAex0wP6CY\nuqcDSQlKyYBoK00LW3sbpj9zbR7AT52xv6uxtGuUTq877kNp3OQc/PwYSwbDlVdeKUlaa6210jZU\nsBVXXFFS/dmCOuOafPwqLerL+dLnvN2RAIY2jGIjVYmM2Oa/w/0mtbkrF7RFV+S5N5zf3Xffncpc\nURsspXFvoB5ITQlWWID7+OOPT9sY6x9++GFJ9SQxzL/Ur18j8zTKqD9/cI9cGSW5FMckJb809PMH\nhBIUBEEQBEEQBEFP0R6zaAO5/7C/bWKF9AW5eFPnLdUtybxllywz7IfFpZSeEkufky8A12ZKi4nN\nDLfkYwlwP+42sdBCC0kqW9Cw5nkbo62U0rVDKZahtIAg7Q3rjVua2d9VqPyYvlgbKbLbgFvjcgta\nqf01qZP5wrZtwGO/gD7F9bu1GwulW9aWWGKJ2ve93rC8YvlzFRt1h/ZLzJlUWb35ni9oV1Kv3GI+\nlDTFyXC/vX4Yf/nrC02SqtgX87vllltqxzzyyCPTZ+IDbrzxRkl1azQKE+lhS2NAacFNlHPv35Rj\nVe5UXZbOzZUB6jpfvNLLHL7L2OX7U1eMZ66U5QuL+7EZx2h/pGr3/b3uXNUbSkrj6rRp02p/vS/h\nQcJ1el0wrnkbQVlD1fJnCpQR6q4U/4yC6c8bzFuoID6PleImqUfq3xehnR323HNPSdJdd92VtjEO\n8WzgfZb64Vq87thWaiOcf6kvUa+PPvpoKltyySUlVX3Wv0d9opz72MZ+vkAoYy7Kkau33mYGSknd\n5rmE9uMKD/eY+vSx46Mf/Wif47M/ahhLA0jS5z//eUnS97//fUn1JTboh7Qjj2z/KKEAACAASURB\nVIcjNhoFkudkSXrggQdqZVI9flmSzjnnnD7nOdSEEhQEQRAEQRAEQU8RL0FBEARBEARBEPQUo8Id\nLsddZ3Ax8JVqkf2QDj0IE6kT2dWDfvPV111SRgL03xmNUD/URZO7l9cdsm0bUxVL5YBG6oA25q5G\npYDS3C2y5EbCPu4mk7v2eJ3jGlKqV9qpu0V4us5up5TghH7pbhF54givCyT60srjTQHB3QBuvV4P\nuBKR3tXdIHFLw/1GqtotbcFdVHGbo615GZ9x7fJxjf1xzXF3j3xFez/noaY/qZb93FZbbTVJfRNp\nSNX5umvWOuusI0naZ599JNVXuT/llFMkVW1tww03TGXbbbedJOmII46QJD3yyCOpbLfddpMkHXzw\nwZKqBAtS5UZz6KGHpm242dBG3YWHIPOhhvrx+qX/EIjvCQhwDfQgfeqFY3hZyVUJmItpR74P8zVu\nRu4uWkqX7G45Q0l/5jB3EfXPvQ7B7fvuu2/ahovcgQceKEk6+uijU9nWW28tSXriiSck1cdv2gou\nV5I0duxYSVV78+QmfJcx0d2wLrvsMklVm/IxguQHjLU+h9ImSSQj9U1g5EmV3B1ssOCaJlUunyQQ\n8HOjfrhed5PmnPzcbr/9dknl9Nk/+MEPJEnbbLONpPozCPMorsTuOsmYiWsxY7AkfeITn5BUuSL7\nue6///6lS+8IoQQFQRAEQRAEQdBTjAolKLcoubLj1k3IF0n17+fBs6V0f1gJPAitFBSWH3M0gHUD\na0FTqkW/7lKiiTaBJb204BiKV0kF9MBVAhqxUpeC9Ju28XulNo01tnQ/vH0PR2D1UOHKGtfOtlJA\ncBMDSejRbbhlDfWZbV5GGtPhxlUfxkjf1qlUxXvssYek+sJ9BFyTytUtllhrGYsIhpaqPuyLVrIA\nKskPpkyZksqwqmJpZoFBqQoaJlGKzwmkv+aYpE+Wqr571VVXpW30fcYOFmDsJKhhJQ+JUqKDPJmB\nfy6pPfTFpsQWtBlXXfJ5u+SFUFKIg+7jkksuKX6WpAkTJqTP+Zzq8yP315VmFmFFcSilF2f/Nddc\nM5UxhpA4wtOLow41zb+LLLJI+sxczO+40oGKORhIauTpxVG6N9lkE0n1BDZ5AhL3XLrooosk1Z/R\nWEKA8/UFkVkUmmt3FZZrnzRpkiTpxBNPnOk1+FiIiuXjBuPocD4zhxIUBEEQBEEQBEFPMSpNJfnC\nnFLd1xvrElYjtw7zGStVKU0o+Fstb+QlS37bFgbtD01WPPDFUtsaCwTEZ/i9JA0q1ouS2uX752lH\nS3VC+yl9r5QWGVB4fEEx2re34U6lje0Efp1Nqa3zdLwOdYY1rE1KUB7rJFXWb1cQhoNSjBp4nZYW\nKexUnCSqiqcjxnr57LPP9ikjVgqFxheaxcq6ww47pG3rr7++pKp9eXvEovvVr35VkrTVVlulMvzs\nS+0RBZM6u/nmm/ucAzEIUqU4Mb94Wm/ikoYavB/8/LEq8/sed9YUF1pSYPO+XOqTTXF6qJ/XXXdd\n2kb9Y8mXRn98bptpGk+ckurSxMknn1z721+I36P9eMwbKaNL8bQ8A/r1MF6zzeOSWIDUVZn+suyy\ny0qqz+HEWqNqEccoVfGc/PV+ynn7khk8N3O+3n/4zDOFxzYR9+NpzyGP7fN6YkxxbwZPez9chBIU\nBEEQBEEQBEFPES9BQRAEQRAEQRD0FKPCHa5JTkVycwkxdy9y1658pWoPkIM8TbRUuUqU3I3a7grm\nUJ/UYVPCAw/iHT9+vKTuTUc8K0quFcjGXFMpmM9daPKA4P6k+PX98vSxDkGNLlPjGuSBo20KFvZz\npY756yl3m+ozvzelQNmhWg19qOH6vR5wy3zooYf67N+fdjVYmsYwXy2doN277747bWtyZZwd+F1W\nHpeq8XeeeeaRVKVtlaqUuPQV3Eukqu7uu+++tI3j4k7iLn6s/M74d80116SyPDmEzxOcAyuje6IS\nXGRKKZW5p+6m06l6ZazzcSN3h6NOnNISAWxz1zrqpXT+7Mdfr3P2xxXP7x9uwE2JeoLuodueiUhZ\n382QMMUTp5AAYvnll5ckbbnllqmMhAX0WQ/fKC1lwBjD/v48w3j17W9/W1Ll1jdQlltuufSZfuzj\nDG7GJPnxZ51OhZWEEhQEQRAEQRAEQU/RHrNwA/kboqfJxNpbWvitKUi6FAzLZ8o80IyyTi3Q1i2g\nNPTH6uyLpWLFa6sS5EkeIF/E1K+XtuHX25T2kfrhmKV6ytO3S31TJnsQZok21X9J8WpKr9vUFptS\nnEN/g3WHC6zaPp5xn0nD3A1gJZSqOvT+UlpoeCjguK4I0B/of66MEuCcL5ooVYkHSmM6+7uawXWi\n5LjiRB/k+K6Wsx/3tlS21FJL9TkH1Cu3mv7sZz9TJ0BN83ZHHXg68hyvn3xBaL/OXAHyPslvovS6\nssMxqBP/Pfb3OZ3FZ4NgtHLPPffU/p522mkz3df7Ax4F8803X59tzH2k+pYqpbv0HJQnevK5M59H\np0+fnj4z3vlyFyOxnEwoQUEQBEEQBEEQ9BTxEhQEQRAEQRAEQU8xKtzhcjz4ueRelAeslhIclNyG\ncLdBsi8lBXDXkNFIHhBbCtCGV199tc82lz7bBOsHEIgoVW2FNVsIxpaqNuLrlOSuXCX3qyZJOU8O\nIFXuOKwXMGPGjFTGmgEuMT/11FOzvtguhGugzkpB2CXydYKc3H2uG1zgHFx8PDkLLgq4PzjDdf65\nK6y7JeFKhXuZ1DkXTNzOfM0aXD5wg/P1lOiT7uYFHMOvhXqn7bkrGrDN1zPh+LRVnyf4TN15uyRp\ngo+bjJeluu7UWHrjjTdKkjbaaKO07dFHH5UkLbPMMn32b3IrL7moNrVTjpXXvcNaVIsuumjaRp25\ni+OUKVNm+jtB0Gt4Ahv/PLs0uaHnfd3X9vLPgzn2UBFKUBAEQRAEQRAEPcWoVILcWsabZNMbZcmS\nnAeqS5XlDQtt6XuzCkxvO3lAdlN64VKq17bWz6mnnipJmjBhQtqGhfuRRx6RVFeCWLHag++xYKJU\numKZry5fUoJIvODB21hmCfr2YMa99tqrz7FYGbsNuMUeCzrX4n0P6zH7uPJAHdN3vc5HIghzIGAN\n92Qrc8wxh6S6wjHc5NY9T9k6ZsyYPvt7wpChhCBd/31WQEcRGjt2bCqjffA9H4sY0/3aaH+l9OqU\noSB5GTA2et+mrfJ9L+OcCVCWqrbMeY0bNy6Vrb/++n1+cyg48cQTa38dzpvxRqrmVlfD8oQIpaQJ\nlHm6e7bx/ZKCS5rwI488Mm2bNm1aP64sCIKgTihBQRAEQRAEQRD0FKNSCSI+QqqsqB5/gbWw5Juc\n+167vzlWKfbBh9vLNt98c0l1P2mseaVtbSP3i2dBzhKl+JM2Ldbp0I580VTu51lnnSWpfr0/+tGP\nhu/kjK233jp9RnnymBLa/lD6BHcK7y9Yj7kPruyycCXX65ZlV82k4Vl8baggvvCuu+5K24hJG8lF\nIXOV3NOmzj///JLqKaOHMw7wmWeeqf29/vrr++zDmO7tC3XB1cemxUhReWhftEGprogMBNrvQQcd\nlLZxjsRY3XzzzamMaxxOuF4USalqBx7LxPxGjJgrQag9qGde57Qfvv/CCy+kMtKE095C/QmCYHYJ\nJSgIgiAIgiAIgp4iXoKCIAiCIAiCIOgp2umblJG7tU2aNCl9ZjVxDy5GhsfdYYEFFkhlyPCkRHaX\nGSR95Hx3h8MViiDgphTbbebiiy+WVK1q3pTm0F1Rjj/+eEnSLbfc0sGz6xykjd11113TNtpUye0v\nTyPcKfLf8folcNjdVCZPntzR8xlK3OWL1LelRBy4KFIH7gKHqw1umO62VEpx302Q5MKTXeAeNBKu\nUJCPt+4iy3n5vXv66aeH58T6SWnV804lbxgI1OOhhx46wmcya9zFlrHd++bLL79c298TZtDv6Ive\nfuivtB8fu3CVO+644/qcTymRURAEwawIJSgIgiAIgiAIgp7iDf8J00kQBEEQBEEQBD1EKEFBEARB\nEARBEPQU8RIUBEEQBEEQBEFPES9BQRAEQRAEQRD0FPESFARBEARBEARBTxEvQUEQBEEQBEEQ9BTx\nEhQEQRAEQRAEQU8RL0FBEARBEARBEPQU8RIUBEEQBEEQBEFPES9BQRAEQRAEQRD0FPESFARBEARB\nEARBTxEvQUEQBEEQBEEQ9BTxEhQEQRAEQRAEQU/xppE+gRJveMMbZuv773rXu9LnNddcU5K0zTbb\npG3zzDOPJOn444+XJD3zzDOp7Omnn5YkfeADH5AkveMd70hlK6ywgiTpi1/8oiTpuOOOS2WXXHLJ\nbJ1zif/85z8D/s7s1l2Jr3zlK+nzzjvvLEl65JFHJElvfetbUxnn+/e//12S9J73vCeVsY1789vf\n/jaV7bDDDkN+zt1Sd296U9XFDj30UEnSAw88IEm66qqrUtmf/vSnmR5jueWWkyTtvffekqTTTjst\nld11111Dd7L/n26puxJHHXWUpKouJOmd73ynJOnd7363JOkPf/hDKltttdUkSffee++wnN9A664T\n9bbAAgukz4cddpikqo7e//73p7J//etfkqR//OMftf99G/311VdfTWW77rrrkJ9zN7e5bmck6u5t\nb3tb+rziiitKkpZccsm07eqrr5Ykvfzyy7P1Ox/60IfSZ8bBGTNmSJJefPHFPvv7dfWnXqLdDZ5u\nrDvayPTp04fsmMsuu6wk6cEHH+xTxvV4XeTXWKqnbqy7tjCYumsilKAgCIIgCIIgCHqKN/xnqF+r\nhoDBvvFedNFFkqRFFlkkbUOBePbZZ9O2D37wg5Kkf//735KkP/7xj6mMbfx1xcItrFLdGgavvPKK\nJOnjH/942vbXv/51oJciqXusBb///e/TZ5QxfueNb3xjn/2xxGOZl6o65nuu1nHMv/zlL0N2ziNR\ndzvuuGP6vP3220uS5pprrrRt3nnnlVRd7z//+c9UhjpZqs+XXnpJUqUW/fnPf05lfD788MMlSVdc\nccVsXYM08u0O9czrh7pFfX3hhRdS2UorrSRJ2nzzzSVJZ555Zip7/vnnJUlbbLFF7X8/56EcAjut\nBGGV/OpXvyqpajeSNP/880uqW+RzvE5pa03ngCL05je/uU8Z6vfUqVPTtmOPPVaS9Lvf/a7hKvoy\n0m2uzQxn3WFp32CDDdI21J511lknbVt88cUlSb/+9a8lSXPPPXcq+9a3viWpmk99zGNOxcOA40jV\nvL3YYotJkr70pS+lsjvuuKPPuZbGkZxod4NnJOruv/6rstvzjOZq4Sc+8Yna7xx55JEDOv4aa6wh\nSVp99dXTtoUXXliSdM4550iSpkyZkspou66ihxLUWUIJCoIgCIIgCIIgmA3iJSgIgiAIgiAIgp5i\nVLjDEfw7btw4SdKjjz6aypDE3aWLYGmkVQLVpUqOR2p1KX2++eaTVHbbwgUMafa1115LZXvttVft\nmP2lWyRTPw9cH6gX3GWkyoWB63Q3B7bhGugui+uuu64k6ZZbbunIOfeXwdbdGWecIUlaa6210jbc\n1NwVEtdMzs1djGinnIPL63/7299qZf49XOtwPcQlVJIOOOCAQV1Pt7Q757LLLpNUudx4IgncwDhv\nd33FBZGkFO4eUXJlmF064Q533nnnpc8keCm5p9HHXn/99bSN/kl/9d/jukttjrrhetz19+1vf3vt\nr4MbHG5QUjUu+3nldGObawtDXXfMiz5f4XK64YYbSpKefPLJVMZ99bng6KOPliSdeOKJkqQPf/jD\nqYyEOXfeeackadVVV01lJ5xwgiRpiSWWkCQttdRSfc7ra1/7miRps802S2UEwt9zzz0zva4S0e4G\nz3DUXX9clnF1lir387XXXluS9Pjjj6cykjldfPHFfY5BW8Lt2hPp8OzIMx5zkVTuK/0552h3gyfc\n4YIgCIIgCIIgCGaD1ipBpLCWpCuvvFKSdNNNN0mqp21+3/veN9NjYKH0oEos9295y1skVUGYUl9L\n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\n93eDTi31dS22p0u0vNifvvVH3e8gES0+XYtMjDuz6J/F3qBYURyTcYx0rGT6HAAAIABJREFUi1JG\nK17XAhTTPJ900kkA7LnnnkB7TGrpiparQfIERUtUt69rFiy31drs61gEb1DQCgplnGhdjHPMa9+r\nwGFscy5244bittp4dB9+J1r3aqnz11xzTaDEtfQLo00P2y0OC/ChD30IKCljb7311qZNC6dxojHm\nxX7U2r3YYos1bVpULSYKcOmllwLtYoyjOebZwfON48E4J88perhvuukmoD239Aq97nWvA9rptrXu\nmt7Z30MpQH7nnXcC8NrXvrZpO/300wFYbbXVAHj44YebNj1x8T48lbGmXW9PnGe1danL2muv3Xze\ndtttgeIZifdKYxq1tse13fPtxp5CmZdvfetbAdhjjz2aNlULMdW0njU9TYssskjTFj1TE4nemBhb\nq1fLWJIYg+d5xrHY7f/YB6NR/ngM8bt6lXw2jPPC8Ra9V8ZfmbZ9olQvkzHfax5+efe73918dt2y\n/2OcnSUc7IPoCfIe073XxL8Xr7drp16+6NldcsklR39iYyA9QUmSJEmSJEmSDBX5EpQkSZIkSZIk\nyVAxx8vhDLCqVVM3RWKUMSkh0lUXA/FMqKAcLrrqYhApDG5a4hoxOLUrj4nVgbuYnhyKW9v+vf/+\n+yf8OKeCGATeTUoQJR+m7YxjxO/bd9EVHcfLzNqUPsUx+d3vfheA3XbbDWiPc2WeMSnIIFELeJVe\ncrjafLPvx5t2ezqJEkwDR6MkQ2qym+64im0GsioBqUkV/DfKXx1jyh6idMTjituilKafqI2hmjyk\nJkNR7mqimCjpsGK88q0o4XEdVD634YYbNm1Kv2LymXvuuQdoS5Vqxz+RmDwkBsOffPLJQJGdKfWB\nEhweU6XvuOOOQOmD97znPU2bAeOvfOUrgfb49l6j5O3iiy9u2uwfJb1xLV5xxRUBOPLII5ttynRM\nHT1RdOcU9B4r4nyLiSC81lHy6pqujDKmFbbPfAaJY2vppZcGytiKzyTKtpyfUbLk72Iq92764ii7\nVe410TiHaumpHWPxnHqls+4mYorfq61RygW9X8c0z15Tjy+uhX7PlM5xX0oV+zkJVG28mup+6623\nbrb5rKxcNc49z91+jX3uOPI50fUPSl/H50vnlveY+DwTn3smkvQEJUmSJEmSJEkyVMzxniDfLGPA\n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\nJShJkiRJkiRJkqEiX4KSJEmSJEmSJBkq8iUoSZIkSZIkSZKhIl+CkiRJkiRJkiQZKp403QdQ4wlP\neMKYvv/kJz8ZgH/+85+j+v6LX/xiAPbbbz8A/vSnPzVtV155JQBPfOITAXjqU5/atC288MIALLbY\nYgBcd911TdsxxxwzpmP2HP/73//O9Du92ma134lkgQUWaD5/9KMfBeCSSy4B2n2+6667ArDxxhsD\ncP755zdtm2++OQBLL700AL/73e+ath//+McTfsyT1XfxO92/scEGGzSfHZOrr756s23ZZZcF4OGH\nHwbgiiuuaNp+9atfAfDHP/4RgBe84AVN2/zzzw/AeuutB7Svx5e//GUA/vOf/wBw3nnnzfT4Rku/\njDvPG+CII44A4O9//zsAb37zm8e0r2984xsAXH/99c22L33pS7N7iCMYa99NRr/VeNrTngbA2Wef\n3WxbZJFFAPjFL34BwPOf//ym7ZnPfCYAF198MQA77rjjpB5fv4y5QWQ6+q7XOgiw7bbbAuX++cgj\njzRt//M//2d7nXfeeQH49a9/3bStueaaQFk/Tz/99Kbt5ptvnq1jrpHjbvxk342f7LvxM97nmpmR\nnqAkSZIkSZIkSYaKJ/x3ol+rJoDRvPHqqQH497//3WrTigmwySabALDDDjuM2Mdvf/tbAJ797Gc3\n2/76178C8Oc//xmApzzlKU3b05/+dAD+9a9/AfCsZz2radPDcc455wBti/ztt98OwM9+9rMRx9DL\nI9Qv1oL111+/+fyyl70MgGOPPRaAddddt2nTOv+kJ/2fg/HMM89s2k4++WQA5p57bqBYAwEeeuih\nCT/mie47x1t3rAF88IMfBGCuueZqtt19990A3HPPPc22tddeG4BDDjkEaFtH//CHPwDwt7/9DYD5\n5puvadPLo8X+uOOOa9ocw4suuuiI47vqqquAtsdyNPTLuFtnnXWazwcddBBQ5l70Huq9ffnLXw60\n+3z55ZcHYJlllgHaVucNN9xwwo95Oj1BvdaSCy64AChjEMqYdsxpfY+4HmqhB3jggQcm6IgL/TLm\nBpF+7LtLL70UgMceewyAl770pU2b6oH//d//Bdrr5k9/+tPWfq6++urm82c+85kJP85+7LtBIftu\n/GTfjZ/0BCVJkiRJkiRJkswG+RKUJEmSJEmSJMlQMXByuFoSBBMW7LvvvgA873nPa9oMCDbwHOA3\n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\n/Re+8IWSpK9+9avDPbGKUew72H///SVJ//Zv/9ZtO+mkk5a5/yabbCJJetKTniRJOvXUUxfw7Obe\ndwvRb4xbqT92pTJupTLe7rvvPknS7//+73dtxx13nCTpxz/+sSTpQQ8qS8V///d/D/mMR1vmRp0V\n0Xf1/q3fbB2T/d73vvd129Zcc01J0m9/+1tJ0sorr9y1HXzwwZKku+66S1JZh/34//u//7vM35kr\nkbv5k76bP+m7+TPfsb4sYgkKIYQQQgghTBUP+N2wX6uGwPK+8S5durT7/O53v1uStPPOO3fb7r33\nXknSQx7yEEnSE5/4xK7t3//933ttDhrT//qv/5IkrbLKKl3bmWeeKUn667/+a0lFg7o8jKK2AEvQ\ny1/+cknSjTfe2LU97GEPkyQ985nPlCT95Cc/6douuugiSdITnvAESUULKBWt8zBZjL5bf/31u89/\n+Zd/KUl63vOe122rLWuusf/pT38qqWg56UupWDH++Z//ufdXko466ihJ0tFHHy2pbyEBv67Z9Muo\nyB2WM0l61ateJUn64z/+Y0l97TF9teuuu0rqWzvQJN9zzz2SyviWpGOOOUaS9OlPf3po5zwKlqAW\n73znO3t/JekXv/iFpCKHj3rUo7o2LGb77LPPCjm/UZG5cWTYfceYaVlc+J5bBlkPW6y66qqSpKuv\nvrrbhtwxFtdaa62u7YQTTpAkHXjggfd7fm4l4lxb5zyIyN38Sd/Nn/Td/IklKIQQQgghhBCWg7wE\nhRBCCCGEEKaKiXKHO/fccyVJT3nKU7ptBPH+0z/9U7etvmQ37eMawjl4EDCmdr7v7kx/8id/IqkE\n/F922WVdm7vizYXFNplyLD+P17/+9ZKkW265RZJ05513dm3bb7+9pOJW8+tf/7prwwWRbe6CiOvg\ntddeO7RzX5F995a3vEVS39UIuXHXtX/913+VVGTl0Y9+dNdWu5S4O+Yvf/lLSdI//uM/9r4vSX/0\nR3/U+50///M/79pOOeWUeV3PYssdbqa4mErl2nGHW2211bq2hz70oZKkE088UVJxx5SkRzziEZLK\neHQ3Q763++67S+rL8nwZBXc4Er5IJenIZpttJqntLoms+nyGXF1zzTWSiluxJF1yySW978/V3bLF\nYsvcODPsvmvN+7iesa31mz62GFO4sXob7m/Mf//xH//RteHKetNNN0mSTj/99K7tuuuuG3xRGl/X\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# takes 5-10 seconds to execute this\n", - "show_MNIST(test_lbl, test_img, fashion=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's now see how many times each class appears in the training and testing data:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "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": "iVBORw0KGgoAAAANSUhEUgAAA0EAAACDCAYAAABLNRD7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJztnXd0VVX2x78hpJkQQov00Hs1IAgiIDCRKiLFAoII4iAi\nYxsdVFQcHRWxMDZGRQfxRzMIIkgR1EFBEAVR6U1qkBZCDSHn9wdr37ffeTs3L8lL8mL2Zy1WHree\ns+85596z2wkxxhgoiqIoiqIoiqIUE0oUdgEURVEURVEURVEKEp0EKYqiKIqiKIpSrNBJkKIoiqIo\niqIoxQqdBCmKoiiKoiiKUqzQSZCiKIqiKIqiKMUKnQQpiqIoiqIoilKs0EmQoiiKoiiKoijFCp0E\nKYqiKIqiKIpSrNBJkKIoiqIoiqIoxYo/5SRo8ODBiIuLy/a4jIwMhISE4Nlnny2AUinFkU6dOqFT\np07O//fs2YOQkBB88MEHhVYmRVEKjg8++AAhISHYs2dPjs8dNmwYatSoEfAyFQQhISEYM2ZMtsfl\nRT6KL/SOmTRpUmEXRSkkhg0bhpiYmGyPs79P8kqnTp3QpEmTgF2vICjQSVBISIhf/7766quCLJbf\nLFy4EM8884zrMffffz+aNWsGAFi1ahWeeuopnDp1qiCK51DU5VyY0AuZ/kVGRqJevXoYM2YMUlJS\nCrt4RR5JvpUrV0ZSUhJef/11pKWlFXYRiyQ7d+7EqFGjUKtWLURGRiI2Nhbt27fHa6+9hnPnzuXL\nPT/++GO8+uqr+XLtvLJp0yb0798fCQkJiIyMRJUqVdCtWzdMmTKlsIv2p6Aw5fvcc8/h008/zff7\nuKHtq3Cx3yMhISGIj49H586dsXjx4sIuXq548803ERISgjZt2hR2UYokuR0XSuZDWbJk+vTpXv//\n73//i2XLlvlsb9iwYYGUp2TJkjh37hzCwsL8On7hwoV499138eSTT2Z5zKJFi9C/f38AlydBTz/9\nNEaMGIHY2NiAlNkfgk3ORZFnnnkGNWvWxPnz57Fq1Sq89dZbWLRoEX755RdcccUVhV28Ig/J9+LF\nizh8+DC++uorjBs3DpMnT8aCBQscRYKSPZ9//jkGDBiAiIgI3HHHHWjSpAnS09OxatUqPPzww/j1\n118xderUgN/3448/xi+//IJx48YF/Np54bvvvkPnzp1RvXp1jBw5EhUrVsS+ffuwZs0avPbaa7jv\nvvsKu4hFmkDLd8iQIbjlllsQERHh1/HPPfcc+vfvj759++am+HlG21fwQO8RYwxSUlLwwQcfoEeP\nHvjss8/Qq1evwi5ejpgxYwZq1KiBtWvXYseOHahTp05hF6lIkdtxoUAnQYMHD/b6/5o1a7Bs2TKf\n7QVJZGRktsecOXMG0dHR2R63bds27NixAz179gxE0XJNXuV87tw5REZGIiQkJD+Kl6+cPXs2IJOU\n7t27o1WrVgCAESNGoFy5cpg8eTLmz5+PW2+9Nc/XD1b8bet5hcsXAB577DGsWLECvXr1Qp8+fbB5\n82ZERUUVahmLArt378Ytt9yChIQErFixApUqVXL23XvvvdixYwc+//zzQixhwfPPf/4TpUuXxrp1\n63zcoo8cOVJIpfrzEGj5hoaGIjQ01PUYYwzOnz+f5ZhQkGj7uhxKkJmZifDw8EIth/0eueuuu3Dl\nlVfi//7v/4rUJGj37t347rvvkJycjFGjRmHGjBmYMGFCYRerWFDkYoIuXryICRMmoE6dOoiMjET5\n8uXRoUMHfPnllz7H7tu3D3369EFMTAwqVKiAv//978jMzHT2SzFBjz/+OEJCQrB161YMGjQIcXFx\n6NSpEwYPHox33nkHly5dcsyvJUt6zyE///xzlClTBtdccw0ef/xxPPbYYwCAatWqOefs37/fqcfT\nTz+NWrVqISIiAjVr1sQTTzyB9PR0r2tWrVoVffv2xeLFi9G8eXNERkaicePGAXMH+OKLLxASEoLk\n5GT8/e9/R+XKlREdHY0LFy4AALZv345+/fohLi4OV1xxBdq1a4elS5d6XePtt99GSEgIDh8+LF57\nzZo1zrbNmzejb9++uPLKKxEZGYlq1arh9ttvx5kzZ7zOff/999GyZUtERUWhXLlyGDx4MA4dOuR1\nTNu2bdGqVSusWbMG1157LaKiorJ1V8wt119/PYDLg9VTTz0lThDz4tu+YsUKdOjQAdHR0YiLi8ON\nN96IzZs3O/vnzp2LkJAQfP311z7nvvPOOwgJCcEvv/zibNuyZQv69++PsmXLIjIyEq1atcKCBQvE\n8n799dcYPXo04uPjUbVq1RyXPVBcf/31eOKJJ7B371589NFHADy+zTt37kSPHj1QqlQp3H777c45\n33//PW644QaULl0aV1xxBTp27Ihvv/3W67ppaWkYN24catSogYiICMTHx6Nbt2748ccfnWO2b9+O\nm2++GRUrVkRkZCSqVq2KW265BampqQVT+Vzy4osv4vTp03jvvfe8JkBEnTp1cP/99wO4PN5NnDgR\ntWvXRkREBGrUqIF//OMfTl8n5s+fj549e6Jy5cqIiIhA7dq1MXHiRFy6dMk5plOnTvj888+xd+9e\nZ2wLltiVnTt3onHjxmJcaHx8vPN72rRpuP766xEfH4+IiAg0atQIb731ls85NWrUQK9evbBq1Spc\nffXViIyMRK1atfDf//7X59hff/0V119/PaKiolC1alU8++yzXu8cwh8ZByv+ypf49NNP0aRJE0RE\nRKBx48b44osvvPZL4ybJfMmSJWjVqhWioqKcce7MmTP48MMPnXY3bNiwQFfRFX/rTzFR2dUfAA4c\nOIDhw4fjyiuvdI57//33vY5JT0/Hk08+icTERJQuXRrR0dHo0KEDVq5cmW2ZjTG4++67ER4ejuTk\nZGf7yZMnMW7cOFSrVg0RERGoU6cOXnjhBa82y2OMXn31VWf8+O233/ySV0ESFxeHqKgor2+zSZMm\noV27dihXrhyioqKQmJiIuXPn+px77tw5jB07FuXLl0epUqXQp08fHDhwACEhIXjqqafytdwzZsxA\nmTJl0LNnT/Tv3x8zZszwOYY/h6lTpzrPoXXr1li3bl2299iwYQMqVKiATp064fTp01ked+HCBecb\nOyIiAtWqVcMjjzzi855wY/369WjXrh2ioqJQs2ZNvP322z7HHDlyxJm0RkZGonnz5vjwww99jjtz\n5gwefPBBp43Wr18fkyZNgjHGOSYv40KBWoICweOPP46XXnoJd999N1q1aoXU1FSsW7cOP/30E7p0\n6eIcd/HiRfzlL3/Btddei0mTJmHp0qV48cUXUadOHYwcOTLb+/Tr1w/169fHv/71LwBAs2bNcOjQ\nIXz11VfOgypRwnsOuWjRIiQlJSE0NBQDBgzAjh07MGvWLLz++usoU6YMAKBs2bIAgDvvvBMzZszA\nwIED8eCDD2LNmjV49tlnsWXLFsyZM8frulu2bMFtt92Gv/71rxg2bBjee+899O/fH0uXLnU+zvPK\nE088gSuuuAKPPPIIzpw5g9DQUOzfvx/t2rVDRkYGxo4di7i4OLz//vvo0aMHFixYgB49euToHufO\nncNf/vIXAMC4ceMQHx+Pffv2YcGCBTh9+rSj3X/iiSfw3HPP4dZbb8WoUaNw+PBhvP766/j+++/x\n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\nj8cbb7zhsy85ORnz5s3D22+/nasJaEhICGbMmIEbb7wRAwYMyNIiyKlduzY2btyILl265LqfHTx4\n0GcZC/t7NSEhAT///DMyMzO9FJz2t2VCQgKWL1+OtLQ0L2uQfRzVNzcEZUxQSEgIunbt6vWPPq6P\nHTvmdWypUqVQu3btHKXvyy3R0dG4dOmST3rBRYsWoXLlymjZsqXP8cDlj2UOZVWzs6/Q7NueTP3+\n++9evsYnT57E9OnT0apVq4C4wmVFjx498L///c/Ld5Yy1NSvX9/R1tMHKfchvnjxIv7zn/94XS81\nNdXHWtK8eXMAcJ5f//79ERISgqefftqnPOQHXdhI9aX0jDmlUqVKaNGiBT788EOvdvLLL79g6dKl\nPhn4unbtirJly2LWrFmYNWsWrr76ai8Tfnx8PDp16oR33nlHfBn/8ccfOS5jQbFixQpMnDgRNWvW\nFOMoOImJiahduzYmTZokpvukel66dMnHvSg+Ph6VK1d22typU6ecFyfRtGlTlChRokDGlbzwyCOP\nIDo6GiNGjEBKSorP/p07d+K1117ze8whLSPXKqanp+PNN9/0uXZ0dHRQum6tXLlStDSQdbl+/fpi\nPVNTU30+jnJCjx49sGbNGqxdu9bZ9scff/iku82JjIMRf+Sbn0RHR/u8UwuSQNY/NDQUN998Mz75\n5BPRosvHa6ndfP/991i9enWW1+/atStmzpyJL774AkOGDPGyMg4cOBCrV6/GkiVLfM47efKkz5hY\nFLh48SKWLl2K8PBwNGzYEKGhoQgJCfH67tizZ49PljNSutl9cMqUKflW1nPnziE5ORm9evVC//79\nff6NGTMGaWlpPnFmOYFSordu3Rq9e/f2GpskBg4ciAMHDvh8u1F5/ckem5GRgXfeecf5f3p6Ot55\n5x1UqFABiYmJAC6PlYcPH8asWbO8zpsyZQpiYmKcDLg9evTApUuX8O9//9vrHq+88gpCQkK8lJi5\nHReC0hLkRr169dCtWzckJiaiTJkyWLt2LT799NMCWbWcHuB9992Hrl27IiwsDAMHDsTnn38upoum\n4//xj39gwIABCAsLw4033ojExETcfvvtePPNN3H8+HF06NABa9aswfTp09G/f3+vAFzg8qA6dOhQ\njB49GuXLl8d7772Ho0ePirnkA8n48eMxd+5cdO3aFWPHjkVsbCymTZuGgwcP4rPPPvOqZ8uWLfHQ\n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\noiiKoihKfqGWIEVRFEVRFEVRihU6CVIURVEURVEUpVihkyBFURRFURRFUYoVOglSFEVRFEVRFKVY\noZMgRVEURVEURVGKFToJUhRFURRFURSlWKGTIEVRFEVRFEVRihU6CVIURVEURVEUpVihkyBFURRF\nURRFUYoVOglSFEVRFEVRFKVYoZMgRVEURVEURVGKFToJUhRFURRFURSlWKGTIEVRFEVRFEVRihU6\nCVIURVEURVEUpVihkyBFURRFURRFUYoVOglSFEVRFEVRFKVYoZMgRVEURVEURVGKFToJUhRFURRF\nURSlWKGTIEVRFEVRFEVRihU6CVIURVEURVEUpVihkyBFURRFURRFUYoVOglSFEVRFEVRFKVYoZMg\nRVEURVEURVGKFToJUhRFURRFURSlWKGTIEVRFEVRFEVRihU6CVIURVEURVEUpVihkyBFURRFURRF\nUYoVOglSFEVRFEVRFKVYoZMgRVEURVEURVGKFToJUhRFURRFURSlWKGTIEVRFEVRFEVRihU6CVIU\nRVEURVEUpVihkyBFURRFURRFUYoV/w8ZNAMQwMn7dwAAAABJRU5ErkJggg==\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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\nF08//TQSExMRExODGTNm+Lhtly5dipEjR6Jr166oWLEirl69iv/85z8IDw9H586dAdyI9XzppZfw\n8ssvY/cP6aF0AAAgAElEQVTu3ejQoQOioqKwd+9ezJs3D3/9618xbNiwTK33zbj33ntRunRp9O/f\nH8888wxCQ0Px8ccfo3Dhwjh48GCazzdu3Di0adMGjRo1Qv/+/R2J7Hz58vmsT5AnTx507twZs2bN\nwsWLFzF+/Hif802aNAl33XUXatasiYEDB6JcuXJITEzEunXrcPjwYWzdujW9VQ8YS5cuxfbt25Gc\nnIzExESsXr0aK1euRFxcHBYuXHjTRYxz5cqFDz/8EG3atEH16tXRt29flChRAkeOHMGaNWsQExOD\nL7/8EufPn0fJkiXRpUsX1K5dG9HR0Vi1ahU2bdqEN998E8CNj69hw4aha9euqFSpEpKTkzF9+nTn\nBSWYKV++PGbOnInu3bujatWqePTRR1GjRg0kJSXh+++/d2RHn3jiCfTu3RtTpkxxwrE2btyIadOm\noVOnTk5SbuPGjVGgQAH07t0bw4cPR0hICKZPny6+9MXHx2P27Nl48sknUb9+fURHR6NDhw5Z3QQ+\nPP7447h06RIeeOABVKlSxWmL2bNno0yZMujbty8SExMRFhaGDh06YPDgwbhw4QL+/e9/IzY2Nt2e\njJEjR2L69Om477778MQTTzgS2WT1JNLSxsGIP+2bmcTHx2PVqlWYMGECihcvjrJly4q5WJlFoOv/\nz3/+E2vWrEGDBg0wcOBAVKtWDadOncKPP/6IVatWOYa/9u3bY968eXjggQfQrl077Nu3D++//z6q\nVavmuu5Lp06dMHXqVDz66KOIiYlxXlCfeeYZLFy4EO3bt3fk3i9evIhffvkFc+fODVi+cWZCzxHg\nRr7KzJkzsWvXLjz77LOIiYlBu3btMGHCBNx33314+OGHcfz4cUyaNAkVKlTwGpPx8fF48MEH8fbb\nb+PkyZOORDZ5MDLD+7hw4UKcP3/eS/SK07BhQxQuXBgzZszwivZIK5GRkVi0aBHuuecetGnTBt98\n802q0u69evXCnDlz8Nhjj2HNmjVo0qQJrl+/ju3bt2POnDnOul1uFC9eHG+88Qb279+PSpUqYfbs\n2diyZQumTJniSHgPGjQIH3zwAfr06YPNmzejTJkymDt3Lr777ju8/fbbjtenQ4cOaNGiBZ5//nns\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Average of all images in training dataset.\")\n", - "show_ave_MNIST(train_lbl, train_img, fashion=True)\n", - "\n", - "print(\"Average of all images in testing dataset.\")\n", - "show_ave_MNIST(test_lbl, test_img, fashion=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "Unlike Digits, in Fashion all items appear the same number of times." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Testing\n", - "\n", - "We will now begin testing our algorithms on Fashion.\n", - "\n", - "First, we need to convert the dataset into the `learning`-compatible `Dataset` class:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "temp_train_lbl = train_lbl.reshape((60000,1))\n", - "training_examples = np.hstack((train_img, temp_train_lbl))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# takes ~10 seconds to execute this\n", - "MNIST_DataSet = DataSet(examples=training_examples, distance=manhattan_distance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### K-Nearest Neighbors\n", - "\n", - "With the dataset in hand, we will first test how the kNN algorithm performs:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "# takes ~20 Secs. to execute this\n", - "kNN = NearestNeighborLearner(MNIST_DataSet, k=3)\n", - "print(kNN(test_img[211]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output is 1, which means the item at index 211 is a trouser. Let's see if the prediction is correct:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Actual class of test image: 1\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\nRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "\n", - "print(\"Actual class of test image:\", test_lbl[211])\n", - "plt.imshow(test_img[211].reshape((28,28)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Indeed, the item was a trouser! The algorithm classified the item correctly." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/logic.ipynb b/logic.ipynb deleted file mode 100644 index fb42df7aa..000000000 --- a/logic.ipynb +++ /dev/null @@ -1,1450 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Logic: `logic.py`; Chapters 6-8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook describes the [logic.py](https://github.com/aimacode/aima-python/blob/master/logic.py) module, which covers Chapters 6 (Logical Agents), 7 (First-Order Logic) and 8 (Inference in First-Order Logic) of *[Artificial Intelligence: A Modern Approach](http://aima.cs.berkeley.edu)*. See the [intro notebook](https://github.com/aimacode/aima-python/blob/master/intro.ipynb) for instructions.\n", - "\n", - "We'll start by looking at `Expr`, the data type for logical sentences, and the convenience function `expr`. We'll be covering two types of knowledge bases, `PropKB` - Propositional logic knowledge base and `FolKB` - First order logic knowledge base. We will construct a propositional knowledge base of a specific situation in the Wumpus World. We will next go through the `tt_entails` function and experiment with it a bit. The `pl_resolution` and `pl_fc_entails` functions will come next. We'll study forward chaining and backward chaining algorithms for `FolKB` and use them on `crime_kb` knowledge base.\n", - "\n", - "But the first step is to load the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from utils import *\n", - "from logic import *" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Logical Sentences" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Expr` class is designed to represent any kind of mathematical expression. The simplest type of `Expr` is a symbol, which can be defined with the function `Symbol`:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Symbol('x')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can define multiple symbols at the same time with the function `symbols`:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "(x, y, P, Q, f) = symbols('x, y, P, Q, f')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can combine `Expr`s with the regular Python infix and prefix operators. Here's how we would form the logical sentence \"P and not Q\":" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P & ~Q)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P & ~Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This works because the `Expr` class overloads the `&` operator with this definition:\n", - "\n", - "```python\n", - "def __and__(self, other): return Expr('&', self, other)```\n", - " \n", - "and does similar overloads for the other operators. An `Expr` has two fields: `op` for the operator, which is always a string, and `args` for the arguments, which is a tuple of 0 or more expressions. By \"expression,\" I mean either an instance of `Expr`, or a number. Let's take a look at the fields for some `Expr` examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'&'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sentence = P & ~Q\n", - "\n", - "sentence.op" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P, ~Q)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sentence.args" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'P'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P.op" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "()" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P.args" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'P'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Pxy = P(x, y)\n", - "\n", - "Pxy.op" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(x, y)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Pxy.args" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is important to note that the `Expr` class does not define the *logic* of Propositional Logic sentences; it just gives you a way to *represent* expressions. Think of an `Expr` as an [abstract syntax tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree). Each of the `args` in an `Expr` can be either a symbol, a number, or a nested `Expr`. We can nest these trees to any depth. Here is a deply nested `Expr`:" - ] - }, - { - "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" - } - ], - "source": [ - "3 * f(x, y) + P(y) / 2 + 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Operators for Constructing Logical Sentences\n", - "\n", - "Here is a table of the operators that can be used to form sentences. Note that we have a problem: we want to use Python operators to make sentences, so that our programs (and our interactive sessions like the one here) will show simple code. But Python does not allow implication arrows as operators, so for now we have to use a more verbose notation that Python does allow: `|'==>'|` instead of just `==>`. Alternately, you can always use the more verbose `Expr` constructor forms:\n", - "\n", - "| Operation | Book | Python Infix Input | Python Output | Python `Expr` Input\n", - "|--------------------------|----------------------|-------------------------|---|---|\n", - "| Negation | ¬ P | `~P` | `~P` | `Expr('~', P)`\n", - "| And | P ∧ Q | `P & Q` | `P & Q` | `Expr('&', P, Q)`\n", - "| Or | P ∨ Q | `P` | `Q`| `P` | `Q` | `Expr('`|`', P, Q)`\n", - "| Inequality (Xor) | P ≠ Q | `P ^ Q` | `P ^ Q` | `Expr('^', P, Q)`\n", - "| Implication | P → Q | `P` |`'==>'`| `Q` | `P ==> Q` | `Expr('==>', P, Q)`\n", - "| Reverse Implication | Q ← P | `Q` |`'<=='`| `P` |`Q <== P` | `Expr('<==', Q, P)`\n", - "| Equivalence | P ↔ Q | `P` |`'<=>'`| `Q` |`P <=> Q` | `Expr('<=>', P, Q)`\n", - "\n", - "Here's an example of defining a sentence with an implication arrow:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "~(P & Q) |'==>'| (~P | ~Q)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## `expr`: a Shortcut for Constructing Sentences\n", - "\n", - "If the `|'==>'|` notation looks ugly to you, you can use the function `expr` instead:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr('~(P & Q) ==> (~P | ~Q)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`expr` takes a string as input, and parses it into an `Expr`. The string can contain arrow operators: `==>`, `<==`, or `<=>`, which are handled as if they were regular Python infix operators. And `expr` automatically defines any symbols, so you don't need to pre-define them:" - ] - }, - { - "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" - } - ], - "source": [ - "expr('sqrt(b ** 2 - 4 * a * c)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For now that's all you need to know about `expr`. If you are interested, we explain the messy details of how `expr` is implemented and how `|'==>'|` is handled in the appendix." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Propositional Knowledge Bases: `PropKB`\n", - "\n", - "The class `PropKB` can be used to represent a knowledge base of propositional logic sentences.\n", - "\n", - "We see that the class `KB` has four methods, apart from `__init__`. A point to note here: the `ask` method simply calls the `ask_generator` method. Thus, this one has already been implemented, and what you'll have to actually implement when you create your own knowledge base class (though you'll probably never need to, considering the ones we've created for you) will be the `ask_generator` function and not the `ask` function itself.\n", - "\n", - "The class `PropKB` now.\n", - "* `__init__(self, sentence=None)` : The constructor `__init__` creates a single field `clauses` which will be a list of all the sentences of the knowledge base. Note that each one of these sentences will be a 'clause' i.e. a sentence which is made up of only literals and `or`s.\n", - "* `tell(self, sentence)` : When you want to add a sentence to the KB, you use the `tell` method. This method takes a sentence, converts it to its CNF, extracts all the clauses, and adds all these clauses to the `clauses` field. So, you need not worry about `tell`ing only clauses to the knowledge base. You can `tell` the knowledge base a sentence in any form that you wish; converting it to CNF and adding the resulting clauses will be handled by the `tell` method.\n", - "* `ask_generator(self, query)` : The `ask_generator` function is used by the `ask` function. It calls the `tt_entails` function, which in turn returns `True` if the knowledge base entails query and `False` otherwise. The `ask_generator` itself returns an empty dict `{}` if the knowledge base entails query and `None` otherwise. This might seem a little bit weird to you. After all, it makes more sense just to return a `True` or a `False` instead of the `{}` or `None` But this is done to maintain consistency with the way things are in First-Order Logic, where an `ask_generator` function is supposed to return all the substitutions that make the query true. Hence the dict, to return all these substitutions. I will be mostly be using the `ask` function which returns a `{}` or a `False`, but if you don't like this, you can always use the `ask_if_true` function which returns a `True` or a `False`.\n", - "* `retract(self, sentence)` : This function removes all the clauses of the sentence given, from the knowledge base. Like the `tell` function, you don't have to pass clauses to remove them from the knowledge base; any sentence will do fine. The function will take care of converting that sentence to clauses and then remove those." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Wumpus World KB\n", - "Let us create a `PropKB` for the wumpus world with the sentences mentioned in `section 7.4.3`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "wumpus_kb = PropKB()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define the symbols we use in our clauses.
    \n", - "$P_{x, y}$ is true if there is a pit in `[x, y]`.
    \n", - "$B_{x, y}$ is true if the agent senses breeze in `[x, y]`.
    " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "P11, P12, P21, P22, P31, B11, B21 = expr('P11, P12, P21, P22, P31, B11, B21')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we tell sentences based on `section 7.4.3`.
    \n", - "There is no pit in `[1,1]`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "wumpus_kb.tell(~P11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A square is breezy if and only if there is a pit in a neighboring square. This has to be stated for each square but for now, we include just the relevant squares." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "wumpus_kb.tell(B11 | '<=>' | ((P12 | P21)))\n", - "wumpus_kb.tell(B21 | '<=>' | ((P11 | P22 | P31)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we include the breeze percepts for the first two squares leading up to the situation in `Figure 7.3(b)`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "wumpus_kb.tell(~B11)\n", - "wumpus_kb.tell(B21)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check the clauses stored in a `KB` by accessing its `clauses` variable" - ] - }, - { - "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" - } - ], - "source": [ - "wumpus_kb.clauses" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that the equivalence $B_{1, 1} \\iff (P_{1, 2} \\lor P_{2, 1})$ was automatically converted to two implications which were inturn converted to CNF which is stored in the `KB`.
    \n", - "$B_{1, 1} \\iff (P_{1, 2} \\lor P_{2, 1})$ was split into $B_{1, 1} \\implies (P_{1, 2} \\lor P_{2, 1})$ and $B_{1, 1} \\Longleftarrow (P_{1, 2} \\lor P_{2, 1})$.
    \n", - "$B_{1, 1} \\implies (P_{1, 2} \\lor P_{2, 1})$ was converted to $P_{1, 2} \\lor P_{2, 1} \\lor \\neg B_{1, 1}$.
    \n", - "$B_{1, 1} \\Longleftarrow (P_{1, 2} \\lor P_{2, 1})$ was converted to $\\neg (P_{1, 2} \\lor P_{2, 1}) \\lor B_{1, 1}$ which becomes $(\\neg P_{1, 2} \\lor B_{1, 1}) \\land (\\neg P_{2, 1} \\lor B_{1, 1})$ after applying De Morgan's laws and distributing the disjunction.
    \n", - "$B_{2, 1} \\iff (P_{1, 1} \\lor P_{2, 2} \\lor P_{3, 2})$ is converted in similar manner." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inference in Propositional Knowledge Base\n", - "In this section we will look at two algorithms to check if a sentence is entailed by the `KB`. Our goal is to decide whether $\\text{KB} \\vDash \\alpha$ for some sentence $\\alpha$.\n", - "### Truth Table Enumeration\n", - "It is a model-checking approach which, as the name suggests, enumerates all possible models in which the `KB` is true and checks if $\\alpha$ is also true in these models. We list the $n$ symbols in the `KB` and enumerate the $2^{n}$ models in a depth-first manner and check the truth of `KB` and $\\alpha$." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource tt_check_all" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that `tt_entails()` takes an `Expr` which is a conjunction of clauses as the input instead of the `KB` itself. You can use the `ask_if_true()` method of `PropKB` which does all the required conversions. Let's check what `wumpus_kb` tells us about $P_{1, 1}$." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(True, False)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wumpus_kb.ask_if_true(~P11), wumpus_kb.ask_if_true(P11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looking at Figure 7.9 we see that in all models in which the knowledge base is `True`, $P_{1, 1}$ is `False`. It makes sense that `ask_if_true()` returns `True` for $\\alpha = \\neg P_{1, 1}$ and `False` for $\\alpha = P_{1, 1}$. This begs the question, what if $\\alpha$ is `True` in only a portion of all models. Do we return `True` or `False`? This doesn't rule out the possibility of $\\alpha$ being `True` but it is not entailed by the `KB` so we return `False` in such cases. We can see this is the case for $P_{2, 2}$ and $P_{3, 1}$." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(False, False)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wumpus_kb.ask_if_true(~P22), wumpus_kb.ask_if_true(P22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Proof by Resolution\n", - "Recall that our goal is to check whether $\\text{KB} \\vDash \\alpha$ i.e. is $\\text{KB} \\implies \\alpha$ true in every model. Suppose we wanted to check if $P \\implies Q$ is valid. We check the satisfiability of $\\neg (P \\implies Q)$, which can be rewritten as $P \\land \\neg Q$. If $P \\land \\neg Q$ is unsatisfiable, then $P \\implies Q$ must be true in all models. This gives us the result \"$\\text{KB} \\vDash \\alpha$ if and only if $\\text{KB} \\land \\neg \\alpha$ is unsatisfiable\".
    \n", - "This technique corresponds to proof by contradiction, a standard mathematical proof technique. We assume $\\alpha$ to be false and show that this leads to a contradiction with known axioms in $\\text{KB}$. We obtain a contradiction by making valid inferences using inference rules. In this proof we use a single inference rule, resolution which states $(l_1 \\lor \\dots \\lor l_k) \\land (m_1 \\lor \\dots \\lor m_n) \\land (l_i \\iff \\neg m_j) \\implies l_1 \\lor \\dots \\lor l_{i - 1} \\lor l_{i + 1} \\lor \\dots \\lor l_k \\lor m_1 \\lor \\dots \\lor m_{j - 1} \\lor m_{j + 1} \\lor \\dots \\lor m_n$. Applying the resolution yeilds us a clause which we add to the KB. We keep doing this until:\n", - "\n", - "* There are no new clauses that can be added, in which case $\\text{KB} \\nvDash \\alpha$.\n", - "* Two clauses resolve to yield the empty clause, in which case $\\text{KB} \\vDash \\alpha$.\n", - "\n", - "The empty clause is equivalent to False because it arises only from resolving two complementary\n", - "unit clauses such as $P$ and $\\neg P$ which is a contradiction as both $P$ and $\\neg P$ can't be True at the same time." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource pl_resolution" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(True, False)" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pl_resolution(wumpus_kb, ~P11), pl_resolution(wumpus_kb, P11)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(False, False)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pl_resolution(wumpus_kb, ~P22), pl_resolution(wumpus_kb, P22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## First-Order Logic Knowledge Bases: `FolKB`\n", - "\n", - "The class `FolKB` can be used to represent a knowledge base of First-order logic sentences. You would initialize and use it the same way as you would for `PropKB` except that the clauses are first-order definite clauses. We will see how to write such clauses to create a database and query them in the following sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Criminal KB\n", - "In this section we create a `FolKB` based on the following paragraph.
    \n", - "The law says that it is a crime for an American to sell weapons to hostile nations. The country Nono, an enemy of America, has some missiles, and all of its missiles were sold to it by Colonel West, who is American.
    \n", - "The first step is to extract the facts and convert them into first-order definite clauses. Extracting the facts from data alone is a challenging task. Fortunately, we have a small paragraph and can do extraction and conversion manually. We'll store the clauses in list aptly named `clauses`." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "“... it is a crime for an American to sell weapons to hostile nations”
    \n", - "The keywords to look for here are 'crime', 'American', 'sell', 'weapon' and 'hostile'. We use predicate symbols to make meaning of them.\n", - "\n", - "* `Criminal(x)`: `x` is a criminal\n", - "* `American(x)`: `x` is an American\n", - "* `Sells(x ,y, z)`: `x` sells `y` to `z`\n", - "* `Weapon(x)`: `x` is a weapon\n", - "* `Hostile(x)`: `x` is a hostile nation\n", - "\n", - "Let us now combine them with appropriate variable naming to depict the meaning of the sentence. The criminal `x` is also the American `x` who sells weapon `y` to `z`, which is a hostile nation.\n", - "\n", - "$\\text{American}(x) \\land \\text{Weapon}(y) \\land \\text{Sells}(x, y, z) \\land \\text{Hostile}(z) \\implies \\text{Criminal} (x)$" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"(American(x) & Weapon(y) & Sells(x, y, z) & Hostile(z)) ==> Criminal(x)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"The country Nono, an enemy of America\"
    \n", - "We now know that Nono is an enemy of America. We represent these nations using the constant symbols `Nono` and `America`. the enemy relation is show using the predicate symbol `Enemy`.\n", - "\n", - "$\\text{Enemy}(\\text{Nono}, \\text{America})$" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"Enemy(Nono, America)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Nono ... has some missiles\"
    \n", - "This states the existance of some missile which is owned by Nono. $\\exists x \\text{Owns}(\\text{Nono}, x) \\land \\text{Missile}(x)$. We invoke existential instantiation to introduce a new constant `M1` which is the missile owned by Nono.\n", - "\n", - "$\\text{Owns}(\\text{Nono}, \\text{M1}), \\text{Missile}(\\text{M1})$" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"Owns(Nono, M1)\"))\n", - "clauses.append(expr(\"Missile(M1)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "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", - "\n", - "$\\text{Missile}(x) \\land \\text{Owns}(\\text{Nono}, x) \\implies \\text{Sells}(\\text{West}, x, \\text{Nono})$" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"(Missile(x) & Owns(Nono, x)) ==> Sells(West, x, Nono)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"West, who is American\"
    \n", - "West is an American.\n", - "\n", - "$\\text{American}(\\text{West})$" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"American(West)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also know, from our understanding of language, that missiles are weapons and that an enemy of America counts as “hostile”.\n", - "\n", - "$\\text{Missile}(x) \\implies \\text{Weapon}(x), \\text{Enemy}(x, \\text{America}) \\implies \\text{Hostile}(x)$" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "clauses.append(expr(\"Missile(x) ==> Weapon(x)\"))\n", - "clauses.append(expr(\"Enemy(x, America) ==> Hostile(x)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have converted the information into first-order definite clauses we can create our first-order logic knowledge base." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "crime_kb = FolKB(clauses)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inference in First-Order Logic\n", - "In this section we look at a forward chaining and a backward chaining algorithm for `FolKB`. Both aforementioned algorithms rely on a process called unification, a key component of all first-order inference algorithms." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Unification\n", - "We sometimes require finding substitutions that make different logical expressions look identical. This process, called unification, is done by the `unify` algorithm. It takes as input two sentences and returns a unifier for them if one exists. A unifier is a dictionary which stores the substitutions required to make the two sentences identical. It does so by recursively unifying the components of a sentence, where the unification of a variable symbol `var` with a constant symbol `Const` is the mapping `{var: Const}`. Let's look at a few examples." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: 3}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unify(expr('x'), 3)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: B}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unify(expr('A(x)'), expr('A(B)'))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{x: Bella, y: Dobby}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unify(expr('Cat(x) & Dog(Dobby)'), expr('Cat(Bella) & Dog(y)'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In cases where there is no possible substitution that unifies the two sentences the function return `None`." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print(unify(expr('Cat(x)'), expr('Dog(Dobby)')))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We also need to take care we do not unintentionally use the same variable name. Unify treats them as a single variable which prevents it from taking multiple value." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print(unify(expr('Cat(x) & Dog(Dobby)'), expr('Cat(Bella) & Dog(x)')))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Forward Chaining Algorithm\n", - "We consider the simple forward-chaining algorithm presented in Figure 9.3. We look at each rule in the knoweldge base and see if the premises can be satisfied. This is done by finding a substitution which unifies each of the premise with a clause in the `KB`. If we are able to unify the premises, the conclusion (with the corresponding substitution) is added to the `KB`. This inferencing process is repeated until either the query can be answered or till no new sentences can be added. We test if the newly added clause unifies with the query in which case the substitution yielded by `unify` is an answer to the query. If we run out of sentences to infer, this means the query was a failure.\n", - "\n", - "The function `fol_fc_ask` is a generator which yields all substitutions which validate the query." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource fol_fc_ask" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's find out all the hostile nations. Note that we only told the `KB` that Nono was an enemy of America, not that it was hostile." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{x: Nono}]\n" - ] - } - ], - "source": [ - "answer = fol_fc_ask(crime_kb, expr('Hostile(x)'))\n", - "print(list(answer))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The generator returned a single substitution which says that Nono is a hostile nation. See how after adding another enemy nation the generator returns two substitutions." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{x: Nono}, {x: JaJa}]\n" - ] - } - ], - "source": [ - "crime_kb.tell(expr('Enemy(JaJa, America)'))\n", - "answer = fol_fc_ask(crime_kb, expr('Hostile(x)'))\n", - "print(list(answer))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note: `fol_fc_ask` makes changes to the `KB` by adding sentences to it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Backward Chaining Algorithm\n", - "This algorithm works backward from the goal, chaining through rules to find known facts that support the proof. Suppose `goal` is the query we want to find the substitution for. We find rules of the form $\\text{lhs} \\implies \\text{goal}$ in the `KB` and try to prove `lhs`. There may be multiple clauses in the `KB` which give multiple `lhs`. It is sufficient to prove only one of these. But to prove a `lhs` all the conjuncts in the `lhs` of the clause must be proved. This makes it similar to And/Or search." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### OR\n", - "The OR part of the algorithm comes from our choice to select any clause of the form $\\text{lhs} \\implies \\text{goal}$. Looking at all rules's `lhs` whose `rhs` unify with the `goal`, we yield a substitution which proves all the conjuncts in the `lhs`. We use `parse_definite_clause` to attain `lhs` and `rhs` from a clause of the form $\\text{lhs} \\implies \\text{rhs}$. For atomic facts the `lhs` is an empty list." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource fol_bc_or" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### AND\n", - "The AND corresponds to proving all the conjuncts in the `lhs`. We need to find a substitution which proves each and every clause in the list of conjuncts." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource fol_bc_and" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the main function `fl_bc_ask` calls `fol_bc_or` with substitution initialized as empty. The `ask` method of `FolKB` uses `fol_bc_ask` and fetches the first substitution returned by the generator to answer query. Let's query the knowledge base we created from `clauses` to find hostile nations." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Rebuild KB because running fol_fc_ask would add new facts to the KB\n", - "crime_kb = FolKB(clauses)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{v_5: x, x: Nono}" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "crime_kb.ask(expr('Hostile(x)'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You may notice some new variables in the substitution. They are introduced to standardize the variable names to prevent naming problems as discussed in the [Unification section](#Unification)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Appendix: The Implementation of `|'==>'|`\n", - "\n", - "Consider the `Expr` formed by this syntax:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P |'==>'| ~Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What is the funny `|'==>'|` syntax? The trick is that \"`|`\" is just the regular Python or-operator, and so is exactly equivalent to this: " - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(P | '==>') | ~Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In other words, there are two applications of or-operators. Here's the first one:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PartialExpr('==>', P)" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P | '==>'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What is going on here is that the `__or__` method of `Expr` serves a dual purpose. If the right-hand-side is another `Expr` (or a number), then the result is an `Expr`, as in `(P | Q)`. But if the right-hand-side is a string, then the string is taken to be an operator, and we create a node in the abstract syntax tree corresponding to a partially-filled `Expr`, one where we know the left-hand-side is `P` and the operator is `==>`, but we don't yet know the right-hand-side.\n", - "\n", - "The `PartialExpr` class has an `__or__` method that says to create an `Expr` node with the right-hand-side filled in. Here we can see the combination of the `PartialExpr` with `Q` to create a complete `Expr`:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(P ==> ~Q)" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "partial = PartialExpr('==>', P) \n", - "partial | ~Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This [trick](http://code.activestate.com/recipes/384122-infix-operators/) is due to [Ferdinand Jamitzky](http://code.activestate.com/recipes/users/98863/), with a modification by [C. G. Vedant](https://github.com/Chipe1),\n", - "who suggested using a string inside the or-bars.\n", - "\n", - "## Appendix: The Implementation of `expr`\n", - "\n", - "How does `expr` parse a string into an `Expr`? It turns out there are two tricks (besides the Jamitzky/Vedant trick):\n", - "\n", - "1. We do a string substitution, replacing \"`==>`\" with \"`|'==>'|`\" (and likewise for other operators).\n", - "2. We `eval` the resulting string in an environment in which every identifier\n", - "is bound to a symbol with that identifier as the `op`.\n", - "\n", - "In other words," - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr('~(P & Q) ==> (~P | ~Q)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "is equivalent to doing:" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(~(P & Q) ==> (~P | ~Q))" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P, Q = symbols('P, Q')\n", - "~(P & Q) |'==>'| (~P | ~Q)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One thing to beware of: this puts `==>` at the same precedence level as `\"|\"`, which is not quite right. For example, we get this:" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(((P & Q) ==> P) | Q)" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "P & Q |'==>'| P | Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which is probably not what we meant; when in doubt, put in extra parens:" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((P & Q) ==> (P | Q))" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(P & Q) |'==>'| (P | Q)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from notebook import Canvas_fol_bc_ask\n", - "canvas_bc_ask = Canvas_fol_bc_ask('canvas_bc_ask', crime_kb, expr('Criminal(x)'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Authors\n", - "\n", - "This notebook by [Chirag Vartak](https://github.com/chiragvartak) and [Peter Norvig](https://github.com/norvig).\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/logic.py b/logic.py deleted file mode 100644 index 5810e633f..000000000 --- a/logic.py +++ /dev/null @@ -1,1127 +0,0 @@ -"""Representations and Inference for Logic (Chapters 7-9, 12) - -Covers both Propositional and First-Order Logic. First we have four -important data types: - - KB Abstract class holds a knowledge base of logical expressions - KB_Agent Abstract class subclasses agents.Agent - Expr A logical expression, imported from utils.py - substitution Implemented as a dictionary of var:value pairs, {x:1, y:x} - -Be careful: some functions take an Expr as argument, and some take a KB. - -Logical expressions can be created with Expr or expr, imported from utils, TODO -or with expr, which adds the capability to write a string that uses -the connectives ==>, <==, <=>, or <=/=>. But be careful: these have the -operator precedence of commas; you may need to add parens to make precedence work. -See logic.ipynb for examples. - -Then we implement various functions for doing logical inference: - - pl_true Evaluate a propositional logical sentence in a model - tt_entails Say if a statement is entailed by a KB - pl_resolution Do resolution on propositional sentences - dpll_satisfiable See if a propositional sentence is satisfiable - WalkSAT Try to find a solution for a set of clauses - -And a few other functions: - - to_cnf Convert to conjunctive normal form - unify Do unification of two FOL sentences - diff, simp Symbolic differentiation and simplification -""" - -from utils import ( - removeall, unique, first, argmax, probability, - isnumber, issequence, Expr, expr, subexpressions -) -import agents - -import itertools -import random -from collections import defaultdict - -# ______________________________________________________________________________ - - -class KB: - - """A knowledge base to which you can tell and ask sentences. - To create a KB, first subclass this class and implement - tell, ask_generator, and retract. Why ask_generator instead of ask? - The book is a bit vague on what ask means -- - For a Propositional Logic KB, ask(P & Q) returns True or False, but for an - FOL KB, something like ask(Brother(x, y)) might return many substitutions - such as {x: Cain, y: Abel}, {x: Abel, y: Cain}, {x: George, y: Jeb}, etc. - So ask_generator generates these one at a time, and ask either returns the - first one or returns False.""" - - def __init__(self, sentence=None): - raise NotImplementedError - - def tell(self, sentence): - """Add the sentence to the KB.""" - raise NotImplementedError - - def ask(self, query): - """Return a substitution that makes the query true, or, failing that, return False.""" - return first(self.ask_generator(query), default=False) - - def ask_generator(self, query): - """Yield all the substitutions that make query true.""" - raise NotImplementedError - - def retract(self, sentence): - """Remove sentence from the KB.""" - raise NotImplementedError - - -class PropKB(KB): - """A KB for propositional logic. Inefficient, with no indexing.""" - - def __init__(self, sentence=None): - self.clauses = [] - if sentence: - self.tell(sentence) - - def tell(self, sentence): - """Add the sentence's clauses to the KB.""" - self.clauses.extend(conjuncts(to_cnf(sentence))) - - def ask_generator(self, query): - """Yield the empty substitution {} if KB entails query; else no results.""" - if tt_entails(Expr('&', *self.clauses), query): - yield {} - - def ask_if_true(self, query): - """Return True if the KB entails query, else return False.""" - for _ in self.ask_generator(query): - return True - return False - - def retract(self, sentence): - """Remove the sentence's clauses from the KB.""" - for c in conjuncts(to_cnf(sentence)): - if c in self.clauses: - self.clauses.remove(c) - -# ______________________________________________________________________________ - - -def KB_AgentProgram(KB): - """A generic logical knowledge-based agent program. [Figure 7.1]""" - steps = itertools.count() - - def program(percept): - t = next(steps) - KB.tell(make_percept_sentence(percept, t)) - action = KB.ask(make_action_query(t)) - KB.tell(make_action_sentence(action, t)) - return action - - def make_percept_sentence(percept, t): - return Expr("Percept")(percept, t) - - def make_action_query(t): - return expr("ShouldDo(action, {})".format(t)) - - def make_action_sentence(action, t): - return Expr("Did")(action[expr('action')], t) - - return program - - -def is_symbol(s): - """A string s is a symbol if it starts with an alphabetic char.""" - return isinstance(s, str) and s[:1].isalpha() - - -def is_var_symbol(s): - """A logic variable symbol is an initial-lowercase string.""" - return is_symbol(s) and s[0].islower() - - -def is_prop_symbol(s): - """A proposition logic symbol is an initial-uppercase string.""" - return is_symbol(s) and s[0].isupper() - - -def variables(s): - """Return a set of the variables in expression s. - >>> variables(expr('F(x, x) & G(x, y) & H(y, z) & R(A, z, 2)')) == {x, y, z} - True - """ - return {x for x in subexpressions(s) if is_variable(x)} - - -def is_definite_clause(s): - """Returns True for exprs s of the form A & B & ... & C ==> D, - where all literals are positive. In clause form, this is - ~A | ~B | ... | ~C | D, where exactly one clause is positive. - >>> is_definite_clause(expr('Farmer(Mac)')) - True - """ - if is_symbol(s.op): - return True - elif s.op == '==>': - antecedent, consequent = s.args - return (is_symbol(consequent.op) and - all(is_symbol(arg.op) for arg in conjuncts(antecedent))) - else: - return False - - -def parse_definite_clause(s): - """Return the antecedents and the consequent of a definite clause.""" - assert is_definite_clause(s) - if is_symbol(s.op): - return [], s - else: - antecedent, consequent = s.args - return conjuncts(antecedent), consequent - - -# Useful constant Exprs used in examples and code: -A, B, C, D, E, F, G, P, Q, x, y, z = map(Expr, 'ABCDEFGPQxyz') - - -# ______________________________________________________________________________ - - -def tt_entails(kb, alpha): - """Does kb entail the sentence alpha? Use truth tables. For propositional - kb's and sentences. [Figure 7.10]. Note that the 'kb' should be an - Expr which is a conjunction of clauses. - >>> tt_entails(expr('P & Q'), expr('Q')) - True - """ - assert not variables(alpha) - symbols = list(prop_symbols(kb & alpha)) - return tt_check_all(kb, alpha, symbols, {}) - - -def tt_check_all(kb, alpha, symbols, model): - """Auxiliary routine to implement tt_entails.""" - if not symbols: - if pl_true(kb, model): - result = pl_true(alpha, model) - assert result in (True, False) - return result - else: - return True - else: - P, rest = symbols[0], symbols[1:] - return (tt_check_all(kb, alpha, rest, extend(model, P, True)) and - tt_check_all(kb, alpha, rest, extend(model, P, False))) - - -def prop_symbols(x): - """Return the set of all propositional symbols in x.""" - if not isinstance(x, Expr): - return set() - elif is_prop_symbol(x.op): - return {x} - else: - return {symbol for arg in x.args for symbol in prop_symbols(arg)} - - -def constant_symbols(x): - """Return the set of all constant symbols in x.""" - if not isinstance(x, Expr): - return set() - elif is_prop_symbol(x.op) and not x.args: - return {x} - else: - return {symbol for arg in x.args for symbol in constant_symbols(arg)} - - -def predicate_symbols(x): - """Return a set of (symbol_name, arity) in x. - All symbols (even functional) with arity > 0 are considered.""" - if not isinstance(x, Expr) or not x.args: - return set() - pred_set = {(x.op, len(x.args))} if is_prop_symbol(x.op) else set() - pred_set.update({symbol for arg in x.args for symbol in predicate_symbols(arg)}) - return pred_set - - -def tt_true(s): - """Is a propositional sentence a tautology? - >>> tt_true('P | ~P') - True - """ - s = expr(s) - return tt_entails(True, s) - - -def pl_true(exp, model={}): - """Return True if the propositional logic expression is true in the model, - and False if it is false. If the model does not specify the value for - every proposition, this may return None to indicate 'not obvious'; - this may happen even when the expression is tautological.""" - if exp in (True, False): - return exp - op, args = exp.op, exp.args - if is_prop_symbol(op): - return model.get(exp) - elif op == '~': - p = pl_true(args[0], model) - if p is None: - return None - else: - return not p - elif op == '|': - result = False - for arg in args: - p = pl_true(arg, model) - if p is True: - return True - if p is None: - result = None - return result - elif op == '&': - result = True - for arg in args: - p = pl_true(arg, model) - if p is False: - return False - if p is None: - result = None - return result - p, q = args - if op == '==>': - return pl_true(~p | q, model) - elif op == '<==': - return pl_true(p | ~q, model) - pt = pl_true(p, model) - if pt is None: - return None - qt = pl_true(q, model) - if qt is None: - return None - if op == '<=>': - return pt == qt - elif op == '^': # xor or 'not equivalent' - return pt != qt - else: - raise ValueError("illegal operator in logic expression" + str(exp)) - -# ______________________________________________________________________________ - -# Convert to Conjunctive Normal Form (CNF) - - -def to_cnf(s): - """Convert a propositional logical sentence to conjunctive normal form. - That is, to the form ((A | ~B | ...) & (B | C | ...) & ...) [p. 253] - >>> to_cnf('~(B | C)') - (~B & ~C) - """ - s = expr(s) - if isinstance(s, str): - s = expr(s) - s = eliminate_implications(s) # Steps 1, 2 from p. 253 - s = move_not_inwards(s) # Step 3 - return distribute_and_over_or(s) # Step 4 - - -def eliminate_implications(s): - """Change implications into equivalent form with only &, |, and ~ as logical operators.""" - s = expr(s) - if not s.args or is_symbol(s.op): - return s # Atoms are unchanged. - args = list(map(eliminate_implications, s.args)) - a, b = args[0], args[-1] - if s.op == '==>': - return b | ~a - elif s.op == '<==': - return a | ~b - elif s.op == '<=>': - return (a | ~b) & (b | ~a) - elif s.op == '^': - assert len(args) == 2 # TODO: relax this restriction - return (a & ~b) | (~a & b) - else: - assert s.op in ('&', '|', '~') - return Expr(s.op, *args) - - -def move_not_inwards(s): - """Rewrite sentence s by moving negation sign inward. - >>> move_not_inwards(~(A | B)) - (~A & ~B)""" - s = expr(s) - if s.op == '~': - def NOT(b): - return move_not_inwards(~b) - a = s.args[0] - if a.op == '~': - return move_not_inwards(a.args[0]) # ~~A ==> A - if a.op == '&': - return associate('|', list(map(NOT, a.args))) - if a.op == '|': - return associate('&', list(map(NOT, a.args))) - return s - elif is_symbol(s.op) or not s.args: - return s - else: - return Expr(s.op, *list(map(move_not_inwards, s.args))) - - -def distribute_and_over_or(s): - """Given a sentence s consisting of conjunctions and disjunctions - of literals, return an equivalent sentence in CNF. - >>> distribute_and_over_or((A & B) | C) - ((A | C) & (B | C)) - """ - s = expr(s) - if s.op == '|': - s = associate('|', s.args) - if s.op != '|': - return distribute_and_over_or(s) - if len(s.args) == 0: - return False - if len(s.args) == 1: - return distribute_and_over_or(s.args[0]) - conj = first(arg for arg in s.args if arg.op == '&') - if not conj: - return s - others = [a for a in s.args if a is not conj] - rest = associate('|', others) - return associate('&', [distribute_and_over_or(c | rest) - for c in conj.args]) - elif s.op == '&': - return associate('&', list(map(distribute_and_over_or, s.args))) - else: - return s - - -def associate(op, args): - """Given an associative op, return an expression with the same - meaning as Expr(op, *args), but flattened -- that is, with nested - instances of the same op promoted to the top level. - >>> associate('&', [(A&B),(B|C),(B&C)]) - (A & B & (B | C) & B & C) - >>> associate('|', [A|(B|(C|(A&B)))]) - (A | B | C | (A & B)) - """ - args = dissociate(op, args) - if len(args) == 0: - return _op_identity[op] - elif len(args) == 1: - return args[0] - else: - return Expr(op, *args) - - -_op_identity = {'&': True, '|': False, '+': 0, '*': 1} - - -def dissociate(op, args): - """Given an associative op, return a flattened list result such - that Expr(op, *result) means the same as Expr(op, *args).""" - result = [] - - def collect(subargs): - for arg in subargs: - if arg.op == op: - collect(arg.args) - else: - result.append(arg) - collect(args) - return result - - -def conjuncts(s): - """Return a list of the conjuncts in the sentence s. - >>> conjuncts(A & B) - [A, B] - >>> conjuncts(A | B) - [(A | B)] - """ - return dissociate('&', [s]) - - -def disjuncts(s): - """Return a list of the disjuncts in the sentence s. - >>> disjuncts(A | B) - [A, B] - >>> disjuncts(A & B) - [(A & B)] - """ - return dissociate('|', [s]) - -# ______________________________________________________________________________ - - -def pl_resolution(KB, alpha): - """Propositional-logic resolution: say if alpha follows from KB. [Figure 7.12]""" - clauses = KB.clauses + conjuncts(to_cnf(~alpha)) - new = set() - while True: - n = len(clauses) - pairs = [(clauses[i], clauses[j]) - for i in range(n) for j in range(i+1, n)] - for (ci, cj) in pairs: - resolvents = pl_resolve(ci, cj) - if False in resolvents: - return True - new = new.union(set(resolvents)) - if new.issubset(set(clauses)): - return False - for c in new: - if c not in clauses: - clauses.append(c) - - -def pl_resolve(ci, cj): - """Return all clauses that can be obtained by resolving clauses ci and cj.""" - clauses = [] - for di in disjuncts(ci): - for dj in disjuncts(cj): - if di == ~dj or ~di == dj: - dnew = unique(removeall(di, disjuncts(ci)) + - removeall(dj, disjuncts(cj))) - clauses.append(associate('|', dnew)) - return clauses - -# ______________________________________________________________________________ - - -class PropDefiniteKB(PropKB): - """A KB of propositional definite clauses.""" - - def tell(self, sentence): - """Add a definite clause to this KB.""" - assert is_definite_clause(sentence), "Must be definite clause" - self.clauses.append(sentence) - - def ask_generator(self, query): - """Yield the empty substitution if KB implies query; else nothing.""" - if pl_fc_entails(self.clauses, query): - yield {} - - def retract(self, sentence): - self.clauses.remove(sentence) - - def clauses_with_premise(self, p): - """Return a list of the clauses in KB that have p in their premise. - This could be cached away for O(1) speed, but we'll recompute it.""" - return [c for c in self.clauses - if c.op == '==>' and p in conjuncts(c.args[0])] - - -def pl_fc_entails(KB, q): - """Use forward chaining to see if a PropDefiniteKB entails symbol q. - [Figure 7.15] - >>> pl_fc_entails(horn_clauses_KB, expr('Q')) - True - """ - count = {c: len(conjuncts(c.args[0])) - for c in KB.clauses - if c.op == '==>'} - inferred = defaultdict(bool) - agenda = [s for s in KB.clauses if is_prop_symbol(s.op)] - while agenda: - p = agenda.pop() - if p == q: - return True - if not inferred[p]: - inferred[p] = True - for c in KB.clauses_with_premise(p): - count[c] -= 1 - if count[c] == 0: - agenda.append(c.args[1]) - return False - - -""" [Figure 7.13] -Simple inference in a wumpus world example -""" -wumpus_world_inference = expr("(B11 <=> (P12 | P21)) & ~B11") - - -""" [Figure 7.16] -Propositional Logic Forward Chaining example -""" -horn_clauses_KB = PropDefiniteKB() -for s in "P==>Q; (L&M)==>P; (B&L)==>M; (A&P)==>L; (A&B)==>L; A;B".split(';'): - horn_clauses_KB.tell(expr(s)) - -# ______________________________________________________________________________ -# DPLL-Satisfiable [Figure 7.17] - - -def dpll_satisfiable(s): - """Check satisfiability of a propositional sentence. - This differs from the book code in two ways: (1) it returns a model - rather than True when it succeeds; this is more useful. (2) The - function find_pure_symbol is passed a list of unknown clauses, rather - than a list of all clauses and the model; this is more efficient.""" - clauses = conjuncts(to_cnf(s)) - symbols = list(prop_symbols(s)) - return dpll(clauses, symbols, {}) - - -def dpll(clauses, symbols, model): - """See if the clauses are true in a partial model.""" - unknown_clauses = [] # clauses with an unknown truth value - for c in clauses: - val = pl_true(c, model) - if val is False: - return False - if val is not True: - unknown_clauses.append(c) - if not unknown_clauses: - return model - P, value = find_pure_symbol(symbols, unknown_clauses) - if P: - return dpll(clauses, removeall(P, symbols), extend(model, P, value)) - P, value = find_unit_clause(clauses, model) - if P: - return dpll(clauses, removeall(P, symbols), extend(model, P, value)) - if not symbols: - raise TypeError("Argument should be of the type Expr.") - P, symbols = symbols[0], symbols[1:] - return (dpll(clauses, symbols, extend(model, P, True)) or - dpll(clauses, symbols, extend(model, P, False))) - - -def find_pure_symbol(symbols, clauses): - """Find a symbol and its value if it appears only as a positive literal - (or only as a negative) in clauses. - >>> find_pure_symbol([A, B, C], [A|~B,~B|~C,C|A]) - (A, True) - """ - for s in symbols: - found_pos, found_neg = False, False - for c in clauses: - if not found_pos and s in disjuncts(c): - found_pos = True - if not found_neg and ~s in disjuncts(c): - found_neg = True - if found_pos != found_neg: - return s, found_pos - return None, None - - -def find_unit_clause(clauses, model): - """Find a forced assignment if possible from a clause with only 1 - variable not bound in the model. - >>> find_unit_clause([A|B|C, B|~C, ~A|~B], {A:True}) - (B, False) - """ - for clause in clauses: - P, value = unit_clause_assign(clause, model) - if P: - return P, value - return None, None - - -def unit_clause_assign(clause, model): - """Return a single variable/value pair that makes clause true in - the model, if possible. - >>> unit_clause_assign(A|B|C, {A:True}) - (None, None) - >>> unit_clause_assign(B|~C, {A:True}) - (None, None) - >>> unit_clause_assign(~A|~B, {A:True}) - (B, False) - """ - P, value = None, None - for literal in disjuncts(clause): - sym, positive = inspect_literal(literal) - if sym in model: - if model[sym] == positive: - return None, None # clause already True - elif P: - return None, None # more than 1 unbound variable - else: - P, value = sym, positive - return P, value - - -def inspect_literal(literal): - """The symbol in this literal, and the value it should take to - make the literal true. - >>> inspect_literal(P) - (P, True) - >>> inspect_literal(~P) - (P, False) - """ - if literal.op == '~': - return literal.args[0], False - else: - return literal, True - -# ______________________________________________________________________________ -# Walk-SAT [Figure 7.18] - - -def WalkSAT(clauses, p=0.5, max_flips=10000): - """Checks for satisfiability of all clauses by randomly flipping values of variables - """ - # Set of all symbols in all clauses - symbols = {sym for clause in clauses for sym in prop_symbols(clause)} - # model is a random assignment of true/false to the symbols in clauses - model = {s: random.choice([True, False]) for s in symbols} - for i in range(max_flips): - satisfied, unsatisfied = [], [] - for clause in clauses: - (satisfied if pl_true(clause, model) else unsatisfied).append(clause) - if not unsatisfied: # if model satisfies all the clauses - return model - clause = random.choice(unsatisfied) - if probability(p): - sym = random.choice(list(prop_symbols(clause))) - else: - # Flip the symbol in clause that maximizes number of sat. clauses - def sat_count(sym): - # Return the the number of clauses satisfied after flipping the symbol. - model[sym] = not model[sym] - count = len([clause for clause in clauses if pl_true(clause, model)]) - model[sym] = not model[sym] - return count - sym = argmax(prop_symbols(clause), key=sat_count) - model[sym] = not model[sym] - # If no solution is found within the flip limit, we return failure - return None - -# ______________________________________________________________________________ - - -class HybridWumpusAgent(agents.Agent): - """An agent for the wumpus world that does logical inference. [Figure 7.20]""" - - def __init__(self): - raise NotImplementedError - - -def plan_route(current, goals, allowed): - raise NotImplementedError - -# ______________________________________________________________________________ - - -def SAT_plan(init, transition, goal, t_max, SAT_solver=dpll_satisfiable): - """Converts a planning problem to Satisfaction problem by translating it to a cnf sentence. - [Figure 7.22]""" - - # Functions used by SAT_plan - def translate_to_SAT(init, transition, goal, time): - clauses = [] - states = [state for state in transition] - - # Symbol claiming state s at time t - state_counter = itertools.count() - for s in states: - for t in range(time+1): - state_sym[s, t] = Expr("State_{}".format(next(state_counter))) - - # Add initial state axiom - clauses.append(state_sym[init, 0]) - - # Add goal state axiom - clauses.append(state_sym[goal, time]) - - # All possible transitions - transition_counter = itertools.count() - for s in states: - for action in transition[s]: - s_ = transition[s][action] - for t in range(time): - # Action 'action' taken from state 's' at time 't' to reach 's_' - action_sym[s, action, t] = Expr( - "Transition_{}".format(next(transition_counter))) - - # Change the state from s to s_ - clauses.append(action_sym[s, action, t] |'==>'| state_sym[s, t]) - clauses.append(action_sym[s, action, t] |'==>'| state_sym[s_, t + 1]) - - # Allow only one state at any time - for t in range(time+1): - # must be a state at any time - clauses.append(associate('|', [state_sym[s, t] for s in states])) - - for s in states: - for s_ in states[states.index(s) + 1:]: - # for each pair of states s, s_ only one is possible at time t - clauses.append((~state_sym[s, t]) | (~state_sym[s_, t])) - - # Restrict to one transition per timestep - for t in range(time): - # list of possible transitions at time t - transitions_t = [tr for tr in action_sym if tr[2] == t] - - # make sure at least one of the transitions happens - clauses.append(associate('|', [action_sym[tr] for tr in transitions_t])) - - for tr in transitions_t: - for tr_ in transitions_t[transitions_t.index(tr) + 1:]: - # there cannot be two transitions tr and tr_ at time t - clauses.append(~action_sym[tr] | ~action_sym[tr_]) - - # Combine the clauses to form the cnf - return associate('&', clauses) - - def extract_solution(model): - true_transitions = [t for t in action_sym if model[action_sym[t]]] - # Sort transitions based on time, which is the 3rd element of the tuple - true_transitions.sort(key=lambda x: x[2]) - return [action for s, action, time in true_transitions] - - # Body of SAT_plan algorithm - for t in range(t_max): - # dictionaries to help extract the solution from model - state_sym = {} - action_sym = {} - - cnf = translate_to_SAT(init, transition, goal, t) - model = SAT_solver(cnf) - if model is not False: - return extract_solution(model) - return None - - -# ______________________________________________________________________________ - - -def unify(x, y, s={}): - """Unify expressions x,y with substitution s; return a substitution that - would make x,y equal, or None if x,y can not unify. x and y can be - variables (e.g. Expr('x')), constants, lists, or Exprs. [Figure 9.1]""" - if s is None: - return None - elif x == y: - return s - elif is_variable(x): - return unify_var(x, y, s) - elif is_variable(y): - return unify_var(y, x, s) - elif isinstance(x, Expr) and isinstance(y, Expr): - return unify(x.args, y.args, unify(x.op, y.op, s)) - elif isinstance(x, str) or isinstance(y, str): - return None - elif issequence(x) and issequence(y) and len(x) == len(y): - if not x: - return s - return unify(x[1:], y[1:], unify(x[0], y[0], s)) - else: - return None - - -def is_variable(x): - """A variable is an Expr with no args and a lowercase symbol as the op.""" - return isinstance(x, Expr) and not x.args and x.op[0].islower() - - -def unify_var(var, x, s): - if var in s: - return unify(s[var], x, s) - elif x in s: - return unify(var, s[x], s) - elif occur_check(var, x, s): - return None - else: - return extend(s, var, x) - - -def occur_check(var, x, s): - """Return true if variable var occurs anywhere in x - (or in subst(s, x), if s has a binding for x).""" - if var == x: - return True - elif is_variable(x) and x in s: - return occur_check(var, s[x], s) - elif isinstance(x, Expr): - return (occur_check(var, x.op, s) or - occur_check(var, x.args, s)) - elif isinstance(x, (list, tuple)): - return first(e for e in x if occur_check(var, e, s)) - else: - return False - - -def extend(s, var, val): - """Copy the substitution s and extend it by setting var to val; return copy.""" - s2 = s.copy() - s2[var] = val - return s2 - - -def subst(s, x): - """Substitute the substitution s into the expression x. - >>> subst({x: 42, y:0}, F(x) + y) - (F(42) + 0) - """ - if isinstance(x, list): - return [subst(s, xi) for xi in x] - elif isinstance(x, tuple): - return tuple([subst(s, xi) for xi in x]) - elif not isinstance(x, Expr): - return x - elif is_var_symbol(x.op): - return s.get(x, x) - else: - return Expr(x.op, *[subst(s, arg) for arg in x.args]) - - -def standardize_variables(sentence, dic=None): - """Replace all the variables in sentence with new variables.""" - if dic is None: - dic = {} - if not isinstance(sentence, Expr): - return sentence - elif is_var_symbol(sentence.op): - if sentence in dic: - return dic[sentence] - else: - v = Expr('v_{}'.format(next(standardize_variables.counter))) - dic[sentence] = v - return v - else: - return Expr(sentence.op, - *[standardize_variables(a, dic) for a in sentence.args]) - - -standardize_variables.counter = itertools.count() - -# ______________________________________________________________________________ - - -class FolKB(KB): - """A knowledge base consisting of first-order definite clauses. - >>> kb0 = FolKB([expr('Farmer(Mac)'), expr('Rabbit(Pete)'), - ... expr('(Rabbit(r) & Farmer(f)) ==> Hates(f, r)')]) - >>> kb0.tell(expr('Rabbit(Flopsie)')) - >>> kb0.retract(expr('Rabbit(Pete)')) - >>> kb0.ask(expr('Hates(Mac, x)'))[x] - Flopsie - >>> kb0.ask(expr('Wife(Pete, x)')) - False - """ - - def __init__(self, initial_clauses=[]): - self.clauses = [] # inefficient: no indexing - for clause in initial_clauses: - self.tell(clause) - - def tell(self, sentence): - if is_definite_clause(sentence): - self.clauses.append(sentence) - else: - raise Exception("Not a definite clause: {}".format(sentence)) - - def ask_generator(self, query): - return fol_bc_ask(self, query) - - def retract(self, sentence): - self.clauses.remove(sentence) - - def fetch_rules_for_goal(self, goal): - return self.clauses - - -def fol_fc_ask(KB, alpha): - """A simple forward-chaining algorithm. [Figure 9.3]""" - # TODO: Improve efficiency - kb_consts = list({c for clause in KB.clauses for c in constant_symbols(clause)}) - def enum_subst(p): - query_vars = list({v for clause in p for v in variables(clause)}) - for assignment_list in itertools.product(kb_consts, repeat=len(query_vars)): - theta = {x: y for x, y in zip(query_vars, assignment_list)} - yield theta - - # check if we can answer without new inferences - for q in KB.clauses: - phi = unify(q, alpha, {}) - if phi is not None: - yield phi - - while True: - new = [] - for rule in KB.clauses: - p, q = parse_definite_clause(rule) - for theta in enum_subst(p): - if set(subst(theta, p)).issubset(set(KB.clauses)): - q_ = subst(theta, q) - if all([unify(x, q_, {}) is None for x in KB.clauses + new]): - new.append(q_) - phi = unify(q_, alpha, {}) - if phi is not None: - yield phi - if not new: - break - for clause in new: - KB.tell(clause) - return None - - -def fol_bc_ask(KB, query): - """A simple backward-chaining algorithm for first-order logic. [Figure 9.6] - KB should be an instance of FolKB, and query an atomic sentence.""" - return fol_bc_or(KB, query, {}) - - -def fol_bc_or(KB, goal, theta): - for rule in KB.fetch_rules_for_goal(goal): - lhs, rhs = parse_definite_clause(standardize_variables(rule)) - for theta1 in fol_bc_and(KB, lhs, unify(rhs, goal, theta)): - yield theta1 - - -def fol_bc_and(KB, goals, theta): - if theta is None: - pass - elif not goals: - yield theta - else: - first, rest = goals[0], goals[1:] - for theta1 in fol_bc_or(KB, subst(theta, first), theta): - for theta2 in fol_bc_and(KB, rest, theta1): - yield theta2 - - -# A simple KB that defines the relevant conditions of the Wumpus World as in Fig 7.4. -# See Sec. 7.4.3 -wumpus_kb = PropKB() - -P11, P12, P21, P22, P31, B11, B21 = expr('P11, P12, P21, P22, P31, B11, B21') -wumpus_kb.tell(~P11) -wumpus_kb.tell(B11 | '<=>' | ((P12 | P21))) -wumpus_kb.tell(B21 | '<=>' | ((P11 | P22 | P31))) -wumpus_kb.tell(~B11) -wumpus_kb.tell(B21) - -test_kb = FolKB( - map(expr, ['Farmer(Mac)', - 'Rabbit(Pete)', - 'Mother(MrsMac, Mac)', - 'Mother(MrsRabbit, Pete)', - '(Rabbit(r) & Farmer(f)) ==> Hates(f, r)', - '(Mother(m, c)) ==> Loves(m, c)', - '(Mother(m, r) & Rabbit(r)) ==> Rabbit(m)', - '(Farmer(f)) ==> Human(f)', - # Note that this order of conjuncts - # would result in infinite recursion: - # '(Human(h) & Mother(m, h)) ==> Human(m)' - '(Mother(m, h) & Human(h)) ==> Human(m)' - ])) - -crime_kb = FolKB( - map(expr, ['(American(x) & Weapon(y) & Sells(x, y, z) & Hostile(z)) ==> Criminal(x)', - 'Owns(Nono, M1)', - 'Missile(M1)', - '(Missile(x) & Owns(Nono, x)) ==> Sells(West, x, Nono)', - 'Missile(x) ==> Weapon(x)', - 'Enemy(x, America) ==> Hostile(x)', - 'American(West)', - 'Enemy(Nono, America)' - ])) - -# ______________________________________________________________________________ - -# Example application (not in the book). -# You can use the Expr class to do symbolic differentiation. This used to be -# a part of AI; now it is considered a separate field, Symbolic Algebra. - - -def diff(y, x): - """Return the symbolic derivative, dy/dx, as an Expr. - However, you probably want to simplify the results with simp. - >>> diff(x * x, x) - ((x * 1) + (x * 1)) - """ - if y == x: - return 1 - elif not y.args: - return 0 - else: - u, op, v = y.args[0], y.op, y.args[-1] - if op == '+': - return diff(u, x) + diff(v, x) - elif op == '-' and len(y.args) == 1: - return -diff(u, x) - elif op == '-': - return diff(u, x) - diff(v, x) - elif op == '*': - return u * diff(v, x) + v * diff(u, x) - elif op == '/': - return (v * diff(u, x) - u * diff(v, x)) / (v * v) - elif op == '**' and isnumber(x.op): - return (v * u ** (v - 1) * diff(u, x)) - elif op == '**': - return (v * u ** (v - 1) * diff(u, x) + - u ** v * Expr('log')(u) * diff(v, x)) - elif op == 'log': - return diff(u, x) / u - else: - raise ValueError("Unknown op: {} in diff({}, {})".format(op, y, x)) - - -def simp(x): - """Simplify the expression x.""" - if isnumber(x) or not x.args: - return x - args = list(map(simp, x.args)) - u, op, v = args[0], x.op, args[-1] - if op == '+': - if v == 0: - return u - if u == 0: - return v - if u == v: - return 2 * u - if u == -v or v == -u: - return 0 - elif op == '-' and len(args) == 1: - if u.op == '-' and len(u.args) == 1: - return u.args[0] # --y ==> y - elif op == '-': - if v == 0: - return u - if u == 0: - return -v - if u == v: - return 0 - if u == -v or v == -u: - return 0 - elif op == '*': - if u == 0 or v == 0: - return 0 - if u == 1: - return v - if v == 1: - return u - if u == v: - return u ** 2 - elif op == '/': - if u == 0: - return 0 - if v == 0: - return Expr('Undefined') - if u == v: - return 1 - if u == -v or v == -u: - return 0 - elif op == '**': - if u == 0: - return 0 - if v == 0: - return 1 - if u == 1: - return 1 - if v == 1: - return u - elif op == 'log': - if u == 1: - return 0 - else: - raise ValueError("Unknown op: " + op) - # If we fall through to here, we can not simplify further - return Expr(op, *args) - - -def d(y, x): - """Differentiate and then simplify.""" - return simp(diff(y, x)) diff --git a/Queens/main.py b/main.py similarity index 73% rename from Queens/main.py rename to main.py index 0a52515bd..4afdc2e06 100644 --- a/Queens/main.py +++ b/main.py @@ -1,30 +1,30 @@ -from Queens.Environment import QueensEnv -from Queens.Agents import * +from Environment import QueensEnv +from Agents import * queens = 8 # how big is the chessboard env = QueensEnv([steepestAscentAgent()], queens=queens) -env.run(200) +env.run(2000) # Let agent do 2000 steps and see how many solutions it finds print() steep = steepestAscentAgent() plateau = plateauExplorerAgent() env = QueensEnv([steep, plateau], queens=queens) -env.find_sol(73) -# challenge which agent finds 90% of all solutions possible +env.find_sol(72) +# challenge which agent finds 80% of all solutions possible print() agents = [plateauLimitedAgent(t) for t in range(6)] env = QueensEnv(agents, queens=queens) -env.find_sol(73) +env.find_sol(72) # see for how long is it efficient to explore the plateau print() agents = [steepestAscentAgent() for t in range(4)] master = masterBeamAgent(queens) env = QueensEnv(agents, master=master, queens=queens) -env.find_sol(73) +env.find_sol(92) # use beam search to find all the solutions -# remember to check the plots ;) \ No newline at end of file +# remember to check the plots ;) diff --git a/mdp.ipynb b/mdp.ipynb deleted file mode 100644 index e288d1b49..000000000 --- a/mdp.ipynb +++ /dev/null @@ -1,2993 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Markov decision processes (MDPs)\n", - "\n", - "This IPy notebook acts as supporting material for topics covered in **Chapter 17 Making Complex Decisions** of the book* Artificial Intelligence: A Modern Approach*. We makes use of the implementations in mdp.py module. This notebook also includes a brief summary of the main topics as a review. Let us import everything from the mdp module to get started." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from mdp import *\n", - "from notebook import psource, pseudocode" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Overview\n", - "* MDP\n", - "* Grid MDP\n", - "* Value Iteration Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OVERVIEW\n", - "\n", - "Before we start playing with the actual implementations let us review a couple of things about MDPs.\n", - "\n", - "- A stochastic process has the **Markov property** if the conditional probability distribution of future states of the process (conditional on both past and present states) depends only upon the present state, not on the sequence of events that preceded it.\n", - "\n", - " -- Source: [Wikipedia](https://en.wikipedia.org/wiki/Markov_property)\n", - "\n", - "Often it is possible to model many different phenomena as a Markov process by being flexible with our definition of state.\n", - " \n", - "\n", - "- MDPs help us deal with fully-observable and non-deterministic/stochastic environments. For dealing with partially-observable and stochastic cases we make use of generalization of MDPs named POMDPs (partially observable Markov decision process).\n", - "\n", - "Our overall goal to solve a MDP is to come up with a policy which guides us to select the best action in each state so as to maximize the expected sum of future rewards." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MDP\n", - "\n", - "To begin with let us look at the implementation of MDP class defined in mdp.py The docstring tells us what all is required to define a MDP namely - set of states,actions, initial state, transition model, and a reward function. Each of these are implemented as methods. Do not close the popup so that you can follow along the description of code below." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource MDP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The **_ _init_ _** method takes in the following parameters:\n", - "\n", - "- init: the initial state.\n", - "- actlist: List of actions possible in each state.\n", - "- terminals: List of terminal states where only possible action is exit\n", - "- gamma: Discounting factor. This makes sure that delayed rewards have less value compared to immediate ones.\n", - "\n", - "**R** method returns the reward for each state by using the self.reward dict.\n", - "\n", - "**T** method is not implemented and is somewhat different from the text. Here we return (probability, s') pairs where s' belongs to list of possible state by taking action a in state s.\n", - "\n", - "**actions** method returns list of actions possible in each state. By default it returns all actions for states other than terminal states.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us implement the simple MDP in the image below. States A, B have actions X, Y available in them. Their probabilities are shown just above the arrows. We start with using MDP as base class for our CustomMDP. Obviously we need to make a few changes to suit our case. We make use of a transition matrix as our transitions are not very simple.\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Transition Matrix as nested dict. State -> Actions in state -> States by each action -> Probabilty\n", - "t = {\n", - " \"A\": {\n", - " \"X\": {\"A\":0.3, \"B\":0.7},\n", - " \"Y\": {\"A\":1.0}\n", - " },\n", - " \"B\": {\n", - " \"X\": {\"End\":0.8, \"B\":0.2},\n", - " \"Y\": {\"A\":1.0}\n", - " },\n", - " \"End\": {}\n", - "}\n", - "\n", - "init = \"A\"\n", - "\n", - "terminals = [\"End\"]\n", - "\n", - "rewards = {\n", - " \"A\": 5,\n", - " \"B\": -10,\n", - " \"End\": 100\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class CustomMDP(MDP):\n", - "\n", - " def __init__(self, transition_matrix, rewards, terminals, init, gamma=.9):\n", - " # All possible actions.\n", - " actlist = []\n", - " for state in transition_matrix.keys():\n", - " actlist.extend(transition_matrix[state])\n", - " actlist = list(set(actlist))\n", - "\n", - " MDP.__init__(self, init, actlist, terminals=terminals, gamma=gamma)\n", - " self.t = transition_matrix\n", - " self.reward = rewards\n", - " for state in self.t:\n", - " self.states.add(state)\n", - "\n", - " def T(self, state, action):\n", - " if action is None:\n", - " return [(0.0, state)]\n", - " else: \n", - " return [(prob, new_state) for new_state, prob in self.t[state][action].items()]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally we instantize the class with the parameters for our MDP in the picture." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "our_mdp = CustomMDP(t, rewards, terminals, init, gamma=.9)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With this we have sucessfully represented our MDP. Later we will look at ways to solve this MDP." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GRID MDP\n", - "\n", - "Now we look at a concrete implementation that makes use of the MDP as base class. The GridMDP class in the mdp module is used to represent a grid world MDP like the one shown in in **Fig 17.1** of the AIMA Book. The code should be easy to understand if you have gone through the CustomMDP example." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource GridMDP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The **_ _init_ _** method takes **grid** as an extra parameter compared to the MDP class. The grid is a nested list of rewards in states.\n", - "\n", - "**go** method returns the state by going in particular direction by using vector_add.\n", - "\n", - "**T** method is not implemented and is somewhat different from the text. Here we return (probability, s') pairs where s' belongs to list of possible state by taking action a in state s.\n", - "\n", - "**actions** method returns list of actions possible in each state. By default it returns all actions for states other than terminal states.\n", - "\n", - "**to_arrows** are used for representing the policy in a grid like format." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can create a GridMDP like the one in **Fig 17.1** as follows: \n", - "\n", - " GridMDP([[-0.04, -0.04, -0.04, +1],\n", - " [-0.04, None, -0.04, -1],\n", - " [-0.04, -0.04, -0.04, -0.04]],\n", - " terminals=[(3, 2), (3, 1)])\n", - " \n", - "In fact the **sequential_decision_environment** in mdp module has been instantized using the exact same code." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sequential_decision_environment" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Value Iteration\n", - "\n", - "Now that we have looked how to represent MDPs. Let's aim at solving them. Our ultimate goal is to obtain an optimal policy. We start with looking at Value Iteration and a visualisation that should help us understanding it better.\n", - "\n", - "We start by calculating Value/Utility for each of the states. The Value of each state is the expected sum of discounted future rewards given we start in that state and follow a particular policy pi.The algorithm Value Iteration (**Fig. 17.4** in the book) relies on finding solutions of the Bellman's Equation. The intuition Value Iteration works is because values propagate. This point will we more clear after we encounter the visualisation. For more information you can refer to **Section 17.2** of the book. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(value_iteration)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It takes as inputs two parameters, an MDP to solve and epsilon the maximum error allowed in the utility of any state. It returns a dictionary containing utilities where the keys are the states and values represent utilities. Let us solve the **sequencial_decision_enviornment** GridMDP." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "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": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "value_iteration(sequential_decision_environment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The pseudocode for the algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "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": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pseudocode(\"Value-Iteration\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VALUE ITERATION VISUALIZATION\n", - "\n", - "To illustrate that values propagate out of states let us create a simple visualisation. We will be using a modified version of the value_iteration function which will store U over time. We will also remove the parameter epsilon and instead add the number of iterations we want." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def value_iteration_instru(mdp, iterations=20):\n", - " U_over_time = []\n", - " U1 = {s: 0 for s in mdp.states}\n", - " R, T, gamma = mdp.R, mdp.T, mdp.gamma\n", - " for _ in range(iterations):\n", - " U = U1.copy()\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", - " U_over_time.append(U)\n", - " return U_over_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we define a function to create the visualisation from the utilities returned by **value_iteration_instru**. The reader need not concern himself with the code that immediately follows as it is the usage of Matplotib with IPython Widgets. If you are interested in reading more about these visit [ipywidgets.readthedocs.io](http://ipywidgets.readthedocs.io)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "columns = 4\n", - "rows = 3\n", - "U_over_time = value_iteration_instru(sequential_decision_environment)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from notebook import make_plot_grid_step_function\n", - "\n", - "plot_grid_step = make_plot_grid_step_function(columns, rows, U_over_time)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAATcAAADuCAYAAABcZEBhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADVdJREFUeJzt239o2/edx/HX9+prSRfbbQqLrK9d2iKzcporX2kcnyAH\nV0i8/JjbP7pL/MfcboGQXEaYYab5Y1cYgbZXzuFwmgbcCyX5xwn0D3s4P6rQMAiInKCJ/pjDgWpk\nsL6KU9zN9Vw36WK++8OKUjeO5XWW9M17zwcY/NXnY/h834hnpUh1fN8XAFjzD9U+AACUA3EDYBJx\nA2AScQNgEnEDYBJxA2AScQNgEnEDYBJxA2BSzV+zeXZW/O8MQBmtrXWqfYTg8/0VDYlXbgBMIm4A\nTCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBM\nIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwi\nbgBMCmzcfN9Xb+8BxWIRtbc/p3T6ypL7rl79RBs3tigWi6i394B831+03t/fp9paR1NTU5U4dsUw\nn9KY0f39XNL3Jf3wPuu+pAOSIpKek/TNyZ2Q1Fz4OVHGM/6tAhu3ROKcxsYySqcz6u8fUE/PviX3\n9fTs05Ej7yudzmhsLKMLF84X13K5CV28mFBT05OVOnbFMJ/SmNH9vSbp/DLr5yRlCj8Dku5M7g+S\nfiPp/ySlCr//sWyn/NsENm5nzgyrq6tbjuOora1d09PTmpy8vmjP5OR1zczMqK2tXY7jqKurWyMj\nQ8X1gwd7dOjQO3Icp9LHLzvmUxozur9/lbRumfVhSd2SHEntkqYlXZf0kaTNhb99vPD7cpGspsDG\nLZ/35LpNxWvXbVQ+7y2xp7F4HQ7f3TMyMqxw2FVLS6wyB64w5lMaM/ruPElN37huLDx2v8eDqKba\nByiHubk59fW9qaGhRLWPEkjMpzRm9OAL1Cu3gYGjisdbFY+3KhRqkOdNFNc8L6dw2F20Pxx25Xm5\n4nU+v7Anmx3T+HhW8XhM0ehT8rycNm16XjduTFbsXsqB+ZTGjFaHK2niG9e5wmP3ezyIAhW3PXv2\nK5lMK5lMa8eOlzU4eFK+7yuVuqz6+nqFQg2L9odCDaqrq1MqdVm+72tw8KS2b39J0WiLstnPNDo6\nrtHRcbluoy5duqL160NVurPVwXxKY0aro1PSSS18anpZUr2kBkkdkhJa+BDhj4XfO6p0xlIC+7a0\no2ObEomzisUiWrPmUR079kFxLR5vVTKZliQdPvye9u59TTdvfqXNm7dqy5at1TpyRTGf0pjR/XVJ\n+p2kKS38u9lvJP25sLZX0jZJZ7XwVZBHJd2Z3DpJ/ylpQ+H6DS3/wUQ1Od/+Ts9yZme18s0A/mpr\na219KlsWvr+iIQXqbSkArBbiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk\n4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTi\nBsAk4gbAJOIGwCTiBsAk4gbAJOIGwKSaah/AkrXf86t9hMCb/dKp9hECzRHPoVJWOiFeuQEwibgB\nMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEw\nibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJ\nuAEwKbBx831fvb0HFItF1N7+nNLpK0vuu3r1E23c2KJYLKLe3gPyfX/Ren9/n2prHU1NTVXi2BVz\n/vx5/eDZZxVpbtbbb799z/qtW7e0c9cuRZqbtbG9XePj48W1t956S5HmZv3g2Wf10UcfVfDUlcVz\nqJT/l/Qvkh6R9N/L7MtK2igpImmnpK8Lj98qXEcK6+PlOuh3Eti4JRLnNDaWUTqdUX//gHp69i25\nr6dnn44ceV/pdEZjYxlduHC+uJbLTejixYSamp6s1LErYn5+Xvt/8QudO3tW10ZHNXjqlK5du7Zo\nz/Hjx/X4Y4/p00xGPb/8pV4/eFCSdO3aNZ06fVqjv/+9zp87p//Yv1/z8/PVuI2y4zlUyjpJ/ZJ+\nVWLf65J6JH0q6XFJxwuPHy9cf1pYf708x/yOAhu3M2eG1dXVLcdx1NbWrunpaU1OXl+0Z3LyumZm\nZtTW1i7HcdTV1a2RkaHi+sGDPTp06B05jlPp45dVKpVSJBLRM888o4cffli7du7U8PDwoj3Dv/2t\nXn31VUnSK6+8oo8//li+72t4eFi7du7UI488oqefflqRSESpVKoat1F2PIdK+b6kDZL+cZk9vqSL\nkl4pXL8q6c58hgvXKqx/XNgfDIGNWz7vyXWbiteu26h83ltiT2PxOhy+u2dkZFjhsKuWllhlDlxB\nnuepqfHufTc2NsrzvHv3NC3Mr6amRvX19fr8888XPS5Jja57z99awXNoNXwu6TFJNYXrRkl3ZuhJ\nujPfGkn1hf3BUFN6y4Nnbm5OfX1vamgoUe2j4AHFc+jBF6hXbgMDRxWPtyoeb1Uo1CDPmyiueV5O\n4bC7aH847MrzcsXrfH5hTzY7pvHxrOLxmKLRp+R5OW3a9Lxu3Jis2L2Uk+u6msjdve9cLifXde/d\nM7Ewv9u3b+uLL77QE088sehxScp53j1/+yDjOVTKUUmthZ/8CvY/IWla0u3CdU7SnRm6ku7M97ak\nLwr7gyFQcduzZ7+SybSSybR27HhZg4Mn5fu+UqnLqq+vVyjUsGh/KNSguro6pVKX5fu+BgdPavv2\nlxSNtiib/Uyjo+MaHR2X6zbq0qUrWr8+VKU7W10bNmxQJpNRNpvV119/rVOnT6uzs3PRns4f/1gn\nTpyQJH344Yd68cUX5TiOOjs7der0ad26dUvZbFaZTEZtbW3VuI2y4DlUyn5J6cJPeAX7HUn/JunD\nwvUJSS8Vfu8sXKuw/mJhfzAE9m1pR8c2JRJnFYtFtGbNozp27IPiWjzeqmQyLUk6fPg97d37mm7e\n/EqbN2/Vli1bq3XkiqmpqdG7R46o40c/0vz8vH7+s58pGo3qjTfe0AsvvKDOzk7t3r1bP+3uVqS5\nWevWrdOpwUFJUjQa1b//5Cf6p2hUNTU1Ovruu3rooYeqfEflwXOolElJL0ia0cLrnP+RdE1SnaRt\nkv5XCwH8L0m7JP1a0j9L2l34+92SfqqFr4Ksk3Sqgmcvzfn2d3qWMzsboI9CAmjt9xhPKbNfBue/\n7EFUW1vtEwSf76/s5WGg3pYCwGohbgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwi\nbgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJu\nAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEyqqfYBLJn90qn2EfCA+9Ofqn0CO3jlBsAk4gbAJOIG\nwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbA\nJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk4gbAJOIGwCTiBsAk\n4gbApMDGzfd99fYeUCwWUXv7c0qnryy57+rVT7RxY4tisYh6ew/I9/1F6/39faqtdTQ1NVWJY1cM\n8ymNGS3P+nwCG7dE4pzGxjJKpzPq7x9QT8++Jff19OzTkSPvK53OaGwsowsXzhfXcrkJXbyYUFPT\nk5U6dsUwn9KY0fKszyewcTtzZlhdXd1yHEdtbe2anp7W5OT1RXsmJ69rZmZGbW3tchxHXV3dGhkZ\nKq4fPNijQ4fekeM4lT5+2TGf0pjR8qzPJ7Bxy+c9uW5T8dp1G5XPe0vsaSxeh8N394yMDCscdtXS\nEqvMgSuM+ZTGjJZnfT411T5AOczNzamv700NDSWqfZRAYj6lMaPlPQjzCdQrt4GBo4rHWxWPtyoU\napDnTRTXPC+ncNhdtD8cduV5ueJ1Pr+wJ5sd0/h4VvF4TNHoU/K8nDZtel43bkxW7F7KgfmUxoyW\n9/c0n0DFbc+e/Uom00om09qx42UNDp6U7/tKpS6rvr5eoVDDov2hUIPq6uqUSl2W7/saHDyp7dtf\nUjTaomz2M42Ojmt0dFyu26hLl65o/fpQle5sdTCf0pjR8v6e5hPYt6UdHduUSJxVLBbRmjWP6tix\nD4pr8Xirksm0JOnw4fe0d+9runnzK23evFVbtmyt1pErivmUxoyWZ30+zre/s7Kc2VmtfDMAlMHa\ntVrRR7OBelsKAKuFuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4\nATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgBMIm4ATCJuAEwibgB\nMIm4ATCJuAEwibgBMIm4ATDJ8X2/2mcAgFXHKzcAJhE3ACYRNwAmETcAJhE3ACYRNwAmETcAJhE3\nACYRNwAmETcAJv0F9s8EDYqi1wAAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Widget Javascript not detected. It may not be installed or enabled properly.\n" - ] - }, - { - "data": {}, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import ipywidgets as widgets\n", - "from IPython.display import display\n", - "from notebook import make_visualize\n", - "\n", - "iteration_slider = widgets.IntSlider(min=1, max=15, step=1, value=0)\n", - "w=widgets.interactive(plot_grid_step,iteration=iteration_slider)\n", - "display(w)\n", - "\n", - "visualize_callback = make_visualize(iteration_slider)\n", - "\n", - "visualize_button = widgets.ToggleButton(desctiption = \"Visualize\", value = False)\n", - "time_select = widgets.ToggleButtons(description='Extra Delay:',options=['0', '0.1', '0.2', '0.5', '0.7', '1.0'])\n", - "a = widgets.interactive(visualize_callback, Visualize = visualize_button, time_step=time_select)\n", - "display(a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Move the slider above to observe how the utility changes across iterations. It is also possible to move the slider using arrow keys or to jump to the value by directly editing the number with a double click. The **Visualize Button** will automatically animate the slider for you. The **Extra Delay Box** allows you to set time delay in seconds upto one second for each time step." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - }, - "widgets": { - "state": { - "001e6c8ed3fc4eeeb6ab7901992314dd": { - "views": [] - }, - "00f29880456846a8854ab515146ec55b": { - "views": [] - }, - "010f52f7cde545cba25593839002049b": { - "views": [] - }, - "01473ad99aa94acbaca856a7d980f2b9": { - "views": [] - }, - "021a4a4f35da484db5c37c5c8d0dbcc2": { - "views": [] - }, - "02229be5d3bc401fad55a0378977324a": { - "views": [] - }, - "022a5fdfc8e44fb09b21c4bd5b67a0db": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "025c3b0250b94d4c8d9b33adfdba4c15": { - "views": [] - }, - "028f96abfed644b8b042be1e4b16014d": { - "views": [] - }, - "0303bad44d404a1b9ad2cc167e42fcb7": { - "views": [] - }, - "031d2d17f32347ec83c43798e05418fe": { - "views": [] - }, - "03de64f0c2fd43f1b3b5d84aa265aeb7": { - "views": [] - }, - "03fdd484675b42ad84448f64c459b0e0": { - "views": [] - }, - "044cf74f03fd44fd840e450e5ee0c161": { - "views": [] - }, - "054ae5ba0a014a758de446f1980f1ba5": { - "views": [] - }, - "0675230fb92f4539bc257b768fb4cd10": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "06c93b34e1f4424aba9a0b172c428260": { - "views": [] - }, - "077a5ea324be46c3ad0110671a0c6a12": { - "views": [] - }, - "0781138d150142a08775861a69beaec9": { - "views": [] - }, - "0783e74a8c2b40cc9b0f5706271192f4": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "07c7678b73634e728085f19d7b5b84f7": { - "views": [] - }, - "07febf1d15a140d8adb708847dd478ec": { - "views": [] - }, - "08299b681cd9477f9b19a125e186ce44": { - "views": [] - }, - "083af89d82e445aab4abddfece61d700": { - "views": [] - }, - "08a1129a8bd8486bbfe2c9e49226f618": { - "views": [] - }, - "08a2f800c0d540fdb24015156c7ffc15": { - "views": [] - }, - "097d8d0feccc4c76b87bbcb3f1ecece7": { - "views": [] - }, - "098f12158d844cdf89b29a4cd568fda0": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "09e96f9d5d32453290af60fbd29ca155": { - "views": [] - }, - "0a2ec7c49dcd4f768194483c4f2e8813": { - "views": [] - }, - "0b1d6ed8fe4144b8a24228e1befe2084": { - "views": [] - }, - "0b299f8157d24fa9830653a394ef806a": { - "views": [] - }, - "0b2a4ac81a244ff1a7b313290465f8f4": { - "views": [] - }, - "0b52cfc02d604bc2ae42f4ba8c7bca4f": { - "views": [] - }, - "0b65fb781274495ab498ad518bc274d4": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "1aff6a6e15b34bb89d7579d445071230": { - "views": [] - }, - "1b1ea7e915d846aea9efeae4381b2c48": { - "views": [] - }, - "1ba02ae1967740b0a69e07dbe95635cb": { - "views": [] - }, - "1c5c913acbde4e87a163abb2e24e6e38": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "1cfca0b7ef754c459e1ad97c1f0ceb3b": { - "views": [] - }, - "1d8f6a4910e649589863b781aab4c4d4": { - "views": [] - }, - "1e64b8f5a1554a22992693c194f7b971": { - "views": [] - }, - "1e8f0a2bf7614443a380e53ed27b48c0": { - "views": [] - }, - "1f4e6fa4bacc479e8cd997b26a5af733": { - "views": [] - }, - "1fdf09158eb44415a946f07c6aaba620": { - "views": [] - }, - "200e3ebead3d4858a47e2f6d345ca395": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "2dc514cc2f5547aeb97059a5070dc9e3": { - "views": [] - }, - "2e1351ad05384d058c90e594bc6143c1": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "2e9b80fa18984615933e41c1c1db2171": { - "views": [] - }, - "2ef17ee6b7c74a4bbbbbe9b1a93e4fb6": { - "views": [] - }, - "2f5438f1b34046a597a467effd43df11": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "31fc8165275e473f8f75c6215b5184ff": { - "views": [] - }, - "329f12edaa0c44d2a619450f188e8777": { - "views": [] - }, - "32edf057582f4a6ca30ce3cb685bf971": { - "views": [] - }, - "330e74773ba148e18674cfa3e63cd6cc": { - "views": [] - }, - "332a89c03bfb49c2bb291051d172b735": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "3974e38e718547efaf0445da2be6a739": { - "views": [] - }, - "398490e0cc004d22ac9c4486abec61e1": { - "views": [] - }, - "399875994aba4c53afa8c49fae8d369e": { - "views": [] - }, - "39b64aa04b1d4a81953e43def0ef6e10": { - "views": [] - }, - "39ffc3dd42d94a27ba7240d10c11b565": { - "views": [] - }, - "3a21291c8e7249e3b04417d31b0447cf": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "3a377d9f46704d749c6879383c89f5d3": { - "views": [] - }, - "3a44a6f1f62742849e96d957033a0039": { - "views": [] - }, - "3b22d68709b046e09fe70f381a3944cd": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "3b329209c8f547acae1925dc3eb4af77": { - "views": [] - }, - "3c1b2ec10a9041be8a3fad9da78ff9f6": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "3c2be3c85c6d41268bb4f9d63a43e196": { - "views": [] - }, - "3c6796eff7c54238a7b7776e88721b08": { - "views": [] - }, - "3cbca3e11edf439fb7f8ba41693b4824": { - "views": [] - }, - "3d4b6b7c0b0c48ff8c4b8d78f58e0f1c": { - "views": [] - }, - "3de1faf0d2514f49a99b3d60ea211495": { - "views": [] - }, - "3df60d9ac82b42d9b885d895629e372e": { - "views": [] - }, - "3e5b9fd779574270bf58101002c152ce": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "3e80f34623c94659bfab5b3b56072d9a": { - "views": [] - }, - "3e8bb05434cb4a0291383144e4523840": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "42a47243baf34773943a25df9cf23854": { - "views": [] - }, - "4343b72c91d04a7c9a6080f30fc63d7d": { - "views": [] - }, - "43488264fc924c01a30fa58604074b07": { - "views": [] - }, - "4379175239b34553bf45c8ef9443ac55": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "43859798809a4a289c58b4bd5e49d357": { - "views": [] - }, - "43ad406a61a34249b5622aba9450b23d": { - "views": [] - }, - "4421c121414d464bb3bf1b5f0e86c37b": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "445cc08b4da44c2386ac9379793e3506": { - "views": [] - }, - "447cff7e256c434e859bb7ce9e5d71c8": { - "views": [] - }, - "44af7da9d8304f07890ef7d11a9f95fe": { - "views": [] - }, - "45021b6f05db4c028a3b5572bc85217f": { - "views": [] - }, - "457768a474844556bf9b215439a2f2e9": { - "views": [] - }, - "45d5689de53646fe9042f3ce9e281acc": { - "views": [] - }, - "461aa21d57824526a6b61e3f9b5af523": { - "views": [] - }, - "472ca253aab34b098f53ed4854d35f23": { - "views": [] - }, - "4731208453424514b471f862804d9bb8": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "4d85e68205d94965bdb437e5441b10a1": { - "views": [] - }, - "4e0e6dd34ba7487ba2072d352fe91bf5": { - "views": [] - }, - "4e82b1d731dd419480e865494f932f80": { - "views": [] - }, - "4e9f52dea051415a83c4597c4f7a6c00": { - "views": [] - }, - "4ec035cba73647358d416615cf4096ee": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "4f09442f99aa4a9e9f460f82a50317c4": { - "views": [] - }, - "4f80b4e6b074475698efbec6062e3548": { - "views": [] - }, - "4f905a287b4f4f0db64b9572432b0139": { - "views": [] - }, - "50a339306cd549de86fbe5fa2a0a3503": { - "views": [] - }, - "51068697643243e18621c888a6504434": { - "views": [] - }, - "51333b89f44b41aba813aef099bdbb42": { - "views": [] - }, - "5141ae07149b46909426208a30e2861e": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "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.0 - } - ] - }, - "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.0 - } - ] - }, - "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.0 - } - ] - }, - "6455faf9dbc6477f8692528e6eb90c9a": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "64ca99573d5b48d2ba4d5815a50e6ffe": { - "views": [] - }, - "65d7924ba8c44d3f98a1d2f02dc883f1": { - "views": [] - }, - "665ed2b201144d78a5a1f57894c2267c": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "6a74dc52c2a54837a64ad461e174d4e0": { - "views": [] - }, - "6ad1e0bf705141b3b6e6ab7bd6f842ea": { - "views": [] - }, - "6b37935db9f44e6087d1d262a61d54ac": { - "views": [] - }, - "6b402f0f3afb4d0dad0e2fa8b71aa890": { - "views": [] - }, - "6bc95be59a054979b142d2d4a8900cf2": { - "views": [] - }, - "6ce0ea52c2fc4a18b1cce33933df2be4": { - "views": [] - }, - "6d7effd6bc4c40a4b17bf9e136c5814c": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "72e8d31709eb4e3ea28af5cb6d072ab2": { - "views": [] - }, - "73647a1287424ee28d2fb3c4471d720c": { - "views": [] - }, - "739c5dde541a41e1afae5ba38e4b8ee3": { - "views": [] - }, - "74187cc424a347a5aa73b8140772ec68": { - "views": [] - }, - "7418edf751a6486c9fae373cde30cb74": { - "views": [] - }, - "744302ec305b4405894ed1459b9d41d0": { - "views": [] - }, - "74dfbaa15be44021860f7ba407810255": { - "views": [] - }, - "750a30d80fd740aaabc562c0564f02a7": { - "views": [] - }, - "75e344508b0b45d1a9ae440549d95b1a": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "7f4688756da74b369366c22fd99657f4": { - "views": [] - }, - "7f7ed281359f4a55bbe75ce841dd1453": { - "views": [] - }, - "7fdf429182a740a097331bddad58f075": { - "views": [] - }, - "81b312df679f4b0d8944bc680a0f517e": { - "views": [] - }, - "82036e8fa76544ae847f2c2fc3cf72c2": { - "views": [] - }, - "821f1041188a43a4be4bdaeb7fa2f201": { - "views": [] - }, - "827358a9b4ce49de802df37b7b673aea": { - "views": [] - }, - "82db288a0693422cbd846cc3cb5f0415": { - "views": [] - }, - "82e2820c147a4dff85a01bcddbad8645": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "8db2abcad8bc44df812d6ccf2d2d713c": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "8dd5216b361c44359ba1233ee93683a4": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "936bc7eb12e244c196129358a16e14bb": { - "views": [] - }, - "936c09f4dde8440b91e9730a0212497c": { - "views": [] - }, - "9406b6ae7f944405a0e8a22f745a39b2": { - "views": [] - }, - "942a96eea03740719b28fcc1544284d4": { - "views": [] - }, - "94840e902ffe4bbba5b374ff4d26f19f": { - "views": [] - }, - "948d01f0901545d38e05f070ce4396e4": { - "views": [] - }, - "94e2a0bc2d724f7793bb5b6d25fc7088": { - "views": [] - }, - "94f2b877a79142839622a61a3a081c03": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "94f30801a94344129363c8266bf2e1f8": { - "views": [] - }, - "95b127e8aff34a76a813783a6a3c6369": { - "views": [] - }, - "95d44119bf714e42b163512d9a15bbc5": { - "views": [] - }, - "95f016e9ea9148a4a3e9f04cb8f5132d": { - "views": [] - }, - "968e9e9de47646409744df3723e87845": { - "views": [] - }, - "97207358fc65430aa196a7ed78b252f0": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "9768d539ee4044dc94c0bd5cfb827a18": { - "views": [] - }, - "98587702cc55456aa881daf879d2dc8d": { - "views": [] - }, - "986c6c4e92964759903d6eb7f153df8a": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "9d7aa65511b6482d9587609ad7898f54": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "9d87f94baf454bd4b529e55e0792a696": { - "views": [] - }, - "9de4bd9c6a7b4f3dbd401df15f0b9984": { - "views": [] - }, - "9dfd6b08a2574ed89f0eb084dae93f73": { - "views": [] - }, - "9e1dffcb1d9d48aaafa031da2fb5fed9": { - "views": [] - }, - "9efb46d2bb0648f6b109189986f4f102": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "9f1439500d624f769dd5e5c353c46866": { - "views": [] - }, - "9f27ba31ccc947b598dc61aefca16a7f": { - "views": [] - }, - "9f31a58b6e8e4c79a92cf65c497ee000": { - "views": [] - }, - "9f43f85a0fb9464e9b7a25a85f6dba9c": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "9f4970dc472946d48c14e93e7f4d4b70": { - "views": [] - }, - "9f5dd25217a84799b72724b2a37281ea": { - "views": [] - }, - "9faa50b44e1842e0acac301f93a129c4": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "a0202917348d4c41a176d9871b65b168": { - "views": [] - }, - "a058f021f4ca4daf8ab830d8542bf90b": { - "views": [] - }, - "a0a2dded995543a6b68a67cd91baa252": { - "views": [] - }, - "a0e170b3ea484fd984985d2607f90ef3": { - "views": [] - }, - "a168e79f4cbb44c8ac7214db964de5f2": { - "views": [] - }, - "a182b774272b48238b55e3c4d40e6152": { - "views": [] - }, - "a1840ca22d834df2b145151baf6d8241": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "a55227f2fd5d42729fc4fd39a8c11914": { - "views": [] - }, - "a65af2c8506d47ec803c15815e2ab445": { - "views": [] - }, - "a6d2366540004eeaab760c8be196f10a": { - "views": [] - }, - "a709f15a981a468b9471a0f672f961a7": { - "views": [] - }, - "a7258472ad944d038cd227de28d9155f": { - "views": [] - }, - "a72eb43242c34ef19399c52a77da8830": { - "views": [] - }, - "a7568aed621548649e37cfa6423ca198": { - "views": [] - }, - "a83f7f5c09a845ecb3f5823c1d178a54": { - "views": [] - }, - "a87c651448f14ce4958d73c2f1e413e1": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "b821a13ce3e8453d85f07faccc95fee1": { - "views": [] - }, - "b86ea9c1f1ee45a380e35485ad4e2fac": { - "views": [] - }, - "b87f4d4805944698a0011c10d626726c": { - "views": [] - }, - "b8e173c7c8be41df9161cbbe2c4c6c86": { - "views": [] - }, - "b9322adcd8a241478e096aa1df086c78": { - "views": [] - }, - "b9ad471398784b6889ce7a1d2ef5c4c0": { - "views": [] - }, - "b9c138598fce460692cc12650375ee52": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "ba146eb955754db88ba6c720e14ea030": { - "views": [] - }, - "ba48cba009e8411ea85c7e566a47a934": { - "views": [] - }, - "bb2793de83a64688b61a2007573a8110": { - "views": [] - }, - "bb53891d7f514a17b497f699484c9aed": { - "views": [] - }, - "bbe5dea9d57d466ba4e964fce9af13cf": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "bbe88faf528d44a0a9083377d733d66a": { - "views": [] - }, - "bc0525d022404722a921132e61319e46": { - "views": [] - }, - "bc320fb35f5744cc82486b85f7a53b6f": { - "views": [] - }, - "bc900e9562c546f9ae3630d5110080ec": { - "views": [] - }, - "bcbf6b3ff19d4eb5aa1b8a57672d7f6f": { - "views": [] - }, - "bccf183ccb0041e380732005f2ca2d0a": { - "views": [] - }, - "bd0d18e3441340a7a56403c884c87a8e": { - "views": [] - }, - "bd21e4fe92614c22a76ae515077d2d11": { - "views": [] - }, - "bd5b05203cfd402596a6b7f076c4a8f8": { - "views": [] - }, - "beb0c9b29d8d4d69b3147af666fa298b": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "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.0 - } - ] - }, - "ce6ad0459f654b6785b3a71ccdf05063": { - "views": [] - }, - "ce8d3cd3535b459c823da2f49f3cc526": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "d88a0305cc224037a14e5040ed8e13af": { - "views": [] - }, - "d89b81d63c6048ff800d3380bf921ac0": { - "views": [] - }, - "d8d8667ab50944e4b066d648aa3c8e2a": { - "views": [] - }, - "d8fd2b5ef6e24628b2b5102d3cd375f3": { - "views": [] - }, - "d9579a126d5f44a3bc0a731e0ad55f24": { - "views": [] - }, - "da51bd4d4fd848699919e3973b2fabc2": { - "views": [] - }, - "dba5a5a8fec346b2bcdc88f4ce294550": { - "views": [] - }, - "dc201c38ac434cb8a424553f1fa5a791": { - "views": [] - }, - "dc631df85ae84ffc964acd7a76e399ce": { - "views": [] - }, - "dc7376a2272e44179f237e5a1c7f6a49": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "e516fd8ebfc6478c95130d6edec77c88": { - "views": [] - }, - "e5afb8d0e8a94c4dac18f2bbf1d042ce": { - "views": [] - }, - "e5bcb13bf2e94afc857bcbb37f6d4d87": { - "views": [] - }, - "e64ab85e80184b70b69d01a9c6851943": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "f2d40a380f884b1b95992ccc7c3df04e": { - "views": [] - }, - "f2e2e2e5177542aa9e5ca3d69508fb89": { - "views": [] - }, - "f31914f694384908bec466fc2945f1c7": { - "views": [] - }, - "f31cbea99df94f2281044c369ef1962d": { - "views": [] - }, - "f32c6c5551f540709f7c7cd9078f1aad": { - "views": [] - }, - "f337eb824d654f0fbd688e2db3c5bf7b": { - "views": [] - }, - "f36f776a7767495cbda2f649c2b3dd48": { - "views": [] - }, - "f3cef080253c46989413aad84b478199": { - "views": [] - }, - "f3df35ce53e0466e81a48234b36a1430": { - "views": [ - { - "cell_index": 27.0 - } - ] - }, - "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.0 - } - ] - }, - "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, - "nbformat_minor": 1 -} diff --git a/mdp.py b/mdp.py deleted file mode 100644 index 6637108e5..000000000 --- a/mdp.py +++ /dev/null @@ -1,194 +0,0 @@ -"""Markov Decision Processes (Chapter 17) - -First we define an MDP, and the special case of a GridMDP, in which -states are laid out in a 2-dimensional grid. We also represent a policy -as a dictionary of {state:action} pairs, and a Utility function as a -dictionary of {state:number} pairs. We then define the value_iteration -and policy_iteration algorithms.""" - -from utils import argmax, vector_add, orientations, turn_right, turn_left - -import random - - -class MDP: - - """A Markov Decision Process, defined by an initial state, transition model, - and reward function. We also keep track of a gamma value, for use by - algorithms. The transition model is represented somewhat differently from - the text. Instead of P(s' | s, a) being a probability number for each - state/state/action triplet, we instead have T(s, a) return a - list of (p, s') pairs. We also keep track of the possible states, - terminal states, and actions for each state. [page 646]""" - - def __init__(self, init, actlist, terminals, transitions={}, states=None, gamma=.9): - if not (0 < gamma <= 1): - raise ValueError("An MDP must have 0 < gamma <= 1") - - if states: - self.states = states - else: - self.states = set() - self.init = init - self.actlist = actlist - self.terminals = terminals - self.transitions = transitions - self.gamma = gamma - self.reward = {} - - def R(self, state): - """Return a numeric reward for this state.""" - return self.reward[state] - - def T(self, state, action): - """Transition model. From a state and an action, return a list - of (probability, result-state) pairs.""" - if(self.transitions == {}): - raise ValueError("Transition model is missing") - else: - return self.transitions[state][action] - - def actions(self, state): - """Set of actions that can be performed in this state. By default, a - fixed list of actions, except for terminal states. Override this - method if you need to specialize by state.""" - if state in self.terminals: - return [None] - else: - return self.actlist - - -class GridMDP(MDP): - - """A two-dimensional grid MDP, as in [Figure 17.1]. All you have to do is - specify the grid as a list of lists of rewards; use None for an obstacle - (unreachable state). Also, you should specify the terminal states. - An action is an (x, y) unit vector; e.g. (1, 0) means move east.""" - - def __init__(self, grid, terminals, init=(0, 0), gamma=.9): - grid.reverse() # because we want row 0 on bottom, not on top - MDP.__init__(self, init, actlist=orientations, - terminals=terminals, gamma=gamma) - self.grid = grid - self.rows = len(grid) - self.cols = len(grid[0]) - for x in range(self.cols): - for y in range(self.rows): - self.reward[x, y] = grid[y][x] - if grid[y][x] is not None: - self.states.add((x, y)) - - def T(self, state, action): - if action is None: - return [(0.0, state)] - else: - return [(0.8, self.go(state, action)), - (0.1, self.go(state, turn_right(action))), - (0.1, self.go(state, turn_left(action)))] - - def go(self, state, direction): - """Return the state that results from going in this direction.""" - state1 = vector_add(state, direction) - return state1 if state1 in self.states else state - - def to_grid(self, mapping): - """Convert a mapping from (x, y) to v into a [[..., v, ...]] grid.""" - return list(reversed([[mapping.get((x, y), None) - for x in range(self.cols)] - for y in range(self.rows)])) - - def to_arrows(self, policy): - chars = { - (1, 0): '>', (0, 1): '^', (-1, 0): '<', (0, -1): 'v', None: '.'} - return self.to_grid({s: chars[a] for (s, a) in policy.items()}) - -# ______________________________________________________________________________ - - -""" [Figure 17.1] -A 4x3 grid environment that presents the agent with a sequential decision problem. -""" - -sequential_decision_environment = GridMDP([[-0.04, -0.04, -0.04, +1], - [-0.04, None, -0.04, -1], - [-0.04, -0.04, -0.04, -0.04]], - terminals=[(3, 2), (3, 1)]) - -# ______________________________________________________________________________ - - -def value_iteration(mdp, epsilon=0.001): - """Solving an MDP by value iteration. [Figure 17.4]""" - U1 = {s: 0 for s in mdp.states} - R, T, gamma = mdp.R, mdp.T, mdp.gamma - while True: - U = U1.copy() - delta = 0 - for s in mdp.states: - U1[s] = R(s) + gamma * max([sum([p * U[s1] for (p, s1) in T(s, a)]) - for a in mdp.actions(s)]) - delta = max(delta, abs(U1[s] - U[s])) - if delta < epsilon * (1 - gamma) / gamma: - return U - - -def best_policy(mdp, U): - """Given an MDP and a utility function U, determine the best policy, - as a mapping from state to action. (Equation 17.4)""" - pi = {} - for s in mdp.states: - pi[s] = argmax(mdp.actions(s), key=lambda a: expected_utility(a, s, U, mdp)) - return pi - - -def expected_utility(a, s, U, mdp): - """The expected utility of doing a in state s, according to the MDP and U.""" - return sum([p * U[s1] for (p, s1) in mdp.T(s, a)]) - -# ______________________________________________________________________________ - - -def policy_iteration(mdp): - """Solve an MDP by policy iteration [Figure 17.7]""" - U = {s: 0 for s in mdp.states} - pi = {s: random.choice(mdp.actions(s)) for s in mdp.states} - while True: - U = policy_evaluation(pi, U, mdp) - unchanged = True - for s in mdp.states: - a = argmax(mdp.actions(s), key=lambda a: expected_utility(a, s, U, mdp)) - if a != pi[s]: - pi[s] = a - unchanged = False - if unchanged: - return pi - - -def policy_evaluation(pi, U, mdp, k=20): - """Return an updated utility mapping U from each state in the MDP to its - utility, using an approximation (modified policy iteration).""" - R, T, gamma = mdp.R, mdp.T, mdp.gamma - for i in range(k): - for s in mdp.states: - U[s] = R(s) + gamma * sum([p * U[s1] for (p, s1) in T(s, pi[s])]) - return U - - -__doc__ += """ ->>> pi = best_policy(sequential_decision_environment, value_iteration(sequential_decision_environment, .01)) - ->>> sequential_decision_environment.to_arrows(pi) -[['>', '>', '>', '.'], ['^', None, '^', '.'], ['^', '>', '^', '<']] - ->>> from utils import print_table - ->>> print_table(sequential_decision_environment.to_arrows(pi)) -> > > . -^ None ^ . -^ > ^ < - ->>> print_table(sequential_decision_environment.to_arrows(policy_iteration(sequential_decision_environment))) -> > > . -^ None ^ . -^ > ^ < -""" # noqa diff --git a/neural_nets.ipynb b/neural_nets.ipynb deleted file mode 100644 index a6bb6f43b..000000000 --- a/neural_nets.ipynb +++ /dev/null @@ -1,236 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# NEURAL NETWORKS\n", - "\n", - "This notebook covers the neural network algorithms from chapter 18 of the book *Artificial Intelligence: A Modern Approach*, by Stuart Russel and Peter Norvig. The code in the notebook can be found in [learning.py](https://github.com/aimacode/aima-python/blob/master/learning.py).\n", - "\n", - "Execute the below cell to get started:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from learning import *\n", - "\n", - "from notebook import psource, pseudocode" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NEURAL NETWORK ALGORITHM\n", - "\n", - "### Overview\n", - "\n", - "Although the Perceptron may seem like a good way to make classifications, it is a linear classifier (which, roughly, means it can only draw straight lines to divide spaces) and therefore it can be stumped by more complex problems. We can extend Perceptron to solve this issue, by employing multiple layers of its functionality. The construct we are left with is called a Neural Network, or a Multi-Layer Perceptron, and it is a non-linear classifier. It achieves that by combining the results of linear functions on each layer of the network.\n", - "\n", - "Similar to the Perceptron, this network also has an input and output layer. However it can also have a number of hidden layers. These hidden layers are responsible for the non-linearity of the network. The layers are comprised of nodes. Each node in a layer (excluding the input one), holds some values, called *weights*, and takes as input the output values of the previous layer. The node then calculates the dot product of its inputs and its weights and then activates it with an *activation function* (sometimes a sigmoid). Its output is fed to the nodes of the next layer. Note that sometimes the output layer does not use an activation function, or uses a different one from the rest of the network. The process of passing the outputs down the layer is called *feed-forward*.\n", - "\n", - "After the input values are fed-forward into the network, the resulting output can be used for classification. The problem at hand now is how to train the network (ie. adjust the weights in the nodes). To accomplish that we utilize the *Backpropagation* algorithm. In short, it does the opposite of what we were doing up to now. Instead of feeding the input forward, it will feed the error backwards. So, after we make a classification, we check whether it is correct or not, and how far off we were. We then take this error and propagate it backwards in the network, adjusting the weights of the nodes accordingly. We will run the algorithm on the given input/dataset for a fixed amount of time, or until we are satisfied with the results. The number of times we will iterate over the dataset is called *epochs*. In a later section we take a detailed look at how this algorithm works.\n", - "\n", - "NOTE: Sometimes we add to the input of each layer another node, called *bias*. This is a constant value that will be fed to the next layer, usually set to 1. The bias generally helps us \"shift\" the computed function to the left or right." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![neural_net](images/neural_net.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "The `NeuralNetLearner` function takes as input a dataset to train upon, the learning rate (in (0, 1]), the number of epochs and finally the size of the hidden layers. This last argument is a list, with each element corresponding to one hidden layer.\n", - "\n", - "After that we will create our neural network in the `network` function. This function will make the necessary connections between the input layer, hidden layer and output layer. With the network ready, we will use the `BackPropagationLearner` to train the weights of our network for the examples provided in the dataset.\n", - "\n", - "The NeuralNetLearner returns the `predict` function which, in short, can receive an example and feed-forward it into our network to generate a prediction.\n", - "\n", - "In more detail, the example values are first passed to the input layer and then they are passed through the rest of the layers. Each node calculates the dot product of its inputs and its weights, activates it and pushes it to the next layer. The final prediction is the node with the maximum value from the output layer." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(NeuralNetLearner)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BACKPROPAGATION\n", - "\n", - "### Overview\n", - "\n", - "In both the Perceptron and the Neural Network, we are using the Backpropagation algorithm to train our weights. Basically it achieves that by propagating the errors from our last layer into our first layer, this is why it is called Backpropagation. In order to use Backpropagation, we need a cost function. This function is responsible for indicating how good our neural network is for a given example. One common cost function is the *Mean Squared Error* (MSE). This cost function has the following format:\n", - "\n", - "$$MSE=\\frac{1}{2} \\sum_{i=1}^{n}(y - \\hat{y})^{2}$$\n", - "\n", - "Where `n` is the number of training examples, $\\hat{y}$ is our prediction and $y$ is the correct prediction for the example.\n", - "\n", - "The algorithm combines the concept of partial derivatives and the chain rule to generate the gradient for each weight in the network based on the cost function.\n", - "\n", - "For example, if we are using a Neural Network with three layers, the sigmoid function as our activation function and the MSE cost function, we want to find the gradient for the a given weight $w_{j}$, we can compute it like this:\n", - "\n", - "$$\\frac{\\partial MSE(\\hat{y}, y)}{\\partial w_{j}} = \\frac{\\partial MSE(\\hat{y}, y)}{\\partial \\hat{y}}\\times\\frac{\\partial\\hat{y}(in_{j})}{\\partial in_{j}}\\times\\frac{\\partial in_{j}}{\\partial w_{j}}$$\n", - "\n", - "Solving this equation, we have:\n", - "\n", - "$$\\frac{\\partial MSE(\\hat{y}, y)}{\\partial w_{j}} = (\\hat{y} - y)\\times{\\hat{y}}'(in_{j})\\times a_{j}$$\n", - "\n", - "Remember that $\\hat{y}$ is the activation function applied to a neuron in our hidden layer, therefore $$\\hat{y} = sigmoid(\\sum_{i=1}^{num\\_neurons}w_{i}\\times a_{i})$$\n", - "\n", - "Also $a$ is the input generated by feeding the input layer variables into the hidden layer.\n", - "\n", - "We can use the same technique for the weights in the input layer as well. After we have the gradients for both weights, we use gradient descent to update the weights of the network." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pseudocode" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "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" - } - ], - "source": [ - "pseudocode('Back-Prop-Learning')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "First, we feed-forward the examples in our neural network. After that, we calculate the gradient for each layer weights. Once that is complete, we update all the weights using gradient descent. After running these for a given number of epochs, the function returns the trained Neural Network." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(BackPropagationLearner)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n" - ] - } - ], - "source": [ - "iris = DataSet(name=\"iris\")\n", - "iris.classes_to_numbers()\n", - "\n", - "nNL = NeuralNetLearner(iris)\n", - "print(nNL([5, 3, 1, 0.1]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output should be 0, which means the item should get classified in the first class, \"setosa\". Note that since the algorithm is non-deterministic (because of the random initial weights) the classification might be wrong. Usually though it should be correct.\n", - "\n", - "To increase accuracy, you can (most of the time) add more layers and nodes. Unfortunately the more layers and nodes you have, the greater the computation cost." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/nlp.ipynb b/nlp.ipynb deleted file mode 100644 index f95d8283c..000000000 --- a/nlp.ipynb +++ /dev/null @@ -1,1042 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# NATURAL LANGUAGE PROCESSING\n", - "\n", - "This notebook covers chapters 22 and 23 from the book *Artificial Intelligence: A Modern Approach*, 3rd Edition. The implementations of the algorithms can be found in [nlp.py](https://github.com/aimacode/aima-python/blob/master/nlp.py).\n", - "\n", - "Run the below cell to import the code from the module and get started!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import nlp\n", - "from nlp import Page, HITS\n", - "from nlp import Lexicon, Rules, Grammar, ProbLexicon, ProbRules, ProbGrammar\n", - "from nlp import CYK_parse, Chart\n", - "\n", - "from notebook import psource" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## CONTENTS\n", - "\n", - "* Overview\n", - "* Languages\n", - "* HITS\n", - "* Question Answering\n", - "* CYK Parse\n", - "* Chart Parsing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OVERVIEW\n", - "\n", - "**Natural Language Processing (NLP)** is a field of AI concerned with understanding, analyzing and using natural languages. This field is considered a difficult yet intriguing field of study, since it is connected to how humans and their languages work.\n", - "\n", - "Applications of the field include translation, speech recognition, topic segmentation, information extraction and retrieval, and a lot more.\n", - "\n", - "Below we take a look at some algorithms in the field. Before we get right into it though, we will take a look at a very useful form of language, **context-free** languages. Even though they are a bit restrictive, they have been used a lot in research in natural language processing." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LANGUAGES\n", - "\n", - "Languages can be represented by a set of grammar rules over a lexicon of words. Different languages can be represented by different types of grammar, but in Natural Language Processing we are mainly interested in context-free grammars.\n", - "\n", - "### Context-Free Grammars\n", - "\n", - "A lot of natural and programming languages can be represented by a **Context-Free Grammar (CFG)**. A CFG is a grammar that has a single non-terminal symbol on the left-hand side. That means a non-terminal can be replaced by the right-hand side of the rule regardless of context. An example of a CFG:\n", - "\n", - "```\n", - "S -> aSb | ε\n", - "```\n", - "\n", - "That means `S` can be replaced by either `aSb` or `ε` (with `ε` we denote the empty string). The lexicon of the language is comprised of the terminals `a` and `b`, while with `S` we denote the non-terminal symbol. In general, non-terminals are capitalized while terminals are not, and we usually name the starting non-terminal `S`. The language generated by the above grammar is the language anbn for n greater or equal than 1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Probabilistic Context-Free Grammar\n", - "\n", - "While a simple CFG can be very useful, we might want to know the chance of each rule occuring. Above, we do not know if `S` is more likely to be replaced by `aSb` or `ε`. **Probabilistic Context-Free Grammars (PCFG)** are built to fill exactly that need. Each rule has a probability, given in brackets, and the probabilities of a rule sum up to 1:\n", - "\n", - "```\n", - "S -> aSb [0.7] | ε [0.3]\n", - "```\n", - "\n", - "Now we know it is more likely for `S` to be replaced by `aSb` than by `e`.\n", - "\n", - "An issue with *PCFGs* is how we will assign the various probabilities to the rules. We could use our knowledge as humans to assign the probabilities, but that is a laborious and prone to error task. Instead, we can *learn* the probabilities from data. Data is categorized as labeled (with correctly parsed sentences, usually called a **treebank**) or unlabeled (given only lexical and syntactic category names).\n", - "\n", - "With labeled data, we can simply count the occurences. For the above grammar, if we have 100 `S` rules and 30 of them are of the form `S -> ε`, we assign a probability of 0.3 to the transformation.\n", - "\n", - "With unlabeled data we have to learn both the grammar rules and the probability of each rule. We can go with many approaches, one of them the **inside-outside** algorithm. It uses a dynamic programming approach, that first finds the probability of a substring being generated by each rule, and then estimates the probability of each rule." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Chomsky Normal Form\n", - "\n", - "A grammar is in Chomsky Normal Form (or **CNF**, not to be confused with *Conjunctive Normal Form*) if its rules are one of the three:\n", - "\n", - "* `X -> Y Z`\n", - "* `A -> a`\n", - "* `S -> ε`\n", - "\n", - "Where *X*, *Y*, *Z*, *A* are non-terminals, *a* is a terminal, *ε* is the empty string and *S* is the start symbol (the start symbol should not be appearing on the right hand side of rules). Note that there can be multiple rules for each left hand side non-terminal, as long they follow the above. For example, a rule for *X* might be: `X -> Y Z | A B | a | b`.\n", - "\n", - "Of course, we can also have a *CNF* with probabilities.\n", - "\n", - "This type of grammar may seem restrictive, but it can be proven that any context-free grammar can be converted to CNF." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lexicon\n", - "\n", - "The lexicon of a language is defined as a list of allowable words. These words are grouped into the usual classes: `verbs`, `nouns`, `adjectives`, `adverbs`, `pronouns`, `names`, `articles`, `prepositions` and `conjuctions`. For the first five classes it is impossible to list all words, since words are continuously being added in the classes. Recently \"google\" was added to the list of verbs, and words like that will continue to pop up and get added to the lists. For that reason, these first five categories are called **open classes**. The rest of the categories have much fewer words and much less development. While words like \"thou\" were commonly used in the past but have declined almost completely in usage, most changes take many decades or centuries to manifest, so we can safely assume the categories will remain static for the foreseeable future. Thus, these categories are called **closed classes**.\n", - "\n", - "An example lexicon for a PCFG (note that other classes can also be used according to the language, like `digits`, or `RelPro` for relative pronoun):\n", - "\n", - "```\n", - "Verb -> is [0.3] | say [0.1] | are [0.1] | ...\n", - "Noun -> robot [0.1] | sheep [0.05] | fence [0.05] | ...\n", - "Adjective -> good [0.1] | new [0.1] | sad [0.05] | ...\n", - "Adverb -> here [0.1] | lightly [0.05] | now [0.05] | ...\n", - "Pronoun -> me [0.1] | you [0.1] | he [0.05] | ...\n", - "RelPro -> that [0.4] | who [0.2] | which [0.2] | ...\n", - "Name -> john [0.05] | mary [0.05] | peter [0.01] | ...\n", - "Article -> the [0.35] | a [0.25] | an [0.025] | ...\n", - "Preposition -> to [0.25] | in [0.2] | at [0.1] | ...\n", - "Conjuction -> and [0.5] | or [0.2] | but [0.2] | ...\n", - "Digit -> 1 [0.3] | 2 [0.2] | 0 [0.2] | ...\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Grammar\n", - "\n", - "With grammars we combine words from the lexicon into valid phrases. A grammar is comprised of **grammar rules**. Each rule transforms the left-hand side of the rule into the right-hand side. For example, `A -> B` means that `A` transforms into `B`. Let's build a grammar for the language we started building with the lexicon. We will use a PCFG.\n", - "\n", - "```\n", - "S -> NP VP [0.9] | S Conjuction S [0.1]\n", - "\n", - "NP -> Pronoun [0.3] | Name [0.1] | Noun [0.1] | Article Noun [0.25] |\n", - " Article Adjs Noun [0.05] | Digit [0.05] | NP PP [0.1] |\n", - " NP RelClause [0.05]\n", - "\n", - "VP -> Verb [0.4] | VP NP [0.35] | VP Adjective [0.05] | VP PP [0.1]\n", - " VP Adverb [0.1]\n", - "\n", - "Adjs -> Adjective [0.8] | Adjective Adjs [0.2]\n", - "\n", - "PP -> Preposition NP [1.0]\n", - "\n", - "RelClause -> RelPro VP [1.0]\n", - "```\n", - "\n", - "Some valid phrases the grammar produces: \"`mary is sad`\", \"`you are a robot`\" and \"`she likes mary and a good fence`\".\n", - "\n", - "What if we wanted to check if the phrase \"`mary is sad`\" is actually a valid sentence? We can use a **parse tree** to constructively prove that a string of words is a valid phrase in the given language and even calculate the probability of the generation of the sentence.\n", - "\n", - "![parse_tree](images/parse_tree.png)\n", - "\n", - "The probability of the whole tree can be calculated by multiplying the probabilities of each individual rule transormation: `0.9 * 0.1 * 0.05 * 0.05 * 0.4 * 0.05 * 0.3 = 0.00000135`.\n", - "\n", - "To conserve space, we can also write the tree in linear form:\n", - "\n", - "[S [NP [Name **mary**]] [VP [VP [Verb **is**]] [Adjective **sad**]]]\n", - "\n", - "Unfortunately, the current grammar **overgenerates**, that is, it creates sentences that are not grammatically correct (according to the English language), like \"`the fence are john which say`\". It also **undergenerates**, which means there are valid sentences it does not generate, like \"`he believes mary is sad`\"." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "In the module we have implementation both for probabilistic and non-probabilistic grammars. Both these implementation follow the same format. There are functions for the lexicon and the rules which can be combined to create a grammar object.\n", - "\n", - "#### Non-Probabilistic\n", - "\n", - "Execute the cell below to view the implemenations:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(Lexicon, Rules, Grammar)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's build a lexicon and a grammar for the above language:" - ] - }, - { - "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'], 'Conjuction': ['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', 'Conjuction', 'S']], 'VP': [['Verb'], ['VP', 'NP'], ['VP', 'Adjective'], ['VP', 'PP'], ['VP', 'Adverb']], 'PP': [['Preposition', 'NP']]}\n" - ] - } - ], - "source": [ - "lexicon = Lexicon(\n", - " Verb = \"is | say | are\",\n", - " Noun = \"robot | sheep | fence\",\n", - " Adjective = \"good | new | sad\",\n", - " Adverb = \"here | lightly | now\",\n", - " Pronoun = \"me | you | he\",\n", - " RelPro = \"that | who | which\",\n", - " Name = \"john | mary | peter\",\n", - " Article = \"the | a | an\",\n", - " Preposition = \"to | in | at\",\n", - " Conjuction = \"and | or | but\",\n", - " Digit = \"1 | 2 | 0\"\n", - ")\n", - "\n", - "print(\"Lexicon\", lexicon)\n", - "\n", - "rules = Rules(\n", - " S = \"NP VP | S Conjuction S\",\n", - " NP = \"Pronoun | Name | Noun | Article Noun \\\n", - " | Article Adjs Noun | Digit | NP PP | NP RelClause\",\n", - " VP = \"Verb | VP NP | VP Adjective | VP PP | VP Adverb\",\n", - " Adjs = \"Adjective | Adjective Adjs\",\n", - " PP = \"Preposition NP\",\n", - " RelClause = \"RelPro VP\"\n", - ")\n", - "\n", - "print(\"\\nRules:\", rules)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Both the functions return a dictionary with keys the left-hand side of the rules. For the lexicon, the values are the terminals for each left-hand side non-terminal, while for the rules the values are the right-hand sides as lists.\n", - "\n", - "We can now use the variables `lexicon` and `rules` to build a grammar. After we've done so, we can find the transformations of a non-terminal (the `Noun`, `Verb` and the other basic classes do **not** count as proper non-terminals in the implementation). We can also check if a word is in a particular class." - ] - }, - { - "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" - ] - } - ], - "source": [ - "grammar = Grammar(\"A Simple Grammar\", rules, lexicon)\n", - "\n", - "print(\"How can we rewrite 'VP'?\", grammar.rewrites_for('VP'))\n", - "print(\"Is 'the' an article?\", grammar.isa('the', 'Article'))\n", - "print(\"Is 'here' a noun?\", grammar.isa('here', 'Noun'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the grammar is in Chomsky Normal Form, we can call the class function `cnf_rules` to get all the rules in the form of `(X, Y, Z)` for each `X -> Y Z` rule. Since the above grammar is not in *CNF* though, we have to create a new one." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "E_Chomsky = Grammar(\"E_Prob_Chomsky\", # A Grammar in Chomsky Normal Form\n", - " Rules(\n", - " S = \"NP VP\",\n", - " NP = \"Article Noun | Adjective Noun\",\n", - " VP = \"Verb NP | Verb Adjective\",\n", - " ),\n", - " Lexicon(\n", - " Article = \"the | a | an\",\n", - " Noun = \"robot | sheep | fence\",\n", - " Adjective = \"good | new | sad\",\n", - " Verb = \"is | say | are\"\n", - " ))" - ] - }, - { - "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" - ] - } - ], - "source": [ - "print(E_Chomsky.cnf_rules())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we can generate random phrases using our grammar. Most of them will be complete gibberish, falling under the overgenerated phrases of the grammar. That goes to show that in the grammar the valid phrases are much fewer than the overgenerated ones." - ] - }, - { - "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" - } - ], - "source": [ - "grammar.generate_random('S')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Probabilistic\n", - "\n", - "The probabilistic grammars follow the same approach. They take as input a string, are assembled from a grammar and a lexicon and can generate random sentences (giving the probability of the sentence). The main difference is that in the lexicon we have tuples (terminal, probability) instead of strings and for the rules we have a list of tuples (list of non-terminals, probability) instead of list of lists of non-terminals.\n", - "\n", - "Execute the cells to read the code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(ProbLexicon, ProbRules, ProbGrammar)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's build a lexicon and rules for the probabilistic grammar:" - ] - }, - { - "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)], 'Conjuction': [('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', 'Conjuction', '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" - ] - } - ], - "source": [ - "lexicon = ProbLexicon(\n", - " Verb = \"is [0.5] | say [0.3] | are [0.2]\",\n", - " Noun = \"robot [0.4] | sheep [0.4] | fence [0.2]\",\n", - " Adjective = \"good [0.5] | new [0.2] | sad [0.3]\",\n", - " Adverb = \"here [0.6] | lightly [0.1] | now [0.3]\",\n", - " Pronoun = \"me [0.3] | you [0.4] | he [0.3]\",\n", - " RelPro = \"that [0.5] | who [0.3] | which [0.2]\",\n", - " Name = \"john [0.4] | mary [0.4] | peter [0.2]\",\n", - " Article = \"the [0.5] | a [0.25] | an [0.25]\",\n", - " Preposition = \"to [0.4] | in [0.3] | at [0.3]\",\n", - " Conjuction = \"and [0.5] | or [0.2] | but [0.3]\",\n", - " Digit = \"0 [0.35] | 1 [0.35] | 2 [0.3]\"\n", - ")\n", - "\n", - "print(\"Lexicon\", lexicon)\n", - "\n", - "rules = ProbRules(\n", - " S = \"NP VP [0.6] | S Conjuction S [0.4]\",\n", - " NP = \"Pronoun [0.2] | Name [0.05] | Noun [0.2] | Article Noun [0.15] \\\n", - " | Article Adjs Noun [0.1] | Digit [0.05] | NP PP [0.15] | NP RelClause [0.1]\",\n", - " VP = \"Verb [0.3] | VP NP [0.2] | VP Adjective [0.25] | VP PP [0.15] | VP Adverb [0.1]\",\n", - " Adjs = \"Adjective [0.5] | Adjective Adjs [0.5]\",\n", - " PP = \"Preposition NP [1]\",\n", - " RelClause = \"RelPro VP [1]\"\n", - ")\n", - "\n", - "print(\"\\nRules:\", rules)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's use the above to assemble our probabilistic grammar and run some simple queries:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "grammar = ProbGrammar(\"A Simple Probabilistic Grammar\", rules, lexicon)\n", - "\n", - "print(\"How can we rewrite 'VP'?\", grammar.rewrites_for('VP'))\n", - "print(\"Is 'the' an article?\", grammar.isa('the', 'Article'))\n", - "print(\"Is 'here' a noun?\", grammar.isa('here', 'Noun'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we have a grammar in *CNF*, we can get a list of all the rules. Let's create a grammar in the form and print the *CNF* rules:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "E_Prob_Chomsky = ProbGrammar(\"E_Prob_Chomsky\", # A Probabilistic Grammar in CNF\n", - " ProbRules(\n", - " S = \"NP VP [1]\",\n", - " NP = \"Article Noun [0.6] | Adjective Noun [0.4]\",\n", - " VP = \"Verb NP [0.5] | Verb Adjective [0.5]\",\n", - " ),\n", - " ProbLexicon(\n", - " Article = \"the [0.5] | a [0.25] | an [0.25]\",\n", - " Noun = \"robot [0.4] | sheep [0.4] | fence [0.2]\",\n", - " Adjective = \"good [0.5] | new [0.2] | sad [0.3]\",\n", - " Verb = \"is [0.5] | say [0.3] | are [0.2]\"\n", - " ))" - ] - }, - { - "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" - ] - } - ], - "source": [ - "print(E_Prob_Chomsky.cnf_rules())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lastly, we can generate random sentences from this grammar. The function `prob_generation` returns a tuple (sentence, probability)." - ] - }, - { - "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" - ] - } - ], - "source": [ - "sentence, prob = grammar.generate_random('S')\n", - "print(sentence)\n", - "print(prob)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As with the non-probabilistic grammars, this one mostly overgenerates. You can also see that the probability is very, very low, which means there are a ton of generateable sentences (in this case infinite, since we have recursion; notice how `VP` can produce another `VP`, for example)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## HITS\n", - "\n", - "### Overview\n", - "\n", - "**Hyperlink-Induced Topic Search** (or HITS for short) is an algorithm for information retrieval and page ranking. You can read more on information retrieval in the [text notebook](https://github.com/aimacode/aima-python/blob/master/text.ipynb). Essentially, given a collection of documents and a user's query, such systems return to the user the documents most relevant to what the user needs. The HITS algorithm differs from a lot of other similar ranking algorithms (like Google's *Pagerank*) as the page ratings in this algorithm are dependent on the given query. This means that for each new query the result pages must be computed anew. This cost might be prohibitive for many modern search engines, so a lot steer away from this approach.\n", - "\n", - "HITS first finds a list of relevant pages to the query and then adds pages that link to or are linked from these pages. Once the set is built, we define two values for each page. **Authority** on the query, the degree of pages from the relevant set linking to it and **hub** of the query, the degree that it points to authoritative pages in the set. Since we do not want to simply count the number of links from a page to other pages, but we also want to take into account the quality of the linked pages, we update the hub and authority values of a page in the following manner, until convergence:\n", - "\n", - "* Hub score = The sum of the authority scores of the pages it links to.\n", - "\n", - "* Authority score = The sum of hub scores of the pages it is linked from.\n", - "\n", - "So the higher quality the pages a page is linked to and from, the higher its scores.\n", - "\n", - "We then normalize the scores by dividing each score by the sum of the squares of the respective scores of all pages. When the values converge, we return the top-valued pages. Note that because we normalize the values, the algorithm is guaranteed to converge." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "### Implementation\n", - "\n", - "The source code for the algorithm is given below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(HITS)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we compile the collection of pages as mentioned above. Then, we initialize the authority and hub scores for each page and finally we update and normalize the values until convergence.\n", - "\n", - "A quick overview of the helper functions functions we use:\n", - "\n", - "* `relevant_pages`: Returns relevant pages from `pagesIndex` given a query.\n", - "\n", - "* `expand_pages`: Adds to the collection pages linked to and from the given `pages`.\n", - "\n", - "* `normalize`: Normalizes authority and hub scores.\n", - "\n", - "* `ConvergenceDetector`: A class that checks for convergence, by keeping a history of the pages' scores and checking if they change or not.\n", - "\n", - "* `Page`: The template for pages. Stores the address, authority/hub scores and in-links/out-links." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "### Example\n", - "\n", - "Before we begin we need to define a list of sample pages to work on. The pages are `pA`, `pB` and so on and their text is given by `testHTML` and `testHTML2`. The `Page` class takes as arguments the in-links and out-links as lists. For page \"A\", the in-links are \"B\", \"C\" and \"E\" while the sole out-link is \"D\".\n", - "\n", - "We also need to set the `nlp` global variables `pageDict`, `pagesIndex` and `pagesContent`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "testHTML = \"\"\"Like most other male mammals, a man inherits an\n", - " X from his mom and a Y from his dad.\"\"\"\n", - "testHTML2 = \"a mom and a dad\"\n", - "\n", - "pA = Page('A', ['B', 'C', 'E'], ['D'])\n", - "pB = Page('B', ['E'], ['A', 'C', 'D'])\n", - "pC = Page('C', ['B', 'E'], ['A', 'D'])\n", - "pD = Page('D', ['A', 'B', 'C', 'E'], [])\n", - "pE = Page('E', [], ['A', 'B', 'C', 'D', 'F'])\n", - "pF = Page('F', ['E'], [])\n", - "\n", - "nlp.pageDict = {pA.address: pA, pB.address: pB, pC.address: pC,\n", - " pD.address: pD, pE.address: pE, pF.address: pF}\n", - "\n", - "nlp.pagesIndex = nlp.pageDict\n", - "\n", - "nlp.pagesContent ={pA.address: testHTML, pB.address: testHTML2,\n", - " pC.address: testHTML, pD.address: testHTML2,\n", - " pE.address: testHTML, pF.address: testHTML2}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now run the HITS algorithm. Our query will be 'mammals' (note that while the content of the HTML doesn't matter, it should include the query words or else no page will be picked at the first step)." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "HITS('mammals')\n", - "page_list = ['A', 'B', 'C', 'D', 'E', 'F']\n", - "auth_list = [pA.authority, pB.authority, pC.authority, pD.authority, pE.authority, pF.authority]\n", - "hub_list = [pA.hub, pB.hub, pC.hub, pD.hub, pE.hub, pF.hub]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how the pages were scored:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "for i in range(6):\n", - " p = page_list[i]\n", - " a = auth_list[i]\n", - " h = hub_list[i]\n", - " \n", - " print(\"{}: total={}, auth={}, hub={}\".format(p, a + h, a, h))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "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." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## QUESTION ANSWERING\n", - "\n", - "**Question Answering** is a type of Information Retrieval system, where we have a question instead of a query and instead of relevant documents we want the computer to return a short sentence, phrase or word that answers our question. To better understand the concept of question answering systems, you can first read the \"Text Models\" and \"Information Retrieval\" section from the [text notebook](https://github.com/aimacode/aima-python/blob/master/text.ipynb).\n", - "\n", - "A typical example of such a system is `AskMSR` (Banko *et al.*, 2002), a system for question answering that performed admirably against more sophisticated algorithms. The basic idea behind it is that a lot of questions have already been answered in the web numerous times. The system doesn't know a lot about verbs, or concepts or even what a noun is. It knows about 15 different types of questions and how they can be written as queries. It can rewrite [Who was George Washington's second in command?] as the query [\\* was George Washington's second in command] or [George Washington's second in command was \\*].\n", - "\n", - "After rewriting the questions, it issues these queries and retrieves the short text around the query terms. It then breaks the result into 1, 2 or 3-grams. Filters are also applied to increase the chances of a correct answer. If the query starts with \"who\", we filter for names, if it starts with \"how many\" we filter for numbers and so on. We can also filter out the words appearing in the query. For the above query, the answer \"George Washington\" is wrong, even though it is quite possible the 2-gram would appear a lot around the query terms.\n", - "\n", - "Finally, the different results are weighted by the generality of the queries. The result from the general boolean query [George Washington OR second in command] weighs less that the more specific query [George Washington's second in command was \\*]. As an answer we return the most highly-ranked n-gram." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CYK PARSE\n", - "\n", - "### Overview\n", - "\n", - "Syntactic analysis (or **parsing**) of a sentence is the process of uncovering the phrase structure of the sentence according to the rules of a grammar. There are two main approaches to parsing. *Top-down*, start with the starting symbol and build a parse tree with the given words as its leaves, and *bottom-up*, where we start from the given words and build a tree that has the starting symbol as its root. Both approaches involve \"guessing\" ahead, so it is very possible it will take long to parse a sentence (wrong guess mean a lot of backtracking). Thankfully, a lot of effort is spent in analyzing already analyzed substrings, so we can follow a dynamic programming approach to store and reuse these parses instead of recomputing them. The *CYK Parsing Algorithm* (named after its inventors, Cocke, Younger and Kasami) utilizes this technique to parse sentences of a grammar in *Chomsky Normal Form*.\n", - "\n", - "The CYK algorithm returns an *M x N x N* array (named *P*), where *N* is the number of words in the sentence and *M* the number of non-terminal symbols in the grammar. Each element in this array shows the probability of a substring being transformed from a particular non-terminal. To find the most probable parse of the sentence, a search in the resulting array is required. Search heuristic algorithms work well in this space, and we can derive the heuristics from the properties of the grammar.\n", - "\n", - "The algorithm in short works like this: There is an external loop that determines the length of the substring. Then the algorithm loops through the words in the sentence. For each word, it again loops through all the words to its right up to the first-loop length. The substring it will work on in this iteration is the words from the second-loop word with first-loop length. Finally, it loops through all the rules in the grammar and updates the substring's probability for each right-hand side non-terminal." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "The implementation takes as input a list of words and a probabilistic grammar (from the `ProbGrammar` class detailed above) in CNF and returns the table/dictionary *P*. An item's key in *P* is a tuple in the form `(Non-terminal, start of substring, length of substring)`, and the value is a probability. For example, for the sentence \"the monkey is dancing\" and the substring \"the monkey\" an item can be `('NP', 0, 2): 0.5`, which means the first two words (the substring from index 0 and length 2) have a 0.5 probablity of coming from the `NP` terminal.\n", - "\n", - "Before we continue, you can take a look at the source code by running the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(CYK_parse)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When updating the probability of a substring, we pick the max of its current one and the probability of the substring broken into two parts: one from the second-loop word with third-loop length, and the other from the first part's end to the remainer of the first-loop length." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "Let's build a probabilistic grammar in CNF:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "E_Prob_Chomsky = ProbGrammar(\"E_Prob_Chomsky\", # A Probabilistic Grammar in CNF\n", - " ProbRules(\n", - " S = \"NP VP [1]\",\n", - " NP = \"Article Noun [0.6] | Adjective Noun [0.4]\",\n", - " VP = \"Verb NP [0.5] | Verb Adjective [0.5]\",\n", - " ),\n", - " ProbLexicon(\n", - " Article = \"the [0.5] | a [0.25] | an [0.25]\",\n", - " Noun = \"robot [0.4] | sheep [0.4] | fence [0.2]\",\n", - " Adjective = \"good [0.5] | new [0.2] | sad [0.3]\",\n", - " Verb = \"is [0.5] | say [0.3] | are [0.2]\"\n", - " ))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see the probabilities table for the sentence \"the robot is good\":" - ] - }, - { - "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" - ] - } - ], - "source": [ - "words = ['the', 'robot', 'is', 'good']\n", - "grammar = E_Prob_Chomsky\n", - "\n", - "P = CYK_parse(words, grammar)\n", - "print(P)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `defaultdict` object is returned (`defaultdict` is basically a dictionary but with a default value/type). Keys are tuples in the form mentioned above and the values are the corresponding probabilities. Most of the items/parses have a probability of 0. Let's filter those out to take a better look at the parses that matter." - ] - }, - { - "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" - ] - } - ], - "source": [ - "parses = {k: p for k, p in P.items() if p >0}\n", - "\n", - "print(parses)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The item `('Article', 0, 1): 0.5` means that the first item came from the `Article` non-terminal with a chance of 0.5. A more complicated item, one with two words, is `('NP', 0, 2): 0.12` which covers the first two words. The probability of the substring \"the robot\" coming from the `NP` non-terminal is 0.12. Let's try and follow the transformations from `NP` to the given words (top-down) to make sure this is indeed the case:\n", - "\n", - "1. The probability of `NP` transforming to `Article Noun` is 0.6.\n", - "\n", - "2. The probability of `Article` transforming to \"the\" is 0.5 (total probability = 0.6*0.5 = 0.3).\n", - "\n", - "3. The probability of `Noun` transforming to \"robot\" is 0.4 (total = 0.3*0.4 = 0.12).\n", - "\n", - "Thus, the total probability of the transformation is 0.12.\n", - "\n", - "Notice how the probability for the whole string (given by the key `('S', 0, 4)`) is 0.015. This means the most probable parsing of the sentence has a probability of 0.015." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CHART PARSING\n", - "\n", - "### Overview\n", - "\n", - "Let's now take a look at a more general chart parsing algorithm. Given a non-probabilistic grammar and a sentence, this algorithm builds a parse tree in a top-down manner, with the words of the sentence as the leaves. It works with a dynamic programming approach, building a chart to store parses for substrings so that it doesn't have to analyze them again (just like the CYK algorithm). Each non-terminal, starting from S, gets replaced by its right-hand side rules in the chart, until we end up with the correct parses.\n", - "\n", - "### Implementation\n", - "\n", - "A parse is in the form `[start, end, non-terminal, sub-tree, expected-transformation]`, where `sub-tree` is a tree with the corresponding `non-terminal` as its root and `expected-transformation` is a right-hand side rule of the `non-terminal`.\n", - "\n", - "The chart parsing is implemented in a class, `Chart`. It is initialized with a grammar and can return the list of all the parses of a sentence with the `parses` function.\n", - "\n", - "The chart is a list of lists. The lists correspond to the lengths of substrings (including the empty string), from start to finish. When we say 'a point in the chart', we refer to a list of a certain length.\n", - "\n", - "A quick rundown of the class functions:" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "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", - "\n", - "* `parse`: Parses the list of words and builds the chart.\n", - "\n", - "\n", - "* `add_edge`: Adds another edge to the chart at a given point. Also, examines whether the edge extends or predicts another edge. If the edge itself is not expecting a transformation, it will extend other edges and it will predict edges otherwise.\n", - "\n", - "\n", - "* `scanner`: Given a word and a point in the chart, it extends edges that were expecting a transformation that can result in the given word. For example, if the word 'the' is an 'Article' and we are examining two edges at a chart's point, with one expecting an 'Article' and the other a 'Verb', the first one will be extended while the second one will not.\n", - "\n", - "\n", - "* `predictor`: If an edge can't extend other edges (because it is expecting a transformation itself), we will add to the chart rules/transformations that can help extend the edge. The new edges come from the right-hand side of the expected transformation's rules. For example, if an edge is expecting the transformation 'Adjective Noun', we will add to the chart an edge for each right-hand side rule of the non-terminal 'Adjective'.\n", - "\n", - "\n", - "* `extender`: Extends edges given an edge (called `E`). If `E`'s non-terminal is the same as the expected transformation of another edge (let's call it `A`), add to the chart a new edge with the non-terminal of `A` and the transformations of `A` minus the non-terminal that matched with `E`'s non-terminal. For example, if an edge `E` has 'Article' as its non-terminal and is expecting no transformation, we need to see what edges it can extend. Let's examine the edge `N`. This expects a transformation of 'Noun Verb'. 'Noun' does not match with 'Article', so we move on. Another edge, `A`, expects a transformation of 'Article Noun' and has a non-terminal of 'NP'. We have a match! A new edge will be added with 'NP' as its non-terminal (the non-terminal of `A`) and 'Noun' as the expected transformation (the rest of the expected transformation of `A`)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can view the source code by running the cell below:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(Chart)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "We will use the grammar `E0` to parse the sentence \"the stench is in 2 2\".\n", - "\n", - "First we need to build a `Chart` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "chart = Chart(nlp.E0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we simply call the `parses` function:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "print(chart.parses('the stench is in 2 2'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can see which edges get added by setting the optional initialization argument `trace` to true." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chart_trace = Chart(nlp.E0, trace=True)\n", - "chart_trace.parses('the stench is in 2 2')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's try and parse a sentence that is not recognized by the grammar:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "print(chart.parses('the stench 2 2'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "An empty list was returned." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/nlp.py b/nlp.py deleted file mode 100644 index f34d088b5..000000000 --- a/nlp.py +++ /dev/null @@ -1,558 +0,0 @@ -"""Natural Language Processing; Chart Parsing and PageRanking (Chapter 22-23)""" - -from collections import defaultdict -from utils import weighted_choice -import urllib.request -import re - -# ______________________________________________________________________________ -# Grammars and Lexicons - - -def Rules(**rules): - """Create a dictionary mapping symbols to alternative sequences. - >>> Rules(A = "B C | D E") - {'A': [['B', 'C'], ['D', 'E']]} - """ - for (lhs, rhs) in rules.items(): - rules[lhs] = [alt.strip().split() for alt in rhs.split('|')] - return rules - - -def Lexicon(**rules): - """Create a dictionary mapping symbols to alternative words. - >>> Lexicon(Article = "the | a | an") - {'Article': ['the', 'a', 'an']} - """ - for (lhs, rhs) in rules.items(): - rules[lhs] = [word.strip() for word in rhs.split('|')] - return rules - - -class Grammar: - - def __init__(self, name, rules, lexicon): - """A grammar has a set of rules and a lexicon.""" - self.name = name - self.rules = rules - self.lexicon = lexicon - self.categories = defaultdict(list) - for lhs in lexicon: - for word in lexicon[lhs]: - self.categories[word].append(lhs) - - def rewrites_for(self, cat): - """Return a sequence of possible rhs's that cat can be rewritten as.""" - return self.rules.get(cat, ()) - - def isa(self, word, cat): - """Return True iff word is of category cat""" - return cat in self.categories[word] - - def cnf_rules(self): - """Returns the tuple (X, Y, Z) for rules in the form: - X -> Y Z""" - cnf = [] - for X, rules in self.rules.items(): - for (Y, Z) in rules: - cnf.append((X, Y, Z)) - - return cnf - - def generate_random(self, S='S'): - """Replace each token in S by a random entry in grammar (recursively).""" - import random - - def rewrite(tokens, into): - for token in tokens: - if token in self.rules: - rewrite(random.choice(self.rules[token]), into) - elif token in self.lexicon: - into.append(random.choice(self.lexicon[token])) - else: - into.append(token) - return into - - return ' '.join(rewrite(S.split(), [])) - - def __repr__(self): - return ''.format(self.name) - - -def ProbRules(**rules): - """Create a dictionary mapping symbols to alternative sequences, - with probabilities. - >>> ProbRules(A = "B C [0.3] | D E [0.7]") - {'A': [(['B', 'C'], 0.3), (['D', 'E'], 0.7)]} - """ - for (lhs, rhs) in rules.items(): - rules[lhs] = [] - rhs_separate = [alt.strip().split() for alt in rhs.split('|')] - for r in rhs_separate: - prob = float(r[-1][1:-1]) # remove brackets, convert to float - rhs_rule = (r[:-1], prob) - rules[lhs].append(rhs_rule) - - return rules - - -def ProbLexicon(**rules): - """Create a dictionary mapping symbols to alternative words, - with probabilities. - >>> ProbLexicon(Article = "the [0.5] | a [0.25] | an [0.25]") - {'Article': [('the', 0.5), ('a', 0.25), ('an', 0.25)]} - """ - for (lhs, rhs) in rules.items(): - rules[lhs] = [] - rhs_separate = [word.strip().split() for word in rhs.split('|')] - for r in rhs_separate: - prob = float(r[-1][1:-1]) # remove brackets, convert to float - word = r[:-1][0] - rhs_rule = (word, prob) - rules[lhs].append(rhs_rule) - - return rules - - -class ProbGrammar: - - def __init__(self, name, rules, lexicon): - """A grammar has a set of rules and a lexicon. - Each rule has a probability.""" - self.name = name - self.rules = rules - self.lexicon = lexicon - self.categories = defaultdict(list) - - for lhs in lexicon: - for word, prob in lexicon[lhs]: - self.categories[word].append((lhs, prob)) - - def rewrites_for(self, cat): - """Return a sequence of possible rhs's that cat can be rewritten as.""" - return self.rules.get(cat, ()) - - def isa(self, word, cat): - """Return True iff word is of category cat""" - return cat in [c for c, _ in self.categories[word]] - - def cnf_rules(self): - """Returns the tuple (X, Y, Z, p) for rules in the form: - X -> Y Z [p]""" - cnf = [] - for X, rules in self.rules.items(): - for (Y, Z), p in rules: - cnf.append((X, Y, Z, p)) - - return cnf - - def generate_random(self, S='S'): - """Replace each token in S by a random entry in grammar (recursively). - Returns a tuple of (sentence, probability).""" - import random - - def rewrite(tokens, into): - for token in tokens: - if token in self.rules: - non_terminal, prob = weighted_choice(self.rules[token]) - into[1] *= prob - rewrite(non_terminal, into) - elif token in self.lexicon: - terminal, prob = weighted_choice(self.lexicon[token]) - into[0].append(terminal) - into[1] *= prob - else: - into[0].append(token) - return into - - rewritten_as, prob = rewrite(S.split(), [[], 1]) - return (' '.join(rewritten_as), prob) - - def __repr__(self): - return ''.format(self.name) - - -E0 = Grammar('E0', - Rules( # Grammar for E_0 [Figure 22.4] - S='NP VP | S Conjunction S', - NP='Pronoun | Name | Noun | Article Noun | Digit Digit | NP PP | NP RelClause', - VP='Verb | VP NP | VP Adjective | VP PP | VP Adverb', - PP='Preposition NP', - RelClause='That VP'), - - Lexicon( # Lexicon for E_0 [Figure 22.3] - Noun="stench | breeze | glitter | nothing | wumpus | pit | pits | gold | east", - Verb="is | see | smell | shoot | fell | stinks | go | grab | carry | kill | turn | feel", # noqa - Adjective="right | left | east | south | back | smelly", - Adverb="here | there | nearby | ahead | right | left | east | south | back", - Pronoun="me | you | I | it", - Name="John | Mary | Boston | Aristotle", - Article="the | a | an", - Preposition="to | in | on | near", - Conjunction="and | or | but", - Digit="0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9", - That="that" - )) - -E_ = Grammar('E_', # Trivial Grammar and lexicon for testing - Rules( - S='NP VP', - NP='Art N | Pronoun', - VP='V NP'), - - Lexicon( - Art='the | a', - N='man | woman | table | shoelace | saw', - Pronoun='I | you | it', - V='saw | liked | feel' - )) - -E_NP_ = Grammar('E_NP_', # Another Trivial Grammar for testing - Rules(NP='Adj NP | N'), - Lexicon(Adj='happy | handsome | hairy', - N='man')) - -E_Prob = ProbGrammar('E_Prob', # The Probabilistic Grammar from the notebook - ProbRules( - S="NP VP [0.6] | S Conjuction 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]", - RelClause="RelPro VP [1]" - ), - ProbLexicon( - 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]", - Conjuction="and [0.5] | or [0.2] | but [0.3]", - Digit="0 [0.35] | 1 [0.35] | 2 [0.3]" - )) - - - -E_Chomsky = Grammar('E_Prob_Chomsky', # A Grammar in Chomsky Normal Form - Rules( - S='NP VP', - NP='Article Noun | Adjective Noun', - VP='Verb NP | Verb Adjective', - ), - Lexicon( - Article='the | a | an', - Noun='robot | sheep | fence', - Adjective='good | new | sad', - Verb='is | say | are' - )) - -E_Prob_Chomsky = ProbGrammar('E_Prob_Chomsky', # A Probabilistic Grammar in CNF - ProbRules( - S='NP VP [1]', - NP='Article Noun [0.6] | Adjective Noun [0.4]', - VP='Verb NP [0.5] | Verb Adjective [0.5]', - ), - ProbLexicon( - Article='the [0.5] | a [0.25] | an [0.25]', - Noun='robot [0.4] | sheep [0.4] | fence [0.2]', - Adjective='good [0.5] | new [0.2] | sad [0.3]', - Verb='is [0.5] | say [0.3] | are [0.2]' - )) - - -# ______________________________________________________________________________ -# Chart Parsing - - -class Chart: - - """Class for parsing sentences using a chart data structure. - >>> chart = Chart(E0); - >>> len(chart.parses('the stench is in 2 2')) - 1 - """ - - def __init__(self, grammar, trace=False): - """A datastructure for parsing a string; and methods to do the parse. - self.chart[i] holds the edges that end just before the i'th word. - Edges are 5-element lists of [start, end, lhs, [found], [expects]].""" - self.grammar = grammar - self.trace = trace - - def parses(self, words, S='S'): - """Return a list of parses; words can be a list or string.""" - if isinstance(words, str): - words = words.split() - self.parse(words, S) - # Return all the parses that span the whole input - # 'span the whole input' => begin at 0, end at len(words) - return [[i, j, S, found, []] - for (i, j, lhs, found, expects) in self.chart[len(words)] - # assert j == len(words) - if i == 0 and lhs == S and expects == []] - - def parse(self, words, S='S'): - """Parse a list of words; according to the grammar. - Leave results in the chart.""" - self.chart = [[] for i in range(len(words)+1)] - self.add_edge([0, 0, 'S_', [], [S]]) - for i in range(len(words)): - self.scanner(i, words[i]) - return self.chart - - def add_edge(self, edge): - """Add edge to chart, and see if it extends or predicts another edge.""" - start, end, lhs, found, expects = edge - if edge not in self.chart[end]: - self.chart[end].append(edge) - if self.trace: - print('Chart: added {}'.format(edge)) - if not expects: - self.extender(edge) - else: - self.predictor(edge) - - def scanner(self, j, word): - """For each edge expecting a word of this category here, extend the edge.""" - for (i, j, A, alpha, Bb) in self.chart[j]: - if Bb and self.grammar.isa(word, Bb[0]): - self.add_edge([i, j+1, A, alpha + [(Bb[0], word)], Bb[1:]]) - - def predictor(self, edge): - """Add to chart any rules for B that could help extend this edge.""" - (i, j, A, alpha, Bb) = edge - B = Bb[0] - if B in self.grammar.rules: - for rhs in self.grammar.rewrites_for(B): - self.add_edge([j, j, B, [], rhs]) - - def extender(self, edge): - """See what edges can be extended by this edge.""" - (j, k, B, _, _) = edge - for (i, j, A, alpha, B1b) in self.chart[j]: - if B1b and B == B1b[0]: - self.add_edge([i, k, A, alpha + [edge], B1b[1:]]) - - -# ______________________________________________________________________________ -# CYK Parsing - -def CYK_parse(words, grammar): - """ [Figure 23.5] """ - # We use 0-based indexing instead of the book's 1-based. - N = len(words) - P = defaultdict(float) - - # Insert lexical rules for each word. - for (i, word) in enumerate(words): - for (X, p) in grammar.categories[word]: - P[X, i, 1] = p - - # Combine first and second parts of right-hand sides of rules, - # from short to long. - for length in range(2, N+1): - for start in range(N-length+1): - for len1 in range(1, length): # N.B. the book incorrectly has N instead of length - len2 = length - len1 - for (X, Y, Z, p) in grammar.cnf_rules(): - P[X, start, length] = max(P[X, start, length], - P[Y, start, len1] * P[Z, start+len1, len2] * p) - - return P - - -# ______________________________________________________________________________ -# Page Ranking - -# First entry in list is the base URL, and then following are relative URL pages -examplePagesSet = ["https://en.wikipedia.org/wiki/", "Aesthetics", "Analytic_philosophy", - "Ancient_Greek", "Aristotle", "Astrology", "Atheism", "Baruch_Spinoza", - "Belief", "Betrand Russell", "Confucius", "Consciousness", - "Continental Philosophy", "Dialectic", "Eastern_Philosophy", - "Epistemology", "Ethics", "Existentialism", "Friedrich_Nietzsche", - "Idealism", "Immanuel_Kant", "List_of_political_philosophers", "Logic", - "Metaphysics", "Philosophers", "Philosophy", "Philosophy_of_mind", "Physics", - "Plato", "Political_philosophy", "Pythagoras", "Rationalism", - "Social_philosophy", "Socrates", "Subjectivity", "Theology", - "Truth", "Western_philosophy"] - - -def loadPageHTML(addressList): - """Download HTML page content for every URL address passed as argument""" - contentDict = {} - for addr in addressList: - with urllib.request.urlopen(addr) as response: - raw_html = response.read().decode('utf-8') - # Strip raw html of unnessecary content. Basically everything that isn't link or text - html = stripRawHTML(raw_html) - contentDict[addr] = html - return contentDict - - -def initPages(addressList): - """Create a dictionary of pages from a list of URL addresses""" - pages = {} - for addr in addressList: - pages[addr] = Page(addr) - return pages - - -def stripRawHTML(raw_html): - """Remove the section of the HTML which contains links to stylesheets etc., - and remove all other unnessecary HTML""" - # TODO: Strip more out of the raw html - return re.sub(".*?", "", raw_html, flags=re.DOTALL) # remove section - - -def determineInlinks(page): - """Given a set of pages that have their outlinks determined, we can fill - out a page's inlinks by looking through all other page's outlinks""" - inlinks = [] - for addr, indexPage in pagesIndex.items(): - if page.address == indexPage.address: - continue - elif page.address in indexPage.outlinks: - inlinks.append(addr) - return inlinks - - -def findOutlinks(page, handleURLs=None): - """Search a page's HTML content for URL links to other pages""" - urls = re.findall(r'href=[\'"]?([^\'" >]+)', pagesContent[page.address]) - if handleURLs: - urls = handleURLs(urls) - return urls - - -def onlyWikipediaURLS(urls): - """Some example HTML page data is from wikipedia. This function converts - relative wikipedia links to full wikipedia URLs""" - wikiURLs = [url for url in urls if url.startswith('/wiki/')] - return ["https://en.wikipedia.org"+url for url in wikiURLs] - - -# ______________________________________________________________________________ -# HITS Helper Functions - -def expand_pages(pages): - """Adds in every page that links to or is linked from one of - the relevant pages.""" - expanded = {} - for addr, page in pages.items(): - if addr not in expanded: - expanded[addr] = page - for inlink in page.inlinks: - if inlink not in expanded: - expanded[inlink] = pagesIndex[inlink] - for outlink in page.outlinks: - if outlink not in expanded: - expanded[outlink] = pagesIndex[outlink] - return expanded - - -def relevant_pages(query): - """Relevant pages are pages that contain all of the query words. They are obtained by - intersecting the hit lists of the query words.""" - hit_intersection = {addr for addr in pagesIndex} - query_words = query.split() - for query_word in query_words: - hit_list = set() - for addr in pagesIndex: - if query_word.lower() in pagesContent[addr].lower(): - hit_list.add(addr) - hit_intersection = hit_intersection.intersection(hit_list) - return {addr: pagesIndex[addr] for addr in hit_intersection} - - -def normalize(pages): - """Normalize divides each page's score by the sum of the squares of all - pages' scores (separately for both the authority and hub scores). - """ - summed_hub = sum(page.hub**2 for _, page in pages.items()) - summed_auth = sum(page.authority**2 for _, page in pages.items()) - for _, page in pages.items(): - page.hub /= summed_hub**0.5 - page.authority /= summed_auth**0.5 - - -class ConvergenceDetector(object): - """If the hub and authority values of the pages are no longer changing, we have - reached a convergence and further iterations will have no effect. This detects convergence - so that we can stop the HITS algorithm as early as possible.""" - def __init__(self): - self.hub_history = None - self.auth_history = None - - def __call__(self): - return self.detect() - - def detect(self): - curr_hubs = [page.hub for addr, page in pagesIndex.items()] - curr_auths = [page.authority for addr, page in pagesIndex.items()] - if self.hub_history is None: - self.hub_history, self.auth_history = [], [] - else: - diffsHub = [abs(x-y) for x, y in zip(curr_hubs, self.hub_history[-1])] - diffsAuth = [abs(x-y) for x, y in zip(curr_auths, self.auth_history[-1])] - aveDeltaHub = sum(diffsHub)/float(len(pagesIndex)) - aveDeltaAuth = sum(diffsAuth)/float(len(pagesIndex)) - if aveDeltaHub < 0.01 and aveDeltaAuth < 0.01: # may need tweaking - return True - if len(self.hub_history) > 2: # prevent list from getting long - del self.hub_history[0] - del self.auth_history[0] - self.hub_history.append([x for x in curr_hubs]) - self.auth_history.append([x for x in curr_auths]) - return False - - -def getInlinks(page): - if not page.inlinks: - page.inlinks = determineInlinks(page) - return [addr for addr, p in pagesIndex.items() if addr in page.inlinks] - - -def getOutlinks(page): - if not page.outlinks: - page.outlinks = findOutlinks(page) - return [addr for addr, p in pagesIndex.items() if addr in page.outlinks] - - -# ______________________________________________________________________________ -# HITS Algorithm - -class Page(object): - def __init__(self, address, inlinks=None, outlinks=None, hub=0, authority=0): - self.address = address - self.hub = hub - self.authority = authority - self.inlinks = inlinks - self.outlinks = outlinks - - -pagesContent = {} # maps Page relative or absolute URL/location to page's HTML content -pagesIndex = {} -convergence = ConvergenceDetector() # assign function to variable to mimic pseudocode's syntax - - -def HITS(query): - """The HITS algorithm for computing hubs and authorities with respect to a query.""" - pages = expand_pages(relevant_pages(query)) - for p in pages.values(): - p.authority = 1 - p.hub = 1 - while not convergence(): - authority = {p: pages[p].authority for p in pages} - hub = {p: pages[p].hub for p in pages} - for p in pages: - # p.authority ← ∑i Inlinki(p).Hub - pages[p].authority = sum(hub[x] for x in getInlinks(pages[p])) - # p.hub ← ∑i Outlinki(p).Authority - pages[p].hub = sum(authority[x] for x in getOutlinks(pages[p])) - normalize(pages) - return pages diff --git a/nlp_apps.ipynb b/nlp_apps.ipynb deleted file mode 100644 index d50588cb7..000000000 --- a/nlp_apps.ipynb +++ /dev/null @@ -1,228 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# NATURAL LANGUAGE PROCESSING APPLICATIONS\n", - "\n", - "In this notebook we will take a look at some indicative applications of natural language processing. We will cover content from [`nlp.py`](https://github.com/aimacode/aima-python/blob/master/nlp.py) and [`text.py`](https://github.com/aimacode/aima-python/blob/master/text.py), for chapters 22 and 23 of Stuart Russel's and Peter Norvig's book [*Artificial Intelligence: A Modern Approach*](http://aima.cs.berkeley.edu/)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Language Recognition" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LANGUAGE RECOGNITION\n", - "\n", - "A very useful application of text models (you can read more on them on the [`text notebook`](https://github.com/aimacode/aima-python/blob/master/text.ipynb)) is categorizing text into a language. In fact, with enough data we can categorize correctly mostly any text. That is because different languages have certain characteristics that set them apart. For example, in German it is very usual for 'c' to be followed by 'h' while in English we see 't' followed by 'h' a lot.\n", - "\n", - "Here we will build an application to categorize sentences in either English or German.\n", - "\n", - "First we need to build our dataset. We will take as input text in English and in German and we will extract n-gram character models (in this case, *bigrams* for n=2). For English, we will use *Flatland* by Edwin Abbott and for German *Faust* by Goethe.\n", - "\n", - "Let's build our text models for each language, which will hold the probability of each bigram occuring in the text." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from utils import open_data\n", - "from text import *\n", - "\n", - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "\n", - "P_flatland = NgramCharModel(2, wordseq)\n", - "\n", - "faust = open_data(\"GE-text/faust.txt\").read()\n", - "wordseq = words(faust)\n", - "\n", - "P_faust = NgramCharModel(2, wordseq)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use this information to build a *Naive Bayes Classifier* that will be used to categorize sentences (you can read more on Naive Bayes on the [`learning notebook`](https://github.com/aimacode/aima-python/blob/master/learning.ipynb)). The classifier will take as input the probability distribution of bigrams and given a list of bigrams (extracted from the sentence to be classified), it will calculate the probability of the example/sentence coming from each language and pick the maximum.\n", - "\n", - "Let's build our classifier, with the assumption that English is as probable as German (the input is a dictionary with values the text models and keys the tuple `language, probability`):" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from learning import NaiveBayesLearner\n", - "\n", - "dist = {('English', 1): P_flatland, ('German', 1): P_faust}\n", - "\n", - "nBS = NaiveBayesLearner(dist, simple=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we need to write a function that takes as input a sentence, breaks it into a list of bigrams and classifies it with the naive bayes classifier from above.\n", - "\n", - "Once we get the text model for the sentence, we need to unravel it. The text models show the probability of each bigram, but the classifier can't handle that extra data. It requires a simple *list* of bigrams. So, if the text model shows that a bigram appears three times, we need to add it three times in the list. Since the text model stores the n-gram information in a dictionary (with the key being the n-gram and the value the number of times the n-gram appears) we need to iterate through the items of the dictionary and manually add them to the list of n-grams." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def recognize(sentence, nBS, n):\n", - " sentence = sentence.lower()\n", - " wordseq = words(sentence)\n", - " \n", - " P_sentence = NgramCharModel(n, wordseq)\n", - " \n", - " ngrams = []\n", - " for b, p in P_sentence.dictionary.items():\n", - " ngrams += [b]*p\n", - " \n", - " return nBS(ngrams)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can start categorizing sentences." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recognize(\"Ich bin ein platz\", nBS, 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recognize(\"Turtles fly high\", nBS, 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'German'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recognize(\"Der pelikan ist hier\", nBS, 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'English'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recognize(\"And thus the wizard spoke\", nBS, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can add more languages if you want, the algorithm works for as many as you like! Also, you can play around with *n*. Here we used 2, but other numbers work too (even though 2 suffices). The algorithm is not perfect, but it has high accuracy even for small samples like the ones we used. That is because English and German are very different languages. The closer together languages are (for example, Norwegian and Swedish share a lot of common ground) the lower the accuracy of the classifier." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebook.py b/notebook.py deleted file mode 100644 index 3fe64de2d..000000000 --- a/notebook.py +++ /dev/null @@ -1,888 +0,0 @@ -from inspect import getsource - -from utils import argmax, argmin -from games import TicTacToe, alphabeta_player, random_player, Fig52Extended, infinity -from logic import parse_definite_clause, standardize_variables, unify, subst -from learning import DataSet -from IPython.display import HTML, display -from collections import Counter, defaultdict - -import matplotlib.pyplot as plt -import numpy as np - -import os, struct -import array -import time - - -#______________________________________________________________________________ -# Magic Words - - -def pseudocode(algorithm): - """Print the pseudocode for the given algorithm.""" - from urllib.request import urlopen - from IPython.display import Markdown - - algorithm = algorithm.replace(' ', '-') - url = "https://raw.githubusercontent.com/aimacode/aima-pseudocode/master/md/{}.md".format(algorithm) - f = urlopen(url) - md = f.read().decode('utf-8') - md = md.split('\n', 1)[-1].strip() - md = '#' + md - return Markdown(md) - - -def psource(*functions): - """Print the source code for the given function(s).""" - source_code = '\n\n'.join(getsource(fn) for fn in functions) - try: - from pygments.formatters import HtmlFormatter - from pygments.lexers import PythonLexer - from pygments import highlight - - display(HTML(highlight(source_code, PythonLexer(), HtmlFormatter(full=True)))) - - except ImportError: - print(source_code) - -# ______________________________________________________________________________ -# Iris Visualization - - -def show_iris(i=0, j=1, k=2): - """Plots the iris dataset in a 3D plot. - The three axes are given by i, j and k, - which correspond to three of the four iris features.""" - from mpl_toolkits.mplot3d import Axes3D - - plt.rcParams.update(plt.rcParamsDefault) - - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - - iris = DataSet(name="iris") - buckets = iris.split_values_by_classes() - - features = ["Sepal Length", "Sepal Width", "Petal Length", "Petal Width"] - f1, f2, f3 = features[i], features[j], features[k] - - a_setosa = [v[i] for v in buckets["setosa"]] - b_setosa = [v[j] for v in buckets["setosa"]] - c_setosa = [v[k] for v in buckets["setosa"]] - - a_virginica = [v[i] for v in buckets["virginica"]] - b_virginica = [v[j] for v in buckets["virginica"]] - c_virginica = [v[k] for v in buckets["virginica"]] - - a_versicolor = [v[i] for v in buckets["versicolor"]] - b_versicolor = [v[j] for v in buckets["versicolor"]] - c_versicolor = [v[k] for v in buckets["versicolor"]] - - - for c, m, sl, sw, pl in [('b', 's', a_setosa, b_setosa, c_setosa), - ('g', '^', a_virginica, b_virginica, c_virginica), - ('r', 'o', a_versicolor, b_versicolor, c_versicolor)]: - ax.scatter(sl, sw, pl, c=c, marker=m) - - ax.set_xlabel(f1) - ax.set_ylabel(f2) - ax.set_zlabel(f3) - - plt.show() - -# ______________________________________________________________________________ -# MNIST - - -def load_MNIST(path="aima-data/MNIST/Digits", fashion=False): - import os, struct - import array - import numpy as np - from collections import Counter - - if fashion: - path = "aima-data/MNIST/Fashion" - - plt.rcParams.update(plt.rcParamsDefault) - plt.rcParams['figure.figsize'] = (10.0, 8.0) - plt.rcParams['image.interpolation'] = 'nearest' - plt.rcParams['image.cmap'] = 'gray' - - train_img_file = open(os.path.join(path, "train-images-idx3-ubyte"), "rb") - train_lbl_file = open(os.path.join(path, "train-labels-idx1-ubyte"), "rb") - test_img_file = open(os.path.join(path, "t10k-images-idx3-ubyte"), "rb") - test_lbl_file = open(os.path.join(path, 't10k-labels-idx1-ubyte'), "rb") - - magic_nr, tr_size, tr_rows, tr_cols = struct.unpack(">IIII", train_img_file.read(16)) - tr_img = array.array("B", train_img_file.read()) - train_img_file.close() - magic_nr, tr_size = struct.unpack(">II", train_lbl_file.read(8)) - tr_lbl = array.array("b", train_lbl_file.read()) - train_lbl_file.close() - - magic_nr, te_size, te_rows, te_cols = struct.unpack(">IIII", test_img_file.read(16)) - te_img = array.array("B", test_img_file.read()) - test_img_file.close() - magic_nr, te_size = struct.unpack(">II", test_lbl_file.read(8)) - te_lbl = array.array("b", test_lbl_file.read()) - test_lbl_file.close() - - #print(len(tr_img), len(tr_lbl), tr_size) - #print(len(te_img), len(te_lbl), te_size) - - train_img = np.zeros((tr_size, tr_rows*tr_cols), dtype=np.int16) - train_lbl = np.zeros((tr_size,), dtype=np.int8) - for i in range(tr_size): - train_img[i] = np.array(tr_img[i*tr_rows*tr_cols : (i+1)*tr_rows*tr_cols]).reshape((tr_rows*te_cols)) - train_lbl[i] = tr_lbl[i] - - test_img = np.zeros((te_size, te_rows*te_cols), dtype=np.int16) - test_lbl = np.zeros((te_size,), dtype=np.int8) - for i in range(te_size): - test_img[i] = np.array(te_img[i*te_rows*te_cols : (i+1)*te_rows*te_cols]).reshape((te_rows*te_cols)) - test_lbl[i] = te_lbl[i] - - return(train_img, train_lbl, test_img, test_lbl) - - -digit_classes = [str(i) for i in range(10)] -fashion_classes = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", - "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"] - - -def show_MNIST(labels, images, samples=8, fashion=False): - if not fashion: - classes = digit_classes - else: - classes = fashion_classes - - num_classes = len(classes) - - for y, cls in enumerate(classes): - idxs = np.nonzero([i == y for i in labels]) - idxs = np.random.choice(idxs[0], samples, replace=False) - for i , idx in enumerate(idxs): - plt_idx = i * num_classes + y + 1 - plt.subplot(samples, num_classes, plt_idx) - plt.imshow(images[idx].reshape((28, 28))) - plt.axis("off") - if i == 0: - plt.title(cls) - - plt.show() - - -def show_ave_MNIST(labels, images, fashion=False): - if not fashion: - item_type = "Digit" - classes = digit_classes - else: - item_type = "Apparel" - classes = fashion_classes - - num_classes = len(classes) - - for y, cls in enumerate(classes): - idxs = np.nonzero([i == y for i in labels]) - print(item_type, y, ":", len(idxs[0]), "images.") - - ave_img = np.mean(np.vstack([images[i] for i in idxs[0]]), axis = 0) - #print(ave_img.shape) - - plt.subplot(1, num_classes, y+1) - plt.imshow(ave_img.reshape((28, 28))) - plt.axis("off") - plt.title(cls) - - plt.show() - -# ______________________________________________________________________________ -# MDP - - -def make_plot_grid_step_function(columns, rows, U_over_time): - """ipywidgets interactive function supports single parameter as input. - This function creates and return such a function by taking as input - other parameters.""" - - def plot_grid_step(iteration): - data = U_over_time[iteration] - data = defaultdict(lambda: 0, data) - grid = [] - for row in range(rows): - current_row = [] - for column in range(columns): - current_row.append(data[(column, row)]) - grid.append(current_row) - grid.reverse() # output like book - fig = plt.imshow(grid, cmap=plt.cm.bwr, interpolation='nearest') - - plt.axis('off') - fig.axes.get_xaxis().set_visible(False) - fig.axes.get_yaxis().set_visible(False) - - for col in range(len(grid)): - for row in range(len(grid[0])): - magic = grid[col][row] - fig.axes.text(row, col, "{0:.2f}".format(magic), va='center', ha='center') - - plt.show() - - return plot_grid_step - -def make_visualize(slider): - """Takes an input a sliderand returns callback function - for timer and animation.""" - - def visualize_callback(Visualize, time_step): - if Visualize is True: - for i in range(slider.min, slider.max + 1): - slider.value = i - time.sleep(float(time_step)) - - return visualize_callback - -# ______________________________________________________________________________ - - -_canvas = """ - -
    - -
    - - -""" # noqa - - -class Canvas: - """Inherit from this class to manage the HTML canvas element in jupyter notebooks. - To create an object of this class any_name_xyz = Canvas("any_name_xyz") - The first argument given must be the name of the object being created. - IPython must be able to refernce the variable name that is being passed.""" - - def __init__(self, varname, width=800, height=600, cid=None): - self.name = varname - self.cid = cid or varname - self.width = width - self.height = height - self.html = _canvas.format(self.cid, self.width, self.height, self.name) - self.exec_list = [] - display_html(self.html) - - def mouse_click(self, x, y): - """Override this method to handle mouse click at position (x, y)""" - raise NotImplementedError - - def mouse_move(self, x, y): - raise NotImplementedError - - def execute(self, exec_str): - """Stores the command to be exectued to a list which is used later during update()""" - if not isinstance(exec_str, str): - print("Invalid execution argument:", exec_str) - self.alert("Recieved invalid execution command format") - prefix = "{0}_canvas_object.".format(self.cid) - self.exec_list.append(prefix + exec_str + ';') - - def fill(self, r, g, b): - """Changes the fill color to a color in rgb format""" - self.execute("fill({0}, {1}, {2})".format(r, g, b)) - - def stroke(self, r, g, b): - """Changes the colors of line/strokes to rgb""" - self.execute("stroke({0}, {1}, {2})".format(r, g, b)) - - def strokeWidth(self, w): - """Changes the width of lines/strokes to 'w' pixels""" - self.execute("strokeWidth({0})".format(w)) - - def rect(self, x, y, w, h): - """Draw a rectangle with 'w' width, 'h' height and (x, y) as the top-left corner""" - self.execute("rect({0}, {1}, {2}, {3})".format(x, y, w, h)) - - def rect_n(self, xn, yn, wn, hn): - """Similar to rect(), but the dimensions are normalized to fall between 0 and 1""" - x = round(xn * self.width) - y = round(yn * self.height) - w = round(wn * self.width) - h = round(hn * self.height) - self.rect(x, y, w, h) - - def line(self, x1, y1, x2, y2): - """Draw a line from (x1, y1) to (x2, y2)""" - self.execute("line({0}, {1}, {2}, {3})".format(x1, y1, x2, y2)) - - def line_n(self, x1n, y1n, x2n, y2n): - """Similar to line(), but the dimensions are normalized to fall between 0 and 1""" - x1 = round(x1n * self.width) - y1 = round(y1n * self.height) - x2 = round(x2n * self.width) - y2 = round(y2n * self.height) - self.line(x1, y1, x2, y2) - - def arc(self, x, y, r, start, stop): - """Draw an arc with (x, y) as centre, 'r' as radius from angles 'start' to 'stop'""" - self.execute("arc({0}, {1}, {2}, {3}, {4})".format(x, y, r, start, stop)) - - def arc_n(self, xn, yn, rn, start, stop): - """Similar to arc(), but the dimensions are normalized to fall between 0 and 1 - The normalizing factor for radius is selected between width and height by - seeing which is smaller.""" - x = round(xn * self.width) - y = round(yn * self.height) - r = round(rn * min(self.width, self.height)) - self.arc(x, y, r, start, stop) - - def clear(self): - """Clear the HTML canvas""" - self.execute("clear()") - - def font(self, font): - """Changes the font of text""" - self.execute('font("{0}")'.format(font)) - - def text(self, txt, x, y, fill=True): - """Display a text at (x, y)""" - if fill: - self.execute('fill_text("{0}", {1}, {2})'.format(txt, x, y)) - else: - self.execute('stroke_text("{0}", {1}, {2})'.format(txt, x, y)) - - def text_n(self, txt, xn, yn, fill=True): - """Similar to text(), but with normalized coordinates""" - x = round(xn * self.width) - y = round(yn * self.height) - self.text(txt, x, y, fill) - - def alert(self, message): - """Immediately display an alert""" - display_html(''.format(message)) - - def update(self): - """Execute the JS code to execute the commands queued by execute()""" - exec_code = "" - self.exec_list = [] - display_html(exec_code) - - -def display_html(html_string): - display(HTML(html_string)) - - -################################################################################ - - -class Canvas_TicTacToe(Canvas): - """Play a 3x3 TicTacToe game on HTML canvas""" - def __init__(self, varname, player_1='human', player_2='random', - width=300, height=350, cid=None): - valid_players = ('human', 'random', 'alphabeta') - if player_1 not in valid_players or player_2 not in valid_players: - raise TypeError("Players must be one of {}".format(valid_players)) - Canvas.__init__(self, varname, width, height, cid) - self.ttt = TicTacToe() - self.state = self.ttt.initial - self.turn = 0 - self.strokeWidth(5) - self.players = (player_1, player_2) - self.font("20px Arial") - self.draw_board() - - def mouse_click(self, x, y): - player = self.players[self.turn] - if self.ttt.terminal_test(self.state): - if 0.55 <= x/self.width <= 0.95 and 6/7 <= y/self.height <= 6/7+1/8: - self.state = self.ttt.initial - self.turn = 0 - self.draw_board() - return - - if player == 'human': - x, y = int(3*x/self.width) + 1, int(3*y/(self.height*6/7)) + 1 - if (x, y) not in self.ttt.actions(self.state): - # Invalid move - return - move = (x, y) - elif player == 'alphabeta': - move = alphabeta_player(self.ttt, self.state) - else: - move = random_player(self.ttt, self.state) - self.state = self.ttt.result(self.state, move) - self.turn ^= 1 - self.draw_board() - - def draw_board(self): - self.clear() - self.stroke(0, 0, 0) - offset = 1/20 - self.line_n(0 + offset, (1/3)*6/7, 1 - offset, (1/3)*6/7) - self.line_n(0 + offset, (2/3)*6/7, 1 - offset, (2/3)*6/7) - self.line_n(1/3, (0 + offset)*6/7, 1/3, (1 - offset)*6/7) - self.line_n(2/3, (0 + offset)*6/7, 2/3, (1 - offset)*6/7) - - board = self.state.board - for mark in board: - if board[mark] == 'X': - self.draw_x(mark) - elif board[mark] == 'O': - self.draw_o(mark) - if self.ttt.terminal_test(self.state): - # End game message - utility = self.ttt.utility(self.state, self.ttt.to_move(self.ttt.initial)) - if utility == 0: - self.text_n('Game Draw!', offset, 6/7 + offset) - else: - self.text_n('Player {} wins!'.format("XO"[utility < 0]), offset, 6/7 + offset) - # Find the 3 and draw a line - self.stroke([255, 0][self.turn], [0, 255][self.turn], 0) - for i in range(3): - if all([(i + 1, j + 1) in self.state.board for j in range(3)]) and \ - len({self.state.board[(i + 1, j + 1)] for j in range(3)}) == 1: - self.line_n(i/3 + 1/6, offset*6/7, i/3 + 1/6, (1 - offset)*6/7) - if all([(j + 1, i + 1) in self.state.board for j in range(3)]) and \ - len({self.state.board[(j + 1, i + 1)] for j in range(3)}) == 1: - self.line_n(offset, (i/3 + 1/6)*6/7, 1 - offset, (i/3 + 1/6)*6/7) - if all([(i + 1, i + 1) in self.state.board for i in range(3)]) and \ - len({self.state.board[(i + 1, i + 1)] for i in range(3)}) == 1: - self.line_n(offset, offset*6/7, 1 - offset, (1 - offset)*6/7) - if all([(i + 1, 3 - i) in self.state.board for i in range(3)]) and \ - len({self.state.board[(i + 1, 3 - i)] for i in range(3)}) == 1: - self.line_n(offset, (1 - offset)*6/7, 1 - offset, offset*6/7) - # restart button - self.fill(0, 0, 255) - self.rect_n(0.5 + offset, 6/7, 0.4, 1/8) - self.fill(0, 0, 0) - self.text_n('Restart', 0.5 + 2*offset, 13/14) - else: # Print which player's turn it is - self.text_n("Player {}'s move({})".format("XO"[self.turn], self.players[self.turn]), - offset, 6/7 + offset) - - self.update() - - def draw_x(self, position): - self.stroke(0, 255, 0) - x, y = [i-1 for i in position] - offset = 1/15 - self.line_n(x/3 + offset, (y/3 + offset)*6/7, x/3 + 1/3 - offset, (y/3 + 1/3 - offset)*6/7) - self.line_n(x/3 + 1/3 - offset, (y/3 + offset)*6/7, x/3 + offset, (y/3 + 1/3 - offset)*6/7) - - def draw_o(self, position): - self.stroke(255, 0, 0) - x, y = [i-1 for i in position] - self.arc_n(x/3 + 1/6, (y/3 + 1/6)*6/7, 1/9, 0, 360) - - -class Canvas_minimax(Canvas): - """Minimax for Fig52Extended on HTML canvas""" - def __init__(self, varname, util_list, width=800, height=600, cid=None): - Canvas.__init__(self, varname, width, height, cid) - self.utils = {node:util for node, util in zip(range(13, 40), util_list)} - self.game = Fig52Extended() - self.game.utils = self.utils - self.nodes = list(range(40)) - self.l = 1/40 - self.node_pos = {} - for i in range(4): - base = len(self.node_pos) - row_size = 3**i - for node in [base + j for j in range(row_size)]: - self.node_pos[node] = ((node - base)/row_size + 1/(2*row_size) - self.l/2, - self.l/2 + (self.l + (1 - 5*self.l)/3)*i) - self.font("12px Arial") - self.node_stack = [] - self.explored = {node for node in self.utils} - self.thick_lines = set() - self.change_list = [] - self.draw_graph() - self.stack_manager = self.stack_manager_gen() - - def minimax(self, node): - game = self.game - player = game.to_move(node) - def max_value(node): - if game.terminal_test(node): - return game.utility(node, player) - self.change_list.append(('a', node)) - self.change_list.append(('h',)) - max_a = argmax(game.actions(node), key=lambda x: min_value(game.result(node, x))) - max_node = game.result(node, max_a) - self.utils[node] = self.utils[max_node] - x1, y1 = self.node_pos[node] - x2, y2 = self.node_pos[max_node] - self.change_list.append(('l', (node, max_node - 3*node - 1))) - self.change_list.append(('e', node)) - self.change_list.append(('p',)) - self.change_list.append(('h',)) - return self.utils[node] - - def min_value(node): - if game.terminal_test(node): - return game.utility(node, player) - self.change_list.append(('a', node)) - self.change_list.append(('h',)) - min_a = argmin(game.actions(node), key=lambda x: max_value(game.result(node, x))) - min_node = game.result(node, min_a) - self.utils[node] = self.utils[min_node] - x1, y1 = self.node_pos[node] - x2, y2 = self.node_pos[min_node] - self.change_list.append(('l', (node, min_node - 3*node - 1))) - self.change_list.append(('e', node)) - self.change_list.append(('p',)) - self.change_list.append(('h',)) - return self.utils[node] - - return max_value(node) - - def stack_manager_gen(self): - self.minimax(0) - for change in self.change_list: - if change[0] == 'a': - self.node_stack.append(change[1]) - elif change[0] == 'e': - self.explored.add(change[1]) - elif change[0] == 'h': - yield - elif change[0] == 'l': - self.thick_lines.add(change[1]) - elif change[0] == 'p': - self.node_stack.pop() - - def mouse_click(self, x, y): - try: - self.stack_manager.send(None) - except StopIteration: - pass - self.draw_graph() - - def draw_graph(self): - self.clear() - # draw nodes - self.stroke(0, 0, 0) - self.strokeWidth(1) - # highlight for nodes in stack - for node in self.node_stack: - x, y = self.node_pos[node] - self.fill(200, 200, 0) - self.rect_n(x - self.l/5, y - self.l/5, self.l*7/5, self.l*7/5) - for node in self.nodes: - x, y = self.node_pos[node] - if node in self.explored: - self.fill(255, 255, 255) - else: - self.fill(200, 200, 200) - self.rect_n(x, y, self.l, self.l) - self.line_n(x, y, x + self.l, y) - self.line_n(x, y, x, y + self.l) - self.line_n(x + self.l, y + self.l, x + self.l, y) - self.line_n(x + self.l, y + self.l, x, y + self.l) - self.fill(0, 0, 0) - if node in self.explored: - self.text_n(self.utils[node], x + self.l/10, y + self.l*9/10) - # draw edges - for i in range(13): - x1, y1 = self.node_pos[i][0] + self.l/2, self.node_pos[i][1] + self.l - for j in range(3): - x2, y2 = self.node_pos[i*3 + j + 1][0] + self.l/2, self.node_pos[i*3 + j + 1][1] - if i in [1, 2, 3]: - self.stroke(200, 0, 0) - else: - self.stroke(0, 200, 0) - if (i, j) in self.thick_lines: - self.strokeWidth(3) - else: - self.strokeWidth(1) - self.line_n(x1, y1, x2, y2) - self.update() - - -class Canvas_alphabeta(Canvas): - """Alpha-beta pruning for Fig52Extended on HTML canvas""" - def __init__(self, varname, util_list, width=800, height=600, cid=None): - Canvas.__init__(self, varname, width, height, cid) - self.utils = {node:util for node, util in zip(range(13, 40), util_list)} - self.game = Fig52Extended() - self.game.utils = self.utils - self.nodes = list(range(40)) - self.l = 1/40 - self.node_pos = {} - for i in range(4): - base = len(self.node_pos) - row_size = 3**i - for node in [base + j for j in range(row_size)]: - self.node_pos[node] = ((node - base)/row_size + 1/(2*row_size) - self.l/2, - 3*self.l/2 + (self.l + (1 - 6*self.l)/3)*i) - self.font("12px Arial") - self.node_stack = [] - self.explored = {node for node in self.utils} - self.pruned = set() - self.ab = {} - self.thick_lines = set() - self.change_list = [] - self.draw_graph() - self.stack_manager = self.stack_manager_gen() - - def alphabeta_search(self, node): - game = self.game - player = game.to_move(node) - - # Functions used by alphabeta - def max_value(node, alpha, beta): - if game.terminal_test(node): - self.change_list.append(('a', node)) - self.change_list.append(('h',)) - self.change_list.append(('p',)) - return game.utility(node, player) - v = -infinity - self.change_list.append(('a', node)) - self.change_list.append(('ab',node, v, beta)) - self.change_list.append(('h',)) - for a in game.actions(node): - min_val = min_value(game.result(node, a), alpha, beta) - if v < min_val: - v = min_val - max_node = game.result(node, a) - self.change_list.append(('ab',node, v, beta)) - if v >= beta: - self.change_list.append(('h',)) - self.pruned.add(node) - break - alpha = max(alpha, v) - self.utils[node] = v - if node not in self.pruned: - self.change_list.append(('l', (node, max_node - 3*node - 1))) - self.change_list.append(('e',node)) - self.change_list.append(('p',)) - self.change_list.append(('h',)) - return v - - def min_value(node, alpha, beta): - if game.terminal_test(node): - self.change_list.append(('a', node)) - self.change_list.append(('h',)) - self.change_list.append(('p',)) - return game.utility(node, player) - v = infinity - self.change_list.append(('a', node)) - self.change_list.append(('ab',node, alpha, v)) - self.change_list.append(('h',)) - for a in game.actions(node): - max_val = max_value(game.result(node, a), alpha, beta) - if v > max_val: - v = max_val - min_node = game.result(node, a) - self.change_list.append(('ab',node, alpha, v)) - if v <= alpha: - self.change_list.append(('h',)) - self.pruned.add(node) - break - beta = min(beta, v) - self.utils[node] = v - if node not in self.pruned: - self.change_list.append(('l', (node, min_node - 3*node - 1))) - self.change_list.append(('e',node)) - self.change_list.append(('p',)) - self.change_list.append(('h',)) - return v - - return max_value(node, -infinity, infinity) - - def stack_manager_gen(self): - self.alphabeta_search(0) - for change in self.change_list: - if change[0] == 'a': - self.node_stack.append(change[1]) - elif change[0] == 'ab': - self.ab[change[1]] = change[2:] - elif change[0] == 'e': - self.explored.add(change[1]) - elif change[0] == 'h': - yield - elif change[0] == 'l': - self.thick_lines.add(change[1]) - elif change[0] == 'p': - self.node_stack.pop() - - def mouse_click(self, x, y): - try: - self.stack_manager.send(None) - except StopIteration: - pass - self.draw_graph() - - def draw_graph(self): - self.clear() - # draw nodes - self.stroke(0, 0, 0) - self.strokeWidth(1) - # highlight for nodes in stack - for node in self.node_stack: - x, y = self.node_pos[node] - # alpha > beta - if node not in self.explored and self.ab[node][0] > self.ab[node][1]: - self.fill(200, 100, 100) - else: - self.fill(200, 200, 0) - self.rect_n(x - self.l/5, y - self.l/5, self.l*7/5, self.l*7/5) - for node in self.nodes: - x, y = self.node_pos[node] - if node in self.explored: - if node in self.pruned: - self.fill(50, 50, 50) - else: - self.fill(255, 255, 255) - else: - self.fill(200, 200, 200) - self.rect_n(x, y, self.l, self.l) - self.line_n(x, y, x + self.l, y) - self.line_n(x, y, x, y + self.l) - self.line_n(x + self.l, y + self.l, x + self.l, y) - self.line_n(x + self.l, y + self.l, x, y + self.l) - self.fill(0, 0, 0) - if node in self.explored and node not in self.pruned: - self.text_n(self.utils[node], x + self.l/10, y + self.l*9/10) - # draw edges - for i in range(13): - x1, y1 = self.node_pos[i][0] + self.l/2, self.node_pos[i][1] + self.l - for j in range(3): - x2, y2 = self.node_pos[i*3 + j + 1][0] + self.l/2, self.node_pos[i*3 + j + 1][1] - if i in [1, 2, 3]: - self.stroke(200, 0, 0) - else: - self.stroke(0, 200, 0) - if (i, j) in self.thick_lines: - self.strokeWidth(3) - else: - self.strokeWidth(1) - self.line_n(x1, y1, x2, y2) - # display alpha and beta - for node in self.node_stack: - if node not in self.explored: - x, y = self.node_pos[node] - alpha, beta = self.ab[node] - self.text_n(alpha, x - self.l/2, y - self.l/10) - self.text_n(beta, x + self.l, y - self.l/10) - self.update() - - -class Canvas_fol_bc_ask(Canvas): - """fol_bc_ask() on HTML canvas""" - def __init__(self, varname, kb, query, width=800, height=600, cid=None): - Canvas.__init__(self, varname, width, height, cid) - self.kb = kb - self.query = query - self.l = 1/20 - self.b = 3*self.l - bc_out = list(self.fol_bc_ask()) - if len(bc_out) is 0: - self.valid = False - else: - self.valid = True - graph = bc_out[0][0][0] - s = bc_out[0][1] - while True: - new_graph = subst(s, graph) - if graph == new_graph: - break - graph = new_graph - self.make_table(graph) - self.context = None - self.draw_table() - - def fol_bc_ask(self): - KB = self.kb - query = self.query - def fol_bc_or(KB, goal, theta): - for rule in KB.fetch_rules_for_goal(goal): - lhs, rhs = parse_definite_clause(standardize_variables(rule)) - for theta1 in fol_bc_and(KB, lhs, unify(rhs, goal, theta)): - yield ([(goal, theta1[0])], theta1[1]) - - def fol_bc_and(KB, goals, theta): - if theta is None: - pass - elif not goals: - yield ([], theta) - else: - first, rest = goals[0], goals[1:] - for theta1 in fol_bc_or(KB, subst(theta, first), theta): - for theta2 in fol_bc_and(KB, rest, theta1[1]): - yield (theta1[0] + theta2[0], theta2[1]) - - return fol_bc_or(KB, query, {}) - - def make_table(self, graph): - table = [] - pos = {} - links = set() - edges = set() - - def dfs(node, depth): - if len(table) <= depth: - table.append([]) - pos = len(table[depth]) - table[depth].append(node[0]) - for child in node[1]: - child_id = dfs(child, depth + 1) - links.add(((depth, pos), child_id)) - return (depth, pos) - - dfs(graph, 0) - y_off = 0.85/len(table) - for i, row in enumerate(table): - x_off = 0.95/len(row) - for j, node in enumerate(row): - pos[(i, j)] = (0.025 + j*x_off + (x_off - self.b)/2, 0.025 + i*y_off + (y_off - self.l)/2) - for p, c in links: - x1, y1 = pos[p] - x2, y2 = pos[c] - edges.add((x1 + self.b/2, y1 + self.l, x2 + self.b/2, y2)) - - self.table = table - self.pos = pos - self.edges = edges - - def mouse_click(self, x, y): - x, y = x/self.width, y/self.height - for node in self.pos: - xs, ys = self.pos[node] - xe, ye = xs + self.b, ys + self.l - if xs <= x <= xe and ys <= y <= ye: - self.context = node - break - self.draw_table() - - def draw_table(self): - self.clear() - self.strokeWidth(3) - self.stroke(0, 0, 0) - self.font("12px Arial") - if self.valid: - # draw nodes - for i, j in self.pos: - x, y = self.pos[(i, j)] - self.fill(200, 200, 200) - self.rect_n(x, y, self.b, self.l) - self.line_n(x, y, x + self.b, y) - self.line_n(x, y, x, y + self.l) - self.line_n(x + self.b, y, x + self.b, y + self.l) - self.line_n(x, y + self.l, x + self.b, y + self.l) - self.fill(0, 0, 0) - self.text_n(self.table[i][j], x + 0.01, y + self.l - 0.01) - #draw edges - for x1, y1, x2, y2 in self.edges: - self.line_n(x1, y1, x2, y2) - else: - self.fill(255, 0, 0) - self.rect_n(0, 0, 1, 1) - # text area - self.fill(255, 255, 255) - self.rect_n(0, 0.9, 1, 0.1) - self.strokeWidth(5) - self.stroke(0, 0, 0) - self.line_n(0, 0.9, 1, 0.9) - self.font("22px Arial") - self.fill(0, 0, 0) - self.text_n(self.table[self.context[0]][self.context[1]] if self.context else "Click for text", 0.025, 0.975) - self.update() diff --git a/planning.ipynb b/planning.ipynb deleted file mode 100644 index 37461ee9b..000000000 --- a/planning.ipynb +++ /dev/null @@ -1,354 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Planning: planning.py; chapters 10-11" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook describes the [planning.py](https://github.com/aimacode/aima-python/blob/master/planning.py) module, which covers Chapters 10 (Classical Planning) and 11 (Planning and Acting in the Real World) of *[Artificial Intelligence: A Modern Approach](http://aima.cs.berkeley.edu)*. See the [intro notebook](https://github.com/aimacode/aima-python/blob/master/intro.ipynb) for instructions.\n", - "\n", - "We'll start by looking at `PDDL` and `Action` data types for defining problems and actions. Then, we will see how to use them by trying to plan a trip from *Sibiu* to *Bucharest* across the familiar map of Romania, from [search.ipynb](https://github.com/aimacode/aima-python/blob/master/search.ipynb). Finally, we will look at the implementation of the GraphPlan algorithm.\n", - "\n", - "The first step is to load the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from planning import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To be able to model a planning problem properly, it is essential to be able to represent an Action. Each action we model requires at least three things:\n", - "* preconditions that the action must meet\n", - "* the effects of executing the action\n", - "* some expression that represents the action" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Planning actions have been modelled using the `Action` class. Let's look at the source to see how the internal details of an action are implemented in Python." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%psource Action" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is interesting to see the way preconditions and effects are represented here. Instead of just being a list of expressions each, they consist of two lists - `precond_pos` and `precond_neg`. This is to work around the fact that PDDL doesn't allow for negations. Thus, for each precondition, we maintain a seperate list of those preconditions that must hold true, and those whose negations must hold true. Similarly, instead of having a single list of expressions that are the result of executing an action, we have two. The first (`effect_add`) contains all the expressions that will evaluate to true if the action is executed, and the the second (`effect_neg`) contains all those expressions that would be false if the action is executed (ie. their negations would be true).\n", - "\n", - "The constructor parameters, however combine the two precondition lists into a single `precond` parameter, and the effect lists into a single `effect` parameter." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `PDDL` class is used to represent planning problems in this module. The following attributes are essential to be able to define a problem:\n", - "* a goal test\n", - "* an initial state\n", - "* a set of viable actions that can be executed in the search space of the problem\n", - "\n", - "View the source to see how the Python code tries to realise these." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%psource PDDL" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `initial_state` attribute is a list of `Expr` expressions that forms the initial knowledge base for the problem. Next, `actions` contains a list of `Action` objects that may be executed in the search space of the problem. Lastly, we pass a `goal_test` function as a parameter - this typically takes a knowledge base as a parameter, and returns whether or not the goal has been reached." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now lets try to define a planning problem using these tools. Since we already know about the map of Romania, lets see if we can plan a trip across a simplified map of Romania.\n", - "\n", - "Here is our simplified map definition:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from utils import *\n", - "# this imports the required expr so we can create our knowledge base\n", - "\n", - "knowledge_base = [\n", - " expr(\"Connected(Bucharest,Pitesti)\"),\n", - " expr(\"Connected(Pitesti,Rimnicu)\"),\n", - " expr(\"Connected(Rimnicu,Sibiu)\"),\n", - " expr(\"Connected(Sibiu,Fagaras)\"),\n", - " expr(\"Connected(Fagaras,Bucharest)\"),\n", - " expr(\"Connected(Pitesti,Craiova)\"),\n", - " expr(\"Connected(Craiova,Rimnicu)\")\n", - " ]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us add some logic propositions to complete our knowledge about travelling around the map. These are the typical symmetry and transitivity properties of connections on a map. We can now be sure that our `knowledge_base` understands what it truly means for two locations to be connected in the sense usually meant by humans when we use the term.\n", - "\n", - "Let's also add our starting location - *Sibiu* to the map." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "knowledge_base.extend([\n", - " expr(\"Connected(x,y) ==> Connected(y,x)\"),\n", - " expr(\"Connected(x,y) & Connected(y,z) ==> Connected(x,z)\"),\n", - " expr(\"At(Sibiu)\")\n", - " ])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now have a complete knowledge base, which can be seen like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "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": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "knowledge_base" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now define possible actions to our problem. We know that we can drive between any connected places. But, as is evident from [this](https://en.wikipedia.org/wiki/List_of_airports_in_Romania) list of Romanian airports, we can also fly directly between Sibiu, Bucharest, and Craiova.\n", - "\n", - "We can define these flight actions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "#Sibiu to Bucharest\n", - "precond_pos = [expr('At(Sibiu)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Bucharest)')]\n", - "effect_rem = [expr('At(Sibiu)')]\n", - "fly_s_b = Action(expr('Fly(Sibiu, Bucharest)'), [precond_pos, precond_neg], [effect_add, effect_rem])\n", - "\n", - "#Bucharest to Sibiu\n", - "precond_pos = [expr('At(Bucharest)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Sibiu)')]\n", - "effect_rem = [expr('At(Bucharest)')]\n", - "fly_b_s = Action(expr('Fly(Bucharest, Sibiu)'), [precond_pos, precond_neg], [effect_add, effect_rem])\n", - "\n", - "#Sibiu to Craiova\n", - "precond_pos = [expr('At(Sibiu)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Craiova)')]\n", - "effect_rem = [expr('At(Sibiu)')]\n", - "fly_s_c = Action(expr('Fly(Sibiu, Craiova)'), [precond_pos, precond_neg], [effect_add, effect_rem])\n", - "\n", - "#Craiova to Sibiu\n", - "precond_pos = [expr('At(Craiova)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Sibiu)')]\n", - "effect_rem = [expr('At(Craiova)')]\n", - "fly_c_s = Action(expr('Fly(Craiova, Sibiu)'), [precond_pos, precond_neg], [effect_add, effect_rem])\n", - "\n", - "#Bucharest to Craiova\n", - "precond_pos = [expr('At(Bucharest)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Craiova)')]\n", - "effect_rem = [expr('At(Bucharest)')]\n", - "fly_b_c = Action(expr('Fly(Bucharest, Craiova)'), [precond_pos, precond_neg], [effect_add, effect_rem])\n", - "\n", - "#Craiova to Bucharest\n", - "precond_pos = [expr('At(Craiova)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(Bucharest)')]\n", - "effect_rem = [expr('At(Craiova)')]\n", - "fly_c_b = Action(expr('Fly(Craiova, Bucharest)'), [precond_pos, precond_neg], [effect_add, effect_rem])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the drive actions like this." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "#Drive\n", - "precond_pos = [expr('At(x)')]\n", - "precond_neg = []\n", - "effect_add = [expr('At(y)')]\n", - "effect_rem = [expr('At(x)')]\n", - "drive = Action(expr('Drive(x, y)'), [precond_pos, precond_neg], [effect_add, effect_rem])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we can define a a function that will tell us when we have reached our destination, Bucharest." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def goal_test(kb):\n", - " return kb.ask(expr(\"At(Bucharest)\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Thus, with all the components in place, we can define the planning problem." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "prob = PDDL(knowledge_base, [fly_s_b, fly_b_s, fly_s_c, fly_c_s, fly_b_c, fly_c_b, drive], goal_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.4.3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/planning.py b/planning.py deleted file mode 100644 index 4c02c3d72..000000000 --- a/planning.py +++ /dev/null @@ -1,864 +0,0 @@ -"""Planning (Chapters 10-11) -""" - -import itertools -from search import Node -from utils import Expr, expr, first, FIFOQueue -from logic import FolKB - - -class PDDL: - """ - Planning Domain Definition Language (PDDL) used to define a search problem. - It stores states in a knowledge base consisting of first order logic statements. - The conjunction of these logical statements completely defines a state. - """ - - def __init__(self, initial_state, actions, goal_test): - self.kb = FolKB(initial_state) - self.actions = actions - self.goal_test_func = goal_test - - def goal_test(self): - return self.goal_test_func(self.kb) - - def act(self, action): - """ - Performs the action given as argument. - Note that action is an Expr like expr('Remove(Glass, Table)') or expr('Eat(Sandwich)') - """ - action_name = action.op - args = action.args - list_action = first(a for a in self.actions if a.name == action_name) - if list_action is None: - raise Exception("Action '{}' not found".format(action_name)) - if not list_action.check_precond(self.kb, args): - raise Exception("Action '{}' pre-conditions not satisfied".format(action)) - list_action(self.kb, args) - - -class Action: - """ - Defines an action schema using preconditions and effects. - Use this to describe actions in PDDL. - action is an Expr where variables are given as arguments(args). - Precondition and effect are both lists with positive and negated literals. - Example: - precond_pos = [expr("Human(person)"), expr("Hungry(Person)")] - precond_neg = [expr("Eaten(food)")] - effect_add = [expr("Eaten(food)")] - effect_rem = [expr("Hungry(person)")] - eat = Action(expr("Eat(person, food)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - """ - - def __init__(self, action, precond, effect): - self.name = action.op - self.args = action.args - self.precond_pos = precond[0] - self.precond_neg = precond[1] - self.effect_add = effect[0] - self.effect_rem = effect[1] - - def __call__(self, kb, args): - return self.act(kb, args) - - def substitute(self, e, args): - """Replaces variables in expression with their respective Propositional symbol""" - new_args = list(e.args) - for num, x in enumerate(e.args): - for i, _ in enumerate(self.args): - if self.args[i] == x: - new_args[num] = args[i] - return Expr(e.op, *new_args) - - def check_precond(self, kb, args): - """Checks if the precondition is satisfied in the current state""" - # check for positive clauses - for clause in self.precond_pos: - if self.substitute(clause, args) not in kb.clauses: - return False - # check for negative clauses - for clause in self.precond_neg: - if self.substitute(clause, args) in kb.clauses: - return False - return True - - def act(self, kb, args): - """Executes the action on the state's kb""" - # check if the preconditions are satisfied - if not self.check_precond(kb, args): - raise Exception("Action pre-conditions not satisfied") - # remove negative literals - for clause in self.effect_rem: - kb.retract(self.substitute(clause, args)) - # add positive literals - for clause in self.effect_add: - kb.tell(self.substitute(clause, args)) - - -def air_cargo(): - init = [expr('At(C1, SFO)'), - expr('At(C2, JFK)'), - expr('At(P1, SFO)'), - expr('At(P2, JFK)'), - expr('Cargo(C1)'), - expr('Cargo(C2)'), - expr('Plane(P1)'), - expr('Plane(P2)'), - expr('Airport(JFK)'), - expr('Airport(SFO)')] - - def goal_test(kb): - required = [expr('At(C1 , JFK)'), expr('At(C2 ,SFO)')] - return all([kb.ask(q) is not False for q in required]) - - # Actions - - # Load - precond_pos = [expr("At(c, a)"), expr("At(p, a)"), expr("Cargo(c)"), expr("Plane(p)"), - expr("Airport(a)")] - precond_neg = [] - effect_add = [expr("In(c, p)")] - effect_rem = [expr("At(c, a)")] - load = Action(expr("Load(c, p, a)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # Unload - precond_pos = [expr("In(c, p)"), expr("At(p, a)"), expr("Cargo(c)"), expr("Plane(p)"), - expr("Airport(a)")] - precond_neg = [] - effect_add = [expr("At(c, a)")] - effect_rem = [expr("In(c, p)")] - unload = Action(expr("Unload(c, p, a)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # Fly - # Used 'f' instead of 'from' because 'from' is a python keyword and expr uses eval() function - precond_pos = [expr("At(p, f)"), expr("Plane(p)"), expr("Airport(f)"), expr("Airport(to)")] - precond_neg = [] - effect_add = [expr("At(p, to)")] - effect_rem = [expr("At(p, f)")] - fly = Action(expr("Fly(p, f, to)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - return PDDL(init, [load, unload, fly], goal_test) - - -def spare_tire(): - init = [expr('Tire(Flat)'), - expr('Tire(Spare)'), - expr('At(Flat, Axle)'), - expr('At(Spare, Trunk)')] - - def goal_test(kb): - required = [expr('At(Spare, Axle)')] - return all(kb.ask(q) is not False for q in required) - - # Actions - - # Remove - precond_pos = [expr("At(obj, loc)")] - precond_neg = [] - effect_add = [expr("At(obj, Ground)")] - effect_rem = [expr("At(obj, loc)")] - remove = Action(expr("Remove(obj, loc)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # PutOn - precond_pos = [expr("Tire(t)"), expr("At(t, Ground)")] - precond_neg = [expr("At(Flat, Axle)")] - effect_add = [expr("At(t, Axle)")] - effect_rem = [expr("At(t, Ground)")] - put_on = Action(expr("PutOn(t, Axle)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # LeaveOvernight - precond_pos = [] - precond_neg = [] - effect_add = [] - effect_rem = [expr("At(Spare, Ground)"), expr("At(Spare, Axle)"), expr("At(Spare, Trunk)"), - expr("At(Flat, Ground)"), expr("At(Flat, Axle)"), expr("At(Flat, Trunk)")] - leave_overnight = Action(expr("LeaveOvernight"), [precond_pos, precond_neg], - [effect_add, effect_rem]) - - return PDDL(init, [remove, put_on, leave_overnight], goal_test) - - -def three_block_tower(): - init = [expr('On(A, Table)'), - expr('On(B, Table)'), - expr('On(C, A)'), - expr('Block(A)'), - expr('Block(B)'), - expr('Block(C)'), - expr('Clear(B)'), - expr('Clear(C)')] - - def goal_test(kb): - required = [expr('On(A, B)'), expr('On(B, C)')] - return all(kb.ask(q) is not False for q in required) - - # Actions - - # Move - precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Clear(y)'), expr('Block(b)'), - expr('Block(y)')] - precond_neg = [] - effect_add = [expr('On(b, y)'), expr('Clear(x)')] - effect_rem = [expr('On(b, x)'), expr('Clear(y)')] - move = Action(expr('Move(b, x, y)'), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # MoveToTable - precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)')] - precond_neg = [] - effect_add = [expr('On(b, Table)'), expr('Clear(x)')] - effect_rem = [expr('On(b, x)')] - moveToTable = Action(expr('MoveToTable(b, x)'), [precond_pos, precond_neg], - [effect_add, effect_rem]) - - return PDDL(init, [move, moveToTable], goal_test) - - -def have_cake_and_eat_cake_too(): - init = [expr('Have(Cake)')] - - def goal_test(kb): - required = [expr('Have(Cake)'), expr('Eaten(Cake)')] - return all(kb.ask(q) is not False for q in required) - - # Actions - - # Eat cake - precond_pos = [expr('Have(Cake)')] - precond_neg = [] - effect_add = [expr('Eaten(Cake)')] - effect_rem = [expr('Have(Cake)')] - eat_cake = Action(expr('Eat(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # Bake Cake - precond_pos = [] - precond_neg = [expr('Have(Cake)')] - effect_add = [expr('Have(Cake)')] - effect_rem = [] - bake_cake = Action(expr('Bake(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem]) - - return PDDL(init, [eat_cake, bake_cake], goal_test) - - -class Level(): - """ - Contains the state of the planning problem - and exhaustive list of actions which use the - states as pre-condition. - """ - - def __init__(self, poskb, negkb): - self.poskb = poskb - # Current state - self.current_state_pos = poskb.clauses - self.current_state_neg = negkb.clauses - # Current action to current state link - self.current_action_links_pos = {} - self.current_action_links_neg = {} - # Current state to action link - self.current_state_links_pos = {} - self.current_state_links_neg = {} - # Current action to next state link - self.next_action_links = {} - # Next state to current action link - self.next_state_links_pos = {} - self.next_state_links_neg = {} - self.mutex = [] - - def __call__(self, actions, objects): - self.build(actions, objects) - self.find_mutex() - - def find_mutex(self): - # Inconsistent effects - for poseff in self.next_state_links_pos: - negeff = poseff - if negeff in self.next_state_links_neg: - for a in self.next_state_links_pos[poseff]: - for b in self.next_state_links_neg[negeff]: - if set([a, b]) not in self.mutex: - self.mutex.append(set([a, b])) - - # Interference - for posprecond in self.current_state_links_pos: - negeff = posprecond - if negeff in self.next_state_links_neg: - for a in self.current_state_links_pos[posprecond]: - for b in self.next_state_links_neg[negeff]: - if set([a, b]) not in self.mutex: - self.mutex.append(set([a, b])) - - for negprecond in self.current_state_links_neg: - poseff = negprecond - if poseff in self.next_state_links_pos: - for a in self.next_state_links_pos[poseff]: - for b in self.current_state_links_neg[negprecond]: - if set([a, b]) not in self.mutex: - self.mutex.append(set([a, b])) - - # Competing needs - for posprecond in self.current_state_links_pos: - negprecond = posprecond - if negprecond in self.current_state_links_neg: - for a in self.current_state_links_pos[posprecond]: - for b in self.current_state_links_neg[negprecond]: - if set([a, b]) not in self.mutex: - self.mutex.append(set([a, b])) - - # Inconsistent support - state_mutex = [] - for pair in self.mutex: - next_state_0 = self.next_action_links[list(pair)[0]] - if len(pair) == 2: - next_state_1 = self.next_action_links[list(pair)[1]] - else: - next_state_1 = self.next_action_links[list(pair)[0]] - if (len(next_state_0) == 1) and (len(next_state_1) == 1): - state_mutex.append(set([next_state_0[0], next_state_1[0]])) - - self.mutex = self.mutex+state_mutex - - def build(self, actions, objects): - - # Add persistence actions for positive states - for clause in self.current_state_pos: - self.current_action_links_pos[Expr('Persistence', clause)] = [clause] - self.next_action_links[Expr('Persistence', clause)] = [clause] - self.current_state_links_pos[clause] = [Expr('Persistence', clause)] - self.next_state_links_pos[clause] = [Expr('Persistence', clause)] - - # Add persistence actions for negative states - for clause in self.current_state_neg: - not_expr = Expr('not'+clause.op, clause.args) - self.current_action_links_neg[Expr('Persistence', not_expr)] = [clause] - self.next_action_links[Expr('Persistence', not_expr)] = [clause] - self.current_state_links_neg[clause] = [Expr('Persistence', not_expr)] - self.next_state_links_neg[clause] = [Expr('Persistence', not_expr)] - - for a in actions: - num_args = len(a.args) - possible_args = tuple(itertools.permutations(objects, num_args)) - - for arg in possible_args: - if a.check_precond(self.poskb, arg): - for num, symbol in enumerate(a.args): - if not symbol.op.islower(): - arg = list(arg) - arg[num] = symbol - arg = tuple(arg) - - new_action = a.substitute(Expr(a.name, *a.args), arg) - self.current_action_links_pos[new_action] = [] - self.current_action_links_neg[new_action] = [] - - for clause in a.precond_pos: - new_clause = a.substitute(clause, arg) - self.current_action_links_pos[new_action].append(new_clause) - if new_clause in self.current_state_links_pos: - self.current_state_links_pos[new_clause].append(new_action) - else: - self.current_state_links_pos[new_clause] = [new_action] - - for clause in a.precond_neg: - new_clause = a.substitute(clause, arg) - self.current_action_links_neg[new_action].append(new_clause) - if new_clause in self.current_state_links_neg: - self.current_state_links_neg[new_clause].append(new_action) - else: - self.current_state_links_neg[new_clause] = [new_action] - - self.next_action_links[new_action] = [] - for clause in a.effect_add: - new_clause = a.substitute(clause, arg) - self.next_action_links[new_action].append(new_clause) - if new_clause in self.next_state_links_pos: - self.next_state_links_pos[new_clause].append(new_action) - else: - self.next_state_links_pos[new_clause] = [new_action] - - for clause in a.effect_rem: - new_clause = a.substitute(clause, arg) - self.next_action_links[new_action].append(new_clause) - if new_clause in self.next_state_links_neg: - self.next_state_links_neg[new_clause].append(new_action) - else: - self.next_state_links_neg[new_clause] = [new_action] - - def perform_actions(self): - new_kb_pos = FolKB(list(set(self.next_state_links_pos.keys()))) - new_kb_neg = FolKB(list(set(self.next_state_links_neg.keys()))) - - return Level(new_kb_pos, new_kb_neg) - - -class Graph: - """ - Contains levels of state and actions - Used in graph planning algorithm to extract a solution - """ - - def __init__(self, pddl, negkb): - self.pddl = pddl - self.levels = [Level(pddl.kb, negkb)] - self.objects = set(arg for clause in pddl.kb.clauses + negkb.clauses for arg in clause.args) - - def __call__(self): - self.expand_graph() - - def expand_graph(self): - last_level = self.levels[-1] - last_level(self.pddl.actions, self.objects) - self.levels.append(last_level.perform_actions()) - - def non_mutex_goals(self, goals, index): - goal_perm = itertools.combinations(goals, 2) - for g in goal_perm: - if set(g) in self.levels[index].mutex: - return False - return True - - -class GraphPlan: - """ - Class for formulation GraphPlan algorithm - Constructs a graph of state and action space - Returns solution for the planning problem - """ - - def __init__(self, pddl, negkb): - self.graph = Graph(pddl, negkb) - self.nogoods = [] - self.solution = [] - - def check_leveloff(self): - first_check = (set(self.graph.levels[-1].current_state_pos) == - set(self.graph.levels[-2].current_state_pos)) - second_check = (set(self.graph.levels[-1].current_state_neg) == - set(self.graph.levels[-2].current_state_neg)) - - if first_check and second_check: - return True - - def extract_solution(self, goals_pos, goals_neg, index): - level = self.graph.levels[index] - if not self.graph.non_mutex_goals(goals_pos+goals_neg, index): - self.nogoods.append((level, goals_pos, goals_neg)) - return - - level = self.graph.levels[index-1] - - # Create all combinations of actions that satisfy the goal - actions = [] - for goal in goals_pos: - actions.append(level.next_state_links_pos[goal]) - - for goal in goals_neg: - actions.append(level.next_state_links_neg[goal]) - - all_actions = list(itertools.product(*actions)) - - # Filter out the action combinations which contain mutexes - non_mutex_actions = [] - for action_tuple in all_actions: - action_pairs = itertools.combinations(list(set(action_tuple)), 2) - non_mutex_actions.append(list(set(action_tuple))) - for pair in action_pairs: - if set(pair) in level.mutex: - non_mutex_actions.pop(-1) - break - - # Recursion - for action_list in non_mutex_actions: - if [action_list, index] not in self.solution: - self.solution.append([action_list, index]) - - new_goals_pos = [] - new_goals_neg = [] - for act in set(action_list): - if act in level.current_action_links_pos: - new_goals_pos = new_goals_pos + level.current_action_links_pos[act] - - for act in set(action_list): - if act in level.current_action_links_neg: - new_goals_neg = new_goals_neg + level.current_action_links_neg[act] - - if abs(index)+1 == len(self.graph.levels): - return - elif (level, new_goals_pos, new_goals_neg) in self.nogoods: - return - else: - self.extract_solution(new_goals_pos, new_goals_neg, index-1) - - # Level-Order multiple solutions - solution = [] - for item in self.solution: - if item[1] == -1: - solution.append([]) - solution[-1].append(item[0]) - else: - solution[-1].append(item[0]) - - for num, item in enumerate(solution): - item.reverse() - solution[num] = item - - return solution - - -def spare_tire_graphplan(): - pddl = spare_tire() - negkb = FolKB([expr('At(Flat, Trunk)')]) - graphplan = GraphPlan(pddl, negkb) - - def goal_test(kb, goals): - return all(kb.ask(q) is not False for q in goals) - - # Not sure - goals_pos = [expr('At(Spare, Axle)'), expr('At(Flat, Ground)')] - goals_neg = [] - - while True: - if (goal_test(graphplan.graph.levels[-1].poskb, goals_pos) and - graphplan.graph.non_mutex_goals(goals_pos+goals_neg, -1)): - solution = graphplan.extract_solution(goals_pos, goals_neg, -1) - if solution: - return solution - graphplan.graph.expand_graph() - if len(graphplan.graph.levels)>=2 and graphplan.check_leveloff(): - return None - - -def double_tennis_problem(): - init = [expr('At(A, LeftBaseLine)'), - expr('At(B, RightNet)'), - expr('Approaching(Ball, RightBaseLine)'), - expr('Partner(A, B)'), - expr('Partner(B, A)')] - - def goal_test(kb): - required = [expr('Goal(Returned(Ball))'), expr('At(a, RightNet)'), expr('At(a, LeftNet)')] - return all(kb.ask(q) is not False for q in required) - - # Actions - - # Hit - precond_pos = [expr("Approaching(Ball,loc)"), expr("At(actor,loc)")] - precond_neg = [] - effect_add = [expr("Returned(Ball)")] - effect_rem = [] - hit = Action(expr("Hit(actor, Ball)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - # Go - precond_pos = [expr("At(actor, loc)")] - precond_neg = [] - effect_add = [expr("At(actor, to)")] - effect_rem = [expr("At(actor, loc)")] - go = Action(expr("Go(actor, to)"), [precond_pos, precond_neg], [effect_add, effect_rem]) - - return PDDL(init, [hit, go], goal_test) - - -class HLA(Action): - """ - Define Actions for the real-world (that may be refined further), and satisfy resource - constraints. - """ - unique_group = 1 - - def __init__(self, action, precond=[None, None], effect=[None, None], duration=0, - consume={}, use={}): - """ - As opposed to actions, to define HLA, we have added constraints. - duration holds the amount of time required to execute the task - consumes holds a dictionary representing the resources the task consumes - uses holds a dictionary representing the resources the task uses - """ - super().__init__(action, precond, effect) - self.duration = duration - self.consumes = consume - self.uses = use - self.completed = False - # self.priority = -1 # must be assigned in relation to other HLAs - # self.job_group = -1 # must be assigned in relation to other HLAs - - def do_action(self, job_order, available_resources, kb, args): - """ - An HLA based version of act - along with knowledge base updation, it handles - resource checks, and ensures the actions are executed in the correct order. - """ - # print(self.name) - if not self.has_usable_resource(available_resources): - raise Exception('Not enough usable resources to execute {}'.format(self.name)) - if not self.has_consumable_resource(available_resources): - raise Exception('Not enough consumable resources to execute {}'.format(self.name)) - if not self.inorder(job_order): - raise Exception("Can't execute {} - execute prerequisite actions first". - format(self.name)) - super().act(kb, args) # update knowledge base - for resource in self.consumes: # remove consumed resources - available_resources[resource] -= self.consumes[resource] - self.completed = True # set the task status to complete - - def has_consumable_resource(self, available_resources): - """ - Ensure there are enough consumable resources for this action to execute. - """ - for resource in self.consumes: - if available_resources.get(resource) is None: - return False - if available_resources[resource] < self.consumes[resource]: - return False - return True - - def has_usable_resource(self, available_resources): - """ - Ensure there are enough usable resources for this action to execute. - """ - for resource in self.uses: - if available_resources.get(resource) is None: - return False - if available_resources[resource] < self.uses[resource]: - return False - return True - - def inorder(self, job_order): - """ - Ensure that all the jobs that had to be executed before the current one have been - successfully executed. - """ - for jobs in job_order: - if self in jobs: - for job in jobs: - if job is self: - return True - if not job.completed: - return False - return True - - -class Problem(PDDL): - """ - Define real-world problems by aggregating resources as numerical quantities instead of - named entities. - - This class is identical to PDLL, except that it overloads the act function to handle - resource and ordering conditions imposed by HLA as opposed to Action. - """ - def __init__(self, initial_state, actions, goal_test, jobs=None, resources={}): - super().__init__(initial_state, actions, goal_test) - self.jobs = jobs - self.resources = resources - - def act(self, action): - """ - Performs the HLA given as argument. - - Note that this is different from the superclass action - where the parameter was an - Expression. For real world problems, an Expr object isn't enough to capture all the - detail required for executing the action - resources, preconditions, etc need to be - checked for too. - """ - args = action.args - list_action = first(a for a in self.actions if a.name == action.name) - if list_action is None: - raise Exception("Action '{}' not found".format(action.name)) - list_action.do_action(self.jobs, self.resources, self.kb, args) - - def refinements(hla, state, library): # TODO - refinements may be (multiple) HLA themselves ... - """ - state is a Problem, containing the current state kb - library is a dictionary containing details for every possible refinement. eg: - { - "HLA": [ - "Go(Home,SFO)", - "Go(Home,SFO)", - "Drive(Home, SFOLongTermParking)", - "Shuttle(SFOLongTermParking, SFO)", - "Taxi(Home, SFO)" - ], - "steps": [ - ["Drive(Home, SFOLongTermParking)", "Shuttle(SFOLongTermParking, SFO)"], - ["Taxi(Home, SFO)"], - [], # empty refinements ie primitive action - [], - [] - ], - "precond_pos": [ - ["At(Home), Have(Car)"], - ["At(Home)"], - ["At(Home)", "Have(Car)"] - ["At(SFOLongTermParking)"] - ["At(Home)"] - ], - "precond_neg": [[],[],[],[],[]], - "effect_pos": [ - ["At(SFO)"], - ["At(SFO)"], - ["At(SFOLongTermParking)"], - ["At(SFO)"], - ["At(SFO)"] - ], - "effect_neg": [ - ["At(Home)"], - ["At(Home)"], - ["At(Home)"], - ["At(SFOLongTermParking)"], - ["At(Home)"] - ] - } - """ - e = Expr(hla.name, hla.args) - indices = [i for i, x in enumerate(library["HLA"]) if expr(x).op == hla.name] - for i in indices: - action = HLA(expr(library["steps"][i][0]), [ # TODO multiple refinements - [expr(x) for x in library["precond_pos"][i]], - [expr(x) for x in library["precond_neg"][i]] - ], - [ - [expr(x) for x in library["effect_pos"][i]], - [expr(x) for x in library["effect_neg"][i]] - ]) - if action.check_precond(state.kb, action.args): - yield action - - def hierarchical_search(problem, hierarchy): - """ - [Figure 11.5] 'Hierarchical Search, a Breadth First Search implementation of Hierarchical - Forward Planning Search' - The problem is a real-world prodlem defined by the problem class, and the hierarchy is - a dictionary of HLA - refinements (see refinements generator for details) - """ - act = Node(problem.actions[0]) - frontier = FIFOQueue() - frontier.append(act) - while(True): - if not frontier: - return None - plan = frontier.pop() - print(plan.state.name) - hla = plan.state # first_or_null(plan) - prefix = None - if plan.parent: - prefix = plan.parent.state.action # prefix, suffix = subseq(plan.state, hla) - outcome = Problem.result(problem, prefix) - if hla is None: - if outcome.goal_test(): - return plan.path() - else: - print("else") - for sequence in Problem.refinements(hla, outcome, hierarchy): - print("...") - frontier.append(Node(plan.state, plan.parent, sequence)) - - def result(problem, action): - """The outcome of applying an action to the current problem""" - if action is not None: - problem.act(action) - return problem - else: - return problem - - -def job_shop_problem(): - """ - [figure 11.1] JOB-SHOP-PROBLEM - - A job-shop scheduling problem for assembling two cars, - with resource and ordering constraints. - - Example: - >>> from planning import * - >>> p = job_shop_problem() - >>> p.goal_test() - False - >>> p.act(p.jobs[1][0]) - >>> p.act(p.jobs[1][1]) - >>> p.act(p.jobs[1][2]) - >>> p.act(p.jobs[0][0]) - >>> p.act(p.jobs[0][1]) - >>> p.goal_test() - False - >>> p.act(p.jobs[0][2]) - >>> p.goal_test() - True - >>> - """ - init = [expr('Car(C1)'), - expr('Car(C2)'), - expr('Wheels(W1)'), - expr('Wheels(W2)'), - expr('Engine(E2)'), - expr('Engine(E2)')] - - def goal_test(kb): - # print(kb.clauses) - required = [expr('Has(C1, W1)'), expr('Has(C1, E1)'), expr('Inspected(C1)'), - expr('Has(C2, W2)'), expr('Has(C2, E2)'), expr('Inspected(C2)')] - for q in required: - # print(q) - # print(kb.ask(q)) - if kb.ask(q) is False: - return False - return True - - resources = {'EngineHoists': 1, 'WheelStations': 2, 'Inspectors': 2, 'LugNuts': 500} - - # AddEngine1 - precond_pos = [] - precond_neg = [expr("Has(C1,E1)")] - effect_add = [expr("Has(C1,E1)")] - effect_rem = [] - add_engine1 = HLA(expr("AddEngine1"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=30, use={'EngineHoists': 1}) - - # AddEngine2 - precond_pos = [] - precond_neg = [expr("Has(C2,E2)")] - effect_add = [expr("Has(C2,E2)")] - effect_rem = [] - add_engine2 = HLA(expr("AddEngine2"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=60, use={'EngineHoists': 1}) - - # AddWheels1 - precond_pos = [] - precond_neg = [expr("Has(C1,W1)")] - effect_add = [expr("Has(C1,W1)")] - effect_rem = [] - add_wheels1 = HLA(expr("AddWheels1"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=30, consume={'LugNuts': 20}, use={'WheelStations': 1}) - - # AddWheels2 - precond_pos = [] - precond_neg = [expr("Has(C2,W2)")] - effect_add = [expr("Has(C2,W2)")] - effect_rem = [] - add_wheels2 = HLA(expr("AddWheels2"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=15, consume={'LugNuts': 20}, use={'WheelStations': 1}) - - # Inspect1 - precond_pos = [] - precond_neg = [expr("Inspected(C1)")] - effect_add = [expr("Inspected(C1)")] - effect_rem = [] - inspect1 = HLA(expr("Inspect1"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=10, use={'Inspectors': 1}) - - # Inspect2 - precond_pos = [] - precond_neg = [expr("Inspected(C2)")] - effect_add = [expr("Inspected(C2)")] - effect_rem = [] - inspect2 = HLA(expr("Inspect2"), - [precond_pos, precond_neg], [effect_add, effect_rem], - duration=10, use={'Inspectors': 1}) - - job_group1 = [add_engine1, add_wheels1, inspect1] - job_group2 = [add_engine2, add_wheels2, inspect2] - - return Problem(init, [add_engine1, add_engine2, add_wheels1, add_wheels2, inspect1, inspect2], - goal_test, [job_group1, job_group2], resources) diff --git a/Queens/plots/08board06471352.png b/plots/08board04752613.png similarity index 100% rename from Queens/plots/08board06471352.png rename to plots/08board04752613.png diff --git a/Queens/plots/08board06357142.png b/plots/08board05726314.png similarity index 100% rename from Queens/plots/08board06357142.png rename to plots/08board05726314.png diff --git a/Queens/plots/08board05726314.png b/plots/08board06357142.png similarity index 100% rename from Queens/plots/08board05726314.png rename to plots/08board06357142.png diff --git a/Queens/plots/08board04752613.png b/plots/08board06471352.png similarity index 100% rename from Queens/plots/08board04752613.png rename to plots/08board06471352.png diff --git a/Queens/plots/08board50417263.png b/plots/08board13572064.png similarity index 100% rename from Queens/plots/08board50417263.png rename to plots/08board13572064.png diff --git a/Queens/plots/08board30471625.png b/plots/08board14602753.png similarity index 100% rename from Queens/plots/08board30471625.png rename to plots/08board14602753.png diff --git a/Queens/plots/08board40731625.png b/plots/08board14630752.png similarity index 100% rename from Queens/plots/08board40731625.png rename to plots/08board14630752.png diff --git a/Queens/plots/08board20647135.png b/plots/08board15063724.png similarity index 100% rename from Queens/plots/08board20647135.png rename to plots/08board15063724.png diff --git a/Queens/plots/08board40357162.png b/plots/08board15720364.png similarity index 100% rename from Queens/plots/08board40357162.png rename to plots/08board15720364.png diff --git a/Queens/plots/08board60275314.png b/plots/08board16257403.png similarity index 100% rename from Queens/plots/08board60275314.png rename to plots/08board16257403.png diff --git a/Queens/plots/08board40752613.png b/plots/08board16470352.png similarity index 100% rename from Queens/plots/08board40752613.png rename to plots/08board16470352.png diff --git a/Queens/plots/08board30475261.png b/plots/08board17502463.png similarity index 100% rename from Queens/plots/08board30475261.png rename to plots/08board17502463.png diff --git a/Queens/plots/08board15063724.png b/plots/08board20647135.png similarity index 100% rename from Queens/plots/08board15063724.png rename to plots/08board20647135.png diff --git a/Queens/plots/08board42061753.png b/plots/08board24170635.png similarity index 100% rename from Queens/plots/08board42061753.png rename to plots/08board24170635.png diff --git a/Queens/plots/08board72051463.png b/plots/08board24175360.png similarity index 100% rename from Queens/plots/08board72051463.png rename to plots/08board24175360.png diff --git a/Queens/plots/08board35041726.png b/plots/08board24603175.png similarity index 100% rename from Queens/plots/08board35041726.png rename to plots/08board24603175.png diff --git a/Queens/plots/08board46031752.png b/plots/08board24730615.png similarity index 100% rename from Queens/plots/08board46031752.png rename to plots/08board24730615.png diff --git a/Queens/plots/08board52073164.png b/plots/08board25147063.png similarity index 100% rename from Queens/plots/08board52073164.png rename to plots/08board25147063.png diff --git a/Queens/plots/08board42057136.png b/plots/08board25160374.png similarity index 100% rename from Queens/plots/08board42057136.png rename to plots/08board25160374.png diff --git a/Queens/plots/08board52074136.png b/plots/08board25164073.png similarity index 100% rename from Queens/plots/08board52074136.png rename to plots/08board25164073.png diff --git a/Queens/plots/08board37025164.png b/plots/08board25307461.png similarity index 100% rename from Queens/plots/08board37025164.png rename to plots/08board25307461.png diff --git a/Queens/plots/08board73025164.png b/plots/08board25317460.png similarity index 100% rename from Queens/plots/08board73025164.png rename to plots/08board25317460.png diff --git a/Queens/plots/08board37046152.png b/plots/08board25703641.png similarity index 100% rename from Queens/plots/08board37046152.png rename to plots/08board25703641.png diff --git a/Queens/plots/08board36074152.png b/plots/08board25704613.png similarity index 100% rename from Queens/plots/08board36074152.png rename to plots/08board25704613.png diff --git a/Queens/plots/08board53047162.png b/plots/08board25713064.png similarity index 100% rename from Queens/plots/08board53047162.png rename to plots/08board25713064.png diff --git a/Queens/plots/08board52064713.png b/plots/08board26174035.png similarity index 100% rename from Queens/plots/08board52064713.png rename to plots/08board26174035.png diff --git a/Queens/plots/08board62057413.png b/plots/08board26175304.png similarity index 100% rename from Queens/plots/08board62057413.png rename to plots/08board26175304.png diff --git a/Queens/plots/08board46027531.png b/plots/08board27360514.png similarity index 100% rename from Queens/plots/08board46027531.png rename to plots/08board27360514.png diff --git a/Queens/plots/08board14602753.png b/plots/08board30471625.png similarity index 100% rename from Queens/plots/08board14602753.png rename to plots/08board30471625.png diff --git a/Queens/plots/08board17502463.png b/plots/08board30475261.png similarity index 100% rename from Queens/plots/08board17502463.png rename to plots/08board30475261.png diff --git a/Queens/plots/08board51602473.png b/plots/08board31475026.png similarity index 100% rename from Queens/plots/08board51602473.png rename to plots/08board31475026.png diff --git a/Queens/plots/08board61307425.png b/plots/08board31625704.png similarity index 100% rename from Queens/plots/08board61307425.png rename to plots/08board31625704.png diff --git a/Queens/plots/08board71306425.png b/plots/08board31625740.png similarity index 100% rename from Queens/plots/08board71306425.png rename to plots/08board31625740.png diff --git a/Queens/plots/08board41703625.png b/plots/08board31640752.png similarity index 100% rename from Queens/plots/08board41703625.png rename to plots/08board31640752.png diff --git a/Queens/plots/08board51603742.png b/plots/08board31746025.png similarity index 100% rename from Queens/plots/08board51603742.png rename to plots/08board31746025.png diff --git a/Queens/plots/08board41506372.png b/plots/08board31750246.png similarity index 100% rename from Queens/plots/08board41506372.png rename to plots/08board31750246.png diff --git a/Queens/plots/08board24603175.png b/plots/08board35041726.png similarity index 100% rename from Queens/plots/08board24603175.png rename to plots/08board35041726.png diff --git a/Queens/plots/08board53607142.png b/plots/08board35716024.png similarity index 100% rename from Queens/plots/08board53607142.png rename to plots/08board35716024.png diff --git a/Queens/plots/08board47306152.png b/plots/08board35720641.png similarity index 100% rename from Queens/plots/08board47306152.png rename to plots/08board35720641.png diff --git a/Queens/plots/08board25704613.png b/plots/08board36074152.png similarity index 100% rename from Queens/plots/08board25704613.png rename to plots/08board36074152.png diff --git a/Queens/plots/08board64205713.png b/plots/08board36271405.png similarity index 100% rename from Queens/plots/08board64205713.png rename to plots/08board36271405.png diff --git a/Queens/plots/08board53602417.png b/plots/08board36415027.png similarity index 100% rename from Queens/plots/08board53602417.png rename to plots/08board36415027.png diff --git a/Queens/plots/08board47302516.png b/plots/08board36420571.png similarity index 100% rename from Queens/plots/08board47302516.png rename to plots/08board36420571.png diff --git a/Queens/plots/08board25307461.png b/plots/08board37025164.png similarity index 100% rename from Queens/plots/08board25307461.png rename to plots/08board37025164.png diff --git a/Queens/plots/08board25703641.png b/plots/08board37046152.png similarity index 100% rename from Queens/plots/08board25703641.png rename to plots/08board37046152.png diff --git a/Queens/plots/08board46302751.png b/plots/08board37420615.png similarity index 100% rename from Queens/plots/08board46302751.png rename to plots/08board37420615.png diff --git a/Queens/plots/08board15720364.png b/plots/08board40357162.png similarity index 100% rename from Queens/plots/08board15720364.png rename to plots/08board40357162.png diff --git a/Queens/plots/08board14630752.png b/plots/08board40731625.png similarity index 100% rename from Queens/plots/08board14630752.png rename to plots/08board40731625.png diff --git a/Queens/plots/08board16470352.png b/plots/08board40752613.png similarity index 100% rename from Queens/plots/08board16470352.png rename to plots/08board40752613.png diff --git a/Queens/plots/08board61520374.png b/plots/08board41357206.png similarity index 100% rename from Queens/plots/08board61520374.png rename to plots/08board41357206.png diff --git a/Queens/plots/08board71420635.png b/plots/08board41362750.png similarity index 100% rename from Queens/plots/08board71420635.png rename to plots/08board41362750.png diff --git a/Queens/plots/08board31750246.png b/plots/08board41506372.png similarity index 100% rename from Queens/plots/08board31750246.png rename to plots/08board41506372.png diff --git a/Queens/plots/08board31640752.png b/plots/08board41703625.png similarity index 100% rename from Queens/plots/08board31640752.png rename to plots/08board41703625.png diff --git a/Queens/plots/08board25160374.png b/plots/08board42057136.png similarity index 100% rename from Queens/plots/08board25160374.png rename to plots/08board42057136.png diff --git a/Queens/plots/08board24170635.png b/plots/08board42061753.png similarity index 100% rename from Queens/plots/08board24170635.png rename to plots/08board42061753.png diff --git a/Queens/plots/08board57130642.png b/plots/08board42736051.png similarity index 100% rename from Queens/plots/08board57130642.png rename to plots/08board42736051.png diff --git a/Queens/plots/08board27360514.png b/plots/08board46027531.png similarity index 100% rename from Queens/plots/08board27360514.png rename to plots/08board46027531.png diff --git a/Queens/plots/08board24730615.png b/plots/08board46031752.png similarity index 100% rename from Queens/plots/08board24730615.png rename to plots/08board46031752.png diff --git a/Queens/plots/08board52630714.png b/plots/08board46137025.png similarity index 100% rename from Queens/plots/08board52630714.png rename to plots/08board46137025.png diff --git a/Queens/plots/08board52460317.png b/plots/08board46152037.png similarity index 100% rename from Queens/plots/08board52460317.png rename to plots/08board46152037.png diff --git a/Queens/plots/08board52470316.png b/plots/08board46152073.png similarity index 100% rename from Queens/plots/08board52470316.png rename to plots/08board46152073.png diff --git a/Queens/plots/08board37420615.png b/plots/08board46302751.png similarity index 100% rename from Queens/plots/08board37420615.png rename to plots/08board46302751.png diff --git a/Queens/plots/08board36420571.png b/plots/08board47302516.png similarity index 100% rename from Queens/plots/08board36420571.png rename to plots/08board47302516.png diff --git a/Queens/plots/08board35720641.png b/plots/08board47306152.png similarity index 100% rename from Queens/plots/08board35720641.png rename to plots/08board47306152.png diff --git a/Queens/plots/08board13572064.png b/plots/08board50417263.png similarity index 100% rename from Queens/plots/08board13572064.png rename to plots/08board50417263.png diff --git a/Queens/plots/08board31475026.png b/plots/08board51602473.png similarity index 100% rename from Queens/plots/08board31475026.png rename to plots/08board51602473.png diff --git a/Queens/plots/08board31746025.png b/plots/08board51603742.png similarity index 100% rename from Queens/plots/08board31746025.png rename to plots/08board51603742.png diff --git a/Queens/plots/08board26174035.png b/plots/08board52064713.png similarity index 100% rename from Queens/plots/08board26174035.png rename to plots/08board52064713.png diff --git a/Queens/plots/08board25147063.png b/plots/08board52073164.png similarity index 100% rename from Queens/plots/08board25147063.png rename to plots/08board52073164.png diff --git a/Queens/plots/08board25164073.png b/plots/08board52074136.png similarity index 100% rename from Queens/plots/08board25164073.png rename to plots/08board52074136.png diff --git a/Queens/plots/08board46152037.png b/plots/08board52460317.png similarity index 100% rename from Queens/plots/08board46152037.png rename to plots/08board52460317.png diff --git a/Queens/plots/08board46152073.png b/plots/08board52470316.png similarity index 100% rename from Queens/plots/08board46152073.png rename to plots/08board52470316.png diff --git a/Queens/plots/08board63147025.png b/plots/08board52613704.png similarity index 100% rename from Queens/plots/08board63147025.png rename to plots/08board52613704.png diff --git a/Queens/plots/08board63175024.png b/plots/08board52617403.png similarity index 100% rename from Queens/plots/08board63175024.png rename to plots/08board52617403.png diff --git a/Queens/plots/08board46137025.png b/plots/08board52630714.png similarity index 100% rename from Queens/plots/08board46137025.png rename to plots/08board52630714.png diff --git a/Queens/plots/08board25713064.png b/plots/08board53047162.png similarity index 100% rename from Queens/plots/08board25713064.png rename to plots/08board53047162.png diff --git a/Queens/plots/08board62714053.png b/plots/08board53174602.png similarity index 100% rename from Queens/plots/08board62714053.png rename to plots/08board53174602.png diff --git a/Queens/plots/08board36415027.png b/plots/08board53602417.png similarity index 100% rename from Queens/plots/08board36415027.png rename to plots/08board53602417.png diff --git a/Queens/plots/08board35716024.png b/plots/08board53607142.png similarity index 100% rename from Queens/plots/08board35716024.png rename to plots/08board53607142.png diff --git a/Queens/plots/08board42736051.png b/plots/08board57130642.png similarity index 100% rename from Queens/plots/08board42736051.png rename to plots/08board57130642.png diff --git a/Queens/plots/08board16257403.png b/plots/08board60275314.png similarity index 100% rename from Queens/plots/08board16257403.png rename to plots/08board60275314.png diff --git a/Queens/plots/08board31625704.png b/plots/08board61307425.png similarity index 100% rename from Queens/plots/08board31625704.png rename to plots/08board61307425.png diff --git a/Queens/plots/08board41357206.png b/plots/08board61520374.png similarity index 100% rename from Queens/plots/08board41357206.png rename to plots/08board61520374.png diff --git a/Queens/plots/08board26175304.png b/plots/08board62057413.png similarity index 100% rename from Queens/plots/08board26175304.png rename to plots/08board62057413.png diff --git a/Queens/plots/08board53174602.png b/plots/08board62714053.png similarity index 100% rename from Queens/plots/08board53174602.png rename to plots/08board62714053.png diff --git a/Queens/plots/08board52613704.png b/plots/08board63147025.png similarity index 100% rename from Queens/plots/08board52613704.png rename to plots/08board63147025.png diff --git a/Queens/plots/08board52617403.png b/plots/08board63175024.png similarity index 100% rename from Queens/plots/08board52617403.png rename to plots/08board63175024.png diff --git a/Queens/plots/08board36271405.png b/plots/08board64205713.png similarity index 100% rename from Queens/plots/08board36271405.png rename to plots/08board64205713.png diff --git a/Queens/plots/08board31625740.png b/plots/08board71306425.png similarity index 100% rename from Queens/plots/08board31625740.png rename to plots/08board71306425.png diff --git a/Queens/plots/08board41362750.png b/plots/08board71420635.png similarity index 100% rename from Queens/plots/08board41362750.png rename to plots/08board71420635.png diff --git a/Queens/plots/08board24175360.png b/plots/08board72051463.png similarity index 100% rename from Queens/plots/08board24175360.png rename to plots/08board72051463.png diff --git a/Queens/plots/08board25317460.png b/plots/08board73025164.png similarity index 100% rename from Queens/plots/08board25317460.png rename to plots/08board73025164.png diff --git a/probability-4e.ipynb b/probability-4e.ipynb deleted file mode 100644 index e148e929e..000000000 --- a/probability-4e.ipynb +++ /dev/null @@ -1,1381 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Probability and Bayesian Networks\n", - "\n", - "Probability theory allows us to compute the likelihood of certain events, given assumptioons about the components of the event. A Bayesian network, or Bayes net for short, is a data structure to represent a joint probability distribution over several random variables, and do inference on it. \n", - "\n", - "As an example, here is a network with five random variables, each with its conditional probability table, and with arrows from parent to child variables. The story, from Judea Pearl, is that there is a house burglar alarm, which can be triggered by either a burglary or an earthquake. If the alarm sounds, one or both of the neighbors, John and Mary, might call the owwner to say the alarm is sounding.\n", - "\n", - "

    \n", - "\n", - "We implement this with the help of seven Python classes:\n", - "\n", - "\n", - "## `BayesNet()`\n", - "\n", - "A `BayesNet` is a graph (as in the diagram above) where each node represents a random variable, and the edges are parent→child links. You can construct an empty graph with `BayesNet()`, then add variables one at a time with the method call `.add(`*variable_name, parent_names, cpt*`)`, where the names are strings, and each of the `parent_names` must already have been `.add`ed.\n", - "\n", - "## `Variable(`*name, cpt, parents*`)`\n", - "\n", - "A random variable; the ovals in the diagram above. The value of a variable depends on the value of the parents, in a probabilistic way specified by the variable's conditional probability table (CPT). Given the parents, the variable is independent of all the other variables. For example, if I know whether *Alarm* is true or false, then I know the probability of *JohnCalls*, and evidence about the other variables won't give me any more information about *JohnCalls*. Each row of the CPT uses the same order of variables as the list of parents.\n", - "We will only allow variables with a finite discrete domain; not continuous values. \n", - "\n", - "## `ProbDist(`*mapping*`)`
    `Factor(`*mapping*`)`\n", - "\n", - "A probability distribution is a mapping of `{outcome: probability}` for every outcome of a random variable. \n", - "You can give `ProbDist` the same arguments that you would give to the `dict` initializer, for example\n", - "`ProbDist(sun=0.6, rain=0.1, cloudy=0.3)`.\n", - "As a shortcut for Boolean Variables, you can say `ProbDist(0.95)` instead of `ProbDist({T: 0.95, F: 0.05})`. \n", - "In a probability distribution, every value is between 0 and 1, and the values sum to 1.\n", - "A `Factor` is similar to a probability distribution, except that the values need not sum to 1. Factors\n", - "are used in the variable elimination inference method.\n", - "\n", - "## `Evidence(`*mapping*`)`\n", - "\n", - "A mapping of `{Variable: value, ...}` pairs, describing the exact values for a set of variables—the things we know for sure.\n", - "\n", - "## `CPTable(`*rows, parents*`)`\n", - "\n", - "A conditional probability table (or *CPT*) describes the probability of each possible outcome value of a random variable, given the values of the parent variables. A `CPTable` is a a mapping, `{tuple: probdist, ...}`, where each tuple lists the values of each of the parent variables, in order, and each probability distribution says what the possible outcomes are, given those values of the parents. The `CPTable` for *Alarm* in the diagram above would be represented as follows:\n", - "\n", - " CPTable({(T, T): .95,\n", - " (T, F): .94,\n", - " (F, T): .29,\n", - " (F, F): .001},\n", - " [Burglary, Earthquake])\n", - " \n", - "How do you read this? Take the second row, \"`(T, F): .94`\". This means that when the first parent (`Burglary`) is true, and the second parent (`Earthquake`) is fale, then the probability of `Alarm` being true is .94. Note that the .94 is an abbreviation for `ProbDist({T: .94, F: .06})`.\n", - " \n", - "## `T = Bool(True); F = Bool(False)`\n", - "\n", - "When I used `bool` values (`True` and `False`), it became hard to read rows in CPTables, because the columns didn't line up:\n", - "\n", - " (True, True, False, False, False)\n", - " (False, False, False, False, True)\n", - " (True, False, False, True, True)\n", - " \n", - "Therefore, I created the `Bool` class, with constants `T` and `F` such that `T == True` and `F == False`, and now rows are easier to read:\n", - "\n", - " (T, T, F, F, F)\n", - " (F, F, F, F, T)\n", - " (T, F, F, T, T)\n", - " \n", - "Here is the code for these classes:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "from collections import defaultdict, Counter\n", - "import itertools\n", - "import math\n", - "import random\n", - "\n", - "class BayesNet(object):\n", - " \"Bayesian network: a graph of variables connected by parent links.\"\n", - " \n", - " def __init__(self): \n", - " self.variables = [] # List of variables, in parent-first topological sort order\n", - " self.lookup = {} # Mapping of {variable_name: variable} pairs\n", - " \n", - " def add(self, name, parentnames, cpt):\n", - " \"Add a new Variable to the BayesNet. Parentnames must have been added previously.\"\n", - " parents = [self.lookup[name] for name in parentnames]\n", - " var = Variable(name, cpt, parents)\n", - " self.variables.append(var)\n", - " self.lookup[name] = var\n", - " return self\n", - " \n", - "class Variable(object):\n", - " \"A discrete random variable; conditional on zero or more parent Variables.\"\n", - " \n", - " def __init__(self, name, cpt, parents=()):\n", - " \"A variable has a name, list of parent variables, and a Conditional Probability Table.\"\n", - " self.__name__ = name\n", - " self.parents = parents\n", - " self.cpt = CPTable(cpt, parents)\n", - " self.domain = set(itertools.chain(*self.cpt.values())) # All the outcomes in the CPT\n", - " \n", - " def __repr__(self): return self.__name__\n", - " \n", - "class Factor(dict): \"An {outcome: frequency} mapping.\"\n", - "\n", - "class ProbDist(Factor):\n", - " \"\"\"A Probability Distribution is an {outcome: probability} mapping. \n", - " The values are normalized to sum to 1.\n", - " ProbDist(0.75) is an abbreviation for ProbDist({T: 0.75, F: 0.25}).\"\"\"\n", - " def __init__(self, mapping=(), **kwargs):\n", - " if isinstance(mapping, float):\n", - " mapping = {T: mapping, F: 1 - mapping}\n", - " self.update(mapping, **kwargs)\n", - " normalize(self)\n", - " \n", - "class Evidence(dict): \n", - " \"A {variable: value} mapping, describing what we know for sure.\"\n", - " \n", - "class CPTable(dict):\n", - " \"A mapping of {row: ProbDist, ...} where each row is a tuple of values of the parent variables.\"\n", - " \n", - " def __init__(self, mapping, parents=()):\n", - " \"\"\"Provides two shortcuts for writing a Conditional Probability Table. \n", - " With no parents, CPTable(dist) means CPTable({(): dist}).\n", - " With one parent, CPTable({val: dist,...}) means CPTable({(val,): dist,...}).\"\"\"\n", - " if len(parents) == 0 and not (isinstance(mapping, dict) and set(mapping.keys()) == {()}):\n", - " mapping = {(): mapping}\n", - " for (row, dist) in mapping.items():\n", - " if len(parents) == 1 and not isinstance(row, tuple): \n", - " row = (row,)\n", - " self[row] = ProbDist(dist)\n", - "\n", - "class Bool(int):\n", - " \"Just like `bool`, except values display as 'T' and 'F' instead of 'True' and 'False'\"\n", - " __str__ = __repr__ = lambda self: 'T' if self else 'F'\n", - " \n", - "T = Bool(True)\n", - "F = Bool(False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are some associated functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def P(var, evidence={}):\n", - " \"The probability distribution for P(variable | evidence), when all parent variables are known (in evidence).\"\n", - " row = tuple(evidence[parent] for parent in var.parents)\n", - " return var.cpt[row]\n", - "\n", - "def normalize(dist):\n", - " \"Normalize a {key: value} distribution so values sum to 1.0. Mutates dist and returns it.\"\n", - " total = sum(dist.values())\n", - " for key in dist:\n", - " dist[key] = dist[key] / total\n", - " assert 0 <= dist[key] <= 1, \"Probabilities must be between 0 and 1.\"\n", - " return dist\n", - "\n", - "def sample(probdist):\n", - " \"Randomly sample an outcome from a probability distribution.\"\n", - " r = random.random() # r is a random point in the probability distribution\n", - " c = 0.0 # c is the cumulative probability of outcomes seen so far\n", - " for outcome in probdist:\n", - " c += probdist[outcome]\n", - " if r <= c:\n", - " return outcome\n", - " \n", - "def globalize(mapping):\n", - " \"Given a {name: value} mapping, export all the names to the `globals()` namespace.\"\n", - " globals().update(mapping)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sample Usage\n", - "\n", - "Here are some examples of using the classes:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Example random variable: Earthquake:\n", - "# An earthquake occurs on 0.002 of days, independent of any other variables.\n", - "Earthquake = Variable('Earthquake', 0.002)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.998, T: 0.002}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# The probability distribution for Earthquake\n", - "P(Earthquake)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.002" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get the probability of a specific outcome by subscripting the probability distribution\n", - "P(Earthquake)[T]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "F" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Randomly sample from the distribution:\n", - "sample(P(Earthquake))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Counter({F: 99793, T: 207})" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Randomly sample 100,000 times, and count up the results:\n", - "Counter(sample(P(Earthquake)) for i in range(100000))" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Two equivalent ways of specifying the same Boolean probability distribution:\n", - "assert ProbDist(0.75) == ProbDist({T: 0.75, F: 0.25})" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'lose': 0.15, 'tie': 0.1, 'win': 0.75}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Two equivalent ways of specifying the same non-Boolean probability distribution:\n", - "assert ProbDist(win=15, lose=3, tie=2) == ProbDist({'win': 15, 'lose': 3, 'tie': 2})\n", - "ProbDist(win=15, lose=3, tie=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'a': 1, 'b': 2, 'c': 3, 'd': 4}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# The difference between a Factor and a ProbDist--the ProbDist is normalized:\n", - "Factor(a=1, b=2, c=3, d=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'a': 0.1, 'b': 0.2, 'c': 0.3, 'd': 0.4}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ProbDist(a=1, b=2, c=3, d=4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Example: Alarm Bayes Net\n", - "\n", - "Here is how we define the Bayes net from the diagram above:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "alarm_net = (BayesNet()\n", - " .add('Burglary', [], 0.001)\n", - " .add('Earthquake', [], 0.002)\n", - " .add('Alarm', ['Burglary', 'Earthquake'], {(T, T): 0.95, (T, F): 0.94, (F, T): 0.29, (F, F): 0.001})\n", - " .add('JohnCalls', ['Alarm'], {T: 0.90, F: 0.05})\n", - " .add('MaryCalls', ['Alarm'], {T: 0.70, F: 0.01})) " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Burglary, Earthquake, Alarm, JohnCalls, MaryCalls]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Make Burglary, Earthquake, etc. be global variables\n", - "globalize(alarm_net.lookup) \n", - "alarm_net.variables" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.999, T: 0.001}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Probability distribution of a Burglary\n", - "P(Burglary)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.06000000000000005, T: 0.94}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Probability of Alarm going off, given a Burglary and not an Earthquake:\n", - "P(Alarm, {Burglary: T, Earthquake: F})" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{(F, F): {F: 0.999, T: 0.001},\n", - " (F, T): {F: 0.71, T: 0.29},\n", - " (T, F): {F: 0.06000000000000005, T: 0.94},\n", - " (T, T): {F: 0.050000000000000044, T: 0.95}}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Where that came from: the (T, F) row of Alarm's CPT:\n", - "Alarm.cpt" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Bayes Nets as Joint Probability Distributions\n", - "\n", - "A Bayes net is a compact way of specifying a full joint distribution over all the variables in the network. Given a set of variables {*X*1, ..., *X**n*}, the full joint distribution is:\n", - "\n", - "P(*X*1=*x*1, ..., *X**n*=*x**n*) = Π*i* P(*X**i* = *x**i* | parents(*X**i*))\n", - "\n", - "For a network with *n* variables, each of which has *b* values, there are *bn* rows in the joint distribution (for example, a billion rows for 30 Boolean variables), making it impractical to explicitly create the joint distribution for large networks. But for small networks, the function `joint_distribution` creates the distribution, which can be instructive to look at, and can be used to do inference. " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def joint_distribution(net):\n", - " \"Given a Bayes net, create the joint distribution over all variables.\"\n", - " return ProbDist({row: prod(P_xi_given_parents(var, row, net)\n", - " for var in net.variables)\n", - " for row in all_rows(net)})\n", - "\n", - "def all_rows(net): return itertools.product(*[var.domain for var in net.variables])\n", - "\n", - "def P_xi_given_parents(var, row, net):\n", - " \"The probability that var = xi, given the values in this row.\"\n", - " dist = P(var, Evidence(zip(net.variables, row)))\n", - " xi = row[net.variables.index(var)]\n", - " return dist[xi]\n", - "\n", - "def prod(numbers):\n", - " \"The product of numbers: prod([2, 3, 5]) == 30. Analogous to `sum([2, 3, 5]) == 10`.\"\n", - " result = 1\n", - " for x in numbers:\n", - " result *= x\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{(F, F, F, F, F),\n", - " (F, F, F, F, T),\n", - " (F, F, F, T, F),\n", - " (F, F, F, T, T),\n", - " (F, F, T, F, F),\n", - " (F, F, T, F, T),\n", - " (F, F, T, T, F),\n", - " (F, F, T, T, T),\n", - " (F, T, F, F, F),\n", - " (F, T, F, F, T),\n", - " (F, T, F, T, F),\n", - " (F, T, F, T, T),\n", - " (F, T, T, F, F),\n", - " (F, T, T, F, T),\n", - " (F, T, T, T, F),\n", - " (F, T, T, T, T),\n", - " (T, F, F, F, F),\n", - " (T, F, F, F, T),\n", - " (T, F, F, T, F),\n", - " (T, F, F, T, T),\n", - " (T, F, T, F, F),\n", - " (T, F, T, F, T),\n", - " (T, F, T, T, F),\n", - " (T, F, T, T, T),\n", - " (T, T, F, F, F),\n", - " (T, T, F, F, T),\n", - " (T, T, F, T, F),\n", - " (T, T, F, T, T),\n", - " (T, T, T, F, F),\n", - " (T, T, T, F, T),\n", - " (T, T, T, T, F),\n", - " (T, T, T, T, T)}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# All rows in the joint distribution (2**5 == 32 rows)\n", - "set(all_rows(alarm_net))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Let's work through just one row of the table:\n", - "row = (F, F, F, F, F)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.999, T: 0.001}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# This is the probability distribution for Alarm\n", - "P(Alarm, {Burglary: F, Earthquake: F})" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.999" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Here's the probability that Alarm is false, given the parent values in this row:\n", - "P_xi_given_parents(Alarm, row, alarm_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{(F, F, F, F, F): 0.9367427006190001,\n", - " (F, F, F, F, T): 0.009462047481000001,\n", - " (F, F, F, T, F): 0.04930224740100002,\n", - " (F, F, F, T, T): 0.0004980024990000002,\n", - " (F, F, T, F, F): 2.9910060000000004e-05,\n", - " (F, F, T, F, T): 6.979013999999999e-05,\n", - " (F, F, T, T, F): 0.00026919054000000005,\n", - " (F, F, T, T, T): 0.00062811126,\n", - " (F, T, F, F, F): 0.0013341744900000002,\n", - " (F, T, F, F, T): 1.3476510000000005e-05,\n", - " (F, T, F, T, F): 7.021971000000001e-05,\n", - " (F, T, F, T, T): 7.092900000000001e-07,\n", - " (F, T, T, F, F): 1.7382600000000002e-05,\n", - " (F, T, T, F, T): 4.0559399999999997e-05,\n", - " (F, T, T, T, F): 0.00015644340000000006,\n", - " (F, T, T, T, T): 0.00036503460000000007,\n", - " (T, F, F, F, F): 5.631714000000006e-05,\n", - " (T, F, F, F, T): 5.688600000000006e-07,\n", - " (T, F, F, T, F): 2.9640600000000033e-06,\n", - " (T, F, F, T, T): 2.9940000000000035e-08,\n", - " (T, F, T, F, F): 2.8143600000000003e-05,\n", - " (T, F, T, F, T): 6.56684e-05,\n", - " (T, F, T, T, F): 0.0002532924000000001,\n", - " (T, F, T, T, T): 0.0005910156000000001,\n", - " (T, T, F, F, F): 9.40500000000001e-08,\n", - " (T, T, F, F, T): 9.50000000000001e-10,\n", - " (T, T, F, T, F): 4.9500000000000054e-09,\n", - " (T, T, F, T, T): 5.0000000000000066e-11,\n", - " (T, T, T, F, F): 5.7e-08,\n", - " (T, T, T, F, T): 1.3299999999999996e-07,\n", - " (T, T, T, T, F): 5.130000000000002e-07,\n", - " (T, T, T, T, T): 1.1970000000000001e-06}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# The full joint distribution:\n", - "joint_distribution(alarm_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Burglary, Earthquake, Alarm, JohnCalls, MaryCalls]\n" - ] - }, - { - "data": { - "text/plain": [ - "0.00062811126" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Probability that \"the alarm has sounded, but neither a burglary nor an earthquake has occurred, \n", - "# and both John and Mary call\" (page 514 says it should be 0.000628)\n", - "\n", - "print(alarm_net.variables)\n", - "joint_distribution(alarm_net)[F, F, T, T, T]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Inference by Querying the Joint Distribution\n", - "\n", - "We can use `P(variable, evidence)` to get the probability of aa variable, if we know the vaues of all the parent variables. But what if we don't know? Bayes nets allow us to calculate the probability, but the calculation is not just a lookup in the CPT; it is a global calculation across the whole net. One inefficient but straightforward way of doing the calculation is to create the joint probability distribution, then pick out just the rows that\n", - "match the evidence variables, and for each row check what the value of the query variable is, and increment the probability for that value accordningly:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def enumeration_ask(X, evidence, net):\n", - " \"The probability distribution for query variable X in a belief net, given evidence.\"\n", - " i = net.variables.index(X) # The index of the query variable X in the row\n", - " dist = defaultdict(float) # The resulting probability distribution over X\n", - " for (row, p) in joint_distribution(net).items():\n", - " if matches_evidence(row, evidence, net):\n", - " dist[row[i]] += p\n", - " return ProbDist(dist)\n", - "\n", - "def matches_evidence(row, evidence, net):\n", - " \"Does the tuple of values for this row agree with the evidence?\"\n", - " return all(evidence[v] == row[net.variables.index(v)]\n", - " for v in evidence)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.9931237539265789, T: 0.006876246073421024}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# The probability of a Burgalry, given that John calls but Mary does not: \n", - "enumeration_ask(Burglary, {JohnCalls: F, MaryCalls: T}, alarm_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.03368899586522123, T: 0.9663110041347788}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# The probability of an Alarm, given that there is an Earthquake and Mary calls:\n", - "enumeration_ask(Alarm, {MaryCalls: T, Earthquake: T}, alarm_net)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Variable Elimination\n", - "\n", - "The `enumeration_ask` algorithm takes time and space that is exponential in the number of variables. That is, first it creates the joint distribution, of size *bn*, and then it sums out the values for the rows that match the evidence. We can do better than that if we interleave the joining of variables with the summing out of values.\n", - "This approach is called *variable elimination*. The key insight is that\n", - "when we compute\n", - "\n", - "P(*X*1=*x*1, ..., *X**n*=*x**n*) = Π*i* P(*X**i* = *x**i* | parents(*X**i*))\n", - "\n", - "we are repeating the calculation of, say, P(*X**3* = *x**4* | parents(*X**3*))\n", - "multiple times, across multiple rows of the joint distribution.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# TODO: Copy over and update Variable Elimination algorithm. Also, sampling algorithms." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Example: Flu Net\n", - "\n", - "In this net, whether a patient gets the flu is dependent on whether they were vaccinated, and having the flu influences whether they get a fever or headache. Here `Fever` is a non-Boolean variable, with three values, `no`, `mild`, and `high`." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "flu_net = (BayesNet()\n", - " .add('Vaccinated', [], 0.60)\n", - " .add('Flu', ['Vaccinated'], {T: 0.002, F: 0.02})\n", - " .add('Fever', ['Flu'], {T: ProbDist(no=25, mild=25, high=50),\n", - " F: ProbDist(no=97, mild=2, high=1)})\n", - " .add('Headache', ['Flu'], {T: 0.5, F: 0.03}))\n", - "\n", - "globalize(flu_net.lookup)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.9616440110625343, T: 0.03835598893746573}" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# If you just have a headache, you probably don't have the Flu.\n", - "enumeration_ask(Flu, {Headache: T, Fever: 'no'}, flu_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.9914651882096696, T: 0.008534811790330398}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Even more so if you were vaccinated.\n", - "enumeration_ask(Flu, {Headache: T, Fever: 'no', Vaccinated: T}, flu_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.9194016377587207, T: 0.08059836224127925}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# But if you were not vaccinated, there is a higher chance you have the flu.\n", - "enumeration_ask(Flu, {Headache: T, Fever: 'no', Vaccinated: F}, flu_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.1904145077720207, T: 0.8095854922279793}" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# And if you have both headache and fever, and were not vaccinated, \n", - "# then the flu is very likely, especially if it is a high fever.\n", - "enumeration_ask(Flu, {Headache: T, Fever: 'mild', Vaccinated: F}, flu_net)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{F: 0.055534567434831886, T: 0.9444654325651682}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "enumeration_ask(Flu, {Headache: T, Fever: 'high', Vaccinated: F}, flu_net)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Entropy\n", - "\n", - "We can compute the entropy of a probability distribution:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def entropy(probdist):\n", - " \"The entropy of a probability distribution.\"\n", - " return - sum(p * math.log(p, 2)\n", - " for p in probdist.values())" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entropy(ProbDist(heads=0.5, tails=0.5))" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011397802630112312" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entropy(ProbDist(yes=1000, no=1))" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8687212463394045" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entropy(P(Alarm, {Earthquake: T, Burglary: F}))" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011407757737461138" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entropy(P(Alarm, {Earthquake: F, Burglary: F}))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For non-Boolean variables, the entropy can be greater than 1 bit:" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.5" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entropy(P(Fever, {Flu: T}))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "# Unknown Outcomes: Smoothing\n", - "\n", - "So far we have dealt with discrete distributions where we know all the possible outcomes in advance. For Boolean variables, the only outcomes are `T` and `F`. For `Fever`, we modeled exactly three outcomes. However, in some applications we will encounter new, previously unknown outcomes over time. For example, we could train a model on the distribution of words in English, and then somebody could coin a brand new word. To deal with this, we introduce\n", - "the `DefaultProbDist` distribution, which uses the key `None` to stand as a placeholder for any unknown outcome(s)." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class DefaultProbDist(ProbDist):\n", - " \"\"\"A Probability Distribution that supports smoothing for unknown outcomes (keys).\n", - " The default_value represents the probability of an unknown (previously unseen) key. \n", - " The key `None` stands for unknown outcomes.\"\"\"\n", - " def __init__(self, default_value, mapping=(), **kwargs):\n", - " self[None] = default_value\n", - " self.update(mapping, **kwargs)\n", - " normalize(self)\n", - " \n", - " def __missing__(self, key): return self[None] " - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import re\n", - "\n", - "def words(text): return re.findall(r'\\w+', text.lower())\n", - "\n", - "english = words('''This is a sample corpus of English prose. To get a better model, we would train on much\n", - "more text. But this should give you an idea of the process. So far we have dealt with discrete \n", - "distributions where we know all the possible outcomes in advance. For Boolean variables, the only \n", - "outcomes are T and F. For Fever, we modeled exactly three outcomes. However, in some applications we \n", - "will encounter new, previously unknown outcomes over time. For example, when we could train a model on the \n", - "words in this text, we get a distribution, but somebody could coin a brand new word. To deal with this, \n", - "we introduce the DefaultProbDist distribution, which uses the key `None` to stand as a placeholder for any \n", - "unknown outcomes. Probability theory allows us to compute the likelihood of certain events, given \n", - "assumptions about the components of the event. A Bayesian network, or Bayes net for short, is a data \n", - "structure to represent a joint probability distribution over several random variables, and do inference on it.''')\n", - "\n", - "E = DefaultProbDist(0.1, Counter(english))" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.052295177222545036" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 'the' is a common word:\n", - "E['the']" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.005810575246949448" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 'possible' is a less-common word:\n", - "E['possible']" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0005810575246949449" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 'impossible' was not seen in the training data, but still gets a non-zero probability ...\n", - "E['impossible']" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0005810575246949449" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# ... as do other rare, previously unseen words:\n", - "E['llanfairpwllgwyngyll']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that this does not mean that 'impossible' and 'llanfairpwllgwyngyll' and all the other unknown words\n", - "*each* have probability 0.004.\n", - "Rather, it means that together, all the unknown words total probability 0.004. With that\n", - "interpretation, the sum of all the probabilities is still 1, as it should be. In the `DefaultProbDist`, the\n", - "unknown words are all represented by the key `None`:" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0005810575246949449" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "E[None]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/probability.ipynb b/probability.ipynb deleted file mode 100644 index 2fd1c9dae..000000000 --- a/probability.ipynb +++ /dev/null @@ -1,1515 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Probability \n", - "\n", - "This IPy notebook acts as supporting material for **Chapter 13 Quantifying Uncertainty**, **Chapter 14 Probabilistic Reasoning** and **Chapter 15 Probabilistic Reasoning over Time** of the book* Artificial Intelligence: A Modern Approach*. This notebook makes use of the implementations in probability.py module. Let us import everything from the probability module. It might be helpful to view the source of some of our implementations. Please refer to the Introductory IPy file for more details on how to do so." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from probability import *\n", - "from notebook import psource" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Probability Distribution\n", - "\n", - "Let us begin by specifying discrete probability distributions. The class **ProbDist** defines a discrete probability distribution. We name our random variable and then assign probabilities to the different values of the random variable. Assigning probabilities to the values works similar to that of using a dictionary with keys being the Value and we assign to it the probability. This is possible because of the magic methods **_ _getitem_ _** and **_ _setitem_ _** which store the probabilities in the prob dict of the object. You can keep the source window open alongside while playing with the rest of the code to get a better understanding." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource ProbDist" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.75" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = ProbDist('Flip')\n", - "p['H'], p['T'] = 0.25, 0.75\n", - "p['T']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first parameter of the constructor **varname** has a default value of '?'. So if the name is not passed it defaults to ?. The keyword argument **freqs** can be a dictionary of values of random variable:probability. These are then normalized such that the probability values sum upto 1 using the **normalize** method." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'?'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = ProbDist(freqs={'low': 125, 'medium': 375, 'high': 500})\n", - "p.varname" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.125, 0.375, 0.5)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(p['low'], p['medium'], p['high'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Besides the **prob** and **varname** the object also separately keeps track of all the values of the distribution in a list called **values**. Every time a new value is assigned a probability it is appended to this list, This is done inside the **_ _setitem_ _** method." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['high', 'medium', 'low']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The distribution by default is not normalized if values are added incremently. We can still force normalization by invoking the **normalize** method." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(50, 114, 64)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = ProbDist('Y')\n", - "p['Cat'] = 50\n", - "p['Dog'] = 114\n", - "p['Mice'] = 64\n", - "(p['Cat'], p['Dog'], p['Mice'])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.21929824561403508, 0.5, 0.2807017543859649)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.normalize()\n", - "(p['Cat'], p['Dog'], p['Mice'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is also possible to display the approximate values upto decimals using the **show_approx** method." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Cat: 0.219, Dog: 0.5, Mice: 0.281'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.show_approx()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Joint Probability Distribution\n", - "\n", - "The helper function **event_values** returns a tuple of the values of variables in event. An event is specified by a dict where the keys are the names of variables and the corresponding values are the value of the variable. Variables are specified with a list. The ordering of the returned tuple is same as those of the variables.\n", - "\n", - "\n", - "Alternatively if the event is specified by a list or tuple of equal length of the variables. Then the events tuple is returned as it is." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(8, 10)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event = {'A': 10, 'B': 9, 'C': 8}\n", - "variables = ['C', 'A']\n", - "event_values(event, variables)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "_A probability model is completely determined by the joint distribution for all of the random variables._ (**Section 13.3**) The probability module implements these as the class **JointProbDist** which inherits from the **ProbDist** class. This class specifies a discrete probability distribute over a set of variables. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource JointProbDist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Values for a Joint Distribution is a an ordered tuple in which each item corresponds to the value associate with a particular variable. For Joint Distribution of X, Y where X, Y take integer values this can be something like (18, 19).\n", - "\n", - "To specify a Joint distribution we first need an ordered list of variables." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "P(['X', 'Y'])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "variables = ['X', 'Y']\n", - "j = JointProbDist(variables)\n", - "j" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like the **ProbDist** class **JointProbDist** also employes magic methods to assign probability to different values.\n", - "The probability can be assigned in either of the two formats for all possible values of the distribution. The **event_values** call inside **_ _getitem_ _** and **_ _setitem_ _** does the required processing to make this work." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.2, 0.5)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "j[1,1] = 0.2\n", - "j[dict(X=0, Y=1)] = 0.5\n", - "\n", - "(j[1,1], j[0,1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is also possible to list all the values for a particular variable using the **values** method." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 0]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "j.values('X')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inference Using Full Joint Distributions\n", - "\n", - "In this section we use Full Joint Distributions to calculate the posterior distribution given some evidence. We represent evidence by using a python dictionary with variables as dict keys and dict values representing the values.\n", - "\n", - "This is illustrated in **Section 13.3** of the book. The functions **enumerate_joint** and **enumerate_joint_ask** implement this functionality. Under the hood they implement **Equation 13.9** from the book.\n", - "\n", - "$$\\textbf{P}(X | \\textbf{e}) = α \\textbf{P}(X, \\textbf{e}) = α \\sum_{y} \\textbf{P}(X, \\textbf{e}, \\textbf{y})$$\n", - "\n", - "Here **α** is the normalizing factor. **X** is our query variable and **e** is the evidence. According to the equation we enumerate on the remaining variables **y** (not in evidence or query variable) i.e. all possible combinations of **y**\n", - "\n", - "We will be using the same example as the book. Let us create the full joint distribution from **Figure 13.3**. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "full_joint = JointProbDist(['Cavity', 'Toothache', 'Catch'])\n", - "full_joint[dict(Cavity=True, Toothache=True, Catch=True)] = 0.108\n", - "full_joint[dict(Cavity=True, Toothache=True, Catch=False)] = 0.012\n", - "full_joint[dict(Cavity=True, Toothache=False, Catch=True)] = 0.016\n", - "full_joint[dict(Cavity=True, Toothache=False, Catch=False)] = 0.064\n", - "full_joint[dict(Cavity=False, Toothache=True, Catch=True)] = 0.072\n", - "full_joint[dict(Cavity=False, Toothache=False, Catch=True)] = 0.144\n", - "full_joint[dict(Cavity=False, Toothache=True, Catch=False)] = 0.008\n", - "full_joint[dict(Cavity=False, Toothache=False, Catch=False)] = 0.576" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us now look at the **enumerate_joint** function returns the sum of those entries in P consistent with e,provided variables is P's remaining variables (the ones not in e). Here, P refers to the full joint distribution. The function uses a recursive call in its implementation. The first parameter **variables** refers to remaining variables. The function in each recursive call keeps on variable constant while varying others." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(enumerate_joint)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us assume we want to find **P(Toothache=True)**. This can be obtained by marginalization (**Equation 13.6**). We can use **enumerate_joint** to solve for this by taking Toothache=True as our evidence. **enumerate_joint** will return the sum of probabilities consistent with evidence i.e. Marginal Probability." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.19999999999999998" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evidence = dict(Toothache=True)\n", - "variables = ['Cavity', 'Catch'] # variables not part of evidence\n", - "ans1 = enumerate_joint(variables, evidence, full_joint)\n", - "ans1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can verify the result from our definition of the full joint distribution. We can use the same function to find more complex probabilities like **P(Cavity=True and Toothache=True)** " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.12" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evidence = dict(Cavity=True, Toothache=True)\n", - "variables = ['Catch'] # variables not part of evidence\n", - "ans2 = enumerate_joint(variables, evidence, full_joint)\n", - "ans2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Being able to find sum of probabilities satisfying given evidence allows us to compute conditional probabilities like **P(Cavity=True | Toothache=True)** as we can rewrite this as $$P(Cavity=True | Toothache = True) = \\frac{P(Cavity=True \\ and \\ Toothache=True)}{P(Toothache=True)}$$\n", - "\n", - "We have already calculated both the numerator and denominator." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.6" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ans2/ans1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We might be interested in the probability distribution of a particular variable conditioned on some evidence. This can involve doing calculations like above for each possible value of the variable. This has been implemented slightly differently using normalization in the function **enumerate_joint_ask** which returns a probability distribution over the values of the variable **X**, given the {var:val} observations **e**, in the **JointProbDist P**. The implementation of this function calls **enumerate_joint** for each value of the query variable and passes **extended evidence** with the new evidence having **X = xi**. This is followed by normalization of the obtained distribution." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(enumerate_joint_ask)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us find **P(Cavity | Toothache=True)** using **enumerate_joint_ask**." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.6, 0.39999999999999997)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_variable = 'Cavity'\n", - "evidence = dict(Toothache=True)\n", - "ans = enumerate_joint_ask(query_variable, evidence, full_joint)\n", - "(ans[True], ans[False])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can verify that the first value is the same as we obtained earlier by manual calculation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Bayesian Networks\n", - "\n", - "A Bayesian network is a representation of the joint probability distribution encoding a collection of conditional independence statements.\n", - "\n", - "A Bayes Network is implemented as the class **BayesNet**. It consisits of a collection of nodes implemented by the class **BayesNode**. The implementation in the above mentioned classes focuses only on boolean variables. Each node is associated with a variable and it contains a **conditional probabilty table (cpt)**. The **cpt** represents the probability distribution of the variable conditioned on its parents **P(X | parents)**.\n", - "\n", - "Let us dive into the **BayesNode** implementation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(BayesNode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The constructor takes in the name of **variable**, **parents** and **cpt**. Here **variable** is a the name of the variable like 'Earthquake'. **parents** should a list or space separate string with variable names of parents. The conditional probability table is a dict {(v1, v2, ...): p, ...}, the distribution P(X=true | parent1=v1, parent2=v2, ...) = p. Here the keys are combination of boolean values that the parents take. The length and order of the values in keys should be same as the supplied **parent** list/string. In all cases the probability of X being false is left implicit, since it follows from P(X=true).\n", - "\n", - "The example below where we implement the network shown in **Figure 14.3** of the book will make this more clear.\n", - "\n", - "\n", - "\n", - "The alarm node can be made as follows: " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "alarm_node = BayesNode('Alarm', ['Burglary', 'Earthquake'], \n", - " {(True, True): 0.95,(True, False): 0.94, (False, True): 0.29, (False, False): 0.001})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is possible to avoid using a tuple when there is only a single parent. So an alternative format for the **cpt** is" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "john_node = BayesNode('JohnCalls', ['Alarm'], {True: 0.90, False: 0.05})\n", - "mary_node = BayesNode('MaryCalls', 'Alarm', {(True, ): 0.70, (False, ): 0.01}) # Using string for parents.\n", - "# Equivalant to john_node definition." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The general format used for the alarm node always holds. For nodes with no parents we can also use. " - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "burglary_node = BayesNode('Burglary', '', 0.001)\n", - "earthquake_node = BayesNode('Earthquake', '', 0.002)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is possible to use the node for lookup function using the **p** method. The method takes in two arguments **value** and **event**. Event must be a dict of the type {variable:values, ..} The value corresponds to the value of the variable we are interested in (False or True).The method returns the conditional probability **P(X=value | parents=parent_values)**, where parent_values are the values of parents in event. (event must assign each parent a value.)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.09999999999999998" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "john_node.p(False, {'Alarm': True, 'Burglary': True}) # P(JohnCalls=False | Alarm=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With all the information about nodes present it is possible to construct a Bayes Network using **BayesNet**. The **BayesNet** class does not take in nodes as input but instead takes a list of **node_specs**. An entry in **node_specs** is a tuple of the parameters we use to construct a **BayesNode** namely **(X, parents, cpt)**. **node_specs** must be ordered with parents before children." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(BayesNet)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The constructor of **BayesNet** takes each item in **node_specs** and adds a **BayesNode** to its **nodes** object variable by calling the **add** method. **add** in turn adds node to the net. Its parents must already be in the net, and its variable must not. Thus add allows us to grow a **BayesNet** given its parents are already present.\n", - "\n", - "**burglary** global is an instance of **BayesNet** corresponding to the above example.\n", - "\n", - " T, F = True, False\n", - "\n", - " burglary = BayesNet([\n", - " ('Burglary', '', 0.001),\n", - " ('Earthquake', '', 0.002),\n", - " ('Alarm', 'Burglary Earthquake',\n", - " {(T, T): 0.95, (T, F): 0.94, (F, T): 0.29, (F, F): 0.001}),\n", - " ('JohnCalls', 'Alarm', {T: 0.90, F: 0.05}),\n", - " ('MaryCalls', 'Alarm', {T: 0.70, F: 0.01})\n", - " ])" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "BayesNet([('Burglary', ''), ('Earthquake', ''), ('Alarm', 'Burglary Earthquake'), ('JohnCalls', 'Alarm'), ('MaryCalls', 'Alarm')])" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "burglary" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**BayesNet** method **variable_node** allows to reach **BayesNode** instances inside a Bayes Net. It is possible to modify the **cpt** of the nodes directly using this method." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "probability.BayesNode" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(burglary.variable_node('Alarm'))" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(False, False): 0.001,\n", - " (False, True): 0.29,\n", - " (True, False): 0.94,\n", - " (True, True): 0.95}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "burglary.variable_node('Alarm').cpt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exact Inference in Bayesian Networks\n", - "\n", - "A Bayes Network is a more compact representation of the full joint distribution and like full joint distributions allows us to do inference i.e. answer questions about probability distributions of random variables given some evidence.\n", - "\n", - "Exact algorithms don't scale well for larger networks. Approximate algorithms are explained in the next section.\n", - "\n", - "### Inference by Enumeration\n", - "\n", - "We apply techniques similar to those used for **enumerate_joint_ask** and **enumerate_joint** to draw inference from Bayesian Networks. **enumeration_ask** and **enumerate_all** implement the algorithm described in **Figure 14.9** of the book." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(enumerate_all)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**enumerate__all** recursively evaluates a general form of the **Equation 14.4** in the book.\n", - "\n", - "$$\\textbf{P}(X | \\textbf{e}) = α \\textbf{P}(X, \\textbf{e}) = α \\sum_{y} \\textbf{P}(X, \\textbf{e}, \\textbf{y})$$ \n", - "\n", - "such that **P(X, e, y)** is written in the form of product of conditional probabilities **P(variable | parents(variable))** from the Bayesian Network.\n", - "\n", - "**enumeration_ask** calls **enumerate_all** on each value of query variable **X** and finally normalizes them. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(enumeration_ask)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us solve the problem of finding out **P(Burglary=True | JohnCalls=True, MaryCalls=True)** using the **burglary** network.**enumeration_ask** takes three arguments **X** = variable name, **e** = Evidence (in form a dict like previously explained), **bn** = The Bayes Net to do inference on." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2841718353643929" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ans_dist = enumeration_ask('Burglary', {'JohnCalls': True, 'MaryCalls': True}, burglary)\n", - "ans_dist[True]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Variable Elimination\n", - "\n", - "The enumeration algorithm can be improved substantially by eliminating repeated calculations. In enumeration we join the joint of all hidden variables. This is of exponential size for the number of hidden variables. Variable elimination employes interleaving join and marginalization.\n", - "\n", - "Before we look into the implementation of Variable Elimination we must first familiarize ourselves with Factors. \n", - "\n", - "In general we call a multidimensional array of type P(Y1 ... Yn | X1 ... Xm) a factor where some of Xs and Ys maybe assigned values. Factors are implemented in the probability module as the class **Factor**. They take as input **variables** and **cpt**. \n", - "\n", - "\n", - "#### Helper Functions\n", - "\n", - "There are certain helper functions that help creating the **cpt** for the Factor given the evidence. Let us explore them one by one." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource( make_factor)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**make_factor** is used to create the **cpt** and **variables** that will be passed to the constructor of **Factor**. We use **make_factor** for each variable. It takes in the arguments **var** the particular variable, **e** the evidence we want to do inference on, **bn** the bayes network.\n", - "\n", - "Here **variables** for each node refers to a list consisting of the variable itself and the parents minus any variables that are part of the evidence. This is created by finding the **node.parents** and filtering out those that are not part of the evidence.\n", - "\n", - "The **cpt** created is the one similar to the original **cpt** of the node with only rows that agree with the evidence." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(all_events)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The **all_events** function is a recursive generator function which yields a key for the orignal **cpt** which is part of the node. This works by extending evidence related to the node, thus all the output from **all_events** only includes events that support the evidence. Given **all_events** is a generator function one such event is returned on every call. \n", - "\n", - "We can try this out using the example on **Page 524** of the book. We will make **f**5(A) = P(m | A)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "f5 = make_factor('MaryCalls', {'JohnCalls': True, 'MaryCalls': True}, burglary)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f5" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(False,): 0.01, (True,): 0.7}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f5.cpt" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Alarm']" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f5.variables" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here **f5.cpt** False key gives probability for **P(MaryCalls=True | Alarm = False)**. Due to our representation where we only store probabilities for only in cases where the node variable is True this is the same as the **cpt** of the BayesNode. Let us try a somewhat different example from the book where evidence is that the Alarm = True" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "new_factor = make_factor('MaryCalls', {'Alarm': True}, burglary)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(False,): 0.30000000000000004, (True,): 0.7}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_factor.cpt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here the **cpt** is for **P(MaryCalls | Alarm = True)**. Therefore the probabilities for True and False sum up to one. Note the difference between both the cases. Again the only rows included are those consistent with the evidence.\n", - "\n", - "#### Operations on Factors\n", - "\n", - "We are interested in two kinds of operations on factors. **Pointwise Product** which is used to created joint distributions and **Summing Out** which is used for marginalization." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(Factor.pointwise_product)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Factor.pointwise_product** implements a method of creating a joint via combining two factors. We take the union of **variables** of both the factors and then generate the **cpt** for the new factor using **all_events** function. Note that the given we have eliminated rows that are not consistent with the evidence. Pointwise product assigns new probabilities by multiplying rows similar to that in a database join." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(pointwise_product)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**pointwise_product** extends this operation to more than two operands where it is done sequentially in pairs of two." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(Factor.sum_out)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Factor.sum_out** makes a factor eliminating a variable by summing over its values. Again **events_all** is used to generate combinations for the rest of the variables." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(sum_out)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**sum_out** uses both **Factor.sum_out** and **pointwise_product** to finally eliminate a particular variable from all factors by summing over its values." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Elimination Ask\n", - "\n", - "The algorithm described in **Figure 14.11** of the book is implemented by the function **elimination_ask**. We use this for inference. The key idea is that we eliminate the hidden variables by interleaving joining and marginalization. It takes in 3 arguments **X** the query variable, **e** the evidence variable and **bn** the Bayes network. \n", - "\n", - "The algorithm creates factors out of Bayes Nodes in reverse order and eliminates hidden variables using **sum_out**. Finally it takes a point wise product of all factors and normalizes. Let us finally solve the problem of inferring \n", - "\n", - "**P(Burglary=True | JohnCalls=True, MaryCalls=True)** using variable elimination." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(elimination_ask)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.716, True: 0.284'" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "elimination_ask('Burglary', dict(JohnCalls=True, MaryCalls=True), burglary).show_approx()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Approximate Inference in Bayesian Networks\n", - "\n", - "Exact inference fails to scale for very large and complex Bayesian Networks. This section covers implementation of randomized sampling algorithms, also called Monte Carlo algorithms." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(BayesNode.sample)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we consider the different algorithms in this section let us look at the **BayesNode.sample** method. It samples from the distribution for this variable conditioned on event's values for parent_variables. That is, return True/False at random according to with the conditional probability given the parents. The **probability** function is a simple helper from **utils** module which returns True with the probability passed to it.\n", - "\n", - "### Prior Sampling\n", - "\n", - "The idea of Prior Sampling is to sample from the Bayesian Network in a topological order. We start at the top of the network and sample as per **P(Xi | parents(Xi)** i.e. the probability distribution from which the value is sampled is conditioned on the values already assigned to the variable's parents. This can be thought of as a simulation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(prior_sample)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The function **prior_sample** implements the algorithm described in **Figure 14.13** of the book. Nodes are sampled in the topological order. The old value of the event is passed as evidence for parent values. We will use the Bayesian Network in **Figure 14.12** to try out the **prior_sample**\n", - "\n", - "\n", - "\n", - "We store the samples on the observations. Let us find **P(Rain=True)**" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "N = 1000\n", - "all_observations = [prior_sample(sprinkler) for x in range(N)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we filter to get the observations where Rain = True" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "rain_true = [observation for observation in all_observations if observation['Rain'] == True]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we can find **P(Rain=True)**" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.508\n" - ] - } - ], - "source": [ - "answer = len(rain_true) / N\n", - "print(answer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To evaluate a conditional distribution. We can use a two-step filtering process. We first separate out the variables that are consistent with the evidence. Then for each value of query variable, we can find probabilities. For example to find **P(Cloudy=True | Rain=True)**. We have already filtered out the values consistent with our evidence in **rain_true**. Now we apply a second filtering step on **rain_true** to find **P(Rain=True and Cloudy=True)**" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7755905511811023\n" - ] - } - ], - "source": [ - "rain_and_cloudy = [observation for observation in rain_true if observation['Cloudy'] == True]\n", - "answer = len(rain_and_cloudy) / len(rain_true)\n", - "print(answer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rejection Sampling\n", - "\n", - "Rejection Sampling is based on an idea similar to what we did just now. First, it generates samples from the prior distribution specified by the network. Then, it rejects all those that do not match the evidence. The function **rejection_sampling** implements the algorithm described by **Figure 14.14**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(rejection_sampling)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The function keeps counts of each of the possible values of the Query variable and increases the count when we see an observation consistent with the evidence. It takes in input parameters **X** - The Query Variable, **e** - evidence, **bn** - Bayes net and **N** - number of prior samples to generate.\n", - "\n", - "**consistent_with** is used to check consistency." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(consistent_with)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To answer **P(Cloudy=True | Rain=True)**" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.7835249042145593" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = rejection_sampling('Cloudy', dict(Rain=True), sprinkler, 1000)\n", - "p[True]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Likelihood Weighting\n", - "\n", - "Rejection sampling tends to reject a lot of samples if our evidence consists of a large number of variables. Likelihood Weighting solves this by fixing the evidence (i.e. not sampling it) and then using weights to make sure that our overall sampling is still consistent.\n", - "\n", - "The pseudocode in **Figure 14.15** is implemented as **likelihood_weighting** and **weighted_sample**." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(weighted_sample)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**weighted_sample** samples an event from Bayesian Network that's consistent with the evidence **e** and returns the event and its weight, the likelihood that the event accords to the evidence. It takes in two parameters **bn** the Bayesian Network and **e** the evidence.\n", - "\n", - "The weight is obtained by multiplying **P(xi | parents(xi))** for each node in evidence. We set the values of **event = evidence** at the start of the function." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "({'Cloudy': True, 'Rain': True, 'Sprinkler': False, 'WetGrass': True}, 0.8)" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "weighted_sample(sprinkler, dict(Rain=True))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(likelihood_weighting)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**likelihood_weighting** implements the algorithm to solve our inference problem. The code is similar to **rejection_sampling** but instead of adding one for each sample we add the weight obtained from **weighted_sampling**." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.184, True: 0.816'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "likelihood_weighting('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Gibbs Sampling\n", - "\n", - "In likelihood sampling, it is possible to obtain low weights in cases where the evidence variables reside at the bottom of the Bayesian Network. This can happen because influence only propagates downwards in likelihood sampling.\n", - "\n", - "Gibbs Sampling solves this. The implementation of **Figure 14.16** is provided in the function **gibbs_ask** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(gibbs_ask)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In **gibbs_ask** we initialize the non-evidence variables to random values. And then select non-evidence variables and sample it from **P(Variable | value in the current state of all remaining vars) ** repeatedly sample. In practice, we speed this up by using **markov_blanket_sample** instead. This works because terms not involving the variable get canceled in the calculation. The arguments for **gibbs_ask** are similar to **likelihood_weighting**" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'False: 0.17, True: 0.83'" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - }, - "widgets": { - "state": {}, - "version": "1.1.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/probability.py b/probability.py deleted file mode 100644 index 5c9e28245..000000000 --- a/probability.py +++ /dev/null @@ -1,717 +0,0 @@ -"""Probability models. (Chapter 13-15) -""" - -from utils import ( - product, argmax, element_wise_product, matrix_multiplication, - vector_to_diagonal, vector_add, scalar_vector_product, inverse_matrix, - weighted_sample_with_replacement, isclose, probability, normalize -) -from logic import extend - -import random -from collections import defaultdict -from functools import reduce - -# ______________________________________________________________________________ - - -def DTAgentProgram(belief_state): - """A decision-theoretic agent. [Figure 13.1]""" - def program(percept): - belief_state.observe(program.action, percept) - program.action = argmax(belief_state.actions(), - key=belief_state.expected_outcome_utility) - return program.action - program.action = None - return program - -# ______________________________________________________________________________ - - -class ProbDist: - """A discrete probability distribution. You name the random variable - in the constructor, then assign and query probability of values. - >>> P = ProbDist('Flip'); P['H'], P['T'] = 0.25, 0.75; P['H'] - 0.25 - >>> P = ProbDist('X', {'lo': 125, 'med': 375, 'hi': 500}) - >>> P['lo'], P['med'], P['hi'] - (0.125, 0.375, 0.5) - """ - - def __init__(self, varname='?', freqs=None): - """If freqs is given, it is a dictionary of values - frequency pairs, - then ProbDist is normalized.""" - self.prob = {} - self.varname = varname - self.values = [] - if freqs: - for (v, p) in freqs.items(): - self[v] = p - self.normalize() - - def __getitem__(self, val): - """Given a value, return P(value).""" - try: - return self.prob[val] - except KeyError: - return 0 - - def __setitem__(self, val, p): - """Set P(val) = p.""" - if val not in self.values: - self.values.append(val) - self.prob[val] = p - - def normalize(self): - """Make sure the probabilities of all values sum to 1. - Returns the normalized distribution. - Raises a ZeroDivisionError if the sum of the values is 0.""" - total = sum(self.prob.values()) - if not isclose(total, 1.0): - for val in self.prob: - self.prob[val] /= total - return self - - def show_approx(self, numfmt='{:.3g}'): - """Show the probabilities rounded and sorted by key, for the - sake of portable doctests.""" - return ', '.join([('{}: ' + numfmt).format(v, p) - for (v, p) in sorted(self.prob.items())]) - - def __repr__(self): - return "P({})".format(self.varname) - - -class JointProbDist(ProbDist): - """A discrete probability distribute over a set of variables. - >>> P = JointProbDist(['X', 'Y']); P[1, 1] = 0.25 - >>> P[1, 1] - 0.25 - >>> P[dict(X=0, Y=1)] = 0.5 - >>> P[dict(X=0, Y=1)] - 0.5""" - - def __init__(self, variables): - self.prob = {} - self.variables = variables - self.vals = defaultdict(list) - - def __getitem__(self, values): - """Given a tuple or dict of values, return P(values).""" - values = event_values(values, self.variables) - return ProbDist.__getitem__(self, values) - - def __setitem__(self, values, p): - """Set P(values) = p. Values can be a tuple or a dict; it must - have a value for each of the variables in the joint. Also keep track - of the values we have seen so far for each variable.""" - values = event_values(values, self.variables) - self.prob[values] = p - for var, val in zip(self.variables, values): - if val not in self.vals[var]: - self.vals[var].append(val) - - def values(self, var): - """Return the set of possible values for a variable.""" - return self.vals[var] - - def __repr__(self): - return "P({})".format(self.variables) - - -def event_values(event, variables): - """Return a tuple of the values of variables in event. - >>> event_values ({'A': 10, 'B': 9, 'C': 8}, ['C', 'A']) - (8, 10) - >>> event_values ((1, 2), ['C', 'A']) - (1, 2) - """ - if isinstance(event, tuple) and len(event) == len(variables): - return event - else: - return tuple([event[var] for var in variables]) - -# ______________________________________________________________________________ - - -def enumerate_joint_ask(X, e, P): - """Return a probability distribution over the values of the variable X, - given the {var:val} observations e, in the JointProbDist P. [Section 13.3] - >>> P = JointProbDist(['X', 'Y']) - >>> P[0,0] = 0.25; P[0,1] = 0.5; P[1,1] = P[2,1] = 0.125 - >>> enumerate_joint_ask('X', dict(Y=1), P).show_approx() - '0: 0.667, 1: 0.167, 2: 0.167' - """ - assert X not in e, "Query variable must be distinct from evidence" - Q = ProbDist(X) # probability distribution for X, initially empty - Y = [v for v in P.variables if v != X and v not in e] # hidden variables. - for xi in P.values(X): - Q[xi] = enumerate_joint(Y, extend(e, X, xi), P) - return Q.normalize() - - -def enumerate_joint(variables, e, P): - """Return the sum of those entries in P consistent with e, - provided variables is P's remaining variables (the ones not in e).""" - if not variables: - return P[e] - Y, rest = variables[0], variables[1:] - return sum([enumerate_joint(rest, extend(e, Y, y), P) - for y in P.values(Y)]) - -# ______________________________________________________________________________ - - -class BayesNet: - """Bayesian network containing only boolean-variable nodes.""" - - def __init__(self, node_specs=[]): - """Nodes must be ordered with parents before children.""" - self.nodes = [] - self.variables = [] - for node_spec in node_specs: - self.add(node_spec) - - def add(self, node_spec): - """Add a node to the net. Its parents must already be in the - net, and its variable must not.""" - node = BayesNode(*node_spec) - assert node.variable not in self.variables - assert all((parent in self.variables) for parent in node.parents) - self.nodes.append(node) - self.variables.append(node.variable) - for parent in node.parents: - self.variable_node(parent).children.append(node) - - def variable_node(self, var): - """Return the node for the variable named var. - >>> burglary.variable_node('Burglary').variable - 'Burglary'""" - for n in self.nodes: - if n.variable == var: - return n - raise Exception("No such variable: {}".format(var)) - - def variable_values(self, var): - """Return the domain of var.""" - return [True, False] - - def __repr__(self): - return 'BayesNet({0!r})'.format(self.nodes) - - -class BayesNode: - """A conditional probability distribution for a boolean variable, - P(X | parents). Part of a BayesNet.""" - - def __init__(self, X, parents, cpt): - """X is a variable name, and parents a sequence of variable - names or a space-separated string. cpt, the conditional - probability table, takes one of these forms: - - * A number, the unconditional probability P(X=true). You can - use this form when there are no parents. - - * A dict {v: p, ...}, the conditional probability distribution - P(X=true | parent=v) = p. When there's just one parent. - - * A dict {(v1, v2, ...): p, ...}, the distribution P(X=true | - parent1=v1, parent2=v2, ...) = p. Each key must have as many - values as there are parents. You can use this form always; - the first two are just conveniences. - - In all cases the probability of X being false is left implicit, - since it follows from P(X=true). - - >>> X = BayesNode('X', '', 0.2) - >>> Y = BayesNode('Y', 'P', {T: 0.2, F: 0.7}) - >>> Z = BayesNode('Z', 'P Q', - ... {(T, T): 0.2, (T, F): 0.3, (F, T): 0.5, (F, F): 0.7}) - """ - if isinstance(parents, str): - parents = parents.split() - - # We store the table always in the third form above. - if isinstance(cpt, (float, int)): # no parents, 0-tuple - cpt = {(): cpt} - elif isinstance(cpt, dict): - # one parent, 1-tuple - if cpt and isinstance(list(cpt.keys())[0], bool): - cpt = {(v,): p for v, p in cpt.items()} - - assert isinstance(cpt, dict) - for vs, p in cpt.items(): - assert isinstance(vs, tuple) and len(vs) == len(parents) - assert all(isinstance(v, bool) for v in vs) - assert 0 <= p <= 1 - - self.variable = X - self.parents = parents - self.cpt = cpt - self.children = [] - - def p(self, value, event): - """Return the conditional probability - P(X=value | parents=parent_values), where parent_values - are the values of parents in event. (event must assign each - parent a value.) - >>> bn = BayesNode('X', 'Burglary', {T: 0.2, F: 0.625}) - >>> bn.p(False, {'Burglary': False, 'Earthquake': True}) - 0.375""" - assert isinstance(value, bool) - ptrue = self.cpt[event_values(event, self.parents)] - return ptrue if value else 1 - ptrue - - def sample(self, event): - """Sample from the distribution for this variable conditioned - on event's values for parent_variables. That is, return True/False - at random according with the conditional probability given the - parents.""" - return probability(self.p(True, event)) - - def __repr__(self): - return repr((self.variable, ' '.join(self.parents))) - - -# Burglary example [Figure 14.2] - -T, F = True, False - -burglary = BayesNet([ - ('Burglary', '', 0.001), - ('Earthquake', '', 0.002), - ('Alarm', 'Burglary Earthquake', - {(T, T): 0.95, (T, F): 0.94, (F, T): 0.29, (F, F): 0.001}), - ('JohnCalls', 'Alarm', {T: 0.90, F: 0.05}), - ('MaryCalls', 'Alarm', {T: 0.70, F: 0.01}) -]) - -# ______________________________________________________________________________ - - -def enumeration_ask(X, e, bn): - """Return the conditional probability distribution of variable X - given evidence e, from BayesNet bn. [Figure 14.9] - >>> enumeration_ask('Burglary', dict(JohnCalls=T, MaryCalls=T), burglary - ... ).show_approx() - 'False: 0.716, True: 0.284'""" - assert X not in e, "Query variable must be distinct from evidence" - Q = ProbDist(X) - for xi in bn.variable_values(X): - Q[xi] = enumerate_all(bn.variables, extend(e, X, xi), bn) - return Q.normalize() - - -def enumerate_all(variables, e, bn): - """Return the sum of those entries in P(variables | e{others}) - consistent with e, where P is the joint distribution represented - by bn, and e{others} means e restricted to bn's other variables - (the ones other than variables). Parents must precede children in variables.""" - if not variables: - return 1.0 - Y, rest = variables[0], variables[1:] - Ynode = bn.variable_node(Y) - if Y in e: - return Ynode.p(e[Y], e) * enumerate_all(rest, e, bn) - else: - return sum(Ynode.p(y, e) * enumerate_all(rest, extend(e, Y, y), bn) - for y in bn.variable_values(Y)) - -# ______________________________________________________________________________ - - -def elimination_ask(X, e, bn): - """Compute bn's P(X|e) by variable elimination. [Figure 14.11] - >>> elimination_ask('Burglary', dict(JohnCalls=T, MaryCalls=T), burglary - ... ).show_approx() - 'False: 0.716, True: 0.284'""" - assert X not in e, "Query variable must be distinct from evidence" - factors = [] - for var in reversed(bn.variables): - factors.append(make_factor(var, e, bn)) - if is_hidden(var, X, e): - factors = sum_out(var, factors, bn) - return pointwise_product(factors, bn).normalize() - - -def is_hidden(var, X, e): - """Is var a hidden variable when querying P(X|e)?""" - return var != X and var not in e - - -def make_factor(var, e, bn): - """Return the factor for var in bn's joint distribution given e. - That is, bn's full joint distribution, projected to accord with e, - is the pointwise product of these factors for bn's variables.""" - node = bn.variable_node(var) - variables = [X for X in [var] + node.parents if X not in e] - cpt = {event_values(e1, variables): node.p(e1[var], e1) - for e1 in all_events(variables, bn, e)} - return Factor(variables, cpt) - - -def pointwise_product(factors, bn): - return reduce(lambda f, g: f.pointwise_product(g, bn), factors) - - -def sum_out(var, factors, bn): - """Eliminate var from all factors by summing over its values.""" - result, var_factors = [], [] - for f in factors: - (var_factors if var in f.variables else result).append(f) - result.append(pointwise_product(var_factors, bn).sum_out(var, bn)) - return result - - -class Factor: - """A factor in a joint distribution.""" - - def __init__(self, variables, cpt): - self.variables = variables - self.cpt = cpt - - def pointwise_product(self, other, bn): - """Multiply two factors, combining their variables.""" - variables = list(set(self.variables) | set(other.variables)) - cpt = {event_values(e, variables): self.p(e) * other.p(e) - for e in all_events(variables, bn, {})} - return Factor(variables, cpt) - - def sum_out(self, var, bn): - """Make a factor eliminating var by summing over its values.""" - variables = [X for X in self.variables if X != var] - cpt = {event_values(e, variables): sum(self.p(extend(e, var, val)) - for val in bn.variable_values(var)) - for e in all_events(variables, bn, {})} - return Factor(variables, cpt) - - def normalize(self): - """Return my probabilities; must be down to one variable.""" - assert len(self.variables) == 1 - return ProbDist(self.variables[0], - {k: v for ((k,), v) in self.cpt.items()}) - - def p(self, e): - """Look up my value tabulated for e.""" - return self.cpt[event_values(e, self.variables)] - - -def all_events(variables, bn, e): - """Yield every way of extending e with values for all variables.""" - if not variables: - yield e - else: - X, rest = variables[0], variables[1:] - for e1 in all_events(rest, bn, e): - for x in bn.variable_values(X): - yield extend(e1, X, x) - -# ______________________________________________________________________________ - -# [Figure 14.12a]: sprinkler network - - -sprinkler = BayesNet([ - ('Cloudy', '', 0.5), - ('Sprinkler', 'Cloudy', {T: 0.10, F: 0.50}), - ('Rain', 'Cloudy', {T: 0.80, F: 0.20}), - ('WetGrass', 'Sprinkler Rain', - {(T, T): 0.99, (T, F): 0.90, (F, T): 0.90, (F, F): 0.00})]) - -# ______________________________________________________________________________ - - -def prior_sample(bn): - """Randomly sample from bn's full joint distribution. The result - is a {variable: value} dict. [Figure 14.13]""" - event = {} - for node in bn.nodes: - event[node.variable] = node.sample(event) - return event - -# _________________________________________________________________________ - - -def rejection_sampling(X, e, bn, N): - """Estimate the probability distribution of variable X given - evidence e in BayesNet bn, using N samples. [Figure 14.14] - Raises a ZeroDivisionError if all the N samples are rejected, - i.e., inconsistent with e. - >>> random.seed(47) - >>> rejection_sampling('Burglary', dict(JohnCalls=T, MaryCalls=T), - ... burglary, 10000).show_approx() - 'False: 0.7, True: 0.3' - """ - counts = {x: 0 for x in bn.variable_values(X)} # bold N in [Figure 14.14] - for j in range(N): - sample = prior_sample(bn) # boldface x in [Figure 14.14] - if consistent_with(sample, e): - counts[sample[X]] += 1 - return ProbDist(X, counts) - - -def consistent_with(event, evidence): - """Is event consistent with the given evidence?""" - return all(evidence.get(k, v) == v - for k, v in event.items()) - -# _________________________________________________________________________ - - -def likelihood_weighting(X, e, bn, N): - """Estimate the probability distribution of variable X given - evidence e in BayesNet bn. [Figure 14.15] - >>> random.seed(1017) - >>> likelihood_weighting('Burglary', dict(JohnCalls=T, MaryCalls=T), - ... burglary, 10000).show_approx() - 'False: 0.702, True: 0.298' - """ - W = {x: 0 for x in bn.variable_values(X)} - for j in range(N): - sample, weight = weighted_sample(bn, e) # boldface x, w in [Figure 14.15] - W[sample[X]] += weight - return ProbDist(X, W) - - -def weighted_sample(bn, e): - """Sample an event from bn that's consistent with the evidence e; - return the event and its weight, the likelihood that the event - accords to the evidence.""" - w = 1 - event = dict(e) # boldface x in [Figure 14.15] - for node in bn.nodes: - Xi = node.variable - if Xi in e: - w *= node.p(e[Xi], event) - else: - event[Xi] = node.sample(event) - return event, w - -# _________________________________________________________________________ - - -def gibbs_ask(X, e, bn, N): - """[Figure 14.16]""" - assert X not in e, "Query variable must be distinct from evidence" - counts = {x: 0 for x in bn.variable_values(X)} # bold N in [Figure 14.16] - Z = [var for var in bn.variables if var not in e] - state = dict(e) # boldface x in [Figure 14.16] - for Zi in Z: - state[Zi] = random.choice(bn.variable_values(Zi)) - for j in range(N): - for Zi in Z: - state[Zi] = markov_blanket_sample(Zi, state, bn) - counts[state[X]] += 1 - return ProbDist(X, counts) - - -def markov_blanket_sample(X, e, bn): - """Return a sample from P(X | mb) where mb denotes that the - variables in the Markov blanket of X take their values from event - e (which must assign a value to each). The Markov blanket of X is - X's parents, children, and children's parents.""" - Xnode = bn.variable_node(X) - Q = ProbDist(X) - for xi in bn.variable_values(X): - ei = extend(e, X, xi) - # [Equation 14.12:] - Q[xi] = Xnode.p(xi, e) * product(Yj.p(ei[Yj.variable], ei) - for Yj in Xnode.children) - # (assuming a Boolean variable here) - return probability(Q.normalize()[True]) - -# _________________________________________________________________________ - - -class HiddenMarkovModel: - """A Hidden markov model which takes Transition model and Sensor model as inputs""" - - def __init__(self, transition_model, sensor_model, prior=[0.5, 0.5]): - self.transition_model = transition_model - self.sensor_model = sensor_model - self.prior = prior - - def sensor_dist(self, ev): - if ev is True: - return self.sensor_model[0] - else: - return self.sensor_model[1] - - -def forward(HMM, fv, ev): - prediction = vector_add(scalar_vector_product(fv[0], HMM.transition_model[0]), - scalar_vector_product(fv[1], HMM.transition_model[1])) - sensor_dist = HMM.sensor_dist(ev) - - return normalize(element_wise_product(sensor_dist, prediction)) - - -def backward(HMM, b, ev): - sensor_dist = HMM.sensor_dist(ev) - prediction = element_wise_product(sensor_dist, b) - - return normalize(vector_add(scalar_vector_product(prediction[0], HMM.transition_model[0]), - scalar_vector_product(prediction[1], HMM.transition_model[1]))) - - -def forward_backward(HMM, ev, prior): - """[Figure 15.4] - Forward-Backward algorithm for smoothing. Computes posterior probabilities - of a sequence of states given a sequence of observations.""" - t = len(ev) - ev.insert(0, None) # to make the code look similar to pseudo code - - fv = [[0.0, 0.0] for i in range(len(ev))] - b = [1.0, 1.0] - bv = [b] # we don't need bv; but we will have a list of all backward messages here - sv = [[0, 0] for i in range(len(ev))] - - fv[0] = prior - - for i in range(1, t + 1): - fv[i] = forward(HMM, fv[i - 1], ev[i]) - for i in range(t, -1, -1): - sv[i - 1] = normalize(element_wise_product(fv[i], b)) - b = backward(HMM, b, ev[i]) - bv.append(b) - - sv = sv[::-1] - - return sv - -# _________________________________________________________________________ - - -def fixed_lag_smoothing(e_t, HMM, d, ev, t): - """[Figure 15.6] - Smoothing algorithm with a fixed time lag of 'd' steps. - Online algorithm that outputs the new smoothed estimate if observation - for new time step is given.""" - ev.insert(0, None) - - T_model = HMM.transition_model - f = HMM.prior - B = [[1, 0], [0, 1]] - evidence = [] - - evidence.append(e_t) - O_t = vector_to_diagonal(HMM.sensor_dist(e_t)) - if t > d: - f = forward(HMM, f, e_t) - O_tmd = vector_to_diagonal(HMM.sensor_dist(ev[t - d])) - B = matrix_multiplication(inverse_matrix(O_tmd), inverse_matrix(T_model), B, T_model, O_t) - else: - B = matrix_multiplication(B, T_model, O_t) - t += 1 - - if t > d: - # always returns a 1x2 matrix - return [normalize(i) for i in matrix_multiplication([f], B)][0] - else: - return None - -# _________________________________________________________________________ - - -def particle_filtering(e, N, HMM): - """Particle filtering considering two states variables.""" - dist = [0.5, 0.5] - # Weight Initialization - w = [0 for _ in range(N)] - # STEP 1 - # Propagate one step using transition model given prior state - dist = vector_add(scalar_vector_product(dist[0], HMM.transition_model[0]), - scalar_vector_product(dist[1], HMM.transition_model[1])) - # Assign state according to probability - s = ['A' if probability(dist[0]) else 'B' for _ in range(N)] - w_tot = 0 - # Calculate importance weight given evidence e - for i in range(N): - if s[i] == 'A': - # P(U|A)*P(A) - w_i = HMM.sensor_dist(e)[0] * dist[0] - if s[i] == 'B': - # P(U|B)*P(B) - w_i = HMM.sensor_dist(e)[1] * dist[1] - w[i] = w_i - w_tot += w_i - - # Normalize all the weights - for i in range(N): - w[i] = w[i] / w_tot - - # Limit weights to 4 digits - for i in range(N): - w[i] = float("{0:.4f}".format(w[i])) - - # STEP 2 - - s = weighted_sample_with_replacement(N, s, w) - - return s - -# _________________________________________________________________________ -## TODO: Implement continous map for MonteCarlo similar to Fig25.10 from the book - -class MCLmap: - """Map which provides probability distributions and sensor readings. - Consists of discrete cells which are either an obstacle or empty""" - def __init__(self, m): - self.m = m - self.nrows = len(m) - self.ncols = len(m[0]) - # list of empty spaces in the map - self.empty = [(i, j) for i in range(self.nrows) for j in range(self.ncols) if not m[i][j]] - - def sample(self): - """Returns a random kinematic state possible in the map""" - pos = random.choice(self.empty) - # 0N 1E 2S 3W - orient = random.choice(range(4)) - kin_state = pos + (orient,) - return kin_state - - def ray_cast(self, sensor_num, kin_state): - """Returns distace to nearest obstacle or map boundary in the direction of sensor""" - pos = kin_state[:2] - orient = kin_state[2] - # sensor layout when orientation is 0 (towards North) - # 0 - # 3R1 - # 2 - delta = ((sensor_num%2 == 0)*(sensor_num - 1), (sensor_num%2 == 1)*(2 - sensor_num)) - # sensor direction changes based on orientation - for _ in range(orient): - delta = (delta[1], -delta[0]) - range_count = 0 - while (0 <= pos[0] < self.nrows) and (0 <= pos[1] < self.nrows) and (not self.m[pos[0]][pos[1]]): - pos = vector_add(pos, delta) - range_count += 1 - return range_count - - -def monte_carlo_localization(a, z, N, P_motion_sample, P_sensor, m, S=None): - """Monte Carlo localization algorithm from Fig 25.9""" - - def ray_cast(sensor_num, kin_state, m): - return m.ray_cast(sensor_num, kin_state) - - M = len(z) - W = [0]*N - S_ = [0]*N - W_ = [0]*N - v = a['v'] - w = a['w'] - - if S is None: - S = [m.sample() for _ in range(N)] - - for i in range(N): - S_[i] = P_motion_sample(S[i], v, w) - W_[i] = 1 - for j in range(M): - z_ = ray_cast(j, S_[i], m) - W_[i] = W_[i] * P_sensor(z[j], z_) - - S = weighted_sample_with_replacement(N, S_, W_) - return S diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 7d983c3fc..000000000 --- a/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -filterwarnings = - ignore::ResourceWarning diff --git a/rl.ipynb b/rl.ipynb deleted file mode 100644 index b0920b8ed..000000000 --- a/rl.ipynb +++ /dev/null @@ -1,563 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reinforcement Learning\n", - "\n", - "This IPy notebook acts as supporting material for **Chapter 21 Reinforcement Learning** of the book* Artificial Intelligence: A Modern Approach*. This notebook makes use of the implementations in rl.py module. We also make use of implementation of MDPs in the mdp.py module to test our agents. It might be helpful if you have already gone through the IPy notebook dealing with Markov decision process. Let us import everything from the rl module. It might be helpful to view the source of some of our implementations. Please refer to the Introductory IPy file for more details." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from rl import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Overview\n", - "* Passive Reinforcement Learning\n", - "* Active Reinforcement Learning" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## OVERVIEW\n", - "\n", - "Before we start playing with the actual implementations let us review a couple of things about RL.\n", - "\n", - "1. Reinforcement Learning is concerned with how software agents ought to take actions in an environment so as to maximize some notion of cumulative reward. \n", - "\n", - "2. Reinforcement learning differs from standard supervised learning in that correct input/output pairs are never presented, nor sub-optimal actions explicitly corrected. Further, there is a focus on on-line performance, which involves finding a balance between exploration (of uncharted territory) and exploitation (of current knowledge).\n", - "\n", - "-- Source: [Wikipedia](https://en.wikipedia.org/wiki/Reinforcement_learning)\n", - "\n", - "In summary we have a sequence of state action transitions with rewards associated with some states. Our goal is to find the optimal policy (pi) which tells us what action to take in each state." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PASSIVE REINFORCEMENT LEARNING\n", - "\n", - "In passive Reinforcement Learning the agent follows a fixed policy and tries to learn the Reward function and the Transition model (if it is not aware of that)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Passive Temporal Difference Agent\n", - "\n", - "The PassiveTDAgent class in the rl module implements the Agent Program (notice the usage of word Program) described in **Fig 21.4** of the AIMA Book. PassiveTDAgent uses temporal differences to learn utility estimates. In simple terms we learn the difference between the states and backup the values to previous states while following a fixed policy. Let us look into the source before we see some usage examples." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource PassiveTDAgent" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Agent Program can be obtained by creating the instance of the class by passing the appropriate parameters. Because of the __ call __ method the object that is created behaves like a callable and returns an appropriate action as most Agent Programs do. To instantiate the object we need a policy(pi) and a mdp whose utility of states will be estimated. Let us import a GridMDP object from the mdp module. **Figure 17.1 (sequential_decision_environment)** is similar to **Figure 21.1** but has some discounting as **gamma = 0.9**." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from mdp import sequential_decision_environment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Figure 17.1 (sequential_decision_environment)** is a GridMDP object and is similar to the grid shown in **Figure 21.1**. The rewards in the terminal states are **+1** and **-1** and **-0.04** in rest of the states. Now we define a policy similar to **Fig 21.1** in the book." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Action Directions\n", - "north = (0, 1)\n", - "south = (0,-1)\n", - "west = (-1, 0)\n", - "east = (1, 0)\n", - "\n", - "policy = {\n", - " (0, 2): east, (1, 2): east, (2, 2): east, (3, 2): None,\n", - " (0, 1): north, (2, 1): north, (3, 1): None,\n", - " (0, 0): north, (1, 0): west, (2, 0): west, (3, 0): west, \n", - "}\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us create our object now. We also use the **same alpha** as given in the footnote of the book on **page 837**." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "our_agent = PassiveTDAgent(policy, sequential_decision_environment, alpha=lambda n: 60./(59+n))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The rl module also has a simple implementation to simulate iterations. The function is called **run_single_trial**. Now we can try our implementation. We can also compare the utility estimates learned by our agent to those obtained via **value iteration**.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from mdp import value_iteration" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The values calculated by value iteration:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "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" - ] - } - ], - "source": [ - "print(value_iteration(sequential_decision_environment))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the values estimated by our agent after **200 trials**." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{(0, 1): 0.3892840731173828, (1, 2): 0.6211579621949068, (3, 2): 1, (0, 0): 0.3022330060485855, (2, 0): 0.0, (3, 0): 0.0, (1, 0): 0.18020445259687815, (3, 1): -1, (2, 2): 0.822969605478094, (2, 1): -0.8456690895152308, (0, 2): 0.49454878907979766}\n" - ] - } - ], - "source": [ - "for i in range(200):\n", - " run_single_trial(our_agent,sequential_decision_environment)\n", - "print(our_agent.U)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also explore how these estimates vary with time by using plots similar to **Fig 21.5a**. To do so we define a function to help us with the same. We will first enable matplotlib using the inline backend." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "\n", - "def graph_utility_estimates(agent_program, mdp, no_of_iterations, states_to_graph):\n", - " graphs = {state:[] for state in states_to_graph}\n", - " for iteration in range(1,no_of_iterations+1):\n", - " run_single_trial(agent_program, mdp)\n", - " for state in states_to_graph:\n", - " graphs[state].append((iteration, agent_program.U[state]))\n", - " for state, value in graphs.items():\n", - " state_x, state_y = zip(*value)\n", - " plt.plot(state_x, state_y, label=str(state))\n", - " plt.ylim([0,1.2])\n", - " plt.legend(loc='lower right')\n", - " plt.xlabel('Iterations')\n", - " plt.ylabel('U')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here is a plot of state (2,2)." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4HOW1+PHv2VXvsoqbbOResY2RDQbTDTHNlBBKIAkB\nLuQmIYUkXFIggYSEJDck9/4C3BAgdAghFIeOQzHY2Lj3Jne5qdhqVt3d9/fHFI2kVbVWkqXzeR4/\n1s7Ojt5Z7c6Z97xNjDEopZRSAL6eLoBSSqneQ4OCUkoplwYFpZRSLg0KSimlXBoUlFJKuTQoKKWU\nckUsKIjIEyJSKCLrW3j+ehFZKyLrRGSxiEyNVFmUUkq1TyRrCk8Cc1t5fidwljHmROCXwKMRLItS\nSql2iIrUgY0xC0Ukt5XnF3seLgFyIlUWpZRS7ROxoNBBNwNvt/SkiNwK3AqQmJh48vjx47urXEop\n1SesWLGi2BiT1dZ+PR4UROQcrKAwu6V9jDGPYqeX8vLyzPLly7updEop1TeIyO727NejQUFEpgCP\nARcaY0p6sixKKaV6sEuqiAwHXgG+YozZ2lPlUEop1SBiNQUReQE4G8gUkQLg50A0gDHm/4B7gAzg\nYREBCBhj8iJVHqWUUm2LZO+j69p4/hbglkj9fqWUUh2nI5qVUkq5NCgopZRyaVBQSinl0qCglFLK\npUFBKaWUS4OCUkoplwYFpZRSLg0KSimlXBoUlFJKuTQoKKWUcmlQUEop5dKgoJRSyqVBQSmllEuD\nglJKKZcGBaWUUi4NCkoppVwaFJRSSrk0KCillHJpUFBKKeXSoKCUUsqlQUEppZRLg4JSSimXBgWl\nlFIuDQpKKaVcGhSUUkq5NCgopZRyaVBQSinlilhQEJEnRKRQRNa38LyIyP+KSL6IrBWR6ZEqi1JK\nqfaJZE3hSWBuK89fCIyx/90KPBLBsiillGqHiAUFY8xC4HAru1wGPG0sS4A0ERkcqfIopZRqW0+2\nKQwF9noeF9jblFJK9ZDjoqFZRG4VkeUisryoqKini6OUUn1WTwaFfcAwz+Mce1szxphHjTF5xpi8\nrKysbimcUkr1Rz0ZFOYDX7V7IZ0KlBljDvRgeZRSqt+LitSBReQF4GwgU0QKgJ8D0QDGmP8D3gIu\nAvKBKuDrkSqLUkqp9olYUDDGXNfG8wb4VqR+v1JKqY47LhqalVJKdQ8NCkoppVwaFJRSSrk0KCil\nlHJpUFBKKeXSoKCUUsqlQUEppZRLg4JSSimXBgWllFIuDQpKKaVcGhSUUkq5NCgopZRyaVBQSinl\n0qCglFLKpUFBKaWUS4OCUkoplwYFpZRSLg0KSimlXBoUlFJKuSK2RnNv9ObaA9QHQ9QFQry6ah/B\nkOHuSyZyYk6qu09VXYCnP9vNnAnZjM5ODnuc6rog2wormJKT1uLvqguE+Nea/SzZUUJ8jJ97501C\nRDpU3sKKGuav3k9WciyXTRvaodd6bT1UwaL8YnaXVFFYUUNmUmyb5akLhFiyo4TNB8vZWVzFlJxU\nrps5vNNl6Gpl1fWkxEV1+D1VSrWuXwWFbz2/EgCfwIDEWIora1myo4QTc1LZfLCcYekJ/PKNjby4\nbC8Hy2q4cvpQPs0v5ptnj3aPEQwZ8n71Pkfrgqz9xQWkxEU3+z3VdUGu/esS1uwtdbf94PxxpCY0\n39frxc/38Nb6g/ztxhk8uXgXD7y9ifqgITbK1+6gsHLPEd7feIgfXjCOkspafvraet7feAiA5Lgo\nKmoCAPzoC+NIDlP2UMjw7NLd/OG9rZRV17vb314fzXUzh7OnpIo//XsrX545nLzcAe0qk6M2EOTp\nxbsZkhbPxVMGEwiGWLitiFNHZpAQE/6jGAwZ/D7rwl8fDPHKygKeWrybjQfK+d0Xp3D1jGEdKoNS\nqnX9JigcPlrn/hwy8OKtpzDnwYXUBUNU1QWY+6dPOG1UBit2H3H3m/fnRQAs3XGYh6+fTmJsFB9v\nLeRoXRCwLv7hgsIjH+WzZm8p/3PtNMqr67n79Q3UBoNAy0Fhxe4j3PXKOgCeX7qbX76xkfMnDqQu\nEGLVniNhXxMIhvhgcyFzJgzE5xM2HSjnyocXA3Du+GzufHktB8tq+MH5Y7ny5ByGpsXzt0U7ufdf\nGwkETbPjhUKGH/xjDa+u2sfs0ZncNDuXk4cP4PnP9/Dbdzbz702HuP2FVVTVBUlPiOlQUCiurOWG\nx5ay+WAFo7OTOGtcFjc8tpTVe0v55eWT+cqpJzR7zdOf7eJXb27iya/PIDcjkW8+t5LVe0uZNCSF\npNgoVuw+0qeCQihkKK2uZ0BiTIdeV1UXIL+wstWaq1Lt1W/aFLwX1rhoHyMykwAIBA37S6sBWLy9\nhNpACMD9H+DjrUUsyi8G4LVV+93tdZ59HIFgiBeW7eXc8dlcNm0osVF+d9/6YPP9/2fBNqbe+x4P\nvr/F3Xb36xsYnZ3En798EqOzkwg1v34D8Ju3N3PrMytYuK0IYww/eXWd+9x3XljFnsNVPPn1Gdx+\n3hiGpsUDEOW3/uT1oeZlee7zPby6ah/fmzOGZ26eybnjB5KaEM0JGQkA3PzUcobYxwl3Li2pqgvw\n1cc/Z1fJUWaPziS/sJLr7YAAcLiyrtlrnly0k3te30BdIMTb6w5y7aNLyC+s5P9ddxJv3D6bE4em\nsuVQRbvLEElVdQHuf3Mj24sqO32Msqp6zv3DR0z/5fuNbmDasmF/GRPveZd5f17EnpKqTv/+3qA+\nGOJ//72N6b98n6U7So7pWMYYjGnhi9NOoZDhX2v2u9/9/qLfBIVhAxLcnxNiovD7BJ9YH8S9h6ub\n7d/0C56RFAvApgPl7rZAmKv1pgMVFFXUcvlJVronJsp6iytrA4z56dv8acHWRvv/cYGVplmUX8LF\nUwa72289YySxUX6ifEIgzAU8FDI8sWgnAPPX7OeDzYWs2lPKj74wDoADZTVcnTeMU0ZmNHpdjN9J\nxTQue1VdgAff28JpozL47nljGuXqh3veu7985WSGpMZRZdeW2uPB97ay8UA5j9xwMl882Xpf1uwt\n5f9ddxLx0X4qauob7b+uoIz739rEnAnZjMxM5JkluzlYVsPTN8/k0qlDEBHGDUpm26EKQmH+BhU1\n9dzx99XkF3b+It1etYEgNz6xjL9+spN/rdnf9gvCOHy0jqv/8hm77It6UUVtu163KL+YLz6y2H28\nv8z6HAdDpkNBuzc4UFbNVY8s5sH3t3L4aB1rCkpb3b+qLkAoZDhaG2Dv4cbB8NVVBUy7733eWHug\nQ2UwxrB0RwkVNfXsK63mhseXcvsLq7j+saWsbKG23hf1m6AwdmAyN88eAUB8tHX3Hu338eKyPfx9\n2d5G+6bERXGwrKbRtmDIUBsIsrP4KLn2nXO4L97afdaH+aRhVlXeCQrrCsoAGl04DpU3/h232OUD\n+MKkQQD4fUIwzIVvdUEpzo3QKyv3cfNTy0mM8XPT6Q3HuOn03Gavi/JZ5Qk0Kftrq/ZzpKqeO84f\n26zxNjczEYDZozMZlZVEfIyfqrqA+/ydL6/hvn9tbPa7AOti/tlurs7L4Zxx2YzOshrvhw2I59Kp\nQ0iJb2jnAOuLeffr6xmQGMPvr5oKdlHuvmQC04enu/udkJHA0bogR6qsu+rfvbOZRxduB+CBtzfz\nyqp9PLtkd9gydaU/vr+Nz3cdBgibkmtLIBji28+vZGfJUW47cyRg3UC0ZV1BGf/x9HJOGJDIc7ec\nAkBJZR019UFm3r+AG//2eYfL0lO2F1Vy2Z8XkV9YyUNfnk60Xzh8tL7F/T/ZVsTkn7/LT15dx6Sf\nv8sZv/uQQDCEMYbfvL2J7/99DWXV9Y3a9NoSDBl+9tp6rnl0CTf+bRlz/7SQ1XtLOW98NgBXPryY\nxz/dGfYmpK/pN0EBrLQRQHyMFRRi/D6KK+t4Z8NBd5+k2CjSEmKaBYVAKMTO4qMEQoZJQ63eSuHS\nR+sKykhLiCYnPd79HQDLd1l3GpOGNPR02rC/rNFrp3pywk6jtFVTaP5B/GhzodsA6zhnfLZ7bgBj\nBjbvPRVtBymnplBaVcfX//Y5D32Yz8isRE4+Ib3Za5Jio1hwx5k8ceMMwKppOTWFsqp6Xlpe4NZa\nKmsDnPabf7NwaxFgtY8EQiFuP3eMff4p3HXheP75n6cBkBwXTUWtdQGoqLFqTKv3lvK9OWNJT4zh\n7osnctXJOXz5lMZtDk5bTmVtgM0Hy3n4o+38+q3NFFXU8o8VBQBsK2xIL+UXVnDFw4ua/V2Pxeq9\npTy6cDvX5A0jNT7avZiv3HOEbzyzotFNw4KNh/ivl9c2O8ZfFu5g8fYS7r98MhdMGuieU2uq6gJ8\n58VVpMVH88zNMxk3yPo7Hz5ay+/f3ULJ0ToW5R9b+iWSquoCBEOGz7aXUHCkihseW0rIGP75zdO4\neMpgBiTGcPho+NrS0h0l3PLUcqtd0HMzd6Cshl+9uYm/fLyD608ZzrAB8RxqZ40rGDJ854VVPLd0\nD2C17w1Jjeft757BX75ystve9cs3NrKqA4HmeNVvGpqhoYYQZV9Mo6N80ORzMyg1jpAx1Nlf6B9f\nOJ7fvL2ZYMhwoNS6oIyy75zDXay3F1UydmCye7ft1BRW7bWCgpOTByvV5OXzCT+7eEKjVJfPJxhj\npYt8niCwam8p4wYmc7C8xs1BO6mit797hnuOTUV7evIAvLpqHx9usS7g3z5ndItdPL3dc62aghUU\n3vUEVLAufvvLanh04Q7OGJPJK6v2cfroTPecfD7hG2eNcvd3ekSVVdUz9b73AEhPiOYKO/12zvhs\nzrHv1ryS4qyPbkVNoFGN4Ddvb6I+GGL26ExW7TmCMQYR4dZnVrCj6ChrC0oZlDoo7DkCbh66ta6u\nWw5W8Ks3N1JaVc+AxFh+eskEPs0vprymnlDIuI39ew9XMTIriZr6ILc8vRyAX14+2f1MHCir5s8f\n5DN30iC+lDeMzQet1ORRT1AIBEN88ZHFXDp1CF8/fQSHymt47JOd7Co5yvO3nEp2ShzBkEEE3l5/\nkM/sXLw35debbNhfxsX/+ymThqSwYX85yXFRGAMv3TaL8YNSAEhPiAlbUyg4UsWtz6wgJz2e/5o7\nnv9+bwtXnJTDb9/ZzK/e3Mi7Gw5x42m5/PzSiVzz6BIKy9u+ATDG8Iv5G3hz3QF+fOF4Lp4ymGeX\n7OE/zx5Farx14+H8zR7/dCd7D1eFvXHqS/pZTcEKCs4XPtrf/Is/MCWWaDvF4hPIy7U+AIGgobTa\nuvhmpcQB1oX1nfUHyL3rTffCfKi8lsGpce7xnAvAjqKjAIQ8jV+bDpQzbEA8N56Wy5+/fBIAt5wx\n0k0dQUMAC3peZ4xhbUEZU4el8tZ3znA/vCfb6ZUJg1PC1hKgoaHZSXV420hOG5UR9jVNJcT4qbaD\nwsd2jcCpGX2wuRCw0nWbDlRQcKSaS6cOafFYyXHRlNcEeH/TIXfbZdOGun+rFl8XawWFoopa5q/Z\nz+Sh1gXllZX7OH/CQM4dn22nl+qprgu677/z92jJs0v3cMqv/93owtzUXa+s5ZNtxazbV8Z/nDGC\nlLhokuOiqKwJsHBbkbtfoX2n+vRnu9xtzmcI4I/vbyVoDD+9eAIAiXa33EpPOu2VlftYU1DGb9/Z\nzC/mb+C0Bz7giUU7uXbGMGbZfy+/T0iLj2bx9hKGpMZzyZTBYWuxPS0QDPHDf1i1pQ37rc9dRU2A\nB754IhOHpLj7ZSQ1rykEgiFuf2EVwZDh8a/N4IJJg3jv+2e5Nw/vbjjEnAnZ3H3JRESE7ORYlu48\nzOUPLWJHKx0AXlm5j2eW7Oa2M0dy21mjyElP4K4Lx7vfKccPL7Da6gqOHN+N+e0R0aAgInNFZIuI\n5IvIXWGeHy4iH4rIKhFZKyIXRbI8TmrFuYl28uteiTFRRNnBYkBijNt7KBAylFZZdy9ZdqNzfSDE\nIx/vAGBn8VGMMRwqr2FgSkNQiLUvQk6twts+sOdwFSMyk/jFvElcMiX8hdNvlzEYsu5ocu96k32l\n1ZRV1zN5aCqDUuN4/Vun853zxjB+UPhA4OUEQqcmtNzTBfek4e27A0qw2xRCIcOnds+M2oCV03Xu\nVI/WBtyAcfbYrBaPlRIXxZq9pfzwH2vcbU4apTXOGIs31x2gqi7IXXMnuM9dnTeMIWnW32B/aTUf\nbil0nwvXPuP1/NI9FFbUcs/rG3ht1b5mzxdX1rJhX0Mg/fIpw+3yRFFZG+DJxbvc5woragmGDH9b\n1LDN+QyVVNby2ur9XJ2X49aiku3aj5M+Msbw10+sz1d2chzPeGpE3zlvTKNyHbGP+53zRpOWEO3+\nfVtSVl3P+n1lre7T1Z76bDebDpTzn2eP4rJpQ3jptlk8ePXUZp/9AYmx7vk4nlu6h1V7Srn/islu\nGxdAdnIscdE+spNj+f1VU92Ualay9R1dvbfUTWU2taekirtfX8/MEQO4c+74VsseH+MnIzGGxz7d\nyZEO9A47HkUsfSQifuAh4HygAFgmIvONMd4WyZ8BLxljHhGRicBbQG6kyhTv1hSsx+HuGmOifO7d\ndGZSrPshC4ZCHKmqR8S6kwGoDxlq7Dvm2Cgf5dUBagMhsu0PZLjf4b0oHSyrYcKgFFrj1BQCIeNe\ncJyuhyMyrC9HbmYid5w/to2zt0T7Gxqa//LxdnYUHeXiKYOZN3VIo/aI1sRHR1FdF2RXyVHKqutJ\niPFTWx9kR/FRt+dMeU09S3aUMHZgEtmeINmUE3QBZuYO4KThaZwyou0ai5M+enXVPlLjozl15ADm\nTBjIgk2HmD0mk80HrdTcwbIa3lzX0AslXMrPkV9Y4dac/rmygH+uLHB7kTleXlFAXTDEr684kWED\n4t3g5IybKK8J8PXTc/nbol0UVdSyKL+YA2U1XDdzOC98vod31x+k4EgVmw9WUBcI8bVZue6xE+3a\nT3FlLftKq9lRVMm2wkpS46PZZ3ebnjosjYsmD2Jwanyjcg1Ni2dfaTVXTs9hy8HKNmsKsx/4gIra\nALseuLjV/bpKeU09f1qwlbPGZnHnF8a5tfWZI5qPdRmQEE1JZUNNoaSylv9+bwuzR2cyr0mt0+cT\nfvvFKYzKSiLdM74j3lPTbJqmddz3hnUp+tM105q1z4VTYgeDW59Zzj++cVqb+3elUMjwzedWcpH9\nXY2kSLYpzATyjTE7AETkReAywBsUDOBcFVOBzvXpayc3fWR3aQmXd4+J8rl595T4aHef+qChrKqO\nlLho9+6/PhCiut4KCsGQ4VCFlcMMV1NwOOmjQDBEcWUtA1NiaY0blDw9W3YUW6mQ4Rkdzxs7QaGw\nopbfvL0ZgEtOHNwoZdWWhBg/VfVBt9vgzBED+Gx7idvbIyUuirLqejYeKOcLE1s/7s7ihqr9JVMH\n81XPRbI1zl11MGQ4fXQGUX4ff/7ySZRX1xMX7XdTeLtKjvLh5kLyTkhn+e4jrdYU5q/ej0/gwsmD\nGwUSr/c2HGRKTqpbQ2goj5UGAysF+NySPRRW1LB6bymp8dF8KS+HFz7fwx/e30puRgIhA7NGZjRK\n80X7fcRE+Xj4o+288PkeTj5hAJlJMdw0ewS/e2cLk4em8Pq3Tg9brle/dRrGNByjtaBwsKyGCk9t\npDumCnl2yW4qagL88IJxbf6+7JQ4ymsCPPRhPgfKqkmMtWphP790YtjXhhvtf/PsEYzKSuLlFQVs\nsttqvKPjF24tYsGmQ/zX3PGN2vla882zR/HwR9tZtusIVXWBFkfhh7NyzxGeX7qH331xits2aIwh\nGDLuTWhrXlq+l3c2HOSc8S3XurtKJNNHQwFvX88Ce5vXL4AbRKQAq5Zwe7gDicitIrJcRJYXFYWv\nCrZH05pCOLFRPjd9FOupNQTt0aZpCdHuhfXT/GK3wbU2EOKA3bNlkLdNwd/47tu5KBVV1hIyMDC1\n5btoaAgK3rEK+YWVRPul2d1iezjnts3Th3/84NZrK00l2A3N6wrKiY/2M3lIKrWBEBv2lxMb5WPq\nsDTWFZRRWlXPtOGtj7IdnW0NIvzm2aO4Oq/9o5OTYhu+kLNGZQJW0HdqJZlJsUT5hLfXH6SqLuim\npMLVFA4frWPVniN8uKWIvNwB3HvZJPe5ukCIRxdup7ym3tpvbynnjGu54XvSkBSGpsWTlRxLweFq\n3ttwkHlThzDIc6Owq6SKPYermDet+R1fgl1bO1JVzwebDzFv6lBG2umSL89sPurbkZ0c596MxET5\nqLO7aIYzf01DWqy1mlNXqakP8vgnOzlrbFajecZaMs4OlL9/dwvPLtnDowt3cNGJg1tsJwsnIymW\nL56cw7hByeQXVrJhfxmjfvIWi/OLMcbw4PtbyUmP56bZue0+5p1zx3Of/dmo7sA4naDd+eDlFQVu\nbQPg2y+s4tTf/LvN11fU1PP7d7cwIze9Q9+RzurphubrgCeNMTnARcAzItKsTMaYR40xecaYvKys\nzkfKhpqCfdww+8T4fW5bQ2yUr1H6prSqnrT4hqDw5OJdFNvV3KU7Snhp2V7io/2MsS900Dx95NQU\nnK6Rg1pJrUBDUHBqJGB1tcxJT2hXlbcppxF9mz0a+IcXjGWEJ0fbHvExfuoCIbYeqmBUdqKbdlqz\nt5Txg5IZkBjj3olOHtL6ReAX8ybxzvfO4M6549tsXPby7psXpjeI3ycMSo1jxe4jiOCmpIJhBgJe\n85fPuOLhxWzYX8apIwaQmRTLD+x03DsbDvLrtzZz+/Or+GRbEcYQtjdUvX1nft4EK/gMSo3jg82F\n1AZCnDshm/SE5lNXnBfmOKWeXHrIwBcmDeTscdn89KIJXDm9ffNfObXTltoV2hqV3xpjDN98bkWz\nQZjhlFXXY4zhvY2HKDlax3+cMbJdv2P84IaL/4lDUzEGvuWZf6wjhg1IoKouyL32OJqF24r5bIfV\n7fkbZ41qlL5sD+dz5/0+gtWmeNc/14Ydu/T2+oZap9NeVHCkijfXHqC4sq7ZmKGm/u/j7ZQcrXMb\n0SMtkkFhH+ANazn2Nq+bgZcAjDGfAXFAZqQK5FygnTc23J1UjKemEBPlcy+8pVV1HKmqIzUhxh17\n4PWH97fy5roDXH7SUNI8F4CmQcHp9eMMXBvYRlBwglLBkYZR13sPV7cZTFoSHdVQU/AJ3HrmqDZe\n0ZxzN7tuXxmjspLci9DagjLGD0ppNB/UqOzWA05CTJTbFbGzvEHYK9ducxk3MNmdTyjcADOn1hQy\nMMPOcTv5/Q/t3lTLdh3mw82FZCTGMGVo80Dn3BycM866aRmdlUR1fZAYv49TRgwgPsZPbJTPfa+m\nDktrta0FICPRml8qLtrPf5w5st1B0/l8hrvgbztUwcYD5e4AzI4EhWDIsOlABW+tO8ifFmxj4/7y\nFvfdsL+Mqfe+x7/WHuDlFQUMTYtvd++2oWnxpCVEc8qIAfzjG7N48zuzG/VO6ginV9znO60BhlV1\nAR5duIOs5FiuOjmnw8dzsg01TYLCF/64kBeX7WV3k6lGjDH8+YN897HTq+2xT3a620qrWx6oV1pV\nx98W7eLSqUO6bW6rSAaFZcAYERkhIjHAtcD8JvvsAc4DEJEJWEGh8/mhdnKCbbjatTW1hK/hZztA\n/OrNTawtKCM1PtrdFk5WUuM7wmYNzcYZNGZ9ENqa/MwJSt7RzwfKqslMbr0toiXOue0oqmRIWnyb\nXTTDibdzqWXV9YzMTHIvVnXBECOyEkmJt54fmhbfobxrZ7WUk83NtC58U3PS3Pcx1OSP7p0J1icN\nPbCc9NRHds+lqrogn+0oYdaojEbjRRz3XDqJH5w/lmn2SPYxA61ANf2ENPc9uP6UE/jJRRMQgQsm\nhu9hdcHEgczITSczKYaLThzcqdqg8zcNd8F/z54x12lAb6uXkuOTbUVM+vk7/G1Rw8XM250Z4KnF\nu9wR+6+utO7/3t1wkE+3FXHl9KFh37dwRIQnbpzBg9dMIy7a32jAZ0cNS29odxOxgsPHW4u4bsaw\nDtVMHU5QqK5reN8+2lLovo9Nawofby1i88EKNwBV1AQ4crSOvy/b694grN9Xxvi73+az7Q0DDo8c\nraOqzhqDU1UX5Jtnd/zmrbMi9o01xgRE5NvAu4AfeMIYs0FE7gOWG2PmAz8A/ioi38fK5txojnUW\nq3ZwUihh00dRPrfbpjeV5IiP9rnpo3Dim1wEvbWK1Phod5h8uT3fj9Ng2hInAHnnw6kPGjI6OJNm\n0/KEDI3GU3REmqcP94isRGo9d00nDEhw21ZGZnUsLdVR//2lqWQmtfw+OO05OenxjdKAXt673UlD\nUt1g4NQUjlTVkxofTVl1PYfKa5nSQk58RGYit3u6iTptJWeMaUh33nPpRAAmD011x1U09ehX8wCr\nK224lFN7xLSSPvp0WzETBqe4EyS2t6bwxpoD1NSHeGXVPqYPT2NtQRn5dv//I0friI/x8/P5GwC4\ndOoQd7zGx1uKCBma9eJqy/R2do9uy1C7pjB1WBoDk2PdoPilTubmnVSpkz76bHsJN/5tmft8bZP3\n84XP95CRGMN1M4fx8ooCjtYG+PvyvVTXB7nnkonc98ZGHnx/KzX1Ieav2c+sURkEQ4bLHlrE9OFp\nfJpfzNnjspjQwXa/YxHR2zhjzFtYDcjebfd4ft4IhO9OEQHThqXxtVkncIud22x61wiNu6R600fe\n58OljxyJsY3vPrwD5FLjo3GyFxU1AXzSMGCpJT67WlNU2XgwT2sXw9Z4azltpS9a4g0mOenxjVJb\nJ2Qkcta4LBJj/e0e99BZbVX/Z+Sm88SinZwyMsPTtbjx33yr3baSHBvFuZ4cv/fveMaYTHdytclh\nUkfhzBwxgC9OzwnbDtCeEbHt7RETTkvpo+q6ICt2H+HG03PdwNH0IgbWe/Taqn3MmzaEaL8PY4w7\n5iQYMpw3YSDlNQG2F1ayKL+Y6x9b2uj1BUeq2HrIChiVtQFGZiUyKit8ii/SUuOjuf6U4Vw4eTCf\n7SjmvY2HOG1URqNZAzrCqV04c3+9bE+pcunUIfxrzf5GN0iF5TUs2FTILWeMcAN8ZW2Al5bvZUZu\nOqfaMxA0ZZCiAAAc7ElEQVSstedFc2oOC7cVsedwFQVHqggZ+LpnPrPu0K+mufD7hHsvm+w+Dlcn\nifE3dEmN8TQ0NzzvbzV9FN+kSuptGIr2i1tTqKgJkBQb1WaV2qmpNJ05MzOpk+kjT9k72y7h7V01\nNC2eYk/ZTshIICEmimtm9PwqbReeOJilPzmPgSlxlNnpuqZtClsOVZAaH83yn83B7/lbeXs3nTk2\nq8NBISEmij9cPfVYT6FTWkoffb7rMHXBEKePzqTavqh596mqC1AfMLy+Zh/3vL6BqvogXzn1BLYV\nVnLQk748e1wWq/eWsqvkaLNpTnLS4/nInjZlYEosh8prOTdMb63udP8VJwJw0vA0BiTGMnt055st\nvW0KVXUB3l5/gGvyhnH1jBwrKHjez3+utFZ3vHbGcPcmY+HWInYUHeUbZ45qljp2Op+8ZM/pFDIw\nJDXumMrbGT3d+6hHmTAJpKYNzU0DQGwb6aPE2JbjrHfG0/LqelLiW1+JzXkNNA8KGZ0MCt5aTltj\nJFqSndwQFDKTYon1BMLWzr8nOA35fn8LNYWDFYwbmEy039coQDvnkRDjd+/sR2Qmhl1UqbdpqRaw\nOL+YGL+PmbkDwqaYzn9wIVPve4+V9ih3Z2Dmx/ZFfnBqHNnJsUwcnEJ2cixFFbWs2tMwQdxl04ZQ\nUx/koy1F5KTHc7rdVfjcCT0bFByJsVHcPHuEO4FgZ3jTR+9vPERVXZArpjesm+J9z99ad4Bpw9IY\nkZno3mS8smofCTF+LpoymDR70svkuChm5KbzzoaD3PO6tVKiM3fVVXnDOtWudCx61ze4m4Xpndgo\nZRSuTSHG7ws7Z5IjoZVRwT4Rt6G5vCYQdjnMpqJaDAqdTR95g0Lnagrexmm/T5oN0OuNwrUpGGPY\ncqiCy8MMfnK+xBMGp7hTJrS3ltDTWmpTWLW3lElDU4iP8bvtLU5NwRjjjpp22goO29OSf77rMCMy\nE7l33iTqAiFEhMwkayqKsuoyxg1M5tKpg6msDVJWXc/i7cVcOX0ouRmJfLajhBkdXLa1N/M2NC/e\nXkxmUiwzcwe466/UBqxAuvdwFev2lfGTi8Y3eh1YXZqdz1d2cixzJw9iiT09zNOfWVOZ/PqKE3ll\nVUHYFQkjrV8HhXBio3xusIiJ8tE0SMdE+VrtK9xabxu/Txo1NKe00cgMDXe4TYNCWjtqGeF4A1pW\nJ2sbTXWmF0d3805X4jhQVkNFTYCxYe4cnZrCpCEpJMdGMWdCdsSnF+gqsWHaFIIhw4Z9ZW47TNMU\nk3ehqS32FCEFR6rZfLCc1XtLOWN0Jmd65rByer+FDPz4ovGcPS6bhz/Kpz5oqA8GmTkig0unDOYr\ns05otWZ9vHEu7hU19Xy8tYgLJw/C55OGmkK99X46YxMunGwtnOW9ZnhnD3jj9tmkxEdz92vr3XaY\nnPR4Th+dwewx3Zs2cvTroBB2nILf5zZAx4YJAG3dFbdWU/D7GmoKFTUBtwdIa5w8d8nROrLsKjs0\njKDtqGhPzSe9kz2YABbccabbCO68J+0Jcj3FeR+9NQVnOc9xYUbKpsZHc+HkQe5Kb499bUb3FLQL\nhGtT2FlcydG6ICfmNF78qS5o3dl6Vzpz1tr415r9bhfTpiPTvV2vnQ4F3prvySekIyIdHhzW28XF\nWO/bJ9uKqagJcO54q2txbHTjlN37Gw8xaUhK2AZtZywLNHT2uO+yycRG+3h2yR4unDyoWwaptaTv\nhPBOCNclNTba566JHC4AdCYozJkwkNvOHNmoTaGipt7tz98ab0P3SM/I487mtr15cyen2Rmjs5MZ\nafcoccqY1skulN3BZy+/6m1T2G3PIRVuRLffJzxyw8nHZerDGxQe+2QHP3l1HevsGVFPtFNgTXso\nbWwy5sAZb9HSYyelNnZgkjvNtHNTMDAlliGd7O7c28V4priJ8fs4w76bj3XbcYJU1gZYtaeUs8LM\nDhzj94VNG8fH+Ll82lB8AvOmdqz7blfrvbd23SBsl1S/361BtDSLamvCNbQ+9jWr7/lVjyxu3NDc\njgu7t5FpVHYSS+2RmV2Rx0+L75qLuNP4dm6YaRt6kyifr1FNYX9ZDTFRvk537+2tvG0Kv3pzE2B9\nXuKj/Yyyx440bYz2DkRLT4jmyulDWe1ZZazpqHOn95u3e63TccKpJfRF3vO6+YwR7vfd29C8ZHsJ\ngZBplv5Z9tM5rV4/8nIHsPLu83v85qpf1xTCzQUWE9WQPgqXC20rKLTa0OypKVTXB1vd1+Ht/eTt\n690VXzpnedJjlZOewDvfO4OfXTyh7Z17UNP1rveVVjM0Lb7PXcCcu1mn0ROsUbMTh6S4HQ1im6SY\nNu4vZ6o9MG/y0NRm7SdNP/eDU+M5aXhao7UQnJucrhp41tt9b07DYEU3yNaH+DS/mPhof7PxKFnJ\nsc0W72mqpwMC9POaQrhxClF+cYNFuK5gTWc9barVhmYRAqEQwZChPmja1UDr97QBjOriEcJdeTE8\n1vmLukOUTxqNU9hfWu0uxtOXOBco7zw8mw9UcKlnVlZvbaK4spbCilquzhvGmoIypuSkkpYQw/Kf\nzeFQeU2zsTfO61/9ZuNxpxMGJ3P5tCEtLhjV13jbS/w+IdovVNbW8+GWQmaOGHDctqf066AQLgXj\n7TYa7qLZVtqmtT7Ffp9QGzDuZFrtSQF5B1S1p2FatcyqqXl6H5XWuDnhvsS54K/3rBBXURto1Cbl\n1Cb2Hal2U0enjcpgzMAkTrcHS2UmxXZokGRCTBR/uvakYy5/b/f0TTPDvi9xUX7+ak9099OLenet\nuTX9Oig8ddNMvvCnhY1SCkJDr6Rw1/fW0kcv3Tar1d/n8wlB0zDDYvtqCp5pMo6hYVjZNQX7b10f\nDHGoouaYppPorZJjrc9J0+U2velH53P88Efb3dHKEwancNox9EjrL85sYXnZ2GgfFbUwcXAKF3Rg\n0arepl+3KYzOTuKN22c32uaThryzL0xNwf0yXT/d3faHL03ln/95WtilBb38Yi2rV2PncduT0/e2\nKThfdtU5fp80Ws/CmL5Z+4qP8RMX7Ws0NQU07mXlvblZlF9MRmLMMXVRVg1tkG0tLNXb9eugANbd\n0a4HLnZHDqYnRrttCq0FhYtOHOxumz0ms12TnPl9wrp9ZayzJ8DqaE2hqxqGH7jyRJ6+aWaXHOt4\n4m1T2G+P3u2LNQWg2Qyr0X5x1xaAxl2dD5XXckInlnZVjTmzAzftvnu86dfpI6+7L5nIdTOHk5Oe\n4KaPwrUPdGbsgsMJMt94doX9unb0PvKUwWnjSDrG+YWundnzk9X1BL+/oRa4v8wKCoP7YEMzWEHh\nQFkNo7IS2V50lBMyEhtNcdK0vcxZkEgdu5M0KPQNMVE+d3WnhppC8/3CB4X29TJoGmRi23Hn37S2\n8vI3ZpGTrnd1neEdp7C/1LqrG9KJda6PB+mJVqpxSk4a24uONmpkDucEDQpdpqemCe8q/T59FM5P\nLprA7NGZzAqzfGC4LqntrSk0DQpx7akpNJl8Ly93QKOpq1X7eccp7D1cRUZijDvwrq9x0kfOokAj\nw1yoPvjBWe7Pzip1qvNyMxIYkBjT7hXmeiutKYQxOjuJZ285Jexz4XoftfdD0CwotKOm0N3T5vZl\nVu8jq5F/W2GluzpaX+QEhUlDUvnNlSeG7TEzMiuJjMQYSo7WaU2hCyy446ywA2KPNxoUOuhYppfw\nS9Og0J42Ba3MdRWnpmCMYevBig4vEXk8cXoS5WYktNorLjU+mpKjdeRqQ/Mxa2mt8OONBoUO8qZz\n0hKiKa2qb2XvxprWKDra+0gdG2ecQsGRaipqw0+Z3VfMmzoYv4g7cV1LUhOiSY2P7hXTK6jeQYNC\nB2QmxTaaxuL9759FcZO1k1vTtKbQrhHNGhS6jN8nfLy1iD+8twW/TzgtTJtRXzE6O5nvzmk76OVm\nJLa5TrjqX/TT0AHLfzan0eOs5Ng278S8OlNTaLpGtOq8umAIY+C11fuZMyH7uO8l0hV+c+WJYWcL\nVv2XBoV2mDMhm12eycU6q+n1XRuau1dFTcD9ObuTS5H2NcfDqnmqe2lQaIeuWnWrac+E9oxvaJpy\nUp3nDQrpOo+UUmH1jeby44R3hs5ov7SrFnC893nuTSpqGjoFNJ0GQill0ZpCNwo2xIR2DVxzRPmE\n758/NgIl6l/qPWspaFBQKjwNCt3I26AX3YHxDvm/vigSxenXnGkglFKNafqoG3nXB9ZeRT1L++Ur\nFV5Eg4KIzBWRLSKSLyJ3tbDP1SKyUUQ2iMjzkSxPTwt5gkK49Z9V9wm3xKRSKoLpIxHxAw8B5wMF\nwDIRmW+M2ejZZwzwY+B0Y8wREcmOVHl6g4CnobnpRHcq8px5fhJi/AwfoNM6KBVOq0FBRO5osskA\nxcCnxpidbRx7JpBvjNlhH+tF4DJgo2ef/wAeMsYcATDGFHag7Mcdb0Ozpo+634I7zqKyNsAwDQhK\ntaitHEZyk38pQB7wtohc28ZrhwJ7PY8L7G1eY4GxIrJIRJaIyNxwBxKRW0VkuYgsLyoqauPX9l6N\nu6Rq+qi7pSfGaEBQqg2t1hSMMfeG2y4iA4AFwItd8PvHAGcDOcBCETnRGFPapByPAo8C5OXlHbdj\n8hs1NGv6SCnVC3XqdtUYcxho66q2DxjmeZxjb/MqAOYbY+rtdNRWrCDRJ3m7pOqU2Eqp3qhTVyYR\nOQc40sZuy4AxIjJCRGKAa4H5TfZ5DauWgIhkYqWTdnSmTMeDQFC7pCqlere2GprXYTUuew0A9gNf\nbe21xpiAiHwbeBfwA08YYzaIyH3AcmPMfPu5C0RkIxAEfmSMKencqfR+3ppC07WXlVKqN2irS+ol\nTR4boMQYc7Q9BzfGvAW81WTbPZ6fDXCH/a/PC3pnxNOYoJTqhdpqaN7dXQXpD7yzomr2SCnVG2lr\nZzf64zXTSI6z4rBoVUEp1QtpUOhGg1LjuMOe7VSbFJRSvZEGhW7m9DrShmalVG+kQaGb+e3xCRoT\nlFK9kQaFbubMbiEaFZRSvZAGhW7m1hR6uBxKKRWOBoVu5rQpaEVBKdUbaVDoZj5taFZK9WIaFLqZ\nW1Po4XIopVQ4GhS6mVND0IqCUqo30qDQzZxgoL2PlFK9kQaFbmbsmVI1JCileiMNCt3MmT1bKwpK\nqd5Ig0I3cybP1t5HSqneSINCN3MW2tGYoJTqjTQodDM3faStCkqpXkiDQjdz0kdaU1BK9UYaFLqZ\n2/tIo4JSqhfSoNBDonQ9TqVUL9TqGs2q682dPIjrTxnO9+0V2JRSqjfRoNDNYqP83H/FiT1dDKWU\nCkvTR0oppVwaFJRSSrk0KCillHJpUFBKKeXSoKCUUsoV0aAgInNFZIuI5IvIXa3s90URMSKSF8ny\nKKWUal3EgoKI+IGHgAuBicB1IjIxzH7JwHeBpZEqi1JKqfaJZE1hJpBvjNlhjKkDXgQuC7PfL4Hf\nAjURLItSSql2iGRQGArs9TwusLe5RGQ6MMwY82ZrBxKRW0VkuYgsLyoq6vqSKqWUAnqwoVlEfMCD\nwA/a2tcY86gxJs8Yk5eVlRX5wimlVD8VyaCwDxjmeZxjb3MkA5OBj0RkF3AqMF8bm5VSqudEMigs\nA8aIyAgRiQGuBeY7TxpjyowxmcaYXGNMLrAEmGeMWR7BMimllGpFxIKCMSYAfBt4F9gEvGSM2SAi\n94nIvEj9XqWUUp0X0VlSjTFvAW812XZPC/ueHcmyKKWUapuOaFZKKeXSoKCUUsqlQUEppZRLg4JS\nSimXBgWllFIuDQpKKaVcGhSUUkq5NCgopZRyaVBQSinl0qCglFLKpUFBKaWUS4OCUkoplwYFpZRS\nLg0KSimlXBoUlFJKuTQoKKWUcmlQUEop5dKgoJRSyqVBQSmllEuDglJKKZcGBaWUUi4NCkoppVwa\nFJRSSrk0KCillHJpUFBKKeXSoKCUUsqlQUEppZQrokFBROaKyBYRyReRu8I8f4eIbBSRtSLybxE5\nIZLlUUop1bqIBQUR8QMPARcCE4HrRGRik91WAXnGmCnAy8DvIlUepZRSbYtkTWEmkG+M2WGMqQNe\nBC7z7mCM+dAYU2U/XALkRLA8Siml2hDJoDAU2Ot5XGBva8nNwNsRLI9SSqk2RPV0AQBE5AYgDzir\nhedvBW4FGD58eDeWTCml+pdI1hT2AcM8j3PsbY2IyBzgp8A8Y0xtuAMZYx41xuQZY/KysrIiUlil\nlFKRDQrLgDEiMkJEYoBrgfneHUTkJOAvWAGhMIJlUUop1Q4RCwrGmADwbeBdYBPwkjFmg4jcJyLz\n7N1+DyQB/xCR1SIyv4XDKaWU6gYRbVMwxrwFvNVk2z2en+dE8vcrpZTqGB3RrJRSyqVBQSmllEuD\nglJKKZcGBaWUUi4NCkoppVwaFJRSSrk0KCillHJpUFBKKeXqFRPiKaVUV6uvr6egoICampqeLkq3\niouLIycnh+jo6E69XoOCUqpPKigoIDk5mdzcXESkp4vTLYwxlJSUUFBQwIgRIzp1DE0fKaX6pJqa\nGjIyMvpNQAAQETIyMo6pdqRBQSnVZ/WngOA41nPWoKCUUsqlQUEppSKkurqas846i2AwyOrVq5k1\naxaTJk1iypQp/P3vf2/z9Q8++CATJ05kypQpnHfeeezevRuAoqIi5s6dG5Eya1BQSqkIeeKJJ7jy\nyivx+/0kJCTw9NNPs2HDBt555x2+973vUVpa2urrTzrpJJYvX87atWu56qqruPPOOwHIyspi8ODB\nLFq0qMvLrL2PlFJ93r3/2sDG/eVdesyJQ1L4+aWTWt3nueee4/nnnwdg7Nix7vYhQ4aQnZ1NUVER\naWlpLb7+nHPOcX8+9dRTefbZZ93Hl19+Oc899xynn356Z08hLK0pKKVUBNTV1bFjxw5yc3ObPff5\n559TV1fHqFGj2n28xx9/nAsvvNB9nJeXxyeffNIVRW1EawpKqT6vrTv6SCguLg5bCzhw4ABf+cpX\neOqpp/D52ndf/uyzz7J8+XI+/vhjd1t2djb79+/vsvI6NCgopVQExMfHNxsvUF5ezsUXX8z999/P\nqaee2q7jLFiwgPvvv5+PP/6Y2NhYd3tNTQ3x8fFdWmbQ9JFSSkVEeno6wWDQDQx1dXVcccUVfPWr\nX+Wqq65qtO+Pf/xjXn311WbHWLVqFbfddhvz588nOzu70XNbt25l8uTJXV5uDQpKKRUhF1xwAZ9+\n+ikAL730EgsXLuTJJ59k2rRpTJs2jdWrVwOwbt06Bg0a1Oz1P/rRj6isrORLX/oS06ZNY968ee5z\nH374IRdffHGXl1nTR0opFSHf+ta3+OMf/8icOXO44YYbuOGGG8LuV19fz6xZs5ptX7BgQYvHnj9/\nPq+//nqXldWhNQWllIqQ6dOnc8455xAMBlvd79133+3QcYuKirjjjjtIT08/luKFpTUFpZSKoJtu\nuqnLj5mVlcXll1/e5ccFrSkopfowY0xPF6HbHes5a1BQSvVJcXFxlJSU9KvA4KynEBcX1+ljaPpI\nKdUn5eTkUFBQQFFRUU8XpVs5K691lgYFpVSfFB0d3enVx/qziKaPRGSuiGwRkXwRuSvM87Ei8nf7\n+aUikhvJ8iillGpdxIKCiPiBh4ALgYnAdSIyscluNwNHjDGjgT8Cv41UeZRSSrUtkjWFmUC+MWaH\nMaYOeBG4rMk+lwFP2T+/DJwn/XH9PKWU6iUi2aYwFNjreVwAnNLSPsaYgIiUARlAsXcnEbkVuNV+\nWCkiWzpZpsymx+4H9Jz7Bz3n/uFYzvmE9ux0XDQ0G2MeBR491uOIyHJjTF4XFOm4oefcP+g59w/d\ncc6RTB/tA4Z5HufY28LuIyJRQCpQEsEyKaWUakUkg8IyYIyIjBCRGOBaYH6TfeYDX7N/vgr4wPSn\nkSZKKdXLRCx9ZLcRfBt4F/ADTxhjNojIfcByY8x84HHgGRHJBw5jBY5IOuYU1HFIz7l/0HPuHyJ+\nzqI35koppRw695FSSimXBgWllFKufhEU2ppu43glIk+ISKGIrPdsGyAi74vINvv/dHu7iMj/2u/B\nWhGZ3nMl7zwRGSYiH4rIRhHZICLftbf32fMWkTgR+VxE1tjnfK+9fYQ9PUy+PV1MjL29z0wfIyJ+\nEVklIm/Yj/v0OYvILhFZJyKrRWS5va1bP9t9Pii0c7qN49WTwNwm2+4C/m2MGQP8234M1vmPsf/d\nCjzSTWXsagHgB8aYicCpwLfsv2dfPu9a4FxjzFRgGjBXRE7Fmhbmj/Y0MUewpo2BvjV9zHeBTZ7H\n/eGczzHGTPOMR+jez7Yxpk//A2YB73oe/xj4cU+XqwvPLxdY73m8BRhs/zwY2GL//BfgunD7Hc//\ngNeB8/vLeQMJwEqs2QGKgSh7u/s5x+rxN8v+OcreT3q67J041xysi+C5wBuA9INz3gVkNtnWrZ/t\nPl9TIPx0G0N7qCzdYaAx5oD980FgoP1zn3sf7BTBScBS+vh522mU1UAh8D6wHSg1xgTsXbzn1Wj6\nGMCZPuZ48yfgTiBkP86g75+zAd4TkRX29D7QzZ/t42KaC9U5xhgjIn2yz7GIJAH/BL5njCn3zqPY\nF8/bGBMEpolIGvAqML6HixRRInIJUGiMWSEiZ/d0ebrRbGPMPhHJBt4Xkc3eJ7vjs90fagrtmW6j\nLzkkIoMB7P8L7e195n0QkWisgPCcMeYVe3OfP28AY0wp8CFW6iTNnh4GGp9XX5g+5nRgnojswpph\n+Vzgf+jb54wxZp/9fyFW8J9JN3+2+0NQaM90G32Jd+qQr2Hl3J3tX7V7LJwKlHmqpMcNsaoEjwOb\njDEPep7qs+ctIll2DQERicdqQ9mEFRyusndres7H9fQxxpgfG2NyjDG5WN/ZD4wx19OHz1lEEkUk\n2fkZuABYT3d/tnu6YaWbGm8uArZi5WF/2tPl6cLzegE4ANRj5RNvxsqj/hvYBiwABtj7ClYvrO3A\nOiCvp8vfyXOejZV3XQustv9d1JfPG5gCrLLPeT1wj719JPA5kA/8A4i1t8fZj/Pt50f29Dkc4/mf\nDbzR18/ZPrc19r8NzrWquz/bOs2FUkopV39IHymllGonDQpKKaVcGhSUUkq5NCgopZRyaVBQSinl\n0qCg+h0RqbT/zxWRL3fxsX/S5PHirjy+UpGmQUH1Z7lAh4KCZzRtSxoFBWPMaR0sk1I9SoOC6s8e\nAM6w567/vj3p3O9FZJk9P/1tACJytoh8IiLzgY32ttfsScs2OBOXicgDQLx9vOfsbU6tROxjr7fn\ny7/Gc+yPRORlEdksIs/Zo7YRkQfEWjdirYj8d7e/O6pf0gnxVH92F/BDY8wlAPbFvcwYM0NEYoFF\nIvKeve90YLIxZqf9+CZjzGF72ollIvJPY8xdIvJtY8y0ML/rSqy1EKYCmfZrFtrPnQRMAvYDi4DT\nRWQTcAUw3hhjnGkulIo0rSko1eACrLlkVmNNx52BtYAJwOeegADwHRFZAyzBmpRsDK2bDbxgjAka\nYw4BHwMzPMcuMMaEsKbtyMWa+rkGeFxErgSqjvnslGoHDQpKNRDgdmOtejXNGDPCGOPUFI66O1lT\nOc/BWtRlKta8RHHH8HtrPT8HsRaRCWDNkPkycAnwzjEcX6l206Cg+rMKINnz+F3gP+2puRGRsfZs\nlU2lYi39WCUi47GWBXXUO69v4hPgGrvdIgs4E2vitrDs9SJSjTFvAd/HSjspFXHapqD6s7VA0E4D\nPYk1X38usNJu7C0CLg/zuneAb9h5/y1YKSTHo8BaEVlprKmeHa9irYGwBmuW1zuNMQftoBJOMvC6\niMRh1WDu6NwpKtUxOkuqUkopl6aPlFJKuTQoKKWUcmlQUEop5dKgoJRSyqVBQSmllEuDglJKKZcG\nBaWUUq7/D2ktlL9G6rguAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "agent = PassiveTDAgent(policy, sequential_decision_environment, alpha=lambda n: 60./(59+n))\n", - "graph_utility_estimates(agent, sequential_decision_environment, 500, [(2,2)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is also possible to plot multiple states on the same plot." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\ngohICjRr1qzY6wW6du3KwQcfXKaS/sSJE3nxxReZNGlSgeGm27Zto1mzZpWW3wQFBRGRFGjbti25\nublxYMjOzmbr1q0AbNy4kZkzZ9K3b18ALrzwQt57773dtjF16lTuuOMOMjIyaN68eYF1H3/8MQcf\nfHCl51tBQUQkRYYPH87MmTMBWLRoEUcccQQDBw5k6NChXH/99fTv3x+ArKysIvsXrrrqKr766iuG\nDRvGoEGDuOKKK+J1r7/+Oqeeemql51l9CiIiKXLllVdy9913c/LJJzNs2DCysrJ2S7N582Z69+5N\nt27ddlu3ZMmSIre7fft2MjMzueeeeyo9z6opiIikyODBgznhhBPIzc0tNk3r1q155plnyrXdlStX\nctttt5GWVvnletUURERS6Ac/+EGlb7N379707t270rcLqimIiEgSBQUREYkpKIiISExBQUREYgoK\nIiIpkjx19ty5cznyyCM56KCDGDBgAE899VSp77/rrrvo168fAwYM4KSTTmLFihUA5OTkMGLEiJTk\nWUFBRCRFkqfObt68OY8++igLFixg6tSpXHvttfH9EYpzyCGHkJmZSVZWFqNHj45nRO3YsSNdunRh\n1qxZlZ5nDUkVkbrv5Rvg83mVu829+8PI20pMkjx1dp8+feLlXbt2pVOnTuTk5Ow2aV6yE044IX4+\nZMgQHn/88fj1mWeeyaRJkzj66KMrugdFUk1BRCQFipo6O+G9995jx44d7L///mXe3kMPPaSps0VE\nKkUpJfpUKGrqbIDPPvuMCy64gEceeYQGDcpWLn/88cfJzMzkjTfeiJelaupsBQURkRQoaurszZs3\nc+qpp3LrrbcyZMiQMm1n+vTp3Hrrrbzxxhs0adIkXq6ps0VEapHCU2fv2LGDs846iwsvvJDRo0cX\nSHvjjTfy3HPP7baNOXPmcPnll5ORkUGnTp0KrNPU2SIitUzy1NlPP/00M2bMYOLEiQwaNIhBgwYx\nd+5cAObNm8fee++92/vHjRvHli1bOPfccxk0aBCjRo2K12nqbBGRWiZ56uyxY8cyduzYItPt3LmT\nI488crfl06dPL3bbGRkZPP/885WW1wTVFEREUqQsU2cDTJs2rVzbzcnJ4brrrqNt27Z7kr0iqaYg\nIpJCqZg6u2PHjpx55pmVvl1QTUFE6rAQQnVnocrt6T4rKIhIndS0aVPWr19frwJDCIH169fTtGnT\n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\nAW4Hvin6vj2yAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "graph_utility_estimates(agent, sequential_decision_environment, 500, [(2,2), (3,2)])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## ACTIVE REINFORCEMENT LEARNING\n", - "\n", - "Unlike Passive Reinforcement Learning in Active Reinforcement Learning we are not bound by a policy pi and we need to select our actions. In other words the agent needs to learn an optimal policy. The fundamental tradeoff the agent needs to face is that of exploration vs. exploitation. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### QLearning Agent\n", - "\n", - "The QLearningAgent class in the rl module implements the Agent Program described in **Fig 21.8** of the AIMA Book. In Q-Learning the agent learns an action-value function Q which gives the utility of taking a given action in a particular state. Q-Learning does not required a transition model and hence is a model free method. Let us look into the source before we see some usage examples." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource QLearningAgent" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Agent Program can be obtained by creating the instance of the class by passing the appropriate parameters. Because of the __ call __ method the object that is created behaves like a callable and returns an appropriate action as most Agent Programs do. To instantiate the object we need a mdp similar to the PassiveTDAgent.\n", - "\n", - " Let us use the same GridMDP object we used above. **Figure 17.1 (sequential_decision_environment)** is similar to **Figure 21.1** but has some discounting as **gamma = 0.9**. The class also implements an exploration function **f** which returns fixed **Rplus** untill agent has visited state, action **Ne** number of times. This is the same as the one defined on page **842** of the book. The method **actions_in_state** returns actions possible in given state. It is useful when applying max and argmax operations." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us create our object now. We also use the **same alpha** as given in the footnote of the book on **page 837**. We use **Rplus = 2** and **Ne = 5** as defined on page 843. **Fig 21.7** " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q_agent = QLearningAgent(sequential_decision_environment, Ne=5, Rplus=2, \n", - " alpha=lambda n: 60./(59+n))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now to try out the q_agent we make use of the **run_single_trial** function in rl.py (which was also used above). Let us use **200** iterations." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "for i in range(200):\n", - " run_single_trial(q_agent,sequential_decision_environment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us see the Q Values. The keys are state-action pairs. Where differnt actions correspond according to:\n", - "\n", - "north = (0, 1)\n", - "south = (0,-1)\n", - "west = (-1, 0)\n", - "east = (1, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "defaultdict(float,\n", - " {((0, 0), (-1, 0)): -0.12953971401732597,\n", - " ((0, 0), (0, -1)): -0.12753699595470713,\n", - " ((0, 0), (0, 1)): -0.01158029172666495,\n", - " ((0, 0), (1, 0)): -0.13035841083471436,\n", - " ((0, 1), (-1, 0)): -0.04,\n", - " ((0, 1), (0, -1)): -0.1057916516323444,\n", - " ((0, 1), (0, 1)): 0.13072636267769677,\n", - " ((0, 1), (1, 0)): -0.07323076923076924,\n", - " ((0, 2), (-1, 0)): 0.12165200587479848,\n", - " ((0, 2), (0, -1)): 0.09431411803674361,\n", - " ((0, 2), (0, 1)): 0.14047883620608154,\n", - " ((0, 2), (1, 0)): 0.19224095989491635,\n", - " ((1, 0), (-1, 0)): -0.09696833851887868,\n", - " ((1, 0), (0, -1)): -0.15641263417341367,\n", - " ((1, 0), (0, 1)): -0.15340385689815017,\n", - " ((1, 0), (1, 0)): -0.15224266498911238,\n", - " ((1, 2), (-1, 0)): 0.18537063683043895,\n", - " ((1, 2), (0, -1)): 0.17757702529142774,\n", - " ((1, 2), (0, 1)): 0.17562120416256435,\n", - " ((1, 2), (1, 0)): 0.27484289408254886,\n", - " ((2, 0), (-1, 0)): -0.16785234970594098,\n", - " ((2, 0), (0, -1)): -0.1448679824723624,\n", - " ((2, 0), (0, 1)): -0.028114098214323924,\n", - " ((2, 0), (1, 0)): -0.16267477943781278,\n", - " ((2, 1), (-1, 0)): -0.2301056003129034,\n", - " ((2, 1), (0, -1)): -0.4332722098873507,\n", - " ((2, 1), (0, 1)): 0.2965645851500498,\n", - " ((2, 1), (1, 0)): -0.90815406879654,\n", - " ((2, 2), (-1, 0)): 0.1905755278897695,\n", - " ((2, 2), (0, -1)): 0.07306332481110034,\n", - " ((2, 2), (0, 1)): 0.1793881607466996,\n", - " ((2, 2), (1, 0)): 0.34260576652777697,\n", - " ((3, 0), (-1, 0)): -0.16576962655130892,\n", - " ((3, 0), (0, -1)): -0.16840120349372995,\n", - " ((3, 0), (0, 1)): -0.5090288592720464,\n", - " ((3, 0), (1, 0)): -0.88375,\n", - " ((3, 1), None): -0.6897322258069369,\n", - " ((3, 2), None): 0.388990723935834})" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q_agent.Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Utility **U** of each state is related to **Q** by the following equation.\n", - "\n", - "**U (s) = max a Q(s, a)**\n", - "\n", - "Let us convert the Q Values above into U estimates.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "U = defaultdict(lambda: -1000.) # Very Large Negative Value for Comparison see below.\n", - "for state_action, value in q_agent.Q.items():\n", - " state, action = state_action\n", - " if U[state] < value:\n", - " U[state] = value" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "defaultdict(>,\n", - " {(0, 0): -0.01158029172666495,\n", - " (0, 1): 0.13072636267769677,\n", - " (0, 2): 0.19224095989491635,\n", - " (1, 0): -0.09696833851887868,\n", - " (1, 2): 0.27484289408254886,\n", - " (2, 0): -0.028114098214323924,\n", - " (2, 1): 0.2965645851500498,\n", - " (2, 2): 0.34260576652777697,\n", - " (3, 0): -0.16576962655130892,\n", - " (3, 1): -0.6897322258069369,\n", - " (3, 2): 0.388990723935834})" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "U" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us finally compare these estimates to value_iteration results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "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" - ] - } - ], - "source": [ - "print(value_iteration(sequential_decision_environment))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2+" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/rl.py b/rl.py deleted file mode 100644 index 868784e9f..000000000 --- a/rl.py +++ /dev/null @@ -1,203 +0,0 @@ -"""Reinforcement Learning (Chapter 21)""" - -from collections import defaultdict -from utils import argmax -from mdp import MDP, policy_evaluation - -import random - - -class PassiveADPAgent: - - """Passive (non-learning) agent that uses adaptive dynamic programming - on a given MDP and policy. [Figure 21.2]""" - - class ModelMDP(MDP): - """ Class for implementing modifed Version of input MDP with - an editable transition model P and a custom function T. """ - def __init__(self, init, actlist, terminals, gamma, states): - super().__init__(init, actlist, terminals, gamma) - nested_dict = lambda: defaultdict(nested_dict) - # StackOverflow:whats-the-best-way-to-initialize-a-dict-of-dicts-in-python - self.P = nested_dict() - - def T(self, s, a): - """Returns a list of tuples with probabilities for states - based on the learnt model P.""" - return [(prob, res) for (res, prob) in self.P[(s, a)].items()] - - def __init__(self, pi, mdp): - self.pi = pi - self.mdp = PassiveADPAgent.ModelMDP(mdp.init, mdp.actlist, - mdp.terminals, mdp.gamma, mdp.states) - self.U = {} - self.Nsa = defaultdict(int) - self.Ns1_sa = defaultdict(int) - self.s = None - self.a = None - - def __call__(self, percept): - s1, r1 = percept - self.mdp.states.add(s1) # Model keeps track of visited states. - R, P, mdp, pi = self.mdp.reward, self.mdp.P, self.mdp, self.pi - s, a, Nsa, Ns1_sa, U = self.s, self.a, self.Nsa, self.Ns1_sa, self.U - - if s1 not in R: # Reward is only available for visted state. - U[s1] = R[s1] = r1 - if s is not None: - Nsa[(s, a)] += 1 - Ns1_sa[(s1, s, a)] += 1 - # for each t such that Ns′|sa [t, s, a] is nonzero - for t in [res for (res, state, act), freq in Ns1_sa.items() - if (state, act) == (s, a) and freq != 0]: - P[(s, a)][t] = Ns1_sa[(t, s, a)] / Nsa[(s, a)] - - U = policy_evaluation(pi, U, mdp) - if s1 in mdp.terminals: - self.s = self.a = None - else: - self.s, self.a = s1, self.pi[s1] - return self.a - - def update_state(self, percept): - '''To be overridden in most cases. The default case - assumes the percept to be of type (state, reward)''' - return percept - - -class PassiveTDAgent: - """The abstract class for a Passive (non-learning) agent that uses - temporal differences to learn utility estimates. Override update_state - method to convert percept to state and reward. The mdp being provided - should be an instance of a subclass of the MDP Class. [Figure 21.4] - """ - - def __init__(self, pi, mdp, alpha=None): - - self.pi = pi - self.U = {s: 0. for s in mdp.states} - self.Ns = {s: 0 for s in mdp.states} - self.s = None - self.a = None - self.r = None - self.gamma = mdp.gamma - self.terminals = mdp.terminals - - if alpha: - self.alpha = alpha - else: - self.alpha = lambda n: 1./(1+n) # udacity video - - def __call__(self, percept): - s1, r1 = self.update_state(percept) - pi, U, Ns, s, r = self.pi, self.U, self.Ns, self.s, self.r - alpha, gamma, terminals = self.alpha, self.gamma, self.terminals - if not Ns[s1]: - U[s1] = r1 - if s is not None: - Ns[s] += 1 - U[s] += alpha(Ns[s]) * (r + gamma * U[s1] - U[s]) - if s1 in terminals: - self.s = self.a = self.r = None - else: - self.s, self.a, self.r = s1, pi[s1], r1 - return self.a - - def update_state(self, percept): - ''' To be overridden in most cases. The default case - assumes the percept to be of type (state, reward)''' - return percept - - -class QLearningAgent: - """ An exploratory Q-learning agent. It avoids having to learn the transition - model because the Q-value of a state can be related directly to those of - its neighbors. [Figure 21.8] - """ - def __init__(self, mdp, Ne, Rplus, alpha=None): - - self.gamma = mdp.gamma - self.terminals = mdp.terminals - self.all_act = mdp.actlist - self.Ne = Ne # iteration limit in exploration function - self.Rplus = Rplus # large value to assign before iteration limit - self.Q = defaultdict(float) - self.Nsa = defaultdict(float) - self.s = None - self.a = None - self.r = None - - if alpha: - self.alpha = alpha - else: - self.alpha = lambda n: 1./(1+n) # udacity video - - def f(self, u, n): - """ Exploration function. Returns fixed Rplus until - agent has visited state, action a Ne number of times. - Same as ADP agent in book.""" - if n < self.Ne: - return self.Rplus - else: - return u - - def actions_in_state(self, state): - """ Returns actions possible in given state. - Useful for max and argmax. """ - if state in self.terminals: - return [None] - else: - return self.all_act - - def __call__(self, percept): - s1, r1 = self.update_state(percept) - Q, Nsa, s, a, r = self.Q, self.Nsa, self.s, self.a, self.r - alpha, gamma, terminals = self.alpha, self.gamma, self.terminals, - actions_in_state = self.actions_in_state - - if s in terminals: - Q[s, None] = r1 - if s is not None: - Nsa[s, a] += 1 - Q[s, a] += alpha(Nsa[s, a]) * (r + gamma * max(Q[s1, a1] - for a1 in actions_in_state(s1)) - Q[s, a]) - if s in terminals: - self.s = self.a = self.r = None - else: - self.s, self.r = s1, r1 - self.a = argmax(actions_in_state(s1), key=lambda a1: self.f(Q[s1, a1], Nsa[s1, a1])) - return self.a - - def update_state(self, percept): - ''' To be overridden in most cases. The default case - assumes the percept to be of type (state, reward)''' - return percept - - -def run_single_trial(agent_program, mdp): - ''' Execute trial for given agent_program - and mdp. mdp should be an instance of subclass - of mdp.MDP ''' - - def take_single_action(mdp, s, a): - ''' - Selects outcome of taking action a - in state s. Weighted Sampling. - ''' - x = random.uniform(0, 1) - cumulative_probability = 0.0 - for probability_state in mdp.T(s, a): - probability, state = probability_state - cumulative_probability += probability - if x < cumulative_probability: - break - return state - - current_state = mdp.init - while True: - current_reward = mdp.R(current_state) - percept = (current_state, current_reward) - next_action = agent_program(percept) - if next_action is None: - break - current_state = take_single_action(mdp, current_state, next_action) diff --git a/sample_board.png b/sample_board.png new file mode 100644 index 0000000000000000000000000000000000000000..eb715e74c0b64b94032e15b89a19854bc1a95743 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^bmSQK*5Dp-y;YjIVU|>w~ba4!+ znDh3wBUiJ7fa^iSivQZPwOMAbs9brApQAsn_Rh7a<5n*%{Oq49t>10m@LtHm?}0_* zW0pQ)ER4MQK6SUZ&8^GM+SA63RRvsg-h3M~Q@idi4Q ztvknhoKr@xF8l^!u@bA<_EJ{ hz3DF80RmQfPclXIb*6=5Dlq&RJYD@<);T3K0RY{Cr8xiq literal 0 HcmV?d00001 diff --git a/search-4e.ipynb b/search-4e.ipynb deleted file mode 100644 index 785596ef0..000000000 --- a/search-4e.ipynb +++ /dev/null @@ -1,2151 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "*Note: This is not yet ready, but shows the direction I'm leaning in for Fourth Edition Search.*\n", - "\n", - "# State-Space Search\n", - "\n", - "This notebook describes several state-space search algorithms, and how they can be used to solve a variety of problems. We start with a simple algorithm and a simple domain: finding a route from city to city. Later we will explore other algorithms and domains.\n", - "\n", - "## The Route-Finding Domain\n", - "\n", - "Like all state-space search problems, in a route-finding problem you will be given:\n", - "- A start state (for example, `'A'` for the city Arad).\n", - "- A goal state (for example, `'B'` for the city Bucharest).\n", - "- Actions that can change state (for example, driving from `'A'` to `'S'`).\n", - "\n", - "You will be asked to find:\n", - "- A path from the start state, through intermediate states, to the goal state.\n", - "\n", - "We'll use this map:\n", - "\n", - "\n", - "\n", - "A state-space search problem can be represented by a *graph*, where the vertexes of the graph are the states of the problem (in this case, cities) and the edges of the graph are the actions (in this case, driving along a road).\n", - "\n", - "We'll represent a city by its single initial letter. \n", - "We'll represent the graph of connections as a `dict` that maps each city to a list of the neighboring cities (connected by a road). For now we don't explicitly represent the actions, nor the distances\n", - "between cities." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "romania = {\n", - " 'A': ['Z', 'T', 'S'],\n", - " 'B': ['F', 'P', 'G', 'U'],\n", - " 'C': ['D', 'R', 'P'],\n", - " 'D': ['M', 'C'],\n", - " 'E': ['H'],\n", - " 'F': ['S', 'B'],\n", - " 'G': ['B'],\n", - " 'H': ['U', 'E'],\n", - " 'I': ['N', 'V'],\n", - " 'L': ['T', 'M'],\n", - " 'M': ['L', 'D'],\n", - " 'N': ['I'],\n", - " 'O': ['Z', 'S'],\n", - " 'P': ['R', 'C', 'B'],\n", - " 'R': ['S', 'C', 'P'],\n", - " 'S': ['A', 'O', 'F', 'R'],\n", - " 'T': ['A', 'L'],\n", - " 'U': ['B', 'V', 'H'],\n", - " 'V': ['U', 'I'],\n", - " 'Z': ['O', 'A']}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "Suppose we want to get from `A` to `B`. Where can we go from the start state, `A`?" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['Z', 'T', 'S']" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "romania['A']" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "We see that from `A` we can get to any of the three cities `['Z', 'T', 'S']`. Which should we choose? *We don't know.* That's the whole point of *search*: we don't know which immediate action is best, so we'll have to explore, until we find a *path* that leads to the goal. \n", - "\n", - "How do we explore? We'll start with a simple algorithm that will get us from `A` to `B`. We'll keep a *frontier*—a collection of not-yet-explored states—and expand the frontier outward until it reaches the goal. To be more precise:\n", - "\n", - "- Initially, the only state in the frontier is the start state, `'A'`.\n", - "- Until we reach the goal, or run out of states in the frontier to explore, do the following:\n", - " - Remove the first state from the frontier. Call it `s`.\n", - " - If `s` is the goal, we're done. Return the path to `s`.\n", - " - Otherwise, consider all the neighboring states of `s`. For each one:\n", - " - If we have not previously explored the state, add it to the end of the frontier.\n", - " - Also keep track of the previous state that led to this new neighboring state; we'll need this to reconstruct the path to the goal, and to keep us from re-visiting previously explored states.\n", - " \n", - "# A Simple Search Algorithm: `breadth_first`\n", - " \n", - "The function `breadth_first` implements this strategy:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "from collections import deque # Doubly-ended queue: pop from left, append to right.\n", - "\n", - "def breadth_first(start, goal, neighbors):\n", - " \"Find a shortest sequence of states from start to the goal.\"\n", - " frontier = deque([start]) # A queue of states\n", - " previous = {start: None} # start has no previous state; other states will\n", - " while frontier:\n", - " s = frontier.popleft()\n", - " if s == goal:\n", - " return path(previous, s)\n", - " for s2 in neighbors[s]:\n", - " if s2 not in previous:\n", - " frontier.append(s2)\n", - " previous[s2] = s\n", - " \n", - "def path(previous, s): \n", - " \"Return a list of states that lead to state s, according to the previous dict.\"\n", - " return [] if (s is None) else path(previous, previous[s]) + [s]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "A couple of things to note: \n", - "\n", - "1. We always add new states to the end of the frontier queue. That means that all the states that are adjacent to the start state will come first in the queue, then all the states that are two steps away, then three steps, etc.\n", - "That's what we mean by *breadth-first* search.\n", - "2. We recover the path to an `end` state by following the trail of `previous[end]` pointers, all the way back to `start`.\n", - "The dict `previous` is a map of `{state: previous_state}`. \n", - "3. When we finally get an `s` that is the goal state, we know we have found a shortest path, because any other state in the queue must correspond to a path that is as long or longer.\n", - "3. Note that `previous` contains all the states that are currently in `frontier` as well as all the states that were in `frontier` in the past.\n", - "4. If no path to the goal is found, then `breadth_first` returns `None`. If a path is found, it returns the sequence of states on the path.\n", - "\n", - "Some examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['A', 'S', 'F', 'B']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('A', 'B', romania)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['L', 'T', 'A', 'S', 'F', 'B', 'U', 'V', 'I', 'N']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('L', 'N', romania)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['N', 'I', 'V', 'U', 'B', 'F', 'S', 'A', 'T', 'L']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('N', 'L', romania)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['E']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('E', 'E', romania)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "Now let's try a different kind of problem that can be solved with the same search function.\n", - "\n", - "## Word Ladders Problem\n", - "\n", - "A *word ladder* problem is this: given a start word and a goal word, find the shortest way to transform the start word into the goal word by changing one letter at a time, such that each change results in a word. For example starting with `green` we can reach `grass` in 7 steps:\n", - "\n", - "`green` → `greed` → `treed` → `trees` → `tress` → `cress` → `crass` → `grass`\n", - "\n", - "We will need a dictionary of words. We'll use 5-letter words from the [Stanford GraphBase](http://www-cs-faculty.stanford.edu/~uno/sgb.html) project for this purpose. Let's get that file from aimadata." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "from search import *\n", - "sgb_words = open_data(\"EN-text/sgb-words.txt\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "We can assign `WORDS` to be the set of all the words in this file:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5757" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "WORDS = set(sgb_words.read().split())\n", - "len(WORDS)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "And define `neighboring_words` to return the set of all words that are a one-letter change away from a given `word`:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def neighboring_words(word):\n", - " \"All words that are one letter away from this word.\"\n", - " neighbors = {word[:i] + c + word[i+1:]\n", - " for i in range(len(word))\n", - " for c in 'abcdefghijklmnopqrstuvwxyz'\n", - " if c != word[i]}\n", - " return neighbors & WORDS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'cello', 'hallo', 'hells', 'hullo', 'jello'}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "neighboring_words('hello')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'would'}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "neighboring_words('world')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "Now we can create `word_neighbors` as a dict of `{word: {neighboring_word, ...}}`: " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "word_neighbors = {word: neighboring_words(word)\n", - " for word in WORDS}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "Now the `breadth_first` function can be used to solve a word ladder problem:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['green', 'greed', 'treed', 'trees', 'treys', 'greys', 'grays', 'grass']" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('green', 'grass', word_neighbors)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['smart',\n", - " 'start',\n", - " 'stars',\n", - " 'sears',\n", - " 'bears',\n", - " 'beans',\n", - " 'brans',\n", - " 'brand',\n", - " 'braid',\n", - " 'brain']" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('smart', 'brain', word_neighbors)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['frown',\n", - " 'flown',\n", - " 'flows',\n", - " 'slows',\n", - " 'stows',\n", - " 'stoas',\n", - " 'stoae',\n", - " 'stole',\n", - " 'stile',\n", - " 'smile']" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "breadth_first('frown', 'smile', word_neighbors)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# More General Search Algorithms\n", - "\n", - "Now we'll embelish the `breadth_first` algorithm to make a family of search algorithms with more capabilities:\n", - "\n", - "1. We distinguish between an *action* and the *result* of an action.\n", - "3. We allow different measures of the cost of a solution (not just the number of steps in the sequence).\n", - "4. We search through the state space in an order that is more likely to lead to an optimal solution quickly.\n", - "\n", - "Here's how we do these things:\n", - "\n", - "1. Instead of having a graph of neighboring states, we instead have an object of type *Problem*. A Problem\n", - "has one method, `Problem.actions(state)` to return a collection of the actions that are allowed in a state,\n", - "and another method, `Problem.result(state, action)` that says what happens when you take an action.\n", - "2. We keep a set, `explored` of states that have already been explored. We also have a class, `Frontier`, that makes it efficient to ask if a state is on the frontier.\n", - "3. Each action has a cost associated with it (in fact, the cost can vary with both the state and the action).\n", - "4. The `Frontier` class acts as a priority queue, allowing the \"best\" state to be explored next.\n", - "We represent a sequence of actions and resulting states as a linked list of `Node` objects.\n", - "\n", - "The algorithm `breadth_first_search` is basically the same as `breadth_first`, but using our new conventions:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def breadth_first_search(problem):\n", - " \"Search for goal; paths with least number of steps first.\"\n", - " if problem.is_goal(problem.initial): \n", - " return Node(problem.initial)\n", - " frontier = FrontierQ(Node(problem.initial), LIFO=False)\n", - " explored = set()\n", - " while frontier:\n", - " node = frontier.pop()\n", - " explored.add(node.state)\n", - " for action in problem.actions(node.state):\n", - " child = node.child(problem, action)\n", - " if child.state not in explored and child.state not in frontier:\n", - " if problem.is_goal(child.state):\n", - " return child\n", - " frontier.add(child)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next is `uniform_cost_search`, in which each step can have a different cost, and we still consider first one os the states with minimum cost so far." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def uniform_cost_search(problem, costfn=lambda node: node.path_cost):\n", - " frontier = FrontierPQ(Node(problem.initial), costfn)\n", - " explored = set()\n", - " while frontier:\n", - " node = frontier.pop()\n", - " if problem.is_goal(node.state):\n", - " return node\n", - " explored.add(node.state)\n", - " for action in problem.actions(node.state):\n", - " child = node.child(problem, action)\n", - " if child.state not in explored and child not in frontier:\n", - " frontier.add(child)\n", - " elif child in frontier and frontier.cost[child] < child.path_cost:\n", - " frontier.replace(child)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, `astar_search` in which the cost includes an estimate of the distance to the goal as well as the distance travelled so far." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def astar_search(problem, heuristic):\n", - " costfn = lambda node: node.path_cost + heuristic(node.state)\n", - " return uniform_cost_search(problem, costfn)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Search Tree Nodes\n", - "\n", - "The solution to a search problem is now a linked list of `Node`s, where each `Node`\n", - "includes a `state` and the `path_cost` of getting to the state. In addition, for every `Node` except for the first (root) `Node`, there is a previous `Node` (indicating the state that lead to this `Node`) and an `action` (indicating the action taken to get here)." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \"\"\"A node in a search tree. A search tree is spanning tree over states.\n", - " A Node contains a state, the previous node in the tree, the action that\n", - " takes us from the previous state to this state, and the path cost to get to \n", - " this state. If a state is arrived at by two paths, then there are two nodes \n", - " with the same state.\"\"\"\n", - "\n", - " def __init__(self, state, previous=None, action=None, step_cost=1):\n", - " \"Create a search tree Node, derived from a previous Node by an action.\"\n", - " self.state = state\n", - " self.previous = previous\n", - " self.action = action\n", - " self.path_cost = 0 if previous is None else (previous.path_cost + step_cost)\n", - "\n", - " def __repr__(self): return \"\".format(self.state, self.path_cost)\n", - " \n", - " def __lt__(self, other): return self.path_cost < other.path_cost\n", - " \n", - " def child(self, problem, action):\n", - " \"The Node you get by taking an action from this Node.\"\n", - " result = problem.result(self.state, action)\n", - " return Node(result, self, action, \n", - " problem.step_cost(self.state, action, result)) " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Frontiers\n", - "\n", - "A frontier is a collection of Nodes that acts like both a Queue and a Set. A frontier, `f`, supports these operations:\n", - "\n", - "* `f.add(node)`: Add a node to the Frontier.\n", - "\n", - "* `f.pop()`: Remove and return the \"best\" node from the frontier.\n", - "\n", - "* `f.replace(node)`: add this node and remove a previous node with the same state.\n", - "\n", - "* `state in f`: Test if some node in the frontier has arrived at state.\n", - "\n", - "* `f[state]`: returns the node corresponding to this state in frontier.\n", - "\n", - "* `len(f)`: The number of Nodes in the frontier. When the frontier is empty, `f` is *false*.\n", - "\n", - "We provide two kinds of frontiers: One for \"regular\" queues, either first-in-first-out (for breadth-first search) or last-in-first-out (for depth-first search), and one for priority queues, where you can specify what cost function on nodes you are trying to minimize." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "from collections import OrderedDict\n", - "import heapq\n", - "\n", - "class FrontierQ(OrderedDict):\n", - " \"A Frontier that supports FIFO or LIFO Queue ordering.\"\n", - " \n", - " def __init__(self, initial, LIFO=False):\n", - " \"\"\"Initialize Frontier with an initial Node.\n", - " If LIFO is True, pop from the end first; otherwise from front first.\"\"\"\n", - " self.LIFO = LIFO\n", - " self.add(initial)\n", - " \n", - " def add(self, node):\n", - " \"Add a node to the frontier.\"\n", - " self[node.state] = node\n", - " \n", - " def pop(self):\n", - " \"Remove and return the next Node in the frontier.\"\n", - " (state, node) = self.popitem(self.LIFO)\n", - " return node\n", - " \n", - " def replace(self, node):\n", - " \"Make this node replace the nold node with the same state.\"\n", - " del self[node.state]\n", - " self.add(node)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "class FrontierPQ:\n", - " \"A Frontier ordered by a cost function; a Priority Queue.\"\n", - " \n", - " def __init__(self, initial, costfn=lambda node: node.path_cost):\n", - " \"Initialize Frontier with an initial Node, and specify a cost function.\"\n", - " self.heap = []\n", - " self.states = {}\n", - " self.costfn = costfn\n", - " self.add(initial)\n", - " \n", - " def add(self, node):\n", - " \"Add node to the frontier.\"\n", - " cost = self.costfn(node)\n", - " heapq.heappush(self.heap, (cost, node))\n", - " self.states[node.state] = node\n", - " \n", - " def pop(self):\n", - " \"Remove and return the Node with minimum cost.\"\n", - " (cost, node) = heapq.heappop(self.heap)\n", - " self.states.pop(node.state, None) # remove state\n", - " return node\n", - " \n", - " def replace(self, node):\n", - " \"Make this node replace a previous node with the same state.\"\n", - " if node.state not in self:\n", - " raise ValueError('{} not there to replace'.format(node.state))\n", - " for (i, (cost, old_node)) in enumerate(self.heap):\n", - " if old_node.state == node.state:\n", - " self.heap[i] = (self.costfn(node), node)\n", - " heapq._siftdown(self.heap, 0, i)\n", - " return\n", - "\n", - " def __contains__(self, state): return state in self.states\n", - " \n", - " def __len__(self): return len(self.heap)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Search Problems\n", - "\n", - "`Problem` is the abstract class for all search problems. You can define your own class of problems as a subclass of `Problem`. You will need to override the `actions` and `result` method to describe how your problem works. You will also have to either override `is_goal` or pass a collection of goal states to the initialization method. If actions have different costs, you should override the `step_cost` method. " - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "class Problem(object):\n", - " \"\"\"The abstract class for a search problem.\"\"\"\n", - "\n", - " def __init__(self, initial=None, goals=(), **additional_keywords):\n", - " \"\"\"Provide an initial state and optional goal states.\n", - " A subclass can have additional keyword arguments.\"\"\"\n", - " self.initial = initial # The initial state of the problem.\n", - " self.goals = goals # A collection of possibe goal states.\n", - " self.__dict__.update(**additional_keywords)\n", - "\n", - " def actions(self, state):\n", - " \"Return a list of actions executable in this state.\"\n", - " raise NotImplementedError # Override this!\n", - "\n", - " def result(self, state, action):\n", - " \"The state that results from executing this action in this state.\"\n", - " raise NotImplementedError # Override this!\n", - "\n", - " def is_goal(self, state):\n", - " \"True if the state is a goal.\" \n", - " return state in self.goals # Optionally override this!\n", - "\n", - " def step_cost(self, state, action, result=None):\n", - " \"The cost of taking this action from this state.\"\n", - " return 1 # Override this if actions have different costs " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def action_sequence(node):\n", - " \"The sequence of actions to get to this node.\"\n", - " actions = []\n", - " while node.previous:\n", - " actions.append(node.action)\n", - " node = node.previous\n", - " return actions[::-1]\n", - "\n", - "def state_sequence(node):\n", - " \"The sequence of states to get to this node.\"\n", - " states = [node.state]\n", - " while node.previous:\n", - " node = node.previous\n", - " states.append(node.state)\n", - " return states[::-1]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Two Location Vacuum World" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "dirt = '*'\n", - "clean = ' '\n", - "\n", - "class TwoLocationVacuumProblem(Problem):\n", - " \"\"\"A Vacuum in a world with two locations, and dirt.\n", - " Each state is a tuple of (location, dirt_in_W, dirt_in_E).\"\"\"\n", - "\n", - " def actions(self, state): return ('W', 'E', 'Suck')\n", - " \n", - " def is_goal(self, state): return dirt not in state\n", - " \n", - " def result(self, state, action):\n", - " \"The state that results from executing this action in this state.\" \n", - " (loc, dirtW, dirtE) = state\n", - " if action == 'W': return ('W', dirtW, dirtE)\n", - " elif action == 'E': return ('E', dirtW, dirtE)\n", - " elif action == 'Suck' and loc == 'W': return (loc, clean, dirtE)\n", - " elif action == 'Suck' and loc == 'E': return (loc, dirtW, clean) \n", - " else: raise ValueError('unknown action: ' + action)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "problem = TwoLocationVacuumProblem(initial=('W', dirt, dirt))\n", - "result = uniform_cost_search(problem)\n", - "result" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['Suck', 'E', 'Suck']" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "action_sequence(result)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('W', '*', '*'), ('W', ' ', '*'), ('E', ' ', '*'), ('E', ' ', ' ')]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state_sequence(result)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['Suck']" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "problem = TwoLocationVacuumProblem(initial=('E', clean, dirt))\n", - "result = uniform_cost_search(problem)\n", - "action_sequence(result)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Water Pouring Problem\n", - "\n", - "Here is another problem domain, to show you how to define one. The idea is that we have a number of water jugs and a water tap and the goal is to measure out a specific amount of water (in, say, ounces or liters). You can completely fill or empty a jug, but because the jugs don't have markings on them, you can't partially fill them with a specific amount. You can, however, pour one jug into another, stopping when the seconfd is full or the first is empty." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "class PourProblem(Problem):\n", - " \"\"\"Problem about pouring water between jugs to achieve some water level.\n", - " Each state is a tuples of levels. In the initialization, provide a tuple of \n", - " capacities, e.g. PourProblem(capacities=(8, 16, 32), initial=(2, 4, 3), goals={7}), \n", - " which means three jugs of capacity 8, 16, 32, currently filled with 2, 4, 3 units of \n", - " water, respectively, and the goal is to get a level of 7 in any one of the jugs.\"\"\"\n", - " \n", - " def actions(self, state):\n", - " \"\"\"The actions executable in this state.\"\"\"\n", - " jugs = range(len(state))\n", - " return ([('Fill', i) for i in jugs if state[i] != self.capacities[i]] +\n", - " [('Dump', i) for i in jugs if state[i] != 0] +\n", - " [('Pour', i, j) for i in jugs for j in jugs if i != j])\n", - "\n", - " def result(self, state, action):\n", - " \"\"\"The state that results from executing this action in this state.\"\"\"\n", - " result = list(state)\n", - " act, i, j = action[0], action[1], action[-1]\n", - " if act == 'Fill': # Fill i to capacity\n", - " result[i] = self.capacities[i]\n", - " elif act == 'Dump': # Empty i\n", - " result[i] = 0\n", - " elif act == 'Pour':\n", - " a, b = state[i], state[j]\n", - " result[i], result[j] = ((0, a + b) \n", - " if (a + b <= self.capacities[j]) else\n", - " (a + b - self.capacities[j], self.capacities[j]))\n", - " else:\n", - " raise ValueError('unknown action', action)\n", - " return tuple(result)\n", - "\n", - " def is_goal(self, state):\n", - " \"\"\"True if any of the jugs has a level equal to one of the goal levels.\"\"\"\n", - " return any(level in self.goals for level in state)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(2, 13)" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p7 = PourProblem(initial=(2, 0), capacities=(5, 13), goals={7})\n", - "p7.result((2, 0), ('Fill', 1))" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('Pour', 0, 1), ('Fill', 0), ('Pour', 0, 1)]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result = uniform_cost_search(p7)\n", - "action_sequence(result)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Visualization Output" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def showpath(searcher, problem):\n", - " \"Show what happens when searcvher solves problem.\"\n", - " problem = Instrumented(problem)\n", - " print('\\n{}:'.format(searcher.__name__))\n", - " result = searcher(problem)\n", - " if result:\n", - " actions = action_sequence(result)\n", - " state = problem.initial\n", - " path_cost = 0\n", - " for steps, action in enumerate(actions, 1):\n", - " path_cost += problem.step_cost(state, action, 0)\n", - " result = problem.result(state, action)\n", - " print(' {} =={}==> {}; cost {} after {} steps'\n", - " .format(state, action, result, path_cost, steps,\n", - " '; GOAL!' if problem.is_goal(result) else ''))\n", - " state = result\n", - " msg = 'GOAL FOUND' if result else 'no solution'\n", - " print('{} after {} results and {} goal checks'\n", - " .format(msg, problem._counter['result'], problem._counter['is_goal']))\n", - " \n", - "from collections import Counter\n", - "\n", - "class Instrumented:\n", - " \"Instrument an object to count all the attribute accesses in _counter.\"\n", - " def __init__(self, obj):\n", - " self._object = obj\n", - " self._counter = Counter()\n", - " def __getattr__(self, attr):\n", - " self._counter[attr] += 1\n", - " return getattr(self._object, attr) " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "uniform_cost_search:\n", - " (2, 0) ==('Pour', 0, 1)==> (0, 2); cost 1 after 1 steps\n", - " (0, 2) ==('Fill', 0)==> (5, 2); cost 2 after 2 steps\n", - " (5, 2) ==('Pour', 0, 1)==> (0, 7); cost 3 after 3 steps\n", - "GOAL FOUND after 83 results and 22 goal checks\n" - ] - } - ], - "source": [ - "showpath(uniform_cost_search, p7)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "uniform_cost_search:\n", - " (0, 0) ==('Fill', 0)==> (7, 0); cost 1 after 1 steps\n", - " (7, 0) ==('Pour', 0, 1)==> (0, 7); cost 2 after 2 steps\n", - " (0, 7) ==('Fill', 0)==> (7, 7); cost 3 after 3 steps\n", - " (7, 7) ==('Pour', 0, 1)==> (1, 13); cost 4 after 4 steps\n", - " (1, 13) ==('Dump', 1)==> (1, 0); cost 5 after 5 steps\n", - " (1, 0) ==('Pour', 0, 1)==> (0, 1); cost 6 after 6 steps\n", - " (0, 1) ==('Fill', 0)==> (7, 1); cost 7 after 7 steps\n", - " (7, 1) ==('Pour', 0, 1)==> (0, 8); cost 8 after 8 steps\n", - " (0, 8) ==('Fill', 0)==> (7, 8); cost 9 after 9 steps\n", - " (7, 8) ==('Pour', 0, 1)==> (2, 13); cost 10 after 10 steps\n", - "GOAL FOUND after 110 results and 32 goal checks\n" - ] - } - ], - "source": [ - "p = PourProblem(initial=(0, 0), capacities=(7, 13), goals={2})\n", - "showpath(uniform_cost_search, p)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class GreenPourProblem(PourProblem): \n", - " def step_cost(self, state, action, result=None):\n", - " \"The cost is the amount of water used in a fill.\"\n", - " if action[0] == 'Fill':\n", - " i = action[1]\n", - " return self.capacities[i] - state[i]\n", - " return 0" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "uniform_cost_search:\n", - " (0, 0) ==('Fill', 0)==> (7, 0); cost 7 after 1 steps\n", - " (7, 0) ==('Pour', 0, 1)==> (0, 7); cost 7 after 2 steps\n", - " (0, 7) ==('Fill', 0)==> (7, 7); cost 14 after 3 steps\n", - " (7, 7) ==('Pour', 0, 1)==> (1, 13); cost 14 after 4 steps\n", - " (1, 13) ==('Dump', 1)==> (1, 0); cost 14 after 5 steps\n", - " (1, 0) ==('Pour', 0, 1)==> (0, 1); cost 14 after 6 steps\n", - " (0, 1) ==('Fill', 0)==> (7, 1); cost 21 after 7 steps\n", - " (7, 1) ==('Pour', 0, 1)==> (0, 8); cost 21 after 8 steps\n", - " (0, 8) ==('Fill', 0)==> (7, 8); cost 28 after 9 steps\n", - " (7, 8) ==('Pour', 0, 1)==> (2, 13); cost 28 after 10 steps\n", - "GOAL FOUND after 184 results and 48 goal checks\n" - ] - } - ], - "source": [ - "p = GreenPourProblem(initial=(0, 0), capacities=(7, 13), goals={2})\n", - "showpath(uniform_cost_search, p)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def compare_searchers(problem, searchers=None):\n", - " \"Apply each of the search algorithms to the problem, and show results\"\n", - " if searchers is None: \n", - " searchers = (breadth_first_search, uniform_cost_search)\n", - " for searcher in searchers:\n", - " showpath(searcher, problem)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "breadth_first_search:\n", - " (0, 0) ==('Fill', 0)==> (7, 0); cost 7 after 1 steps\n", - " (7, 0) ==('Pour', 0, 1)==> (0, 7); cost 7 after 2 steps\n", - " (0, 7) ==('Fill', 0)==> (7, 7); cost 14 after 3 steps\n", - " (7, 7) ==('Pour', 0, 1)==> (1, 13); cost 14 after 4 steps\n", - " (1, 13) ==('Dump', 1)==> (1, 0); cost 14 after 5 steps\n", - " (1, 0) ==('Pour', 0, 1)==> (0, 1); cost 14 after 6 steps\n", - " (0, 1) ==('Fill', 0)==> (7, 1); cost 21 after 7 steps\n", - " (7, 1) ==('Pour', 0, 1)==> (0, 8); cost 21 after 8 steps\n", - " (0, 8) ==('Fill', 0)==> (7, 8); cost 28 after 9 steps\n", - " (7, 8) ==('Pour', 0, 1)==> (2, 13); cost 28 after 10 steps\n", - "GOAL FOUND after 100 results and 31 goal checks\n", - "\n", - "uniform_cost_search:\n", - " (0, 0) ==('Fill', 0)==> (7, 0); cost 7 after 1 steps\n", - " (7, 0) ==('Pour', 0, 1)==> (0, 7); cost 7 after 2 steps\n", - " (0, 7) ==('Fill', 0)==> (7, 7); cost 14 after 3 steps\n", - " (7, 7) ==('Pour', 0, 1)==> (1, 13); cost 14 after 4 steps\n", - " (1, 13) ==('Dump', 1)==> (1, 0); cost 14 after 5 steps\n", - " (1, 0) ==('Pour', 0, 1)==> (0, 1); cost 14 after 6 steps\n", - " (0, 1) ==('Fill', 0)==> (7, 1); cost 21 after 7 steps\n", - " (7, 1) ==('Pour', 0, 1)==> (0, 8); cost 21 after 8 steps\n", - " (0, 8) ==('Fill', 0)==> (7, 8); cost 28 after 9 steps\n", - " (7, 8) ==('Pour', 0, 1)==> (2, 13); cost 28 after 10 steps\n", - "GOAL FOUND after 184 results and 48 goal checks\n" - ] - } - ], - "source": [ - "compare_searchers(p)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Random Grid\n", - "\n", - "An environment where you can move in any of 4 directions, unless there is an obstacle there.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{(0, 0): [(0, 1), (1, 0)],\n", - " (0, 1): [(0, 2), (0, 0), (1, 1)],\n", - " (0, 2): [(0, 3), (0, 1), (1, 2)],\n", - " (0, 3): [(0, 4), (0, 2), (1, 3)],\n", - " (0, 4): [(0, 3), (1, 4)],\n", - " (1, 0): [(1, 1), (2, 0), (0, 0)],\n", - " (1, 1): [(1, 2), (1, 0), (2, 1), (0, 1)],\n", - " (1, 2): [(1, 3), (1, 1), (2, 2), (0, 2)],\n", - " (1, 3): [(1, 4), (1, 2), (2, 3), (0, 3)],\n", - " (1, 4): [(1, 3), (2, 4), (0, 4)],\n", - " (2, 0): [(2, 1), (3, 0), (1, 0)],\n", - " (2, 1): [(2, 2), (2, 0), (3, 1), (1, 1)],\n", - " (2, 2): [(2, 3), (2, 1), (3, 2), (1, 2)],\n", - " (2, 3): [(2, 4), (2, 2), (1, 3)],\n", - " (2, 4): [(2, 3), (1, 4)],\n", - " (3, 0): [(3, 1), (4, 0), (2, 0)],\n", - " (3, 1): [(3, 2), (3, 0), (4, 1), (2, 1)],\n", - " (3, 2): [(3, 1), (4, 2), (2, 2)],\n", - " (3, 3): [(3, 2), (4, 3), (2, 3)],\n", - " (3, 4): [(4, 4), (2, 4)],\n", - " (4, 0): [(4, 1), (3, 0)],\n", - " (4, 1): [(4, 2), (4, 0), (3, 1)],\n", - " (4, 2): [(4, 3), (4, 1), (3, 2)],\n", - " (4, 3): [(4, 4), (4, 2)],\n", - " (4, 4): [(4, 3)]}" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import random\n", - "\n", - "N, S, E, W = DIRECTIONS = [(0, 1), (0, -1), (1, 0), (-1, 0)]\n", - "\n", - "def Grid(width, height, obstacles=0.1):\n", - " \"\"\"A 2-D grid, width x height, with obstacles that are either a collection of points,\n", - " or a fraction between 0 and 1 indicating the density of obstacles, chosen at random.\"\"\"\n", - " grid = {(x, y) for x in range(width) for y in range(height)}\n", - " if isinstance(obstacles, (float, int)):\n", - " obstacles = random.sample(grid, int(width * height * obstacles))\n", - " def neighbors(x, y):\n", - " for (dx, dy) in DIRECTIONS:\n", - " (nx, ny) = (x + dx, y + dy)\n", - " if (nx, ny) not in obstacles and 0 <= nx < width and 0 <= ny < height:\n", - " yield (nx, ny)\n", - " return {(x, y): list(neighbors(x, y))\n", - " for x in range(width) for y in range(height)}\n", - "\n", - "Grid(5, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class GridProblem(Problem):\n", - " \"Create with a call like GridProblem(grid=Grid(10, 10), initial=(0, 0), goal=(9, 9))\"\n", - " def actions(self, state): return DIRECTIONS\n", - " def result(self, state, action):\n", - " #print('ask for result of', state, action)\n", - " (x, y) = state\n", - " (dx, dy) = action\n", - " r = (x + dx, y + dy)\n", - " return r if r in self.grid[state] else state" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "uniform_cost_search:\n", - "no solution after 132 results and 33 goal checks\n" - ] - } - ], - "source": [ - "gp = GridProblem(grid=Grid(5, 5, 0.3), initial=(0, 0), goals={(4, 4)})\n", - "showpath(uniform_cost_search, gp)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "button": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "source": [ - "# Finding a hard PourProblem\n", - "\n", - "What solvable two-jug PourProblem requires the most steps? We can define the hardness as the number of steps, and then iterate over all PourProblems with capacities up to size M, keeping the hardest one." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "def hardness(problem):\n", - " L = breadth_first_search(problem)\n", - " #print('hardness', problem.initial, problem.capacities, problem.goals, L)\n", - " return len(action_sequence(L)) if (L is not None) else 0" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hardness(p7)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('Pour', 0, 1), ('Fill', 0), ('Pour', 0, 1)]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "action_sequence(breadth_first_search(p7))" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "((0, 0), (7, 9), {8})" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "C = 9 # Maximum capacity to consider\n", - "\n", - "phard = max((PourProblem(initial=(a, b), capacities=(A, B), goals={goal})\n", - " for A in range(C+1) for B in range(C+1)\n", - " for a in range(A) for b in range(B)\n", - " for goal in range(max(A, B))),\n", - " key=hardness)\n", - "\n", - "phard.initial, phard.capacities, phard.goals" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "breadth_first_search:\n", - " (0, 0) ==('Fill', 1)==> (0, 9); cost 1 after 1 steps\n", - " (0, 9) ==('Pour', 1, 0)==> (7, 2); cost 2 after 2 steps\n", - " (7, 2) ==('Dump', 0)==> (0, 2); cost 3 after 3 steps\n", - " (0, 2) ==('Pour', 1, 0)==> (2, 0); cost 4 after 4 steps\n", - " (2, 0) ==('Fill', 1)==> (2, 9); cost 5 after 5 steps\n", - " (2, 9) ==('Pour', 1, 0)==> (7, 4); cost 6 after 6 steps\n", - " (7, 4) ==('Dump', 0)==> (0, 4); cost 7 after 7 steps\n", - " (0, 4) ==('Pour', 1, 0)==> (4, 0); cost 8 after 8 steps\n", - " (4, 0) ==('Fill', 1)==> (4, 9); cost 9 after 9 steps\n", - " (4, 9) ==('Pour', 1, 0)==> (7, 6); cost 10 after 10 steps\n", - " (7, 6) ==('Dump', 0)==> (0, 6); cost 11 after 11 steps\n", - " (0, 6) ==('Pour', 1, 0)==> (6, 0); cost 12 after 12 steps\n", - " (6, 0) ==('Fill', 1)==> (6, 9); cost 13 after 13 steps\n", - " (6, 9) ==('Pour', 1, 0)==> (7, 8); cost 14 after 14 steps\n", - "GOAL FOUND after 150 results and 44 goal checks\n" - ] - } - ], - "source": [ - "showpath(breadth_first_search, PourProblem(initial=(0, 0), capacities=(7, 9), goals={8}))" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "uniform_cost_search:\n", - " (0, 0) ==('Fill', 1)==> (0, 9); cost 1 after 1 steps\n", - " (0, 9) ==('Pour', 1, 0)==> (7, 2); cost 2 after 2 steps\n", - " (7, 2) ==('Dump', 0)==> (0, 2); cost 3 after 3 steps\n", - " (0, 2) ==('Pour', 1, 0)==> (2, 0); cost 4 after 4 steps\n", - " (2, 0) ==('Fill', 1)==> (2, 9); cost 5 after 5 steps\n", - " (2, 9) ==('Pour', 1, 0)==> (7, 4); cost 6 after 6 steps\n", - " (7, 4) ==('Dump', 0)==> (0, 4); cost 7 after 7 steps\n", - " (0, 4) ==('Pour', 1, 0)==> (4, 0); cost 8 after 8 steps\n", - " (4, 0) ==('Fill', 1)==> (4, 9); cost 9 after 9 steps\n", - " (4, 9) ==('Pour', 1, 0)==> (7, 6); cost 10 after 10 steps\n", - " (7, 6) ==('Dump', 0)==> (0, 6); cost 11 after 11 steps\n", - " (0, 6) ==('Pour', 1, 0)==> (6, 0); cost 12 after 12 steps\n", - " (6, 0) ==('Fill', 1)==> (6, 9); cost 13 after 13 steps\n", - " (6, 9) ==('Pour', 1, 0)==> (7, 8); cost 14 after 14 steps\n", - "GOAL FOUND after 159 results and 45 goal checks\n" - ] - } - ], - "source": [ - "showpath(uniform_cost_search, phard)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "button": false, - "collapsed": true, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [], - "source": [ - "class GridProblem(Problem):\n", - " \"\"\"A Grid.\"\"\"\n", - "\n", - " def actions(self, state): return ['N', 'S', 'E', 'W'] \n", - " \n", - " def result(self, state, action):\n", - " \"\"\"The state that results from executing this action in this state.\"\"\" \n", - " (W, H) = self.size\n", - " if action == 'N' and state > W: return state - W\n", - " if action == 'S' and state + W < W * W: return state + W\n", - " if action == 'E' and (state + 1) % W !=0: return state + 1\n", - " if action == 'W' and state % W != 0: return state - 1\n", - " return state" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "breadth_first_search:\n", - " 0 ==S==> 10; cost 1 after 1 steps\n", - " 10 ==S==> 20; cost 2 after 2 steps\n", - " 20 ==S==> 30; cost 3 after 3 steps\n", - " 30 ==S==> 40; cost 4 after 4 steps\n", - " 40 ==E==> 41; cost 5 after 5 steps\n", - " 41 ==E==> 42; cost 6 after 6 steps\n", - " 42 ==E==> 43; cost 7 after 7 steps\n", - " 43 ==E==> 44; cost 8 after 8 steps\n", - "GOAL FOUND after 135 results and 49 goal checks\n", - "\n", - "uniform_cost_search:\n", - " 0 ==S==> 10; cost 1 after 1 steps\n", - " 10 ==S==> 20; cost 2 after 2 steps\n", - " 20 ==E==> 21; cost 3 after 3 steps\n", - " 21 ==E==> 22; cost 4 after 4 steps\n", - " 22 ==E==> 23; cost 5 after 5 steps\n", - " 23 ==S==> 33; cost 6 after 6 steps\n", - " 33 ==S==> 43; cost 7 after 7 steps\n", - " 43 ==E==> 44; cost 8 after 8 steps\n", - "GOAL FOUND after 1036 results and 266 goal checks\n" - ] - } - ], - "source": [ - "compare_searchers(GridProblem(initial=0, goals={44}, size=(10, 10)))" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'test_frontier ok'" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def test_frontier():\n", - " \n", - " #### Breadth-first search with FIFO Q\n", - " f = FrontierQ(Node(1), LIFO=False)\n", - " assert 1 in f and len(f) == 1\n", - " f.add(Node(2))\n", - " f.add(Node(3))\n", - " assert 1 in f and 2 in f and 3 in f and len(f) == 3\n", - " assert f.pop().state == 1\n", - " assert 1 not in f and 2 in f and 3 in f and len(f) == 2\n", - " assert f\n", - " assert f.pop().state == 2\n", - " assert f.pop().state == 3\n", - " assert not f\n", - " \n", - " #### Depth-first search with LIFO Q\n", - " f = FrontierQ(Node('a'), LIFO=True)\n", - " for s in 'bcdef': f.add(Node(s))\n", - " assert len(f) == 6 and 'a' in f and 'c' in f and 'f' in f\n", - " for s in 'fedcba': assert f.pop().state == s\n", - " assert not f\n", - "\n", - " #### Best-first search with Priority Q\n", - " f = FrontierPQ(Node(''), lambda node: len(node.state))\n", - " assert '' in f and len(f) == 1 and f\n", - " for s in ['book', 'boo', 'bookie', 'bookies', 'cook', 'look', 'b']:\n", - " assert s not in f\n", - " f.add(Node(s))\n", - " assert s in f\n", - " assert f.pop().state == ''\n", - " assert f.pop().state == 'b'\n", - " assert f.pop().state == 'boo'\n", - " assert {f.pop().state for _ in '123'} == {'book', 'cook', 'look'}\n", - " assert f.pop().state == 'bookie'\n", - " \n", - " #### Romania: Two paths to Bucharest; cheapest one found first\n", - " S = Node('S')\n", - " SF = Node('F', S, 'S->F', 99)\n", - " SFB = Node('B', SF, 'F->B', 211)\n", - " SR = Node('R', S, 'S->R', 80)\n", - " SRP = Node('P', SR, 'R->P', 97)\n", - " SRPB = Node('B', SRP, 'P->B', 101)\n", - " f = FrontierPQ(S)\n", - " f.add(SF); f.add(SR), f.add(SRP), f.add(SRPB); f.add(SFB)\n", - " def cs(n): return (n.path_cost, n.state) # cs: cost and state\n", - " assert cs(f.pop()) == (0, 'S')\n", - " assert cs(f.pop()) == (80, 'R')\n", - " assert cs(f.pop()) == (99, 'F')\n", - " assert cs(f.pop()) == (177, 'P')\n", - " assert cs(f.pop()) == (278, 'B')\n", - " return 'test_frontier ok'\n", - "\n", - "test_frontier()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n9r8varwUoYrZVQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "\n", - "p = plt.plot([i**2 for i in range(10)])\n", - "plt.savefig('destination_path.eps', format='eps', dpi=1200)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "button": false, - "collapsed": false, - "deletable": true, - "new_sheet": false, - "run_control": { - "read_only": false - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAHaCAYAAAApPsHTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt209MVPe///HXmT+JDhg7OjAEBIGIGbBYDBLSUha6ICwq\n1IgpzdXvzVfytRujDUlj2t5v6aQ3JN2QUN3YtIsmpbXFaSSmCZpYFrYbF99qid4QSUACDWMwRhmm\niQNnfoveO8nU2u/8gGH4HJ6P3ZlzTny//HzOvGYQrWQyKQAAYA5XrgcAAAD/fyhvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGMaT6wEy9eGHH85alhXM9RzZkkwmbcuyHPthysn53G63vbS05MhskrPXTiKf6Zz8\n/Hk8nuj7779f9Kfn1nqY5bIsKxiNRnM9RtYEg0EX+cwUDAZdPT09uR4ja8LhsGPXTnL23pQ2Rj6n\nPn/hcPi5X1gd+WkFAAAno7wBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAA\nhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShv\nAAAMQ3kDAGAYyhsAAMN4cj3AWpuamtJPP/2kZDKp6upq7du3L+38o0ePNDIyorm5OTU2Nuqll16S\nJMViMV2/fl2//fabLMtSdXW19u7dm4sIf4l8ZucbHh7W22+/Ldu21dXVpbNnz6adHxsb09///nf9\n61//Um9vr7q7uyVJ09PT+tvf/qZoNCqXy6V//OMfOn36dC4iPJfT1458Zucz7dnbUOWdTCZ148YN\ntbW1yefzKRKJqLy8XH6/P3XNpk2b1NzcrImJibR7XS6XmpqaFAgElEgkNDg4qNLS0rR7c418Zuez\nbVunTp3S9evXVVxcrIaGBrW3tysUCqWu2b59u86dO6fLly+n3evxeNTX16e6ujrFYjHV19erpaUl\n7d5ccvrakc/sfCY+exvqx+bRaFRbt27Vli1b5Ha7tWvXLk1OTqZds3nzZhUUFMiyrLTXfT6fAoGA\nJMnr9crv92thYWGtRs8I+czOd/PmTVVVVWnnzp3yer3q7OzU0NBQ2jWBQED19fXyeNI/dxcVFamu\nrk6SlJ+fr+rqas3MzKzZ7P+O09eOfGbnM/HZ21DlvbCwoPz8/NRxfn7+sjbRkydP9PDhQwWDwdUc\nb8XIl5n1mm9mZkalpaWp4x07dizrTWByclK3bt1SY2Pjao63Ik5fO/JlZr3mM/HZ21DlvRoSiYSu\nXbumpqYmeb3eXI+z6shntlgspo6ODvX396e92TqB09eOfGZb62dvQ5V3Xl6eYrFY6jgWiykvLy/j\n+23b1tWrV7V7925VVFRkY8QVId9fW+/5SkpKNDU1lTqenp5WSUlJxvcvLi6qo6NDx48fV3t7ezZG\nXDanrx35/tp6z2fis7ehyruwsFCPHz/W/Py8lpaWND4+rvLy8uden0wm045HRkbk9/vX5W9KSuT7\nI9PyNTQ0aHx8XPfv39fTp0918eJFtbW1Pff6P+Y7ceKEampqdObMmWyP+v/N6WtHvnSm5TPx2dtQ\nv23ucrnU3NysK1euSJJCoZD8fr/u3Lkjy7JUU1OjeDyuS5cuKZFIyLIsjY6OqrOzU3Nzc7p37562\nbdumwcFBSVJjY6PKyspyGSkN+czO53a7df78ebW0tKT+u0p1dbUuXLggy7J08uRJRaNR7d+/X/Pz\n83K5XOrv79fdu3d1+/ZtDQwMqLa2Vvv27ZNlWert7VVra2uuY0ly/tqRz+x8Jj571h8/QaxX4XA4\nGY1Gcz1G1gSDQZHPTMFgUD09PbkeI2vC4bBj105y9t6UNkY+pz5/4XBYPT091p+d21A/NgcAwAko\nbwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAA\nw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3\nAACGsZLJZK5nyMh///d/Ly0tLTn2w4bL5ZJt27keI2ucnM/J2STJ4/FocXEx12NkjdPXL5lMyrKs\nXI+RNW63W0tLS7keIys8Ho/9/vvvu//03FoPs1xLS0uunp6eXI+RNeFwWEeOHMn1GFkTiUQcm8/J\n2aTf8/HsmSsSiSgajeZ6jKwJBoOO3Z/hcPi5X1gd+00WAACnorwBADAM5Q0AgGEobwAADEN5AwBg\nGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIG\nAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNsuPIeHh5WKBTS7t279fHHHz9zfmxs\nTK+88oo2bdqkvr6+1OvT09M6ePCg9uzZo9raWn3yySdrOXbGfvzxRx06dEivvfaaPv/882fOT0xM\n6NixY6qvr9cXX3yRen12dlZdXV16/fXXdfjwYQ0MDKzl2Bkjn7n5ePbMXTtJmpqa0tdff62vvvpK\nP//88zPnHz16pO+++06ffvqpbt++nXo9FotpaGhIFy9e1DfffKNffvllLcfOmGn707Mmf8o6Ydu2\nTp06pevXr6u4uFgNDQ1qb29XKBRKXbN9+3adO3dOly9fTrvX4/Gor69PdXV1isViqq+vV0tLS9q9\nuWbbtnp7e/XZZ5+poKBAb775pg4cOKDKysrUNS+88ILeffdd/fDDD2n3ejwevfPOOwqFQorH43rj\njTf08ssvp92ba+QzNx/PnrlrJ0nJZFI3btxQW1ubfD6fIpGIysvL5ff7U9ds2rRJzc3NmpiYSLvX\n5XKpqalJgUBAiURCg4ODKi0tTbs310zcnxvqm/fNmzdVVVWlnTt3yuv1qrOzU0NDQ2nXBAIB1dfX\ny+NJ/1xTVFSkuro6SVJ+fr6qq6s1MzOzZrNnYnR0VGVlZSouLpbX61Vra6tGRkbSrvH7/dqzZ88z\n+QKBQGqz+Xw+VVRU6MGDB2s2eybIZ24+nj1z106SotGotm7dqi1btsjtdmvXrl2anJxMu2bz5s0q\nKCiQZVlpr/t8PgUCAUmS1+uV3+/XwsLCWo2eERP354Yq75mZGZWWlqaOd+zYsay/5MnJSd26dUuN\njY2rOd6KPXjwQEVFRanjYDC4rDeBmZkZjY2Nae/evas53oqRLzPrMR/PXmbW49pJ0sLCgvLz81PH\n+fn5yyrgJ0+e6OHDhwoGg6s53oqZuD83VHmvhlgspo6ODvX396dtZqeIx+Pq7u7W2bNn5fP5cj3O\nqiOfuXj2zJZIJHTt2jU1NTXJ6/XmepxVt9b7c0OVd0lJiaamplLH09PTKikpyfj+xcVFdXR06Pjx\n42pvb8/GiCtSWFio2dnZ1HE0GlVhYWHG9y8uLqq7u1uHDh3SwYMHszHiipDvr63nfDx7f209r50k\n5eXlKRaLpY5jsZjy8vIyvt+2bV29elW7d+9WRUVFNkZcERP354Yq74aGBo2Pj+v+/ft6+vSpLl68\nqLa2tuden0wm045PnDihmpoanTlzJtujLsuLL76oqakp/frrr0okEhoeHtaBAwcyvv+DDz5QZWWl\njh07lsUpl498f2095+PZ+2vree2k3z+cPH78WPPz81paWtL4+LjKy8ufe/0f129kZER+v3/d/XPA\n/zFxf26o3zZ3u906f/68WlpaZNu2urq6VF1drQsXLsiyLJ08eVLRaFT79+/X/Py8XC6X+vv7dffu\nXd2+fVsDAwOqra3Vvn37ZFmWent71dramutYKW63W++9957eeust2batw4cPq7KyUt9++60sy9LR\no0c1Nzenzs5OxeNxWZalL7/8UkNDQxobG9P333+vqqoqHT16VJZl6fTp03r11VdzHSuFfObm49kz\nd+2k339jvLm5WVeuXJEkhUIh+f1+3blzR5ZlqaamRvF4XJcuXVIikZBlWRodHVVnZ6fm5uZ07949\nbdu2TYODg5KkxsZGlZWV5TJSGhP3p/XHTxDrVTgcTvb09OR6jKwJh8M6cuRIrsfImkgk4th8Ts4m\n/Z6PZ89ckUhE0Wg012NkTTAYdOz+DIfD6unpsf7s3Ib6sTkAAE5AeQMAYBjKGwAAw1DeAAAYhvIG\nAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM\n5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwjJVMJnM9Q0Y++uijJdu2\nHfthw+PxaHFxMddjZI2T8zk5m0Q+05HPXB6Px37//ffdf3purYdZLtu2XUeOHMn1GFkTiUTU09OT\n6zGyJhwOOzafk7NJ5DMd+cwVDoef+4XVsd9kAQBwKsobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADDMhivvH3/8UYcOHdJrr72mzz///JnzExMTOnbs\nmOrr6/XFF1+kXp+dnVVXV5def/11HT58WAMDA2s5dsaGh4cVCoW0e/duffzxx8+cHxsb0yuvvKJN\nmzapr68v9fr09LQOHjyoPXv2qLa2Vp988slajp0x8pmbz8nZJPKRb23zedbkT1knbNtWb2+vPvvs\nMxUUFOjNN9/UgQMHVFlZmbrmhRde0Lvvvqsffvgh7V6Px6N33nlHoVBI8Xhcb7zxhl5++eW0e3PN\ntm2dOnVK169fV3FxsRoaGtTe3q5QKJS6Zvv27Tp37pwuX76cdq/H41FfX5/q6uoUi8VUX1+vlpaW\ntHtzjXzm5nNyNol8EvnWOt+G+uY9OjqqsrIyFRcXy+v1qrW1VSMjI2nX+P1+7dmzRx5P+ueaQCCQ\nWgyfz6eKigo9ePBgzWbPxM2bN1VVVaWdO3fK6/Wqs7NTQ0NDadcEAgHV19c/k6+oqEh1dXWSpPz8\nfFVXV2tmZmbNZs8E+czN5+RsEvkk8klrm29DlfeDBw9UVFSUOg4Gg8sq4JmZGY2NjWnv3r2rOd6K\nzczMqLS0NHW8Y8eOZW2iyclJ3bp1S42Njas53oqRLzPrMZ+Ts0nkyxT5Vs+GKu/VEI/H1d3drbNn\nz8rn8+V6nFUXi8XU0dGh/v5+5efn53qcVUc+czk5m0Q+0611vg1V3oWFhZqdnU0dR6NRFRYWZnz/\n4uKiuru7dejQIR08eDAbI65ISUmJpqamUsfT09MqKSnJ+P7FxUV1dHTo+PHjam9vz8aIK0K+v7ae\n8zk5m0S+f4d8q29DlfeLL76oqakp/frrr0okEhoeHtaBAwcyvv+DDz5QZWWljh07lsUpl6+hoUHj\n4+O6f/++nj59qosXL6qtre251yeTybTjEydOqKamRmfOnMn2qMtCvnQm5XNyNol8f0S+7NtQv23u\ndrv13nvv6a233pJt2zp8+LAqKyv17bffyrIsHT16VHNzc+rs7FQ8HpdlWfryyy81NDSksbExff/9\n96qqqtLRo0dlWZZOnz6tV199NdexUtxut86fP6+WlhbZtq2uri5VV1frwoULsixLJ0+eVDQa1f79\n+zU/Py+Xy6X+/n7dvXtXt2/f1sDAgGpra7Vv3z5ZlqXe3l61trbmOlYK+czN5+RsEvnIt/b5rD9+\nglivwuFw8siRI7keI2sikYh6enpyPUbWhMNhx+ZzcjaJfKYjn7n+N5v1Z+c21I/NAQBwAsobAADD\nUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcA\nAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGGs\nZDKZ6xky8uGHHy5ZluXYDxtut1tLS0u5HiNrPB6PFhcXcz1GViSTSVmWlesxssbp+Zz+7Dl9/Zyc\nL5lM2h9++KH7z8551nqY5bIsyxWNRnM9RtYEg0H19PTkeoysCYfDjs0XDofl9L3p9HxO3ZsS+9Nk\nwWDwuV9YHftNFgAAp6K8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIah\nvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAA\nDEN5AwBgGE+uB1hrU1NT+umnn5RMJlVdXa19+/alnX/06JFGRkY0NzenxsZGvfTSS5KkWCym69ev\n67fffpNlWaqurtbevXtzEeEvDQ8P6+2335Zt2+rq6tLZs2fTzo+Njenvf/+7/vWvf6m3t1fd3d2S\npOnpaf3tb39TNBqVy+XSP/7xD50+fToXEf6S0/M5eX86OZvE3jR9/UzLt6HKO5lM6saNG2pra5PP\n51MkElF5ebn8fn/qmk2bNqm5uVkTExNp97pcLjU1NSkQCCiRSGhwcFClpaVp9+aabds6deqUrl+/\nruLiYjU0NKi9vV2hUCh1zfbt23Xu3Dldvnw57V6Px6O+vj7V1dUpFoupvr5eLS0taffmmtPzOXl/\nOjmbxN6UzF4/E/NtqB+bR6NRbd26VVu2bJHb7dauXbs0OTmZds3mzZtVUFAgy7LSXvf5fAoEApIk\nr9crv9+vhYWFtRo9Izdv3lRVVZV27twpr9erzs5ODQ0NpV0TCARUX18vjyf9c1tRUZHq6uokSfn5\n+aqurtbMzMyazZ4Jp+dz8v50cjaJvSmZvX4m5ttQ5b2wsKD8/PzUcX5+/rL+kp88eaKHDx8qGAyu\n5ngrNjMzo9LS0tTxjh07lvUmMDk5qVu3bqmxsXE1x1sxp+dz8v50cjaJvZmp9bp+JubbUOW9GhKJ\nhK5du6ampiZ5vd5cj7PqYrGYOjo61N/fn7aZncLp+Zy8P52cTWJvmm6t822o8s7Ly1MsFksdx2Ix\n5eXlZXy/bdu6evWqdu/erYqKimyMuCIlJSWamppKHU9PT6ukpCTj+xcXF9XR0aHjx4+rvb09GyOu\niNPzOXl/OjmbxN78d9b7+pmYb0OVd2FhoR4/fqz5+XktLS1pfHxc5eXlz70+mUymHY+MjMjv96/L\n35SUpIaGBo2Pj+v+/ft6+vSpLl68qLa2tude/8d8J06cUE1Njc6cOZPtUZfF6fmcvD+dnE1ib/6R\naetnYr4N9dvmLpdLzc3NunLliiQpFArJ7/frzp07sixLNTU1isfjunTpkhKJhCzL0ujoqDo7OzU3\nN6d79+5p27ZtGhwclCQ1NjaqrKwsl5HSuN1unT9/Xi0tLan/rlJdXa0LFy7IsiydPHlS0WhU+/fv\n1/z8vFwul/r7+3X37l3dvn1bAwMDqq2t1b59+2RZlnp7e9Xa2prrWClOz+fk/enkbBJ70/T1MzGf\n9cdPEOtVOBxORqPRXI+RNcFgUD09PbkeI2vC4bBj84XDYTl9bzo9n1P3psT+NNn/7k3rz85tqB+b\nAwDgBJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGMZKJpO5niEjH3300ZJt2479sJFMJmVZVq7HyBon53NyNklyuVyybTvXY2SN\nx+PR4uJirsfIGqfvTyfnSyaT9ocffuj+s3OetR5muWzbdh05ciTXY2RNJBJRNBrN9RhZEwwGHZvP\nydmk3/M5/dnr6enJ9RhZEw6HHb8/nZovGAw+9wurY7/JAgDgVJQ3AACGobwBADAM5Q0AgGEobwAA\nDEN5AwBgGMobAADDUN4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1De\nAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAM48n1AGvtxx9/1Mcff6xkMqnDhw+rq6sr7fzE\nxIT++c9/6n/+5390+vRp/ed//qckaXZ2Vu+//74ePnwoy7LU0dGh//iP/8hFhL80NTWln376Sclk\nUtXV1dq3b1/a+UePHmlkZERzc3NqbGzUSy+9JEmKxWK6fv26fvvtN1mWperqau3duzcXEf4S+czN\n5/Rnb3h4WG+//bZs21ZXV5fOnj2bdn5sbEx///vf9a9//Uu9vb3q7u6WJE1PT+tvf/ubotGoXC6X\n/vGPf+j06dO5iPCXnLw3JfPybajytm1bvb29+uyzz1RQUKA333xTBw4cUGVlZeqaF154Qe+++65+\n+OGHtHs9Ho/eeecdhUIhxeNxvfHGG3r55ZfT7s21ZDKpGzduqK2tTT6fT5FIROXl5fL7/alrNm3a\npObmZk1MTKTd63K51NTUpEAgoEQiocHBQZWWlqbdm2vkMzef058927Z16tQpXb9+XcXFxWpoaFB7\ne7tCoVDqmu3bt+vcuXO6fPly2r0ej0d9fX2qq6tTLBZTfX29Wlpa0u7NNSfvTcnMfBvqx+ajo6Mq\nKytTcXGxvF6vWltbNTIyknaN3+/Xnj175PGkf64JBAKph8nn86miokIPHjxYs9kzEY1GtXXrVm3Z\nskVut1u7du3S5ORk2jWbN29WQUGBLMtKe93n8ykQCEiSvF6v/H6/FhYW1mr0jJDP3HxOf/Zu3ryp\nqqoq7dy5U16vV52dnRoaGkq7JhAIqL6+/pl8RUVFqqurkyTl5+erurpaMzMzazZ7Jpy8NyUz822o\n8n7w4IGKiopSx8FgcFlvAjMzMxobG1t3P/pZWFhQfn5+6jg/P39Zm+jJkyd6+PChgsHgao63YuTL\nzHrM5/Rnb2ZmRqWlpanjHTt2LKuAJycndevWLTU2Nq7meCvm5L0pmZlvQ5X3aojH4+ru7tbZs2fl\n8/lyPc6qSyQSunbtmpqamuT1enM9zqojn7mc/uzFYjF1dHSov78/rUicwsl7U1r7fBuqvAsLCzU7\nO5s6jkajKiwszPj+xcVFdXd369ChQzp48GA2RlyRvLw8xWKx1HEsFlNeXl7G99u2ratXr2r37t2q\nqKjIxogrQr6/tp7zOf3ZKykp0dTUVOp4enpaJSUlGd+/uLiojo4OHT9+XO3t7dkYcUWcvDclM/Nt\nqPJ+8cUXNTU1pV9//VWJRELDw8M6cOBAxvd/8MEHqqys1LFjx7I45fIVFhbq8ePHmp+f19LSksbH\nx1VeXv7c65PJZNrxyMiI/H7/uvuR5P8hXzqT8jn92WtoaND4+Lju37+vp0+f6uLFi2pra3vu9X9c\nuxMnTqimpkZnzpzJ9qjL4uS9KZmZb0P9trnb7dZ7772nt956S7Zt6/Dhw6qsrNS3334ry7J09OhR\nzc3NqbOzU/F4XJZl6csvv9TQ0JDGxsb0/fffq6qqSkePHpVlWTp9+rReffXVXMdKcblcam5u1pUr\nVyRJoVBIfr9fd+7ckWVZqqmpUTwe16VLl5RIJGRZlkZHR9XZ2am5uTndu3dP27Zt0+DgoCSpsbFR\nZWVluYyUhnzm5nP6s+d2u3X+/Hm1tLSk/qtYdXW1Lly4IMuydPLkSUWjUe3fv1/z8/NyuVzq7+/X\n3bt3dfv2bQ0MDKi2tlb79u2TZVnq7e1Va2trrmOlOHlvSmbms/74CWK9CofDySNHjuR6jKyJRCKK\nRqO5HiNrgsGgY/M5OZv0ez6nP3s9PT25HiNrwuGw4/enU/MFg0H19PRYf3ZuQ/3YHAAAJ6C8AQAw\nDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kD\nAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABjG\nSiaTuZ4hIx999NGSbduO/bCRTCZlWVaux8gal8sl27ZzPUZWODmbJHk8Hi0uLuZ6jKxx+vo5PZ+T\n96fb7bb/67/+y/1n5zxrPcxy2bbtOnLkSK7HyJpIJKJoNJrrMbImGAzKqesXiUQcm036PV9PT0+u\nx8iacDjs+PVzej6n7s9wOPzcL6yO/SYLAIBTUd4AABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8A\nAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ\n3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGE2XHn/+OOPOnTokF577TV9/vnnz5yfmJjQsWPHVF9f\nry+++CL1+uzsrLq6uvT666/r8OHDGhgYWMuxMzY1NaWvv/5aX331lX7++ednzj969EjfffedPv30\nU92+fTv1eiwW09DQkC5evKhvvvlGv/zyy1qOnTGnr5+T8w0PDysUCmn37t36+OOPnzk/NjamV155\nRZs2bVJfX1/q9enpaR08eFB79uxRbW2tPvnkk7UcO2NOXjvJ+flM25+eNflT1gnbttXb26vPPvtM\nBQUFevPNN3XgwAFVVlamrnnhhRf07rvv6ocffki71+Px6J133lEoFFI8Htcbb7yhl19+Oe3eXEsm\nk7px44ba2trk8/kUiURUXl4uv9+fumbTpk1qbm7WxMRE2r0ul0tNTU0KBAJKJBIaHBxUaWlp2r25\n5vT1c3I+27Z16tQpXb9+XcXFxWpoaFB7e7tCoVDqmu3bt+vcuXO6fPly2r0ej0d9fX2qq6tTLBZT\nfX29Wlpa0u7NNSevnbQx8pm2PzfUN+/R0VGVlZWpuLhYXq9Xra2tGhkZSbvG7/drz5498njSP9cE\nAoHUYvh8PlVUVOjBgwdrNnsmotGotm7dqi1btsjtdmvXrl2anJxMu2bz5s0qKCiQZVlpr/t8PgUC\nAUmS1+uqVgErAAARmklEQVSV3+/XwsLCWo2eEaevn5Pz3bx5U1VVVdq5c6e8Xq86Ozs1NDSUdk0g\nEFB9ff0z2YqKilRXVydJys/PV3V1tWZmZtZs9kw4ee0k5+czcX9uqPJ+8OCBioqKUsfBYHBZm2hm\nZkZjY2Pau3fvao63YgsLC8rPz08d5+fnL6uAnzx5oocPHyoYDK7meCvm9PVzcr6ZmRmVlpamjnfs\n2LGsN7jJyUndunVLjY2Nqzneijl57STn5zNxf26o8l4N8Xhc3d3dOnv2rHw+X67HWXWJRELXrl1T\nU1OTvF5vrsdZdU5fPyfni8Vi6ujoUH9/f9qHVKdw8tpJzs+31vtzQ5V3YWGhZmdnU8fRaFSFhYUZ\n37+4uKju7m4dOnRIBw8ezMaIK5KXl6dYLJY6jsViysvLy/h+27Z19epV7d69WxUVFdkYcUWcvn5O\nzldSUqKpqanU8fT0tEpKSjK+f3FxUR0dHTp+/Lja29uzMeKKOHntJOfnM3F/bqjyfvHFFzU1NaVf\nf/1ViURCw8PDOnDgQMb3f/DBB6qsrNSxY8eyOOXyFRYW6vHjx5qfn9fS0pLGx8dVXl7+3OuTyWTa\n8cjIiPx+/7r7kdb/cfr6OTlfQ0ODxsfHdf/+fT19+lQXL15UW1vbc6//4948ceKEampqdObMmWyP\nuixOXjvJ+flM3J8b6rfN3W633nvvPb311luybVuHDx9WZWWlvv32W1mWpaNHj2pubk6dnZ2Kx+Oy\nLEtffvmlhoaGNDY2pu+//15VVVU6evSoLMvS6dOn9eqrr+Y6VorL5VJzc7OuXLkiSQqFQvL7/bpz\n544sy1JNTY3i8bguXbqkRCIhy7I0Ojqqzs5Ozc3N6d69e9q2bZsGBwclSY2NjSorK8tlpDROXz8n\n53O73Tp//rxaWlpk27a6urpUXV2tCxcuyLIsnTx5UtFoVPv379f8/LxcLpf6+/t19+5d3b59WwMD\nA6qtrdW+fftkWZZ6e3vV2tqa61gpTl47aWPkM21/Wn/8BLFehcPh5JEjR3I9RtZEIhFFo9Fcj5E1\nwWBQTl2/SCTi2GzS7/l6enpyPUbWhMNhx6+f0/M5dX+Gw2H19PRYf3ZuQ/3YHAAAJ6C8AQAwDOUN\nAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4AABjGSiaT\nuZ4hIx999NGSbduO/bDh8Xi0uLiY6zGyxsn5XC6XbNvO9RhZ4+S1k1g/0yWTSVmWlesxsiKZTNof\nfvih+8/OedZ6mOWybdt15MiRXI+RNZFIRD09PbkeI2vC4bBj84XDYbE3zcX6mS0cDisajeZ6jKwI\nBoPP/cLq2G+yAAA4FeUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzl\nDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBg\nGMobAADDUN4AABhmw5X3jz/+qEOHDum1117T559//sz5iYkJHTt2TPX19friiy9Sr8/Ozqqrq0uv\nv/66Dh8+rIGBgbUcO2PDw8MKhULavXu3Pv7442fOj42N6ZVXXtGmTZvU19eXen16eloHDx7Unj17\nVFtbq08++WQtx86Y0/M5eX+yduauneT89ZuamtLXX3+tr776Sj///PMz5x89eqTvvvtOn376qW7f\nvp16PRaLaWhoSBcvXtQ333yjX375ZU3m9azJn7JO2Lat3t5effbZZyooKNCbb76pAwcOqLKyMnXN\nCy+8oHfffVc//PBD2r0ej0fvvPOOQqGQ4vG43njjDb388stp9+aabds6deqUrl+/ruLiYjU0NKi9\nvV2hUCh1zfbt23Xu3Dldvnw57V6Px6O+vj7V1dUpFoupvr5eLS0taffm2kbI59T9ydqZu3aS89cv\nmUzqxo0bamtrk8/nUyQSUXl5ufx+f+qaTZs2qbm5WRMTE2n3ulwuNTU1KRAIKJFIaHBwUKWlpWn3\nZsOG+uY9OjqqsrIyFRcXy+v1qrW1VSMjI2nX+P1+7dmzRx5P+ueaQCCQ2mw+n08VFRV68ODBms2e\niZs3b6qqqko7d+6U1+tVZ2enhoaG0q4JBAKqr69/Jl9RUZHq6uokSfn5+aqurtbMzMyazZ4Jp+dz\n8v5k7cxdO8n56xeNRrV161Zt2bJFbrdbu3bt0uTkZNo1mzdvVkFBgSzLSnvd5/MpEAhIkrxer/x+\nvxYWFrI+84Yq7wcPHqioqCh1HAwGl/WQzMzMaGxsTHv37l3N8VZsZmZGpaWlqeMdO3Ys6yGZnJzU\nrVu31NjYuJrjrZjT8zl5f7J2mVmPayc5f/0WFhaUn5+fOs7Pz19WAT958kQPHz5UMBhczfH+1IYq\n79UQj8fV3d2ts2fPyufz5XqcVReLxdTR0aH+/v60zewUTs/n5P3J2pnN6euXSCR07do1NTU1yev1\nZv3P21DlXVhYqNnZ2dRxNBpVYWFhxvcvLi6qu7tbhw4d0sGDB7Mx4oqUlJRoamoqdTw9Pa2SkpKM\n719cXFRHR4eOHz+u9vb2bIy4Ik7P5+T9ydr9tfW8dpLz1y8vL0+xWCx1HIvFlJeXl/H9tm3r6tWr\n2r17tyoqKrIx4jM2VHm/+OKLmpqa0q+//qpEIqHh4WEdOHAg4/s/+OADVVZW6tixY1mccvkaGho0\nPj6u+/fv6+nTp7p48aLa2tqee30ymUw7PnHihGpqanTmzJlsj7osTs/n5P3J2v219bx2kvPXr7Cw\nUI8fP9b8/LyWlpY0Pj6u8vLy517/x3wjIyPy+/1r+s8dG+q3zd1ut9577z299dZbsm1bhw8fVmVl\npb799ltZlqWjR49qbm5OnZ2disfjsixLX375pYaGhjQ2Nqbvv/9eVVVVOnr0qCzL0unTp/Xqq6/m\nOlaK2+3W+fPn1dLSItu21dXVperqal24cEGWZenkyZOKRqPav3+/5ufn5XK51N/fr7t37+r27dsa\nGBhQbW2t9u3bJ8uy1Nvbq9bW1lzHStkI+Zy6P1k7c9dOcv76uVwuNTc368qVK5KkUCgkv9+vO3fu\nyLIs1dTUKB6P69KlS0okErIsS6Ojo+rs7NTc3Jzu3bunbdu2aXBwUJLU2NiosrKyrM5s/fETxHoV\nDoeTR44cyfUYWROJRNTT05PrMbImHA47Nl84HBZ701ysn9nC4bCi0Wiux8iKYDConp4e68/Obagf\nmwMA4ASUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEA\nMAzlDQCAYShvAAAMQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5\nAwBgGMobAADDWMlkMtczZOSjjz5asm3bsR82PB6PFhcXcz1G1rhcLtm2nesxsiKZTMqyrFyPkTVO\nz+d2u7W0tJTrMbLG6evn5PcWl8tl//Of/3T/2TnPWg+zXLZtu44cOZLrMbImEomop6cn12NkTTgc\nllPXLxKJKBqN5nqMrAkGg47P5/Rnz+nr5+D3lud+YXXsN1kAAJyK8gYAwDCUNwAAhqG8AQAwDOUN\nAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShvAAAMQ3kDAGAY\nyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADLPhyvvHH3/UoUOH9Nprr+nzzz9/\n5vzExISOHTum+vp6ffHFF6nXZ2dn1dXVpddff12HDx/WwMDAWo6dseHhYYVCIe3evVsff/zxM+fH\nxsb0yiuvaNOmTerr60u9Pj09rYMHD2rPnj2qra3VJ598spZjZ8zp6zc1NaWvv/5aX331lX7++edn\nzj969EjfffedPv30U92+fTv1eiwW09DQkC5evKhvvvlGv/zyy1qOnREnZ5Oc/+w5ff1Me2/xrMmf\nsk7Ytq3e3l599tlnKigo0JtvvqkDBw6osrIydc0LL7ygd999Vz/88EPavR6PR++8845CoZDi8bje\neOMNvfzyy2n35ppt2zp16pSuX7+u4uJiNTQ0qL29XaFQKHXN9u3bde7cOV2+fDntXo/Ho76+PtXV\n1SkWi6m+vl4tLS1p9+aa09cvmUzqxo0bamtrk8/nUyQSUXl5ufx+f+qaTZs2qbm5WRMTE2n3ulwu\nNTU1KRAIKJFIaHBwUKWlpWn35pKTs0nOf/Y2wvqZ9t6yob55j46OqqysTMXFxfJ6vWptbdXIyEja\nNX6/X3v27JHHk/65JhAIpB4mn8+niooKPXjwYM1mz8TNmzdVVVWlnTt3yuv1qrOzU0NDQ2nXBAIB\n1dfXP5OvqKhIdXV1kqT8/HxVV1drZmZmzWbPhNPXLxqNauvWrdqyZYvcbrd27dqlycnJtGs2b96s\ngoICWZaV9rrP51MgEJAkeb1e+f1+LSwsrNXo/5aTs0nOf/acvn4mvrdsqPJ+8OCBioqKUsfBYHBZ\nf8kzMzMaGxvT3r17V3O8FZuZmVFpaWnqeMeOHct6E5icnNStW7fU2Ni4muOtmNPXb2FhQfn5+anj\n/Pz8Zb3JPXnyRA8fPlQwGFzN8VbEydkk5z97Tl8/E99bNlR5r4Z4PK7u7m6dPXtWPp8v1+Osulgs\npo6ODvX396c9rE7h9PVLJBK6du2ampqa5PV6cz3OqnJyNsn5z57T12+t31s2VHkXFhZqdnY2dRyN\nRlVYWJjx/YuLi+ru7tahQ4d08ODBbIy4IiUlJZqamkodT09Pq6SkJOP7FxcX1dHRoePHj6u9vT0b\nI66I09cvLy9PsVgsdRyLxZSXl5fx/bZt6+rVq9q9e7cqKiqyMeKyOTmb5Pxnz+nrZ+J7y4Yq7xdf\nfFFTU1P69ddflUgkNDw8rAMHDmR8/wcffKDKykodO3Ysi1MuX0NDg8bHx3X//n09ffpUFy9eVFtb\n23OvTyaTaccnTpxQTU2Nzpw5k+1Rl8Xp61dYWKjHjx9rfn5eS0tLGh8fV3l5+XOv/+P6jYyMyO/3\nr7t/DpCcnU1y/rPn9PUz8b1lQ/22udvt1nvvvae33npLtm3r8OHDqqys1LfffivLsnT06FHNzc2p\ns7NT8XhclmXpyy+/1NDQkMbGxvT999+rqqpKR48elWVZOn36tF599dVcx0pxu906f/68WlpaZNu2\nurq6VF1drQsXLsiyLJ08eVLRaFT79+/X/Py8XC6X+vv7dffuXd2+fVsDAwOqra3Vvn37ZFmWent7\n1dramutYKU5fP5fLpebmZl25ckWSFAqF5Pf7defOHVmWpZqaGsXjcV26dEmJREKWZWl0dFSdnZ2a\nm5vTvXv3tG3bNg0ODkqSGhsbVVZWlstIKU7OJjn/2dsI62fae4v1x09I61U4HE4eOXIk12NkTSQS\nUU9PT67HyJpwOCynrl8kElE0Gs31GFkTDAYdn8/pz57T18/J7y09PT3Wn53bUD82BwDACShvAAAM\nQ3kDAGAYyhsAAMNQ3gAAGIbyBgDAMJQ3AACGobwBADAM5Q0AgGEobwAADEN5AwBgGMobAADDUN4A\nABiG8gYAwDCUNwAAhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIax\nkslkrmfIyEcffTRr23Yw13Nki8fjsRcXFx37Ycrlctm2bTsyXzKZtC3LcmQ2yfn53G63vbS05Nh8\nTl8/J7+3uFyu6D//+c+iPztnTHkDAIDfOfLTCgAATkZ5AwBgGMobAADDUN4AABiG8gYAwDCUNwAA\nhqG8AQAwDOUNAIBhKG8AAAxDeQMAYBjKGwAAw1DeAAAYhvIGAMAwlDcAAIahvAEAMAzlDQCAYShv\nAAAMQ3kDAGAYyhsAAMP8P1qBrT7BINI0AAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import itertools\n", - "import random\n", - "# http://stackoverflow.com/questions/10194482/custom-matplotlib-plot-chess-board-like-table-with-colored-cells\n", - "\n", - "from matplotlib.table import Table\n", - "\n", - "def main():\n", - " grid_table(8, 8)\n", - " plt.axis('scaled')\n", - " plt.show()\n", - "\n", - "def grid_table(nrows, ncols):\n", - " fig, ax = plt.subplots()\n", - " ax.set_axis_off()\n", - " colors = ['white', 'lightgrey', 'dimgrey']\n", - " tb = Table(ax, bbox=[0,0,2,2])\n", - " for i,j in itertools.product(range(ncols), range(nrows)):\n", - " tb.add_cell(i, j, 2./ncols, 2./nrows, text='{:0.2f}'.format(0.1234), \n", - " loc='center', facecolor=random.choice(colors), edgecolor='grey') # facecolors=\n", - " ax.add_table(tb)\n", - " #ax.plot([0, .3], [.2, .2])\n", - " #ax.add_line(plt.Line2D([0.3, 0.5], [0.7, 0.7], linewidth=2, color='blue'))\n", - " return fig\n", - "\n", - "main()" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import collections\n", - "class defaultkeydict(collections.defaultdict):\n", - " \"\"\"Like defaultdict, but the default_factory is a function of the key.\n", - " >>> d = defaultkeydict(abs); d[-42]\n", - " 42\n", - " \"\"\"\n", - " def __missing__(self, key):\n", - " self[key] = self.default_factory(key)\n", - " return self[key]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" - }, - "widgets": { - "state": {}, - "version": "1.1.1" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/search.ipynb b/search.ipynb deleted file mode 100644 index d27d42f22..000000000 --- a/search.ipynb +++ /dev/null @@ -1,1885 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Solving problems by Searching\n", - "\n", - "This notebook serves as supporting material for topics covered in **Chapter 3 - Solving Problems by Searching** and **Chapter 4 - Beyond Classical Search** from the book *Artificial Intelligence: A Modern Approach.* This notebook uses implementations from [search.py](https://github.com/aimacode/aima-python/blob/master/search.py) module. Let's start by importing everything from search module." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true, - "scrolled": true - }, - "outputs": [], - "source": [ - "from search import *\n", - "\n", - "# Needed to hide warnings in the matplotlib sections\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Overview\n", - "* Problem\n", - "* Search Algorithms Visualization\n", - "* Breadth-First Tree Search\n", - "* Breadth-First Search\n", - "* Uniform Cost Search\n", - "* A\\* Search\n", - "* Genetic Algorithm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OVERVIEW\n", - "\n", - "Here, we learn about problem solving. Building goal-based agents that can plan ahead to solve problems, in particular, navigation problem/route finding problem. First, we will start the problem solving by precisely defining **problems** and their **solutions**. We will look at several general-purpose search algorithms. Broadly, search algorithms are classified into two types:\n", - "\n", - "* **Uninformed search algorithms**: Search algorithms which explore the search space without having any information about the problem other than its definition.\n", - "* Examples:\n", - " 1. Breadth First Search\n", - " 2. Depth First Search\n", - " 3. Depth Limited Search\n", - " 4. Iterative Deepening Search\n", - "\n", - "\n", - "* **Informed search algorithms**: These type of algorithms leverage any information (heuristics, path cost) on the problem to search through the search space to find the solution efficiently.\n", - "* Examples:\n", - " 1. Best First Search\n", - " 2. Uniform Cost Search\n", - " 3. A\\* Search\n", - " 4. Recursive Best First Search\n", - "\n", - "*Don't miss the visualisations of these algorithms solving the route-finding problem defined on Romania map at the end of this notebook.*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PROBLEM\n", - "\n", - "Let's see how we define a Problem. Run the next cell to see how abstract class `Problem` is defined in the search module." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource Problem" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Problem` class has six methods.\n", - "\n", - "* `__init__(self, initial, goal)` : This is what is called a `constructor` and is the first method called when you create an instance of the class. `initial` specifies the initial state of our search problem. It represents the start state from where our agent begins its task of exploration to find the goal state(s) which is given in the `goal` parameter.\n", - "\n", - "\n", - "* `actions(self, state)` : This method returns all the possible actions agent can execute in the given state `state`.\n", - "\n", - "\n", - "* `result(self, state, action)` : This returns the resulting state if action `action` is taken in the state `state`. This `Problem` class only deals with deterministic outcomes. So we know for sure what every action in a state would result to.\n", - "\n", - "\n", - "* `goal_test(self, state)` : Given a graph state, it checks if it is a terminal state. If the state is indeed a goal state, value of `True` is returned. Else, of course, `False` is returned.\n", - "\n", - "\n", - "* `path_cost(self, c, state1, action, state2)` : Return the cost of the path that arrives at `state2` as a result of taking `action` from `state1`, assuming total cost of `c` to get up to `state1`.\n", - "\n", - "\n", - "* `value(self, state)` : This acts as a bit of extra information in problems where we try to optimise a value when we cannot do a goal test." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will use the abstract class `Problem` to define our real **problem** named `GraphProblem`. You can see how we define `GraphProblem` by running the next cell." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource GraphProblem" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now it's time to define our problem. We will define it by passing `initial`, `goal`, `graph` to `GraphProblem`. So, our problem is to find the goal state starting from the given initial state on the provided graph. Have a look at our romania_map, which is an Undirected Graph containing a dict of nodes as keys and neighbours as values." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "romania_map = UndirectedGraph(dict(\n", - " Arad=dict(Zerind=75, Sibiu=140, Timisoara=118),\n", - " Bucharest=dict(Urziceni=85, Pitesti=101, Giurgiu=90, Fagaras=211),\n", - " Craiova=dict(Drobeta=120, Rimnicu=146, Pitesti=138),\n", - " Drobeta=dict(Mehadia=75),\n", - " Eforie=dict(Hirsova=86),\n", - " Fagaras=dict(Sibiu=99),\n", - " Hirsova=dict(Urziceni=98),\n", - " Iasi=dict(Vaslui=92, Neamt=87),\n", - " Lugoj=dict(Timisoara=111, Mehadia=70),\n", - " Oradea=dict(Zerind=71, Sibiu=151),\n", - " Pitesti=dict(Rimnicu=97),\n", - " Rimnicu=dict(Sibiu=80),\n", - " Urziceni=dict(Vaslui=142)))\n", - "\n", - "romania_map.locations = dict(\n", - " Arad=(91, 492), Bucharest=(400, 327), Craiova=(253, 288),\n", - " Drobeta=(165, 299), Eforie=(562, 293), Fagaras=(305, 449),\n", - " Giurgiu=(375, 270), Hirsova=(534, 350), Iasi=(473, 506),\n", - " Lugoj=(165, 379), Mehadia=(168, 339), Neamt=(406, 537),\n", - " Oradea=(131, 571), Pitesti=(320, 368), Rimnicu=(233, 410),\n", - " Sibiu=(207, 457), Timisoara=(94, 410), Urziceni=(456, 350),\n", - " Vaslui=(509, 444), Zerind=(108, 531))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "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", - "And `romania_map.locations` contains the positions of each of the nodes. We will use the straight line distance (which is different from the one provided in `romania_map`) between two cities in algorithms like A\\*-search and Recursive Best First Search.\n", - "\n", - "**Define a problem:**\n", - "Hmm... say we want to start exploring from **Arad** and try to find **Bucharest** in our romania_map. So, this is how we do it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Romania Map Visualisation\n", - "\n", - "Let's have a visualisation of Romania map [Figure 3.2] from the book and see how different searching algorithms perform / how frontier expands in each search algorithm for a simple problem named `romania_problem`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Have a look at `romania_locations`. It is a dictionary defined in search module. We will use these location values to draw the romania graph using **networkx**." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'Vaslui': (509, 444), 'Sibiu': (207, 457), 'Arad': (91, 492), 'Giurgiu': (375, 270), 'Mehadia': (168, 339), 'Eforie': (562, 293), 'Iasi': (473, 506), 'Oradea': (131, 571), 'Craiova': (253, 288), 'Urziceni': (456, 350), 'Fagaras': (305, 449), 'Pitesti': (320, 368), 'Neamt': (406, 537), 'Rimnicu': (233, 410), 'Zerind': (108, 531), 'Timisoara': (94, 410), 'Hirsova': (534, 350), 'Lugoj': (165, 379), 'Bucharest': (400, 327), 'Drobeta': (165, 299)}\n" - ] - } - ], - "source": [ - "romania_locations = romania_map.locations\n", - "print(romania_locations)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start the visualisations by importing necessary modules. We use networkx and matplotlib to show the map in the notebook and we use ipywidgets to interact with the map to see how the searching algorithm works." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import networkx as nx\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib import lines\n", - "\n", - "from ipywidgets import interact\n", - "import ipywidgets as widgets\n", - "from IPython.display import display\n", - "import time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's get started by initializing an empty graph. We will add nodes, place the nodes in their location as shown in the book, add edges to the graph." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# initialise a graph\n", - "G = nx.Graph()\n", - "\n", - "# use this while labeling nodes in the map\n", - "node_labels = dict()\n", - "# use this to modify colors of nodes while exploring the graph.\n", - "# This is the only dict we send to `show_map(node_colors)` while drawing the map\n", - "node_colors = dict()\n", - "\n", - "for n, p in romania_locations.items():\n", - " # add nodes from romania_locations\n", - " G.add_node(n)\n", - " # add nodes to node_labels\n", - " node_labels[n] = n\n", - " # node_colors to color nodes while exploring romania map\n", - " node_colors[n] = \"white\"\n", - "\n", - "# we'll save the initial node colors to a dict to use later\n", - "initial_node_colors = dict(node_colors)\n", - " \n", - "# positions for node labels\n", - "node_label_pos = { k:[v[0],v[1]-10] for k,v in romania_locations.items() }\n", - "\n", - "# use this while labeling edges\n", - "edge_labels = dict()\n", - "\n", - "# add edges between cities in romania map - UndirectedGraph defined in search.py\n", - "for node in romania_map.nodes():\n", - " connections = romania_map.get(node)\n", - " for connection in connections.keys():\n", - " distance = connections[connection]\n", - "\n", - " # add edges to the graph\n", - " G.add_edge(node, connection)\n", - " # add distances to edge_labels\n", - " edge_labels[(node, connection)] = distance" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# initialise a graph\n", - "G = nx.Graph()\n", - "\n", - "# use this while labeling nodes in the map\n", - "node_labels = dict()\n", - "# use this to modify colors of nodes while exploring the graph.\n", - "# This is the only dict we send to `show_map(node_colors)` while drawing the map\n", - "node_colors = dict()\n", - "\n", - "for n, p in romania_locations.items():\n", - " # add nodes from romania_locations\n", - " G.add_node(n)\n", - " # add nodes to node_labels\n", - " node_labels[n] = n\n", - " # node_colors to color nodes while exploring romania map\n", - " node_colors[n] = \"white\"\n", - "\n", - "# we'll save the initial node colors to a dict to use later\n", - "initial_node_colors = dict(node_colors)\n", - " \n", - "# positions for node labels\n", - "node_label_pos = { k:[v[0],v[1]-10] for k,v in romania_locations.items() }\n", - "\n", - "# use this while labeling edges\n", - "edge_labels = dict()\n", - "\n", - "# add edges between cities in romania map - UndirectedGraph defined in search.py\n", - "for node in romania_map.nodes():\n", - " connections = romania_map.get(node)\n", - " for connection in connections.keys():\n", - " distance = connections[connection]\n", - "\n", - " # add edges to the graph\n", - " G.add_edge(node, connection)\n", - " # add distances to edge_labels\n", - " edge_labels[(node, connection)] = distance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have completed building our graph based on romania_map and its locations. It's time to display it here in the notebook. This function `show_map(node_colors)` helps us do that. We will be calling this function later on to display the map at each and every interval step while searching, using variety of algorithms from the book." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def show_map(node_colors):\n", - " # set the size of the plot\n", - " plt.figure(figsize=(18,13))\n", - " # draw the graph (both nodes and edges) with locations from romania_locations\n", - " nx.draw(G, pos = romania_locations, node_color = [node_colors[node] for node in G.nodes()])\n", - "\n", - " # draw labels for nodes\n", - " node_label_handles = nx.draw_networkx_labels(G, pos = node_label_pos, labels = node_labels, font_size = 14)\n", - " # add a white bounding box behind the node labels\n", - " [label.set_bbox(dict(facecolor='white', edgecolor='none')) for label in node_label_handles.values()]\n", - "\n", - " # add edge lables to the graph\n", - " nx.draw_networkx_edge_labels(G, pos = romania_locations, edge_labels=edge_labels, font_size = 14)\n", - " \n", - " # add a legend\n", - " white_circle = lines.Line2D([], [], color=\"white\", marker='o', markersize=15, markerfacecolor=\"white\")\n", - " orange_circle = lines.Line2D([], [], color=\"orange\", marker='o', markersize=15, markerfacecolor=\"orange\")\n", - " red_circle = lines.Line2D([], [], color=\"red\", marker='o', markersize=15, markerfacecolor=\"red\")\n", - " gray_circle = lines.Line2D([], [], color=\"gray\", marker='o', markersize=15, markerfacecolor=\"gray\")\n", - " green_circle = lines.Line2D([], [], color=\"green\", marker='o', markersize=15, markerfacecolor=\"green\")\n", - " plt.legend((white_circle, orange_circle, red_circle, gray_circle, green_circle),\n", - " ('Un-explored', 'Frontier', 'Currently Exploring', 'Explored', 'Final Solution'),\n", - " numpoints=1,prop={'size':16}, loc=(.8,.75))\n", - " \n", - " # show the plot. No need to use in notebooks. nx.draw will show the graph itself.\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can simply call the function with node_colors dictionary object to display it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nTpyoCxcuWDsOAAAAAFtjGJnX6Lx6NXf7Xb2auZ9h5EusmTNnqmTJknrllVdyfL1q1ary9fWVJEVF\nReVYVoaGhqpSpUrm57/++qtMJpP+85//aPTo0SpbtqycnJx08eJFxcbGymQyKT4+Xt27d5e7u7sa\nN25s3vfTTz9Vq1at5ObmJhcXFwUGBurbb7+1OF9AQICaNWumuLg4NWzYUM7Ozqpbt642bNhgkWn5\n8uU6deqUeUn5PzP+U3h4uEqXLq3U1FSL7UlJSXJzc9PYsWNv+RneiWXLlmVb1p6enq4WLVqoatWq\nunz5sqT/fcZHjhxRy5Yt5ezsLG9vb02aNEkZGRm3PIdhGJo7d65q1qwpR0dHeXt7a/DgweZjZzGZ\nTBo/frxmzJihypUry9HRUUeOHMlxGfudfNZZ3nnnHdWqVUtFixZVvXr19MEHHyggIEABAQF3/8HZ\nAMpOFDqXL1/W7NmzFRkZae0ohV6DBg307LPPatKkSdaOAgAAYDUP6rX5gAIvISHzZkR348yZzP3z\nWHp6unbt2qW2bduqaNGieX78qVOn6scff9SSJUu0YcMGi3OEhISocuXKWrdunWbMmCFJ2rp1q1q1\naiVXV1etWrVKq1evVlJSkpo3b64TJ05YHPv48eMaOnSoIiIitH79enl7e6t79+766aefJEkTJ05U\n+/btVapUKSUkJCghISHHgk6SBg4cqLNnz2Z7ffXq1UpOTs5xefqNDMNQWlpatkeWsLAwde/eXX37\n9tWpU6ckSZMnT9bnn3+u1atXq3jx4hbHe/rpp9W6dWtt3LhRwcHBmjx5sl5++eVbZhg/frwiIiLU\npk0bbd68WaNHj1ZsbKw6dOiQrSiNjY3V1q1bNWvWLG3dulVly5a96XFv91lL0o4dOxQSEqJatWpp\n/fr1GjlypIYNG6Yff/zxtp+drWMZOwqd+fPnq23btvLx8bF2FCjzD5vatWurX79+ql+/vrXjAAAA\n3HdpaWnq06ePIiIi1LBhQ2vHAR4Mw4ZJX3996zEnT+Z+VmeWq1el556Type/+ZgGDaSYmFwd9ty5\nc7p27ZoqVqx4d7luo3Tp0tqwYUOOs0G7deuWbTbp0KFD1aJFC23atMm8rWXLlqpSpYpmz56tmH+8\nv3Pnzik+Pl7Vq1eXlHm9SW9vb7333nsaN26cqlatqlKlSsnR0fG2S7Nr166tFi1aaPHixQoKCjJv\nX7x4sdq2bavKlSvf9r1OmzZN06ZNy7b9zz//lKenpyRpyZIlql+/vnr37q3IyEhNmTJFkydPtpjZ\nmqVfv37mGaVt27Y1T5QaNmyY3N3ds42/cOGCZs+erT59+mjhwoWSpMDAQJUqVUq9e/fWli1b1Llz\nZ/N4wzC0fft2FStWzLwtMTExx/d2u89akiIjI1W7dm2LX++6devKz89PNWrUuO3nZ8uY2YlC5eLF\ni5o3bx6zOgsQDw8PRUdHKzw8XEY+LRMBAAAoyOzt7dW0aVN17NhR3bt3v+lffgHkUnr63S9FN4zM\n/R8wTz/9dI5FpyR17drV4vmxY8d0/PhxhYSEWMyMdHZ2VtOmTRUfH28xvnr16ubyTZK8vLzk5eWl\n33///a6yvvjii9q1a5eOHTsmSdq/f7+++uqrO5rVKUkvvPCC9u/fn+3xz2LS3d1dq1evVnx8vAID\nA/XEE09ozJgxOR7vn6WrJPXo0UNXrlzJtqQ/y759+5SSkqJevXpl28/e3l6ffvqpxfannnrKoui8\nldt91unp6Tpw4ICeffZZi1/vRx999I6KYlvHzE4UKjExMerYsaPFbxqwvn79+mnJkiVas2aNevbs\nae04AAAA91WRIkU0aNAgPf/881q4cKFatGihDh06KDIy8qbXuwMKvTuZURkTI40ZI6Wk5P74Tk6Z\ns0eHDs39vrfg4eGhYsWK6bfffsvT42bx9va+49fO/v8S/7CwMIWFhWUbX6FCBYvnJUuWzDbGyclJ\nf//9991EVdeuXVWmTBktXrxYs2bN0uuvv66yZcuqU6dOd7S/t7e3/Pz8bjuuSZMmqlmzpo4ePaoh\nQ4bIzi7neX+lS5fO8XnWEvgbZd174sbP1d7eXh4eHtnuTXGrX5sb3e6zPnfunFJTU+Xl5ZVt3I3v\nozBiZicKjZSUFB06dEgTJ060dhTcoEiRIlqwYIFGjRqlK1euWDsOAACAVTg7O2v06NE6duyYHn74\nYT366KMaPHiwTp8+be1owIPJ319ycLi7fe3tpUaN8jaPMouwgIAA7dixQ9fv4A7xWdfcTLmhsD1/\n/nyO4282qzOn1zw8PCRJ06dPz3GG5ObNm2+b7144ODiob9++io2N1dmzZ7VmzRqFhYXJ3j5v5+VF\nR0fr2LFj8vX11fDhw3Xp0qUcx505cybH5+XKlctxfFYh+ccff1hsT0tL0/nz57MVlrf6tcktT09P\nOTg4mAvrf7rxfRRGlJ0oNOzt7fXee++pSpUq1o6CHDz++ONq2bKlpk6dau0oAAAAVlWiRAm9/PLL\nSkxMlKOjo+rWrauxY8dmmyUE4DaaNpVymPl2R0qXztw/H4wdO1bnz5/X6NGjc3z9l19+0TfffCNJ\n5mt7/nMp9cWLF/X555/fc46aNWuqUqVK+u677+Tn55ftkXVH+NxwcnLStWvX7nj8gAEDdPHiRXXv\n3l3Xr19Xv379cn3OW9mzZ4+mTp2qqVOnavPmzbp48aIGDhyY49j33nvP4vmaNWvk6uqqevXq5Ti+\nSZMmcnR01Jo1ayy2v/vuu0pLS8vXO6IXKVJEfn5+ev/99y0uB3fw4EH98ssv+XbeBwXL2FFo2NnZ\n5cvd7pB3XnnlFdWrV08vvPAClxoAAACFnpeXl+bMmaOIiAhNnjxZNWrU0LBhwzR06FC5ublZOx5Q\n8JlM0ujR0ogRubtRkbNz5n55OBPvn5544gnzd/vo0aMKDQ1VhQoV9Ndff2nnzp1aunSpVq9eLV9f\nX7Vr104lSpRQv379FB0drevXr+uVV16Rq6vrPecwmUx67bXX1KVLF6WkpCgoKEienp46c+aMPv/8\nc1WoUEERERG5Ombt2rV14cIFLVq0SH5+fipatOhNy0Ipc9Zk586dtWHDBnXq1EkPP/zwHZ/r1KlT\n2rdvX7btFStWlLe3t/766y+FhISoVatWGjlypEwmk5YsWaKgoCAFBgaqT58+Fvu98cYbysjIUKNG\njfTxxx9r6dKlioqKUokSJXI8f8mSJTVixAhNnz5dLi4uat++vRITEzVhwgQ1a9ZMHTp0uOP3cjei\no6PVtm1bde3aVf3799e5c+cUFRWlMmXK3HSpfmFRuN89gALF29tbY8aM0bBhw6wdBQAAoMAoX768\nFi9erISEBCUmJqp69eqKiYm56+vkAYVKWJjUsGHmNTjvhJOT9Oij0gsv5GusYcOG6bPPPpO7u7tG\njhypJ598UqGhoUpMTNTixYvN1610d3fXli1bZGdnp6CgIL300ksKDw9Xy5Yt8yRH+/btFR8fr+Tk\nZPXt21eBgYEaPXq0/vjjDzW9i5mtffv2VY8ePTRu3Dj5+/vf0fU3u3fvLkl3fGOiLLGxsWratGm2\nx9tvvy1J6t+/v65du6bly5ebl5B3795dYWFhGjx4sH766SeL423atEk7duxQ586dtWrVKk2YMOG2\n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\npKdgwkRKegrJqcmcunGKN2LeoPni5iSlJOVonoULF2YuvvXXxzfffAPAN998g4WFBXFxcTmWo3v3\n7nh6ev7rfhcvXiQ8PBwvLy8cHBxwcXGhVq1aDBo0iNTU1Ee65smTJ7GwsODzzz9/5LxbtmwhMjIy\nW88pBZOFSX8VRES4e/cudnZ2RscQERERkf9ZunQpbm5uNGzYEOCBHZ0mk4n33nuP0qVL06VLF43q\nKYCOHz+Oj4/PYx2bmp5K4OJA9ibu5W763X/d387Kjjrl6hDbIzbHOjwXLlxIr169WL58Oa6urlle\nq1q1KoULF+b333/n2LFj+Pr6Zlm4Nzt1796d7777jpMnTz5wnxs3buDv74+trS0RERFUqVKFa9eu\nER8fz5IlSzhy5AhOTk4Pfc2TJ09SuXJlPvvsM7p37/5IeceMGcOUKVPu+3Lj7t27xMfH4+npiYuL\nyyOd05w9ye9VXqdh7CJi1jIyMti6dSsHDhygR48elCpVyuhIIiIiIgJ06dIly/MHDV23sLCgdu3a\nvPnmm0ydOpXJkyfTvn17je4RAObFz+PAhQMPVegEuJt+l/0X9jM/fj79a/fP0Ww1atR4YGdl4cKF\nqVevXo5e/2EsW7aMs2fPcvToUXx9fTO3v/jii0yaNClP/J7Z2dnlifdK8g4NYxcRs2ZpacmtW7fY\ntm0bgwYNMjqOiIiIiDyGpk2bEhcXxzvvvENkZCR169Zl8+bNGt5u5kwmE+9++y63Um890nG3Um/x\n7rfvGvrz83fD2Bs1akTTpk2JiYkhICAAR0dH/Pz8WLNmTZZjExIS6N69OxUqVMDBwYFKlSrx2muv\ncePGjUfOce3aNQBKly5932t/LXSmpKQwevRo3N3dsbW1pUKFCowbN+5fh7o3atSIZ5999r7trq6u\nvPzyy8D/7+q8d10LCwusrf/o33vQMPZFixbh7++PnZ0dTz31FD179uTSpUv3XSMsLIwlS5bg7e1N\noUKFePrpp9m1a9c/Zpa8TcVOETFbKSkpAAQFBfHiiy+ybNkyNm/ebHAqEREREXkcFhYWtG3blgMH\nDhAREcHAgQMJDAxU0cKM7T63m8vJlx/r2EvJl9h9bnc2J8oqPT2dtLS0zEd6evq/HpOQkMDQoUOJ\niIhgxYoVlCpVihdffJFTp05l7pOYmIi7uzsffvghmzZt4s0332TTpk08//zzj5yxTp06AHTu3JmY\n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\nmzdn5syZVKhQwei4IiIiIiIiuSI1NZVFixYxYcIEatasyaRJk/D39zc6lohIvqMxwpKrChcuzJUr\nV/Dw8ADAysoK+GOOxAEDBrB48WJ++OEHBg0axK1bt4yMKpKFyWQiPT3d6BgiIiIiUkDZ2Njw8ssv\n89NPP9GsWTNatmxJt27dOHnypNHRRETyFRU7JdcVL178ga916tSJ9957jytXruDo6JiLqUT+WXJy\nMuXLl+f8+fNGRxERERGRAsze3p7Bgwdz8uRJqlatSr169di2bZvmkxcReUgaxi550vXr1ylWrJjR\nMUSyGD16NGfOnOHzzz83OoqIiIiImIlr167h5OSEra2t0VFERPIFFTvFMCaTCQsLC6NjiDy0pKQk\nfHx8WLp0KY0aNTI6joiIiIiIiIj8hYaxi2FOnz5NWlqa0TFEHpqTkxPTpk0jPDxc83eKiIiIiIiI\n5EEqdophunTpwsaNG42OIfJIQkJCKFKkCJ9++qnRUURERERERETkLzSMXQzxww8/0LJlS3755Res\nra2NjiPySA4fPsyzzz7L8ePHKVGihNFxREREREREROR/1Nkphpg/fz49e/ZUoVPyJX9/f0JCQhgz\nZozRUURERERERETkT9TZKbkuJSUFV1dXdu3ahaenp9FxRB7L9evX8fHxYcOGDQQEBBgdR0RERERE\nRERQZ6cYYO3atfj4+KjQKflasWLFmDRpEuHh4eg7IxEREREREZG8QcVOyXXz58+nT58+RscQeWK9\ne/fmzp07LFmyxOgoIiIiIiIiIoKGsUsuS0xMpFq1apw7dw5HR0ej44g8se+++44XX3yREydO4Ozs\nbHQcEREREREREbOmzk7JVQsXLiQ4OFiFTikw6tWrR4sWLZg0aZLRUURERERERETMnjo7JddkZGRQ\nuXJlli5dSp06dYyOI5JtLl68iJ+fH99++y1VqlQxOo6IiIiImLH09HTS0tKws7MzOoqIiCHU2Sm5\nZseOHTg6OvL0008bHUUkW5UuXZrRo0czaNAgLVYkIiIiIoZr06YNO3bsMDqGiIghVOyUXDNv3jz6\n9OmDhYWF0VFEsl14eDhnzpxhzZo1RkcRERERETNmZWVFjx49GDNmjL6IFxGzpGHskitu3LhBhQoV\nOHnyJC4uLkbHEckR33zzDf369eOHH37AwcHB6DgiIiIiYqbS0tLw9fVl1qxZtGjRwug4IiK5Sp2d\n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\ndWw2m2w2m9zd3U1HAYC7UOzM4Gw2m5YuXfpY55g9e7a8vb3tlCjlXL16Vf7+/nrvvfd08eJF03EA\nGFSgQAGNHz/e4ddx9P3y1VdfZeV2wE5atWql0qVLa8iQIaajAECqxUgSAKkRxc506s4nbfd7dOjQ\nQZIUGRmphg0bPta1WrZsqWPHjtkhdcr67LPPtHv3bkVFRalYsWJ69913df78edOxANhZhw4dku59\nLi4uevLJJ/XWW2/pjz/+SNpn27Zt6tGjh8OzpMT90tXVVd27d9fhw4fl7++vgIAAvfvuu7py5YpD\nrwukNzabTZ988omWLFmidevWmY4DAACAB0SxM52KjIxMekybNu2ubR999JEkKXfu3I899MDT01M5\nc+Z87MyPIy4u7pGOy58/v6ZMmaK9e/fq9u3bKlGihPr27atz587ZOSEAk2rWrKnIyEidOHFC06dP\nV3h4eLLipp+fnzJlyuTwHCl5v/T29tbw4cO1f/9+RUdHq1ixYnr//fcZkgs8hOzZs2vatGnq0KGD\n/vzzT9NxAAAA8AAodqZTuXPnTnpkyZLlrm2ZM2eWlHwY+4kTJ2Sz2bRw4UJVrVpVnp6eKlu2rPbs\n2aN9+/apSpUq8vLy0gsvvJBsWOT/Dss8ffq0GjdurGzZsilTpkwqVqyYFi5cmPT63r17VbNmTXl6\neipbtmx3/QGxbds21a5dWzly5JCvr69eeOEF/frrr8nen81m05QpU9S0aVN5eXlpyJAhSkhIUOfO\nnVWwYEF5enqqSJEiev/995WYmPivP687c3Pt379fTk5OKlmypHr27KkzZ848wk8fQGrj7u6u3Llz\nK1++fKpdu7ZatmypH374Ien1/x3GbrPZ9Omnn6px48bKlCmT/P39tW7dOp05c0Z16tSRl5eXypQp\nk2xezDv3wrVr16pkyZLy8vJStWrV/vF+KUkrVqxQxYoV5enpqezZs6thw4aKiYm5Zy5Jevnll9Wz\nZ88Hfu+5c+fWp59+qg0bNmjz5s0qWrSo5syZw8rtwAOqV6+e6tevrz59+piOAgBGsKYxgLSGYifu\nMnz4cA0cOFA7d+5UlixZ9Prrr6tXr14KCwvT1q1bFRMTo969e9/3+B49eig6Olrr1q3T/v379eGH\nHyYVXKOiolSnTh15e3tr69atWr58uTZt2qROnTolHX/jxg21bdtWv/zyi7Zu3aoyZcqofv36dw3B\n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\nxyEqFwEBAfDw8OBUJxGRAuGZnUSkUh4+fIi4uDj069dPdBSiD1JYWIjS0lLo6OiIjkJKJDg4GBER\nETh16hQ0NDREx6myTpw4AQ8PD9StWxehoaGwsbERHUmh+Pr6IjU1Ffv37+dRMqTUys7qvH79OmrW\nrCk6DhER/T9OdhKRSrl37x63ZFKVsGXLFoSEhKCkpER0FFISsbGxWLFiBXbv3s2is4J1794dly9f\nxtChQ9GjRw9MmTIFjx49Eh1LYSxevBg3b97Etm3bREch+iB79uyBh4cHi04iIgXDspOIVErt2rWR\nnZ0tOgbRP9q8eTPS0tJQWlqK4uLiv5WaDRs2xJ49e3Djxg1BCUmZPH78GKNGjcKmTZvQqFEj0XFU\ngrq6OqZMmYJr165BKpXCysoKa9asQVFRkehowmlpaSE8PBw+Pj7IysoSHYfovchkMnh6emL27Nmi\noxAR0V+w7CQilcKyk5SFr68voqKiIJVKoa6uDjU1NQDA06dPkZKSgtu3byM5ORkJCQmCk5Kik8lk\nGD9+PAYNGoQBAwaIjqNyPvroI6xZswYnT57EgQMH0KpVKxw/flx0LOFsbGzg7e0NFxcXlJaWio5D\n9K9JJBJUr15d/vuZiIgUB8/sJCKVIpPJoKWlhby8PGhqaoqOQ/RGAwcORF5eHrp27YqrV68iIyMD\n9+7dQ15eHqRSKQwMDKCjo4OvvvoKn3/+uei4pMDWrFmD7du3IyYmBlpaWqLjqDSZTIaIiAh4enrC\nxsYGK1asgKmpqehYwpSUlKBz584YMmQIPD09RcchIiKiKoKTnUSkUiQSCWrVqsXpTlJ4n376KaKi\nohAREYFnz56hY8eO8PHxwdatW3Ho0CFEREQgIiICnTp1Eh2VFNivv/6KgIAA/PDDDyw6FYBEIsGg\nQYOQkpKC9u3bw87ODr6+vnj69Ok7Pb64uLiCE1YuNTU1bN++HUuXLkVycrLoOERUSZ4+fQoPDw+Y\nmJhAW1sbn376KS5cuCC/PS8vD9OmTUODBg2gra0NCwsLrFq1SmBiIlI26qIDEBFVtrJL2evVqyc6\nCtEbNWrUCLVr18Z3330HfX19aGlpQVtbm5fL0TvLzc2Fo6Mj1qxZo9LTg4qoWrVq8PPzw5gxY+Dn\n5wdLS0ssXboUzs7Ob9xOLpPJcPToURw+fBidOnXCiBEjKjl1xTA1NcWyZcvg5OSEuLg4XnVBpAJc\n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\nZcv0zTff6MMPP7R1OQAAoIog7AQAyGKxKD8CGnabAAAeCUlEQVQ//4qzQbOysmSxWHTixInrdjIs\nKCiQp6en4uLi9NRTT131ujNnzsjT01MpKSkKDw+XJLVv316FhYVatGiRvL29NWzYMJWUlGj16tXs\nCVnJvL299f3331v3u7tRP//8szp06KDk5GTrrCoAsKW8vDxZLBZ5eXnZuhQAAFBFsLENAEAmk0ke\nHh7y8PDQww8/XO786dOn5eDgcNXXX95v8+DBgzKZTNa9On9//vI4krRy5Urdc889CgoKkiRt2bJF\nKSkp2rVrlzVEmzt3rpo3b66DBw+qWbNmlfKc+M3ljuw3E3ZevHhRAwYM0PTp0wk6AVQZ9evXt3UJ\nAACgirn59WsAgGrnesvYzWazJGnv3r1ydXWVm5tbmfO/bz6UmJioyZMn6+WXX1bdunV16dIlrVu3\nTt7e3goJCdGvv/4qSapTp468vLyUnp5+m56q+rocdt6McePGKTg4WM8999xtqgoArq2kpEQsSgMA\nANdD2AkAqDQZGRny9PS0NjuyWCwqLS2VnZ2dCgoKNH78eE2aNEmjR4/WjBkzJEmXLl3S3r171aRJ\nE0n/C07z8vLk4eGhX375xXovVI6bDTuXL1+udevW6d1336WjJQCbefzxx5WcnGzrMgAAQBXHMnYA\nQIVYLBadPXtW7u7u2rdvn3x9fVWnTh1JvwWXNWrUUFpaml588UWdPXtWCxcuVERERJnZnnl5edal\n6pdDzZycHNWoUaNCXeJxZUFBQdq0adMNXXvgwAGNGTNGa9assf67AsCddvDgQaWlpalDhw62LgUA\nAFRxhJ0AgAo5duyYunfvrqKiIh06dEh+fn5655131KlTJ7Vr104JCQmaPXu22rdvr9dff12urq6S\nftu/02KxyNXVVYWFhdbO3jVq1JAkpaWlydHRUX5+ftbrLyspKVGfPn3KdY739fXVPffcc4ffgbtP\nkyZNbmhmZ3FxsQYOHKgJEyZYG0kBgC3ExcVp8ODB122UBwAAQDd2AECFWCwWpaena+fOncrNzdX2\n7du1fft2tWnTRvPnz1erVq105swZRUREKCwsTMHBwQoKClLLli3l4OAgOzs7DR06VIcPH9ayZcvU\nsGFDSVJoaKjatGmj2bNnWwPSy0pKSrR27dpyneOPHTumRo0alQtBAwMD5efnd80mS9VJUVGR6tat\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "show_map(node_colors)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! You see, the romania map as shown in the Figure[3.2] in the book. Now, see how different searching algorithms perform with our problem statements." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SEARCHING ALGORITHMS VISUALIZATION\n", - "\n", - "In this section, we have visualizations of the following searching algorithms:\n", - "\n", - "1. Breadth First Tree Search - Implemented\n", - "2. Depth First Tree Search\n", - "3. Depth First Graph Search\n", - "4. Breadth First Search - Implemented\n", - "5. Best First Graph Search\n", - "6. Uniform Cost Search - Implemented\n", - "7. Depth Limited Search\n", - "8. Iterative Deepening Search\n", - "9. A\\*-Search - Implemented\n", - "10. Recursive Best First Search\n", - "\n", - "We add the colors to the nodes to have a nice visualisation when displaying. So, these are the different colors we are using in these visuals:\n", - "* Un-explored nodes - white\n", - "* Frontier nodes - orange\n", - "* Currently exploring node - red\n", - "* Already explored nodes - gray\n", - "\n", - "Now, we will define some helper methods to display interactive buttons and sliders when visualising search algorithms." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def final_path_colors(problem, solution):\n", - " \"returns a node_colors dict of the final path provided the problem and solution\"\n", - " \n", - " # get initial node colors\n", - " final_colors = dict(initial_node_colors)\n", - " # color all the nodes in solution and starting node to green\n", - " final_colors[problem.initial] = \"green\"\n", - " for node in solution:\n", - " final_colors[node] = \"green\" \n", - " return final_colors\n", - "\n", - "\n", - "def display_visual(user_input, algorithm=None, problem=None):\n", - " if user_input == False:\n", - " def slider_callback(iteration):\n", - " # don't show graph for the first time running the cell calling this function\n", - " try:\n", - " show_map(all_node_colors[iteration])\n", - " except:\n", - " pass\n", - " def visualize_callback(Visualize):\n", - " if Visualize is True:\n", - " button.value = False\n", - " \n", - " global all_node_colors\n", - " \n", - " iterations, all_node_colors, node = algorithm(problem)\n", - " solution = node.solution()\n", - " all_node_colors.append(final_path_colors(problem, solution))\n", - " \n", - " slider.max = len(all_node_colors) - 1\n", - " \n", - " for i in range(slider.max + 1):\n", - " slider.value = i\n", - " #time.sleep(.5)\n", - " \n", - " slider = widgets.IntSlider(min=0, max=1, step=1, value=0)\n", - " slider_visual = widgets.interactive(slider_callback, iteration = slider)\n", - " display(slider_visual)\n", - "\n", - " button = widgets.ToggleButton(value = False)\n", - " button_visual = widgets.interactive(visualize_callback, Visualize = button)\n", - " display(button_visual)\n", - " \n", - " if user_input == True:\n", - " node_colors = dict(initial_node_colors)\n", - " if algorithm == None:\n", - " algorithms = {\"Breadth First Tree Search\": breadth_first_tree_search,\n", - " \"Breadth First Search\": breadth_first_search,\n", - " \"Uniform Cost Search\": uniform_cost_search,\n", - " \"A-star Search\": astar_search}\n", - " algo_dropdown = widgets.Dropdown(description = \"Search algorithm: \",\n", - " options = sorted(list(algorithms.keys())),\n", - " value = \"Breadth First Tree Search\")\n", - " display(algo_dropdown)\n", - " \n", - " def slider_callback(iteration):\n", - " # don't show graph for the first time running the cell calling this function\n", - " try:\n", - " show_map(all_node_colors[iteration])\n", - " except:\n", - " pass\n", - " \n", - " def visualize_callback(Visualize):\n", - " if Visualize is True:\n", - " button.value = False\n", - " \n", - " problem = GraphProblem(start_dropdown.value, end_dropdown.value, romania_map)\n", - " global all_node_colors\n", - " \n", - " if algorithm == None:\n", - " user_algorithm = algorithms[algo_dropdown.value]\n", - " \n", - "# print(user_algorithm)\n", - "# print(problem)\n", - " \n", - " iterations, all_node_colors, node = user_algorithm(problem)\n", - " solution = node.solution()\n", - " all_node_colors.append(final_path_colors(problem, solution))\n", - "\n", - " slider.max = len(all_node_colors) - 1\n", - " \n", - " for i in range(slider.max + 1):\n", - " slider.value = i\n", - "# time.sleep(.5)\n", - " \n", - " start_dropdown = widgets.Dropdown(description = \"Start city: \",\n", - " options = sorted(list(node_colors.keys())), value = \"Arad\")\n", - " display(start_dropdown)\n", - "\n", - " end_dropdown = widgets.Dropdown(description = \"Goal city: \",\n", - " options = sorted(list(node_colors.keys())), value = \"Fagaras\")\n", - " display(end_dropdown)\n", - " \n", - " button = widgets.ToggleButton(value = False)\n", - " button_visual = widgets.interactive(visualize_callback, Visualize = button)\n", - " display(button_visual)\n", - " \n", - " slider = widgets.IntSlider(min=0, max=1, step=1, value=0)\n", - " slider_visual = widgets.interactive(slider_callback, iteration = slider)\n", - " display(slider_visual)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BREADTH-FIRST TREE SEARCH\n", - "\n", - "We have a working implementation in search module. But as we want to interact with the graph while it is searching, we need to modify the implementation. Here's the modified breadth first tree search." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def tree_search(problem, frontier):\n", - " \"\"\"Search through the successors of a problem to find a goal.\n", - " The argument frontier should be an empty queue.\n", - " Don't worry about repeated paths to a state. [Figure 3.7]\"\"\"\n", - " \n", - " # we use these two variables at the time of visualisations\n", - " iterations = 0\n", - " all_node_colors = []\n", - " node_colors = dict(initial_node_colors)\n", - " \n", - " #Adding first node to the queue\n", - " frontier.append(Node(problem.initial))\n", - " \n", - " node_colors[Node(problem.initial).state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " while frontier:\n", - " #Popping first node of queue\n", - " node = frontier.pop()\n", - " \n", - " # modify the currently searching node to red\n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " # modify goal node to green after reaching the goal\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " frontier.extend(node.expand(problem))\n", - " \n", - " for n in node.expand(problem):\n", - " node_colors[n.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - "\n", - " # modify the color of explored nodes to gray\n", - " node_colors[node.state] = \"gray\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " return None\n", - "\n", - "def breadth_first_tree_search(problem):\n", - " \"Search the shallowest nodes in the search tree first.\"\n", - " iterations, all_node_colors, node = tree_search(problem, FIFOQueue())\n", - " return(iterations, all_node_colors, node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we use ipywidgets to display a slider, a button and our romania map. By sliding the slider we can have a look at all the intermediate steps of a particular search algorithm. By pressing the button **Visualize**, you can see all the steps without interacting with the slider. These two helper functions are the callback functions which are called when we interact with the slider and the button.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "all_node_colors = []\n", - "romania_problem = GraphProblem('Arad', 'Fagaras', romania_map)\n", - "display_visual(user_input = False, algorithm = breadth_first_tree_search, problem = romania_problem)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## BREADTH-FIRST SEARCH\n", - "\n", - "Let's change all the node_colors to starting position and define a different problem statement." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def breadth_first_search(problem):\n", - " \"[Figure 3.11]\"\n", - " \n", - " # we use these two variables at the time of visualisations\n", - " iterations = 0\n", - " all_node_colors = []\n", - " node_colors = dict(initial_node_colors)\n", - " \n", - " node = Node(problem.initial)\n", - " \n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " frontier = FIFOQueue()\n", - " frontier.append(node)\n", - " \n", - " # modify the color of frontier nodes to blue\n", - " node_colors[node.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " explored = set()\n", - " while frontier:\n", - " node = frontier.pop()\n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " explored.add(node.state) \n", - " \n", - " for child in node.expand(problem):\n", - " if child.state not in explored and child not in frontier:\n", - " if problem.goal_test(child.state):\n", - " node_colors[child.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, child)\n", - " frontier.append(child)\n", - "\n", - " node_colors[child.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " node_colors[node.state] = \"gray\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return None" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "all_node_colors = []\n", - "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n", - "display_visual(user_input = False, algorithm = breadth_first_search, problem = romania_problem)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## UNIFORM COST SEARCH\n", - "\n", - "Let's change all the node_colors to starting position and define a different problem statement." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def best_first_graph_search(problem, f):\n", - " \"\"\"Search the nodes with the lowest f scores first.\n", - " You specify the function f(node) that you want to minimize; for example,\n", - " if f is a heuristic estimate to the goal, then we have greedy best\n", - " first search; if f is node.depth then we have breadth-first search.\n", - " There is a subtlety: the line \"f = memoize(f, 'f')\" means that the f\n", - " values will be cached on the nodes as they are computed. So after doing\n", - " a best first search you can examine the f values of the path returned.\"\"\"\n", - " \n", - " # we use these two variables at the time of visualisations\n", - " iterations = 0\n", - " all_node_colors = []\n", - " node_colors = dict(initial_node_colors)\n", - " \n", - " f = memoize(f, 'f')\n", - " node = Node(problem.initial)\n", - " \n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " frontier = PriorityQueue(min, f)\n", - " frontier.append(node)\n", - " \n", - " node_colors[node.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " explored = set()\n", - " while frontier:\n", - " node = frontier.pop()\n", - " \n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " explored.add(node.state)\n", - " for child in node.expand(problem):\n", - " if child.state not in explored and child not in frontier:\n", - " frontier.append(child)\n", - " node_colors[child.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " elif child in frontier:\n", - " incumbent = frontier[child]\n", - " if f(child) < f(incumbent):\n", - " del frontier[incumbent]\n", - " frontier.append(child)\n", - " node_colors[child.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - "\n", - " node_colors[node.state] = \"gray\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return None\n", - "\n", - "def uniform_cost_search(problem):\n", - " \"[Figure 3.14]\"\n", - " iterations, all_node_colors, node = best_first_graph_search(problem, lambda node: node.path_cost)\n", - " return(iterations, all_node_colors, node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## A\\* SEARCH\n", - "\n", - "Let's change all the node_colors to starting position and define a different problem statement." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "all_node_colors = []\n", - "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n", - "display_visual(user_input = False, algorithm = uniform_cost_search, problem = romania_problem)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def best_first_graph_search(problem, f):\n", - " \"\"\"Search the nodes with the lowest f scores first.\n", - " You specify the function f(node) that you want to minimize; for example,\n", - " if f is a heuristic estimate to the goal, then we have greedy best\n", - " first search; if f is node.depth then we have breadth-first search.\n", - " There is a subtlety: the line \"f = memoize(f, 'f')\" means that the f\n", - " values will be cached on the nodes as they are computed. So after doing\n", - " a best first search you can examine the f values of the path returned.\"\"\"\n", - " \n", - " # we use these two variables at the time of visualisations\n", - " iterations = 0\n", - " all_node_colors = []\n", - " node_colors = dict(initial_node_colors)\n", - " \n", - " f = memoize(f, 'f')\n", - " node = Node(problem.initial)\n", - " \n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " frontier = PriorityQueue(min, f)\n", - " frontier.append(node)\n", - " \n", - " node_colors[node.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " explored = set()\n", - " while frontier:\n", - " node = frontier.pop()\n", - " \n", - " node_colors[node.state] = \"red\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " \n", - " if problem.goal_test(node.state):\n", - " node_colors[node.state] = \"green\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return(iterations, all_node_colors, node)\n", - " \n", - " explored.add(node.state)\n", - " for child in node.expand(problem):\n", - " if child.state not in explored and child not in frontier:\n", - " frontier.append(child)\n", - " node_colors[child.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " elif child in frontier:\n", - " incumbent = frontier[child]\n", - " if f(child) < f(incumbent):\n", - " del frontier[incumbent]\n", - " frontier.append(child)\n", - " node_colors[child.state] = \"orange\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - "\n", - " node_colors[node.state] = \"gray\"\n", - " iterations += 1\n", - " all_node_colors.append(dict(node_colors))\n", - " return None\n", - "\n", - "def astar_search(problem, h=None):\n", - " \"\"\"A* search is best-first graph search with f(n) = g(n)+h(n).\n", - " You need to specify the h function when you call astar_search, or\n", - " else in your Problem subclass.\"\"\"\n", - " h = memoize(h or problem.h, 'h')\n", - " iterations, all_node_colors, node = best_first_graph_search(problem, lambda n: n.path_cost + h(n))\n", - " return(iterations, all_node_colors, node)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "all_node_colors = []\n", - "romania_problem = GraphProblem('Arad', 'Bucharest', romania_map)\n", - "display_visual(user_input = False, algorithm = astar_search, problem = romania_problem)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true, - "scrolled": false - }, - "outputs": [], - "source": [ - "all_node_colors = []\n", - "# display_visual(user_input = True, algorithm = breadth_first_tree_search)\n", - "display_visual(user_input = True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GENETIC ALGORITHM\n", - "\n", - "Genetic algorithms (or GA) are inspired by natural evolution and are particularly useful in optimization and search problems with large state spaces.\n", - "\n", - "Given a problem, algorithms in the domain make use of a *population* of solutions (also called *states*), where each solution/state represents a feasible solution. At each iteration (often called *generation*), the population gets updated using methods inspired by biology and evolution, like *crossover*, *mutation* and *natural selection*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Overview\n", - "\n", - "A genetic algorithm works in the following way:\n", - "\n", - "1) Initialize random population.\n", - "\n", - "2) Calculate population fitness.\n", - "\n", - "3) Select individuals for mating.\n", - "\n", - "4) Mate selected individuals to produce new population.\n", - "\n", - " * Random chance to mutate individuals.\n", - "\n", - "5) Repeat from step 2) until an individual is fit enough or the maximum number of iterations was reached." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Glossary\n", - "\n", - "Before we continue, we will lay the basic terminology of the algorithm.\n", - "\n", - "* Individual/State: A list of elements (called *genes*) that represent possible solutions.\n", - "\n", - "* Population: The list of all the individuals/states.\n", - "\n", - "* Gene pool: The alphabet of possible values for an individual's genes.\n", - "\n", - "* Generation/Iteration: The number of times the population will be updated.\n", - "\n", - "* Fitness: An individual's score, calculated by a function specific to the problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Crossover\n", - "\n", - "Two individuals/states can \"mate\" and produce one child. This offspring bears characteristics from both of its parents. There are many ways we can implement this crossover. Here we will take a look at the most common ones. Most other methods are variations of those below.\n", - "\n", - "* Point Crossover: The crossover occurs around one (or more) point. The parents get \"split\" at the chosen point or points and then get merged. In the example below we see two parents get split and merged at the 3rd digit, producing the following offspring after the crossover.\n", - "\n", - "![point crossover](images/point_crossover.png)\n", - "\n", - "* Uniform Crossover: This type of crossover chooses randomly the genes to get merged. Here the genes 1, 2 and 5 were chosen from the first parent, so the genes 3, 4 were added by the second parent.\n", - "\n", - "![uniform crossover](images/uniform_crossover.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mutation\n", - "\n", - "When an offspring is produced, there is a chance it will mutate, having one (or more, depending on the implementation) of its genes altered.\n", - "\n", - "For example, let's say the new individual to undergo mutation is \"abcde\". Randomly we pick to change its third gene to 'z'. The individual now becomes \"abzde\" and is added to the population." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selection\n", - "\n", - "At each iteration, the fittest individuals are picked randomly to mate and produce offsprings. We measure an individual's fitness with a *fitness function*. That function depends on the given problem and it is used to score an individual. Usually the higher the better.\n", - "\n", - "The selection process is this:\n", - "\n", - "1) Individuals are scored by the fitness function.\n", - "\n", - "2) Individuals are picked randomly, according to their score (higher score means higher chance to get picked). Usually the formula to calculate the chance to pick an individual is the following (for population *P* and individual *i*):\n", - "\n", - "$$ chance(i) = \\dfrac{fitness(i)}{\\sum_{k \\, in \\, P}{fitness(k)}} $$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "Below we look over the implementation of the algorithm in the `search` module.\n", - "\n", - "First the implementation of the main core of the algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource genetic_algorithm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The algorithm takes the following input:\n", - "\n", - "* `population`: The initial population.\n", - "\n", - "* `fitness_fn`: The problem's fitness function.\n", - "\n", - "* `gene_pool`: The gene pool of the states/individuals. By default 0 and 1.\n", - "\n", - "* `f_thres`: The fitness threshold. If an individual reaches that score, iteration stops. By default 'None', which means the algorithm will not halt until the generations are ran.\n", - "\n", - "* `ngen`: The number of iterations/generations.\n", - "\n", - "* `pmut`: The probability of mutation.\n", - "\n", - "The algorithm gives as output the state with the largest score." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each generation, the algorithm updates the population. First it calculates the fitnesses of the individuals, then it selects the most fit ones and finally crosses them over to produce offsprings. There is a chance that the offspring will be mutated, given by `pmut`. If at the end of the generation an individual meets the fitness threshold, the algorithm halts and returns that individual.\n", - "\n", - "The function of mating is accomplished by the method `reproduce`:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource reproduce" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The method picks at random a point and merges the parents (`x` and `y`) around it.\n", - "\n", - "The mutation is done in the method `mutate`:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource mutate" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We pick a gene in `x` to mutate and a gene from the gene pool to replace it with.\n", - "\n", - "To help initializing the population we have the helper function `init_population`\":" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource init_population" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The function takes as input the number of individuals in the population, the gene pool and the length of each individual/state. It creates individuals with random genes and returns the population when done." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Usage\n", - "\n", - "Below we give two example usages for the genetic algorithm, for a graph coloring problem and the 8 queens problem.\n", - "\n", - "#### Graph Coloring\n", - "\n", - "First we will take on the simpler problem of coloring a small graph with two colors. Before we do anything, let's imagine how a solution might look. First, we have to represent our colors. Say, 'R' for red and 'G' for green. These make up our gene pool. What of the individual solutions though? For that, we will look at our problem. We stated we have a graph. A graph has nodes and edges, and we want to color the nodes. Naturally, we want to store each node's color. If we have four nodes, we can store their colors in a list of genes, one for each node. A possible solution will then look like this: ['R', 'R', 'G', 'R']. In the general case, we will represent each solution with a list of chars ('R' and 'G'), with length the number of nodes.\n", - "\n", - "Next we need to come up with a fitness function that appropriately scores individuals. Again, we will look at the problem definition at hand. We want to color a graph. For a solution to be optimal, no edge should connect two nodes of the same color. How can we use this information to score a solution? A naive (and ineffective) approach would be to count the different colors in the string. So ['R', 'R', 'R', 'R'] has a score of 1 and ['R', 'R', 'G', 'G'] has a score of 2. Why that fitness function is not ideal though? Why, we forgot the information about the edges! The edges are pivotal to the problem and the above function only deals with node colors. We didn't use all the information at hand and ended up with an ineffective answer. How, then, can we use that information to our advantage?\n", - "\n", - "We said that the optimal solution will have all the edges connecting nodes of different color. So, to score a solution we can count how many edges are valid (aka connecting nodes of different color). That is a great fitness function!\n", - "\n", - "Let's jump into solving this problem using the `genetic_algorithm` function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to represent the graph. Since we mostly need information about edges, we will just store the edges. We will denote edges with capital letters and nodes with integers:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "edges = {\n", - " 'A': [0, 1],\n", - " 'B': [0, 3],\n", - " 'C': [1, 2],\n", - " 'D': [2, 3]\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Edge 'A' connects nodes 0 and 1, edge 'B' connects nodes 0 and 3 etc.\n", - "\n", - "We already said our gene pool is 'R' and 'G', so we can jump right into initializing our population. Since we have only four nodes, `state_length` should be 4. For the number of individuals, we will try 8. We can increase this number if we need higher accuracy, but be careful! Larger populations need more computating power and take longer. You need to strike that sweet balance between accuracy and cost (the ultimate dilemma of the programmer!)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[['R', 'G', 'G', 'R'], ['R', 'G', 'R', 'R'], ['G', 'R', 'G', 'R'], ['R', 'G', 'R', 'G'], ['G', 'R', 'R', 'G'], ['G', 'R', 'G', 'R'], ['G', 'R', 'R', 'R'], ['R', 'G', 'G', 'G']]\n" - ] - } - ], - "source": [ - "population = init_population(8, ['R', 'G'], 4)\n", - "print(population)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We created and printed the population. You can see that the genes in the individuals are random and there are 8 individuals each with 4 genes.\n", - "\n", - "Next we need to write our fitness function. We previously said we want the function to count how many edges are valid. So, given a coloring/individual `c`, we will do just that:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def fitness(c):\n", - " return sum(c[n1] != c[n2] for (n1, n2) in edges.values())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Now we will run the genetic algorithm and see what solution it gives." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['R', 'G', 'R', 'G']\n" - ] - } - ], - "source": [ - "solution = genetic_algorithm(population, fitness, gene_pool=['R', 'G'])\n", - "print(solution)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The algorithm converged to a solution. Let's check its score:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n" - ] - } - ], - "source": [ - "print(fitness(solution))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The solution has a score of 4. Which means it is optimal, since we have exactly 4 edges in our graph, meaning all are valid!\n", - "\n", - "*NOTE: Because the algorithm is non-deterministic, there is a chance a different solution is given. It might even be wrong, if we are very unlucky!*" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Eight Queens\n", - "\n", - "Let's take a look at a more complicated problem.\n", - "\n", - "In the *Eight Queens* problem, we are tasked with placing eight queens on an 8x8 chessboard without any queen threatening the others (aka queens should not be in the same row, column or diagonal). In its general form the problem is defined as placing *N* queens in an NxN chessboard without any conflicts.\n", - "\n", - "First we need to think about the representation of each solution. We can go the naive route of representing the whole chessboard with the queens' placements on it. That is definitely one way to go about it, but for the purpose of this tutorial we will do something different. We have eight queens, so we will have a gene for each of them. The gene pool will be numbers from 0 to 7, for the different columns. The *position* of the gene in the state will denote the row the particular queen is placed in.\n", - "\n", - "For example, we can have the state \"03304577\". Here the first gene with a value of 0 means \"the queen at row 0 is placed at column 0\", for the second gene \"the queen at row 1 is placed at column 3\" and so forth.\n", - "\n", - "We now need to think about the fitness function. On the graph coloring problem we counted the valid edges. The same thought process can be applied here. Instead of edges though, we have positioning between queens. If two queens are not threatening each other, we say they are at a \"non-attacking\" positioning. We can, therefore, count how many such positionings are there.\n", - "\n", - "Let's dive right in and initialize our population:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0, 2, 7, 1, 7, 3, 2, 4], [2, 7, 5, 4, 4, 5, 2, 0], [7, 1, 6, 0, 1, 3, 0, 2], [0, 3, 6, 1, 3, 0, 5, 4], [0, 4, 6, 4, 7, 4, 1, 6]]\n" - ] - } - ], - "source": [ - "population = init_population(100, range(8), 8)\n", - "print(population[:5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We have a population of 100 and each individual has 8 genes. The gene pool is the integers from 0 to 7, in string form. Above you can see the first five individuals.\n", - "\n", - "Next we need to write our fitness function. Remember, queens threaten each other if they are at the same row, column or diagonal.\n", - "\n", - "Since positionings are mutual, we must take care not to count them twice. Therefore for each queen, we will only check for conflicts for the queens after her.\n", - "\n", - "A gene's value in an individual `q` denotes the queen's column, and the position of the gene denotes its row. We can check if the aforementioned values between two genes are the same. We also need to check for diagonals. A queen *a* is in the diagonal of another queen, *b*, if the difference of the rows between them is equal to either their difference in columns (for the diagonal on the right of *a*) or equal to the negative difference of their columns (for the left diagonal of *a*). Below is given the fitness function." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def fitness(q):\n", - " non_attacking = 0\n", - " for row1 in range(len(q)):\n", - " for row2 in range(row1+1, len(q)):\n", - " col1 = int(q[row1])\n", - " col2 = int(q[row2])\n", - " row_diff = row1 - row2\n", - " col_diff = col1 - col2\n", - "\n", - " if col1 != col2 and row_diff != col_diff and row_diff != -col_diff:\n", - " non_attacking += 1\n", - "\n", - " return non_attacking" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the best score achievable is 28. That is because for each queen we only check for the queens after her. For the first queen we check 7 other queens, for the second queen 6 others and so on. In short, the number of checks we make is the sum 7+6+5+...+1. Which is equal to 7\\*(7+1)/2 = 28.\n", - "\n", - "Because it is very hard and will take long to find a perfect solution, we will set the fitness threshold at 25. If we find an individual with a score greater or equal to that, we will halt. Let's see how the genetic algorithm will fare." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5, 0, 6, 3, 7, 4, 1, 3]\n", - "26\n" - ] - } - ], - "source": [ - "solution = genetic_algorithm(population, fitness, f_thres=25, gene_pool=range(8))\n", - "print(solution)\n", - "print(fitness(solution))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Above you can see the solution and its fitness score, which should be no less than 25." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With that this tutorial on the genetic algorithm comes to an end. Hope you found this guide helpful!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2+" - }, - "widgets": { - "state": { - "013d8df0a2ab4899b09f83aa70ce5d50": { - "views": [] - }, - "01ee7dc2239c4b0095710436453b362d": { - "views": [] - }, - "04d594ae6a704fc4b16895e6a7b85270": { - "views": [] - }, - "052ea3e7259346a4b022ec4fef1fda28": { - "views": [ - { - "cell_index": 32 - } - ] - }, - "0ade4328785545c2b66d77e599a3e9da": { - "views": [ - { - "cell_index": 29 - } - ] - }, - "0b94d8de6b4e47f89b0382b60b775cbd": { - "views": [] - }, - "0c63dcc0d11a451ead31a4c0c34d7b43": { - "views": [] - }, - "0d91be53b6474cdeac3239fdffeab908": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "0fe9c3b9b1264d4abd22aef40a9c1ab9": { - "views": [] - }, - "10fd06131b05455d9f0a98072d7cebc6": { - "views": [] - }, - "1193eaa60bb64cb790236d95bf11f358": { - "views": [ - { - "cell_index": 38 - } - ] - }, - "11b596cbf81a47aabccae723684ac3a5": { - "views": [] - }, - "127ae5faa86f41f986c39afb320f2298": { - "views": [] - }, - "16a9167ec7b4479e864b2a32e40825a1": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "170e2e101180413f953a192a41ecbfcc": { - "views": [] - }, - "181efcbccf89478792f0e38a25500e51": { - "views": [] - }, - "1894a28092604d69b0d7d465a3b165b1": { - "views": [] - }, - "1a56cc2ab5ae49ea8bf2a3f6ca2b1c36": { - "views": [] - }, - "1cfd8f392548467696d8cd4fc534a6b4": { - "views": [] - }, - "1e395e67fdec406f8698aa5922764510": { - "views": [] - }, - "23509c6536404e96985220736d286183": { - "views": [] - }, - "23bffaca1206421fb9ea589126e35438": { - "views": [] - }, - "25330d0b799e4f02af5e510bc70494cf": { - "views": [] - }, - "2ab8bf4795ac4240b70e1a94e14d1dd6": { - "views": [ - { - "cell_index": 30 - } - ] - }, - "2bd48f1234e4422aaedecc5815064181": { - "views": [] - }, - "2d3a082066304c8ebf2d5003012596b4": { - "views": [] - }, - "2dc962f16fd143c1851aaed0909f3963": { - "views": [ - { - "cell_index": 35 - } - ] - }, - "2f659054242a453da5ea0884de996008": { - "views": [] - }, - "30a214881db545729c1b883878227e95": { - "views": [] - }, - "3275b81616424947be98bf8fd3cd7b82": { - "views": [] - }, - "330b52bc309d4b6a9b188fd9df621180": { - "views": [] - }, - "3320648123f44125bcfda3b7c68febcf": { - "views": [] - }, - "338e3b1562e747f197ab3ceae91e371f": { - "views": [] - }, - "34658e2de2894f01b16cf89905760f14": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "352f5fd9f698460ea372c6af57c5b478": { - "views": [] - }, - "35dc16b828a74356b56cd01ff9ddfc09": { - "views": [] - }, - "3805ce2994364bd1b259373d8798cc7a": { - "views": [] - }, - "3d1f1f899cfe49aaba203288c61686ac": { - "views": [] - }, - "3d7e943e19794e29b7058eb6bbe23c66": { - "views": [] - }, - "3f6652b3f85740949b7711fbcaa509ba": { - "views": [] - }, - "43e48664a76342c991caeeb2d5b17a49": { - "views": [ - { - "cell_index": 35 - } - ] - }, - "4662dec8595f45fb9ae061b2bdf44427": { - "views": [] - }, - "47ae3d2269d94a95a567be21064eb98a": { - "views": [] - }, - "49c49d665ba44746a1e1e9dc598bc411": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "4a1c43b035f644699fd905d5155ad61f": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "4eb88b6f6b4241f7b755f69b9e851872": { - "views": [] - }, - "4fbb3861e50f41c688e9883da40334d4": { - "views": [] - }, - "52d76de4ee8f4487b335a4a11726fbce": { - "views": [] - }, - "53eccc8fc0ad461cb8277596b666f32a": { - "views": [ - { - "cell_index": 29 - } - ] - }, - "54d3a6067b594ad08907ce059d9f4a41": { - "views": [] - }, - "612530d3edf8443786b3093ab612f88b": { - "views": [] - }, - "613a133b6d1f45e0ac9c5c270bc408e0": { - "views": [] - }, - "636caa7780614389a7f52ad89ea1c6e8": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "63aa621196294629b884c896b6a034d8": { - "views": [] - }, - "66d1d894cc7942c6a91f0630fc4321f9": { - "views": [] - }, - "6775928a174b43ecbe12608772f1cb05": { - "views": [] - }, - "6bce621c90d543bca50afbe0c489a191": { - "views": [] - }, - "6ebbb8c7ec174c15a6ee79a3c5b36312": { - "views": [] - }, - "743219b9d37e4f47a5f777bb41ad0a96": { - "views": [ - { - "cell_index": 29 - } - ] - }, - "774f464794cc409ca6d1106bcaac0cf1": { - "views": [] - }, - "7ba3da40fb26490697fc64b3248c5952": { - "views": [] - }, - "7e79fea4654f4bedb5969db265736c25": { - "views": [] - }, - "85c82ed0844f4ae08a14fd750e55fc15": { - "views": [] - }, - "86e8f92c1d584cdeb13b36af1b6ad695": { - "views": [ - { - "cell_index": 35 - } - ] - }, - "88485e72d2ec447ba7e238b0a6de2839": { - "views": [] - }, - "892d7b895d3840f99504101062ba0f65": { - "views": [] - }, - "89be4167713e488696a20b9b5ddac9bd": { - "views": [] - }, - "8a24a07d166b45498b7d8b3f97c131eb": { - "views": [] - }, - "8e7c7f3284ee45b38d95fe9070d5772f": { - "views": [] - }, - "98985eefab414365991ed6844898677f": { - "views": [] - }, - "98df98e5af87474d8b139cb5bcbc9792": { - "views": [] - }, - "99f11243d387409bbad286dd5ecb1725": { - "views": [] - }, - "9ab2d641b0be4cf8950be5ba72e5039f": { - "views": [] - }, - "9b1ffbd1e7404cb4881380a99c7d11bc": { - "views": [] - }, - "9c07ec6555cb4d0ba8b59007085d5692": { - "views": [] - }, - "9cc80f47249b4609b98223ce71594a3d": { - "views": [] - }, - "9d79bfd34d3640a3b7156a370d2aabae": { - "views": [] - }, - "a015f138cbbe4a0cad4d72184762ed75": { - "views": [] - }, - "a27d2f1eb3834c38baf1181b0de93176": { - "views": [] - }, - "a29b90d050f3442a89895fc7615ccfee": { - "views": [ - { - "cell_index": 29 - } - ] - }, - "a725622cfc5b43b4ae14c74bc2ad7ad0": { - "views": [] - }, - "ac2e05d7d7e945bf99862a2d9d1fa685": { - "views": [] - }, - "b0bb2ca65caa47579a4d3adddd94504b": { - "views": [] - }, - "b8995c40625d465489e1b7ec8014b678": { - "views": [] - }, - "ba83da1373fe45d19b3c96a875f2f4fb": { - "views": [] - }, - "baa0040d35c64604858c529418c22797": { - "views": [] - }, - "badc9fd7b56346d6b6aea68bfa6d2699": { - "views": [ - { - "cell_index": 38 - } - ] - }, - "bdb41c7654e54c83a91452abc59141bd": { - "views": [] - }, - "c2399056ef4a4aa7aa4e23a0f381d64a": { - "views": [ - { - "cell_index": 38 - } - ] - }, - "c73b47b242b4485fb1462abcd92dc7c9": { - "views": [] - }, - "ce3f28a8aeee4be28362d068426a71f6": { - "views": [ - { - "cell_index": 32 - } - ] - }, - "d3067a6bb84544bba5f1abd241a72e55": { - "views": [] - }, - "db13a2b94de34ce9bea721aaf971c049": { - "views": [] - }, - "db468d80cb6e43b6b88455670b036618": { - "views": [] - }, - "e2cb458522b4438ea3f9873b6e411acb": { - "views": [] - }, - "e77dca31f1d94d4dadd3f95d2cdbf10e": { - "views": [] - }, - "e7bffb1fed664dea90f749ea79dcc4f1": { - "views": [ - { - "cell_index": 39 - } - ] - }, - "e80abb145fce4e888072b969ba8f455a": { - "views": [] - }, - "e839d0cf348c4c1b832fc1fc3b0bd3c9": { - "views": [] - }, - "e948c6baadde46f69f105649555b84eb": { - "views": [] - }, - "eb16e9da25bf4bef91a34b1d0565c774": { - "views": [] - }, - "ec82b64048834eafa3e53733bb54a713": { - "views": [] - }, - "edbb3a621c87445e9df4773cc60ec8d2": { - "views": [] - }, - "ef6c99705936425a975e49b9e18ac267": { - "views": [] - }, - "f1b494f025dd48d1ae58ae8e3e2ebf46": { - "views": [] - }, - "f435b108c59c42989bf209a625a3a5b5": { - "views": [ - { - "cell_index": 32 - } - ] - }, - "f71ed7e15a314c28973943046c4529d6": { - "views": [] - }, - "f81f726f001c4fb999851df532ed39f2": { - "views": [] - } - }, - "version": "1.1.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/search.py b/search.py deleted file mode 100644 index 68b77a5a8..000000000 --- a/search.py +++ /dev/null @@ -1,1324 +0,0 @@ -"""Search (Chapters 3-4) - -The way to use this code is to subclass Problem to create a class of problems, -then create problem instances and solve them with calls to the various search -functions.""" - -from utils import ( - is_in, argmin, argmax, argmax_random_tie, probability, weighted_sampler, - memoize, print_table, open_data, Stack, FIFOQueue, PriorityQueue, name, - distance -) - -from collections import defaultdict -import math -import random -import sys -import bisect - -infinity = float('inf') - -# ______________________________________________________________________________ - - -class Problem(object): - - """The abstract class for a formal problem. You should subclass - this and implement the methods actions and result, and possibly - __init__, goal_test, and path_cost. Then you will create instances - of your subclass and solve them with the various search functions.""" - - def __init__(self, initial, goal=None): - """The constructor specifies the initial state, and possibly a goal - state, if there is a unique goal. Your subclass's constructor can add - other arguments.""" - self.initial = initial - self.goal = goal - - def actions(self, state): - """Return the actions that can be executed in the given - state. The result would typically be a list, but if there are - many actions, consider yielding them one at a time in an - iterator, rather than building them all at once.""" - raise NotImplementedError - - def result(self, state, action): - """Return the state that results from executing the given - action in the given state. The action must be one of - self.actions(state).""" - raise NotImplementedError - - def goal_test(self, state): - """Return True if the state is a goal. The default method compares the - state to self.goal or checks for state in self.goal if it is a - list, as specified in the constructor. Override this method if - checking against a single self.goal is not enough.""" - if isinstance(self.goal, list): - return is_in(state, self.goal) - else: - return state == self.goal - - def path_cost(self, c, state1, action, state2): - """Return the cost of a solution path that arrives at state2 from - state1 via action, assuming cost c to get up to state1. If the problem - is such that the path doesn't matter, this function will only look at - state2. If the path does matter, it will consider c and maybe state1 - and action. The default method costs 1 for every step in the path.""" - return c + 1 - - def value(self, state): - """For optimization problems, each state has a value. Hill-climbing - and related algorithms try to maximize this value.""" - raise NotImplementedError -# ______________________________________________________________________________ - - -class Node: - - """A node in a search tree. Contains a pointer to the parent (the node - that this is a successor of) and to the actual state for this node. Note - that if a state is arrived at by two paths, then there are two nodes with - the same state. Also includes the action that got us to this state, and - the total path_cost (also known as g) to reach the node. Other functions - may add an f and h value; see best_first_graph_search and astar_search for - an explanation of how the f and h values are handled. You will not need to - subclass this class.""" - - def __init__(self, state, parent=None, action=None, path_cost=0): - """Create a search tree Node, derived from a parent by an action.""" - self.state = state - self.parent = parent - self.action = action - self.path_cost = path_cost - self.depth = 0 - if parent: - self.depth = parent.depth + 1 - - def __repr__(self): - return "".format(self.state) - - def __lt__(self, node): - return self.state < node.state - - def expand(self, problem): - """List the nodes reachable in one step from this node.""" - return [self.child_node(problem, action) - for action in problem.actions(self.state)] - - def child_node(self, problem, action): - """[Figure 3.10]""" - next = problem.result(self.state, action) - return Node(next, self, action, - problem.path_cost(self.path_cost, self.state, - action, next)) - - def solution(self): - """Return the sequence of actions to go from the root to this node.""" - return [node.action for node in self.path()[1:]] - - def path(self): - """Return a list of nodes forming the path from the root to this node.""" - node, path_back = self, [] - while node: - path_back.append(node) - node = node.parent - return list(reversed(path_back)) - - # We want for a queue of nodes in breadth_first_search or - # astar_search to have no duplicated states, so we treat nodes - # with the same state as equal. [Problem: this may not be what you - # want in other contexts.] - - def __eq__(self, other): - return isinstance(other, Node) and self.state == other.state - - def __hash__(self): - return hash(self.state) - -# ______________________________________________________________________________ - - -class SimpleProblemSolvingAgentProgram: - - """Abstract framework for a problem-solving agent. [Figure 3.1]""" - - def __init__(self, initial_state=None): - """State is an sbstract representation of the state - of the world, and seq is the list of actions required - to get to a particular state from the initial state(root).""" - self.state = initial_state - self.seq = [] - - def __call__(self, percept): - """[Figure 3.1] Formulate a goal and problem, then - search for a sequence of actions to solve it.""" - self.state = self.update_state(self.state, percept) - if not self.seq: - goal = self.formulate_goal(self.state) - problem = self.formulate_problem(self.state, goal) - self.seq = self.search(problem) - if not self.seq: - return None - return self.seq.pop(0) - - def update_state(self, percept): - raise NotImplementedError - - def formulate_goal(self, state): - raise NotImplementedError - - def formulate_problem(self, state, goal): - raise NotImplementedError - - def search(self, problem): - raise NotImplementedError - -# ______________________________________________________________________________ -# Uninformed Search algorithms - - -def tree_search(problem, frontier): - """Search through the successors of a problem to find a goal. - The argument frontier should be an empty queue. - Don't worry about repeated paths to a state. [Figure 3.7]""" - frontier.append(Node(problem.initial)) - while frontier: - node = frontier.pop() - if problem.goal_test(node.state): - return node - frontier.extend(node.expand(problem)) - return None - - -def graph_search(problem, frontier): - """Search through the successors of a problem to find a goal. - The argument frontier should be an empty queue. - If two paths reach a state, only use the first one. [Figure 3.7]""" - frontier.append(Node(problem.initial)) - explored = set() - while frontier: - node = frontier.pop() - if problem.goal_test(node.state): - return node - explored.add(node.state) - frontier.extend(child for child in node.expand(problem) - if child.state not in explored and - child not in frontier) - return None - - -def breadth_first_tree_search(problem): - """Search the shallowest nodes in the search tree first.""" - return tree_search(problem, FIFOQueue()) - - -def depth_first_tree_search(problem): - """Search the deepest nodes in the search tree first.""" - return tree_search(problem, Stack()) - - -def depth_first_graph_search(problem): - """Search the deepest nodes in the search tree first.""" - return graph_search(problem, Stack()) - - -def breadth_first_search(problem): - """[Figure 3.11]""" - node = Node(problem.initial) - if problem.goal_test(node.state): - return node - frontier = FIFOQueue() - frontier.append(node) - explored = set() - while frontier: - node = frontier.pop() - explored.add(node.state) - for child in node.expand(problem): - if child.state not in explored and child not in frontier: - if problem.goal_test(child.state): - return child - frontier.append(child) - return None - - -def best_first_graph_search(problem, f): - """Search the nodes with the lowest f scores first. - You specify the function f(node) that you want to minimize; for example, - if f is a heuristic estimate to the goal, then we have greedy best - first search; if f is node.depth then we have breadth-first search. - There is a subtlety: the line "f = memoize(f, 'f')" means that the f - values will be cached on the nodes as they are computed. So after doing - a best first search you can examine the f values of the path returned.""" - f = memoize(f, 'f') - node = Node(problem.initial) - if problem.goal_test(node.state): - return node - frontier = PriorityQueue(min, f) - frontier.append(node) - explored = set() - while frontier: - node = frontier.pop() - if problem.goal_test(node.state): - return node - explored.add(node.state) - for child in node.expand(problem): - if child.state not in explored and child not in frontier: - frontier.append(child) - elif child in frontier: - incumbent = frontier[child] - if f(child) < f(incumbent): - del frontier[incumbent] - frontier.append(child) - return None - - -def uniform_cost_search(problem): - """[Figure 3.14]""" - return best_first_graph_search(problem, lambda node: node.path_cost) - - -def depth_limited_search(problem, limit=50): - """[Figure 3.17]""" - def recursive_dls(node, problem, limit): - if problem.goal_test(node.state): - return node - elif limit == 0: - return 'cutoff' - else: - cutoff_occurred = False - for child in node.expand(problem): - result = recursive_dls(child, problem, limit - 1) - if result == 'cutoff': - cutoff_occurred = True - elif result is not None: - return result - return 'cutoff' if cutoff_occurred else None - - # Body of depth_limited_search: - return recursive_dls(Node(problem.initial), problem, limit) - - -def iterative_deepening_search(problem): - """[Figure 3.18]""" - for depth in range(sys.maxsize): - result = depth_limited_search(problem, depth) - if result != 'cutoff': - return result - -# ______________________________________________________________________________ -# Bidirectional Search -# Pseudocode from https://webdocs.cs.ualberta.ca/%7Eholte/Publications/MM-AAAI2016.pdf - -def bidirectional_search(problem): - e = problem.find_min_edge() - gF, gB = {problem.initial : 0}, {problem.goal : 0} - openF, openB = [problem.initial], [problem.goal] - closedF, closedB = [], [] - U = infinity - - - def extend(U, open_dir, open_other, g_dir, g_other, closed_dir): - """Extend search in given direction""" - n = find_key(C, open_dir, g_dir) - - open_dir.remove(n) - closed_dir.append(n) - - for c in problem.actions(n): - if c in open_dir or c in closed_dir: - if g_dir[c] <= problem.path_cost(g_dir[n], n, None, c): - continue - - open_dir.remove(c) - - g_dir[c] = problem.path_cost(g_dir[n], n, None, c) - open_dir.append(c) - - if c in open_other: - U = min(U, g_dir[c] + g_other[c]) - - return U, open_dir, closed_dir, g_dir - - - def find_min(open_dir, g): - """Finds minimum priority, g and f values in open_dir""" - m, m_f = infinity, infinity - for n in open_dir: - f = g[n] + problem.h(n) - pr = max(f, 2*g[n]) - m = min(m, pr) - m_f = min(m_f, f) - - return m, m_f, min(g.values()) - - - def find_key(pr_min, open_dir, g): - """Finds key in open_dir with value equal to pr_min - and minimum g value.""" - m = infinity - state = -1 - for n in open_dir: - pr = max(g[n] + problem.h(n), 2*g[n]) - if pr == pr_min: - if g[n] < m: - m = g[n] - state = n - - return state - - - while openF and openB: - pr_min_f, f_min_f, g_min_f = find_min(openF, gF) - pr_min_b, f_min_b, g_min_b = find_min(openB, gB) - C = min(pr_min_f, pr_min_b) - - if U <= max(C, f_min_f, f_min_b, g_min_f + g_min_b + e): - return U - - if C == pr_min_f: - # Extend forward - U, openF, closedF, gF = extend(U, openF, openB, gF, gB, closedF) - else: - # Extend backward - U, openB, closedB, gB = extend(U, openB, openF, gB, gF, closedB) - - return infinity - -# ______________________________________________________________________________ -# Informed (Heuristic) Search - - -greedy_best_first_graph_search = best_first_graph_search -# Greedy best-first search is accomplished by specifying f(n) = h(n). - - -def astar_search(problem, h=None): - """A* search is best-first graph search with f(n) = g(n)+h(n). - You need to specify the h function when you call astar_search, or - else in your Problem subclass.""" - h = memoize(h or problem.h, 'h') - return best_first_graph_search(problem, lambda n: n.path_cost + h(n)) - -# ______________________________________________________________________________ -# Other search algorithms - - -def recursive_best_first_search(problem, h=None): - """[Figure 3.26]""" - h = memoize(h or problem.h, 'h') - - def RBFS(problem, node, flimit): - if problem.goal_test(node.state): - return node, 0 # (The second value is immaterial) - successors = node.expand(problem) - if len(successors) == 0: - return None, infinity - for s in successors: - s.f = max(s.path_cost + h(s), node.f) - while True: - # Order by lowest f value - successors.sort(key=lambda x: x.f) - best = successors[0] - if best.f > flimit: - return None, best.f - if len(successors) > 1: - alternative = successors[1].f - else: - alternative = infinity - result, best.f = RBFS(problem, best, min(flimit, alternative)) - if result is not None: - return result, best.f - - node = Node(problem.initial) - node.f = h(node) - result, bestf = RBFS(problem, node, infinity) - return result - - -def hill_climbing(problem): - """From the initial node, keep choosing the neighbor with highest value, - stopping when no neighbor is better. [Figure 4.2]""" - current = Node(problem.initial) - while True: - neighbors = current.expand(problem) - if not neighbors: - break - neighbor = argmax_random_tie(neighbors, - key=lambda node: problem.value(node.state)) - if problem.value(neighbor.state) <= problem.value(current.state): - break - current = neighbor - return current.state - - -def exp_schedule(k=20, lam=0.005, limit=100): - """One possible schedule function for simulated annealing""" - return lambda t: (k * math.exp(-lam * t) if t < limit else 0) - - -def simulated_annealing(problem, schedule=exp_schedule()): - """[Figure 4.5] CAUTION: This differs from the pseudocode as it - returns a state instead of a Node.""" - current = Node(problem.initial) - for t in range(sys.maxsize): - T = schedule(t) - if T == 0: - return current.state - neighbors = current.expand(problem) - if not neighbors: - return current.state - next = random.choice(neighbors) - delta_e = problem.value(next.state) - problem.value(current.state) - if delta_e > 0 or probability(math.exp(delta_e / T)): - current = next - - -def and_or_graph_search(problem): - """[Figure 4.11]Used when the environment is nondeterministic and completely observable. - Contains OR nodes where the agent is free to choose any action. - After every action there is an AND node which contains all possible states - the agent may reach due to stochastic nature of environment. - The agent must be able to handle all possible states of the AND node (as it - may end up in any of them). - Returns a conditional plan to reach goal state, - or failure if the former is not possible.""" - - # functions used by and_or_search - def or_search(state, problem, path): - """returns a plan as a list of actions""" - if problem.goal_test(state): - return [] - if state in path: - return None - for action in problem.actions(state): - plan = and_search(problem.result(state, action), - problem, path + [state, ]) - if plan is not None: - return [action, plan] - - def and_search(states, problem, path): - """Returns plan in form of dictionary where we take action plan[s] if we reach state s.""" - plan = {} - for s in states: - plan[s] = or_search(s, problem, path) - if plan[s] is None: - return None - return plan - - # body of and or search - return or_search(problem.initial, problem, []) - - -class PeakFindingProblem(Problem): - """Problem of finding the highest peak in a limited grid""" - - def __init__(self, initial, grid): - """The grid is a 2 dimensional array/list whose state is specified by tuple of indices""" - Problem.__init__(self, initial) - self.grid = grid - self.n = len(grid) - assert self.n > 0 - self.m = len(grid[0]) - assert self.m > 0 - - def actions(self, state): - """Allows movement in only 4 directions""" - # TODO: Add flag to allow diagonal motion - allowed_actions = [] - if state[0] > 0: - allowed_actions.append('N') - if state[0] < self.n - 1: - allowed_actions.append('S') - if state[1] > 0: - allowed_actions.append('W') - if state[1] < self.m - 1: - allowed_actions.append('E') - return allowed_actions - - def result(self, state, action): - """Moves in the direction specified by action""" - x, y = state - x = x + (1 if action == 'S' else (-1 if action == 'N' else 0)) - y = y + (1 if action == 'E' else (-1 if action == 'W' else 0)) - return (x, y) - - def value(self, state): - """Value of a state is the value it is the index to""" - x, y = state - assert 0 <= x < self.n - assert 0 <= y < self.m - return self.grid[x][y] - - -class OnlineDFSAgent: - - """[Figure 4.21] The abstract class for an OnlineDFSAgent. Override - update_state method to convert percept to state. While initializing - the subclass a problem needs to be provided which is an instance of - a subclass of the Problem class.""" - - def __init__(self, problem): - self.problem = problem - self.s = None - self.a = None - self.untried = defaultdict(list) - self.unbacktracked = defaultdict(list) - self.result = {} - - def __call__(self, percept): - s1 = self.update_state(percept) - if self.problem.goal_test(s1): - self.a = None - else: - if s1 not in self.untried.keys(): - self.untried[s1] = self.problem.actions(s1) - if self.s is not None: - if s1 != self.result[(self.s, self.a)]: - self.result[(self.s, self.a)] = s1 - self.unbacktracked[s1].insert(0, self.s) - if len(self.untried[s1]) == 0: - if len(self.unbacktracked[s1]) == 0: - self.a = None - else: - # else a <- an action b such that result[s', b] = POP(unbacktracked[s']) - unbacktracked_pop = self.unbacktracked[s1].pop(0) - for (s, b) in self.result.keys(): - if self.result[(s, b)] == unbacktracked_pop: - self.a = b - break - else: - self.a = self.untried[s1].pop(0) - self.s = s1 - return self.a - - def update_state(self, percept): - """To be overridden in most cases. The default case - assumes the percept to be of type state.""" - return percept - -# ______________________________________________________________________________ - - -class OnlineSearchProblem(Problem): - """ - A problem which is solved by an agent executing - actions, rather than by just computation. - Carried in a deterministic and a fully observable environment.""" - - def __init__(self, initial, goal, graph): - self.initial = initial - self.goal = goal - self.graph = graph - - def actions(self, state): - return self.graph.dict[state].keys() - - def output(self, state, action): - return self.graph.dict[state][action] - - def h(self, state): - """Returns least possible cost to reach a goal for the given state.""" - return self.graph.least_costs[state] - - def c(self, s, a, s1): - """Returns a cost estimate for an agent to move from state 's' to state 's1'.""" - return 1 - - def update_state(self, percept): - raise NotImplementedError - - def goal_test(self, state): - if state == self.goal: - return True - return False - - -class LRTAStarAgent: - - """ [Figure 4.24] - Abstract class for LRTA*-Agent. A problem needs to be - provided which is an instanace of a subclass of Problem Class. - - Takes a OnlineSearchProblem [Figure 4.23] as a problem. - """ - - def __init__(self, problem): - self.problem = problem - # self.result = {} # no need as we are using problem.result - self.H = {} - self.s = None - self.a = None - - def __call__(self, s1): # as of now s1 is a state rather than a percept - if self.problem.goal_test(s1): - self.a = None - return self.a - else: - if s1 not in self.H: - self.H[s1] = self.problem.h(s1) - if self.s is not None: - # self.result[(self.s, self.a)] = s1 # no need as we are using problem.output - - # minimum cost for action b in problem.actions(s) - self.H[self.s] = min(self.LRTA_cost(self.s, b, self.problem.output(self.s, b), - self.H) for b in self.problem.actions(self.s)) - - # an action b in problem.actions(s1) that minimizes costs - self.a = argmin(self.problem.actions(s1), - key=lambda b: self.LRTA_cost(s1, b, self.problem.output(s1, b), self.H)) - - self.s = s1 - return self.a - - def LRTA_cost(self, s, a, s1, H): - """Returns cost to move from state 's' to state 's1' plus - estimated cost to get to goal from s1.""" - print(s, a, s1) - if s1 is None: - return self.problem.h(s) - else: - # sometimes we need to get H[s1] which we haven't yet added to H - # to replace this try, except: we can initialize H with values from problem.h - try: - return self.problem.c(s, a, s1) + self.H[s1] - except: - return self.problem.c(s, a, s1) + self.problem.h(s1) - -# ______________________________________________________________________________ -# Genetic Algorithm - - -def genetic_search(problem, fitness_fn, ngen=1000, pmut=0.1, n=20): - """Call genetic_algorithm on the appropriate parts of a problem. - This requires the problem to have states that can mate and mutate, - plus a value method that scores states.""" - - # NOTE: This is not tested and might not work. - # TODO: Use this function to make Problems work with genetic_algorithm. - - s = problem.initial_state - states = [problem.result(s, a) for a in problem.actions(s)] - random.shuffle(states) - return genetic_algorithm(states[:n], problem.value, ngen, pmut) - - -def genetic_algorithm(population, fitness_fn, gene_pool=[0, 1], f_thres=None, ngen=1000, pmut=0.1): # noqa - """[Figure 4.8]""" - for i in range(ngen): - new_population = [] - random_selection = selection_chances(fitness_fn, population) - for j in range(len(population)): - x = random_selection() - y = random_selection() - child = reproduce(x, y) - if random.uniform(0, 1) < pmut: - child = mutate(child, gene_pool) - new_population.append(child) - - population = new_population - - if f_thres: - fittest_individual = argmax(population, key=fitness_fn) - if fitness_fn(fittest_individual) >= f_thres: - return fittest_individual - - return argmax(population, key=fitness_fn) - - -def init_population(pop_number, gene_pool, state_length): - """Initializes population for genetic algorithm - pop_number : Number of individuals in population - gene_pool : List of possible values for individuals - state_length: The length of each individual""" - g = len(gene_pool) - population = [] - for i in range(pop_number): - new_individual = [gene_pool[random.randrange(0, g)] for j in range(state_length)] - population.append(new_individual) - - return population - - -def selection_chances(fitness_fn, population): - fitnesses = map(fitness_fn, population) - return weighted_sampler(population, fitnesses) - - -def reproduce(x, y): - n = len(x) - c = random.randrange(1, n) - return x[:c] + y[c:] - - -def mutate(x, gene_pool): - n = len(x) - g = len(gene_pool) - c = random.randrange(0, n) - r = random.randrange(0, g) - - new_gene = gene_pool[r] - return x[:c] + [new_gene] + x[c+1:] - -# _____________________________________________________________________________ -# The remainder of this file implements examples for the search algorithms. - -# ______________________________________________________________________________ -# Graphs and Graph Problems - - -class Graph: - - """A graph connects nodes (verticies) by edges (links). Each edge can also - have a length associated with it. The constructor call is something like: - g = Graph({'A': {'B': 1, 'C': 2}) - this makes a graph with 3 nodes, A, B, and C, with an edge of length 1 from - A to B, and an edge of length 2 from A to C. You can also do: - g = Graph({'A': {'B': 1, 'C': 2}, directed=False) - This makes an undirected graph, so inverse links are also added. The graph - stays undirected; if you add more links with g.connect('B', 'C', 3), then - inverse link is also added. You can use g.nodes() to get a list of nodes, - g.get('A') to get a dict of links out of A, and g.get('A', 'B') to get the - length of the link from A to B. 'Lengths' can actually be any object at - all, and nodes can be any hashable object.""" - - def __init__(self, dict=None, directed=True): - self.dict = dict or {} - self.directed = directed - if not directed: - self.make_undirected() - - def make_undirected(self): - """Make a digraph into an undirected graph by adding symmetric edges.""" - for a in list(self.dict.keys()): - for (b, dist) in self.dict[a].items(): - self.connect1(b, a, dist) - - def connect(self, A, B, distance=1): - """Add a link from A and B of given distance, and also add the inverse - link if the graph is undirected.""" - self.connect1(A, B, distance) - if not self.directed: - self.connect1(B, A, distance) - - def connect1(self, A, B, distance): - """Add a link from A to B of given distance, in one direction only.""" - self.dict.setdefault(A, {})[B] = distance - - def get(self, a, b=None): - """Return a link distance or a dict of {node: distance} entries. - .get(a,b) returns the distance or None; - .get(a) returns a dict of {node: distance} entries, possibly {}.""" - links = self.dict.setdefault(a, {}) - if b is None: - return links - else: - return links.get(b) - - def nodes(self): - """Return a list of nodes in the graph.""" - return list(self.dict.keys()) - - -def UndirectedGraph(dict=None): - """Build a Graph where every edge (including future ones) goes both ways.""" - return Graph(dict=dict, directed=False) - - -def RandomGraph(nodes=list(range(10)), min_links=2, width=400, height=300, - curvature=lambda: random.uniform(1.1, 1.5)): - """Construct a random graph, with the specified nodes, and random links. - The nodes are laid out randomly on a (width x height) rectangle. - Then each node is connected to the min_links nearest neighbors. - Because inverse links are added, some nodes will have more connections. - The distance between nodes is the hypotenuse times curvature(), - where curvature() defaults to a random number between 1.1 and 1.5.""" - g = UndirectedGraph() - g.locations = {} - # Build the cities - for node in nodes: - g.locations[node] = (random.randrange(width), random.randrange(height)) - # Build roads from each city to at least min_links nearest neighbors. - for i in range(min_links): - for node in nodes: - if len(g.get(node)) < min_links: - here = g.locations[node] - - def distance_to_node(n): - if n is node or g.get(node, n): - return infinity - return distance(g.locations[n], here) - neighbor = argmin(nodes, key=distance_to_node) - d = distance(g.locations[neighbor], here) * curvature() - g.connect(node, neighbor, int(d)) - return g - - -""" [Figure 3.2] -Simplified road map of Romania -""" -romania_map = UndirectedGraph(dict( - Arad=dict(Zerind=75, Sibiu=140, Timisoara=118), - Bucharest=dict(Urziceni=85, Pitesti=101, Giurgiu=90, Fagaras=211), - Craiova=dict(Drobeta=120, Rimnicu=146, Pitesti=138), - Drobeta=dict(Mehadia=75), - Eforie=dict(Hirsova=86), - Fagaras=dict(Sibiu=99), - Hirsova=dict(Urziceni=98), - Iasi=dict(Vaslui=92, Neamt=87), - Lugoj=dict(Timisoara=111, Mehadia=70), - Oradea=dict(Zerind=71, Sibiu=151), - Pitesti=dict(Rimnicu=97), - Rimnicu=dict(Sibiu=80), - Urziceni=dict(Vaslui=142))) -romania_map.locations = dict( - 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)) - -""" [Figure 4.9] -Eight possible states of the vacumm world -Each state is represented as - * "State of the left room" "State of the right room" "Room in which the agent - is present" -1 - DDL Dirty Dirty Left -2 - DDR Dirty Dirty Right -3 - DCL Dirty Clean Left -4 - DCR Dirty Clean Right -5 - CDL Clean Dirty Left -6 - CDR Clean Dirty Right -7 - CCL Clean Clean Left -8 - CCR Clean Clean Right -""" -vacumm_world = Graph(dict( - State_1=dict(Suck=['State_7', 'State_5'], Right=['State_2']), - State_2=dict(Suck=['State_8', 'State_4'], Left=['State_2']), - State_3=dict(Suck=['State_7'], Right=['State_4']), - State_4=dict(Suck=['State_4', 'State_2'], Left=['State_3']), - State_5=dict(Suck=['State_5', 'State_1'], Right=['State_6']), - State_6=dict(Suck=['State_8'], Left=['State_5']), - State_7=dict(Suck=['State_7', 'State_3'], Right=['State_8']), - State_8=dict(Suck=['State_8', 'State_6'], Left=['State_7']) - )) - -""" [Figure 4.23] -One-dimensional state space Graph -""" -one_dim_state_space = Graph(dict( - State_1=dict(Right='State_2'), - State_2=dict(Right='State_3', Left='State_1'), - State_3=dict(Right='State_4', Left='State_2'), - State_4=dict(Right='State_5', Left='State_3'), - State_5=dict(Right='State_6', Left='State_4'), - State_6=dict(Left='State_5') - )) -one_dim_state_space.least_costs = dict( - State_1=8, - State_2=9, - State_3=2, - State_4=2, - State_5=4, - State_6=3) - -""" [Figure 6.1] -Principal states and territories of Australia -""" -australia_map = UndirectedGraph(dict( - T=dict(), - SA=dict(WA=1, NT=1, Q=1, NSW=1, V=1), - NT=dict(WA=1, Q=1), - NSW=dict(Q=1, V=1))) -australia_map.locations = dict(WA=(120, 24), NT=(135, 20), SA=(135, 30), - Q=(145, 20), NSW=(145, 32), T=(145, 42), - V=(145, 37)) - - -class GraphProblem(Problem): - - """The problem of searching a graph from one node to another.""" - - def __init__(self, initial, goal, graph): - Problem.__init__(self, initial, goal) - self.graph = graph - - def actions(self, A): - """The actions at a graph node are just its neighbors.""" - return list(self.graph.get(A).keys()) - - def result(self, state, action): - """The result of going to a neighbor is just that neighbor.""" - return action - - def path_cost(self, cost_so_far, A, action, B): - return cost_so_far + (self.graph.get(A, B) or infinity) - - def find_min_edge(self): - """Find minimum value of edges.""" - m = infinity - for d in self.graph.dict.values(): - local_min = min(d.values()) - m = min(m, local_min) - - return m - - def h(self, node): - """h function is straight-line distance from a node's state to goal.""" - locs = getattr(self.graph, 'locations', None) - if locs: - if type(node) is str: - return int(distance(locs[node], locs[self.goal])) - - return int(distance(locs[node.state], locs[self.goal])) - else: - return infinity - - -class GraphProblemStochastic(GraphProblem): - """ - A version of GraphProblem where an action can lead to - nondeterministic output i.e. multiple possible states. - - Define the graph as dict(A = dict(Action = [[, , ...], ], ...), ...) - A the dictionary format is different, make sure the graph is created as a directed graph. - """ - - def result(self, state, action): - return self.graph.get(state, action) - - def path_cost(self): - raise NotImplementedError - - -# ______________________________________________________________________________ - - -class NQueensProblem(Problem): - - """The problem of placing N queens on an NxN board with none attacking - each other. A state is represented as an N-element array, where - a value of r in the c-th entry means there is a queen at column c, - row r, and a value of None means that the c-th column has not been - filled in yet. We fill in columns left to right. - >>> depth_first_tree_search(NQueensProblem(8)) - - """ - - def __init__(self, N): - self.N = N - self.initial = [None] * N - - def actions(self, state): - """In the leftmost empty column, try all non-conflicting rows.""" - if state[-1] is not None: - return [] # All columns filled; no successors - else: - col = state.index(None) - return [row for row in range(self.N) - if not self.conflicted(state, row, col)] - - def result(self, state, row): - """Place the next queen at the given row.""" - col = state.index(None) - new = state[:] - new[col] = row - return new - - def conflicted(self, state, row, col): - """Would placing a queen at (row, col) conflict with anything?""" - return any(self.conflict(row, col, state[c], c) - for c in range(col)) - - def conflict(self, row1, col1, row2, col2): - """Would putting two queens in (row1, col1) and (row2, col2) conflict?""" - return (row1 == row2 or # same row - col1 == col2 or # same column - row1 - col1 == row2 - col2 or # same \ diagonal - row1 + col1 == row2 + col2) # same / diagonal - - def goal_test(self, state): - """Check if all columns filled, no conflicts.""" - if state[-1] is None: - return False - return not any(self.conflicted(state, state[col], col) - for col in range(len(state))) - -# ______________________________________________________________________________ -# Inverse Boggle: Search for a high-scoring Boggle board. A good domain for -# iterative-repair and related search techniques, as suggested by Justin Boyan. - - -ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - -cubes16 = ['FORIXB', 'MOQABJ', 'GURILW', 'SETUPL', - 'CMPDAE', 'ACITAO', 'SLCRAE', 'ROMASH', - 'NODESW', 'HEFIYE', 'ONUDTK', 'TEVIGN', - 'ANEDVZ', 'PINESH', 'ABILYT', 'GKYLEU'] - - -def random_boggle(n=4): - """Return a random Boggle board of size n x n. - We represent a board as a linear list of letters.""" - cubes = [cubes16[i % 16] for i in range(n * n)] - random.shuffle(cubes) - return list(map(random.choice, cubes)) - -# The best 5x5 board found by Boyan, with our word list this board scores -# 2274 words, for a score of 9837 - - -boyan_best = list('RSTCSDEIAEGNLRPEATESMSSID') - - -def print_boggle(board): - """Print the board in a 2-d array.""" - n2 = len(board) - n = exact_sqrt(n2) - for i in range(n2): - - if i % n == 0 and i > 0: - print() - if board[i] == 'Q': - print('Qu', end=' ') - else: - print(str(board[i]) + ' ', end=' ') - print() - - -def boggle_neighbors(n2, cache={}): - """Return a list of lists, where the i-th element is the list of indexes - for the neighbors of square i.""" - if cache.get(n2): - return cache.get(n2) - n = exact_sqrt(n2) - neighbors = [None] * n2 - for i in range(n2): - neighbors[i] = [] - on_top = i < n - on_bottom = i >= n2 - n - on_left = i % n == 0 - on_right = (i+1) % n == 0 - if not on_top: - neighbors[i].append(i - n) - if not on_left: - neighbors[i].append(i - n - 1) - if not on_right: - neighbors[i].append(i - n + 1) - if not on_bottom: - neighbors[i].append(i + n) - if not on_left: - neighbors[i].append(i + n - 1) - if not on_right: - neighbors[i].append(i + n + 1) - if not on_left: - neighbors[i].append(i - 1) - if not on_right: - neighbors[i].append(i + 1) - cache[n2] = neighbors - return neighbors - - -def exact_sqrt(n2): - """If n2 is a perfect square, return its square root, else raise error.""" - n = int(math.sqrt(n2)) - assert n * n == n2 - return n - -# _____________________________________________________________________________ - - -class Wordlist: - - """This class holds a list of words. You can use (word in wordlist) - to check if a word is in the list, or wordlist.lookup(prefix) - to see if prefix starts any of the words in the list.""" - - def __init__(self, file, min_len=3): - lines = file.read().upper().split() - self.words = [word for word in lines if len(word) >= min_len] - self.words.sort() - self.bounds = {} - for c in ALPHABET: - c2 = chr(ord(c) + 1) - self.bounds[c] = (bisect.bisect(self.words, c), - bisect.bisect(self.words, c2)) - - def lookup(self, prefix, lo=0, hi=None): - """See if prefix is in dictionary, as a full word or as a prefix. - Return two values: the first is the lowest i such that - words[i].startswith(prefix), or is None; the second is - True iff prefix itself is in the Wordlist.""" - words = self.words - if hi is None: - hi = len(words) - i = bisect.bisect_left(words, prefix, lo, hi) - if i < len(words) and words[i].startswith(prefix): - return i, (words[i] == prefix) - else: - return None, False - - def __contains__(self, word): - return self.lookup(word)[1] - - def __len__(self): - return len(self.words) - -# _____________________________________________________________________________ - - -class BoggleFinder: - - """A class that allows you to find all the words in a Boggle board.""" - - wordlist = None # A class variable, holding a wordlist - - def __init__(self, board=None): - if BoggleFinder.wordlist is None: - BoggleFinder.wordlist = Wordlist(open_data("EN-text/wordlist.txt")) - self.found = {} - if board: - self.set_board(board) - - def set_board(self, board=None): - """Set the board, and find all the words in it.""" - if board is None: - board = random_boggle() - self.board = board - self.neighbors = boggle_neighbors(len(board)) - self.found = {} - for i in range(len(board)): - lo, hi = self.wordlist.bounds[board[i]] - self.find(lo, hi, i, [], '') - return self - - def find(self, lo, hi, i, visited, prefix): - """Looking in square i, find the words that continue the prefix, - considering the entries in self.wordlist.words[lo:hi], and not - revisiting the squares in visited.""" - if i in visited: - return - wordpos, is_word = self.wordlist.lookup(prefix, lo, hi) - if wordpos is not None: - if is_word: - self.found[prefix] = True - visited.append(i) - c = self.board[i] - if c == 'Q': - c = 'QU' - prefix += c - for j in self.neighbors[i]: - self.find(wordpos, hi, j, visited, prefix) - visited.pop() - - def words(self): - """The words found.""" - return list(self.found.keys()) - - scores = [0, 0, 0, 0, 1, 2, 3, 5] + [11] * 100 - - def score(self): - """The total score for the words found, according to the rules.""" - return sum([self.scores[len(w)] for w in self.words()]) - - def __len__(self): - """The number of words found.""" - return len(self.found) - -# _____________________________________________________________________________ - - -def boggle_hill_climbing(board=None, ntimes=100, verbose=True): - """Solve inverse Boggle by hill-climbing: find a high-scoring board by - starting with a random one and changing it.""" - finder = BoggleFinder() - if board is None: - board = random_boggle() - best = len(finder.set_board(board)) - for _ in range(ntimes): - i, oldc = mutate_boggle(board) - new = len(finder.set_board(board)) - if new > best: - best = new - if verbose: - print(best, _, board) - else: - board[i] = oldc # Change back - if verbose: - print_boggle(board) - return board, best - - -def mutate_boggle(board): - i = random.randrange(len(board)) - oldc = board[i] - # random.choice(boyan_best) - board[i] = random.choice(random.choice(cubes16)) - return i, oldc - -# ______________________________________________________________________________ - -# Code to compare searchers on various problems. - - -class InstrumentedProblem(Problem): - - """Delegates to a problem, and keeps statistics.""" - - def __init__(self, problem): - self.problem = problem - self.succs = self.goal_tests = self.states = 0 - self.found = None - - def actions(self, state): - self.succs += 1 - return self.problem.actions(state) - - def result(self, state, action): - self.states += 1 - return self.problem.result(state, action) - - def goal_test(self, state): - self.goal_tests += 1 - result = self.problem.goal_test(state) - if result: - self.found = state - return result - - def path_cost(self, c, state1, action, state2): - return self.problem.path_cost(c, state1, action, state2) - - def value(self, state): - return self.problem.value(state) - - def __getattr__(self, attr): - return getattr(self.problem, attr) - - def __repr__(self): - return '<{:4d}/{:4d}/{:4d}/{}>'.format(self.succs, self.goal_tests, - self.states, str(self.found)[:4]) - - -def compare_searchers(problems, header, - searchers=[breadth_first_tree_search, - breadth_first_search, - depth_first_graph_search, - iterative_deepening_search, - depth_limited_search, - recursive_best_first_search]): - def do(searcher, problem): - p = InstrumentedProblem(problem) - searcher(p) - return p - table = [[name(s)] + [do(s, p) for p in problems] for s in searchers] - print_table(table, header) - - -def compare_graph_searchers(): - """Prints a table of search results.""" - compare_searchers(problems=[GraphProblem('Arad', 'Bucharest', romania_map), - GraphProblem('Oradea', 'Neamt', romania_map), - GraphProblem('Q', 'WA', australia_map)], - header=['Searcher', 'romania_map(Arad, Bucharest)', - 'romania_map(Oradea, Neamt)', 'australia_map']) diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/pytest.ini b/tests/pytest.ini deleted file mode 100644 index 7043be6c8..000000000 --- a/tests/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -filterwarnings = - ignore::ResourceWarning \ No newline at end of file diff --git a/tests/test_agents.py b/tests/test_agents.py deleted file mode 100644 index 59ab6bce9..000000000 --- a/tests/test_agents.py +++ /dev/null @@ -1,119 +0,0 @@ -import random -from agents import Direction -from agents import Agent -from agents import ReflexVacuumAgent, ModelBasedVacuumAgent, TrivialVacuumEnvironment, compare_agents,\ - RandomVacuumAgent - - -random.seed("aima-python") - - -def test_move_forward(): - d = Direction("up") - l1 = d.move_forward((0, 0)) - assert l1 == (0, -1) - - d = Direction(Direction.R) - l1 = d.move_forward((0, 0)) - assert l1 == (1, 0) - - d = Direction(Direction.D) - l1 = d.move_forward((0, 0)) - assert l1 == (0, 1) - - d = Direction("left") - l1 = d.move_forward((0, 0)) - assert l1 == (-1, 0) - - l2 = d.move_forward((1, 0)) - assert l2 == (0, 0) - - -def test_add(): - d = Direction(Direction.U) - l1 = d + "right" - l2 = d + "left" - assert l1.direction == Direction.R - assert l2.direction == Direction.L - - d = Direction("right") - l1 = d.__add__(Direction.L) - l2 = d.__add__(Direction.R) - assert l1.direction == "up" - assert l2.direction == "down" - - d = Direction("down") - l1 = d.__add__("right") - l2 = d.__add__("left") - assert l1.direction == Direction.L - assert l2.direction == Direction.R - - d = Direction(Direction.L) - l1 = d + Direction.R - l2 = d + Direction.L - assert l1.direction == Direction.U - assert l2.direction == Direction.D - - -def test_RandomVacuumAgent() : - # create an object of the RandomVacuumAgent - agent = RandomVacuumAgent() - # create an object of TrivialVacuumEnvironment - environment = TrivialVacuumEnvironment() - # add agent to the environment - environment.add_thing(agent) - # run the environment - environment.run() - # check final status of the environment - assert environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} - - -def test_ReflexVacuumAgent() : - # create an object of the ReflexVacuumAgent - agent = ReflexVacuumAgent() - # create an object of TrivialVacuumEnvironment - environment = TrivialVacuumEnvironment() - # add agent to the environment - environment.add_thing(agent) - # run the environment - environment.run() - # check final status of the environment - assert environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} - - -def test_ModelBasedVacuumAgent() : - # create an object of the ModelBasedVacuumAgent - agent = ModelBasedVacuumAgent() - # create an object of TrivialVacuumEnvironment - environment = TrivialVacuumEnvironment() - # add agent to the environment - environment.add_thing(agent) - # run the environment - environment.run() - # check final status of the environment - assert environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} - - -def test_compare_agents() : - environment = TrivialVacuumEnvironment - agents = [ModelBasedVacuumAgent, ReflexVacuumAgent] - - result = compare_agents(environment, agents) - performance_ModelBasedVacummAgent = result[0][1] - performance_ReflexVacummAgent = result[1][1] - - # The performance of ModelBasedVacuumAgent will be at least as good as that of - # ReflexVacuumAgent, since ModelBasedVacuumAgent can identify when it has - # reached the terminal state (both locations being clean) and will perform - # NoOp leading to 0 performance change, whereas ReflexVacuumAgent cannot - # identify the terminal state and thus will keep moving, leading to worse - # performance compared to ModelBasedVacuumAgent. - assert performance_ReflexVacummAgent <= performance_ModelBasedVacummAgent - - -def test_Agent(): - def constant_prog(percept): - return percept - agent = Agent(constant_prog) - result = agent.program(5) - assert result == 5 diff --git a/tests/test_csp.py b/tests/test_csp.py deleted file mode 100644 index 4e2c4f119..000000000 --- a/tests/test_csp.py +++ /dev/null @@ -1,380 +0,0 @@ -import pytest -from utils import failure_test -from csp import * -import random - - -random.seed("aima-python") - - -def test_csp_assign(): - var = 10 - val = 5 - assignment = {} - australia.assign(var, val, assignment) - - assert australia.nassigns == 1 - assert assignment[var] == val - - -def test_csp_unassign(): - var = 10 - assignment = {var: 5} - australia.unassign(var, assignment) - - assert var not in assignment - - -def test_csp_nconflits(): - map_coloring_test = MapColoringCSP(list('RGB'), 'A: B C; B: C; C: ') - assignment = {'A': 'R', 'B': 'G'} - var = 'C' - val = 'R' - assert map_coloring_test.nconflicts(var, val, assignment) == 1 - - val = 'B' - assert map_coloring_test.nconflicts(var, val, assignment) == 0 - - -def test_csp_actions(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - - state = {'A': '1', 'B': '2', 'C': '3'} - assert map_coloring_test.actions(state) == [] - - state = {'A': '1', 'B': '3'} - assert map_coloring_test.actions(state) == [('C', '2')] - - state = {'A': '1', 'C': '2'} - assert map_coloring_test.actions(state) == [('B', '3')] - - state = (('A', '1'), ('B', '3')) - assert map_coloring_test.actions(state) == [('C', '2')] - - state = {'A': '1'} - assert (map_coloring_test.actions(state) == [('C', '2'), ('C', '3')] or - map_coloring_test.actions(state) == [('B', '2'), ('B', '3')]) - - -def test_csp_result(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - - state = (('A', '1'), ('B', '3')) - action = ('C', '2') - - assert map_coloring_test.result(state, action) == (('A', '1'), ('B', '3'), ('C', '2')) - - -def test_csp_goal_test(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - state = (('A', '1'), ('B', '3'), ('C', '2')) - assert map_coloring_test.goal_test(state) is True - - state = (('A', '1'), ('C', '2')) - assert map_coloring_test.goal_test(state) is False - - -def test_csp_support_pruning(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - map_coloring_test.support_pruning() - assert map_coloring_test.curr_domains == {'A': ['1', '2', '3'], 'B': ['1', '2', '3'], - 'C': ['1', '2', '3']} - - -def test_csp_suppose(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - var = 'A' - value = '1' - - removals = map_coloring_test.suppose(var, value) - - assert removals == [('A', '2'), ('A', '3')] - assert map_coloring_test.curr_domains == {'A': ['1'], 'B': ['1', '2', '3'], - 'C': ['1', '2', '3']} - - -def test_csp_prune(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - removals = None - var = 'A' - value = '3' - - map_coloring_test.support_pruning() - map_coloring_test.prune(var, value, removals) - assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'], - 'C': ['1', '2', '3']} - assert removals is None - - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - removals = [('A', '2')] - map_coloring_test.support_pruning() - map_coloring_test.prune(var, value, removals) - assert map_coloring_test.curr_domains == {'A': ['1', '2'], 'B': ['1', '2', '3'], - 'C': ['1', '2', '3']} - assert removals == [('A', '2'), ('A', '3')] - - -def test_csp_choices(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - var = 'A' - assert map_coloring_test.choices(var) == ['1', '2', '3'] - - map_coloring_test.support_pruning() - removals = None - value = '3' - map_coloring_test.prune(var, value, removals) - assert map_coloring_test.choices(var) == ['1', '2'] - - -def test_csp_infer_assignement(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - map_coloring_test.infer_assignment() == {} - - var = 'A' - value = '3' - map_coloring_test.prune(var, value, None) - value = '1' - map_coloring_test.prune(var, value, None) - - map_coloring_test.infer_assignment() == {'A': '2'} - - -def test_csp_restore(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - map_coloring_test.curr_domains = {'A': ['2', '3'], 'B': ['1'], 'C': ['2', '3']} - removals = [('A', '1'), ('B', '2'), ('B', '3')] - - map_coloring_test.restore(removals) - - assert map_coloring_test.curr_domains == {'A': ['2', '3', '1'], 'B': ['1', '2', '3'], - 'C': ['2', '3']} - - -def test_csp_conflicted_vars(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - - current = {} - var = 'A' - val = '1' - map_coloring_test.assign(var, val, current) - - var = 'B' - val = '3' - map_coloring_test.assign(var, val, current) - - var = 'C' - val = '3' - map_coloring_test.assign(var, val, current) - - conflicted_vars = map_coloring_test.conflicted_vars(current) - - assert (conflicted_vars == ['B', 'C'] or conflicted_vars == ['C', 'B']) - - -def test_revise(): - neighbors = parse_neighbors('A: B; B: ') - domains = {'A': [0], 'B': [4]} - constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4 - - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - csp.support_pruning() - Xi = 'A' - Xj = 'B' - removals = [] - - assert revise(csp, Xi, Xj, removals) is False - assert len(removals) == 0 - - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]} - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - csp.support_pruning() - - assert revise(csp, Xi, Xj, removals) is True - assert removals == [('A', 1), ('A', 3)] - - -def test_AC3(): - neighbors = parse_neighbors('A: B; B: ') - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4]} - constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4 and y % 2 != 0 - removals = [] - - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - - assert AC3(csp, removals=removals) is False - - constraints = lambda X, x, Y, y: (x % 2) == 0 and (x+y) == 4 - removals = [] - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - - assert AC3(csp, removals=removals) is True - assert (removals == [('A', 1), ('A', 3), ('B', 1), ('B', 3)] or - removals == [('B', 1), ('B', 3), ('A', 1), ('A', 3)]) - - -def test_first_unassigned_variable(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - assignment = {'A': '1', 'B': '2'} - assert first_unassigned_variable(assignment, map_coloring_test) == 'C' - - assignment = {'B': '1'} - assert (first_unassigned_variable(assignment, map_coloring_test) == 'A' or - first_unassigned_variable(assignment, map_coloring_test) == 'C') - - -def test_num_legal_values(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - map_coloring_test.support_pruning() - var = 'A' - assignment = {} - - assert num_legal_values(map_coloring_test, var, assignment) == 3 - - map_coloring_test = MapColoringCSP(list('RGB'), 'A: B C; B: C; C: ') - assignment = {'A': 'R', 'B': 'G'} - var = 'C' - - assert num_legal_values(map_coloring_test, var, assignment) == 1 - - -def test_mrv(): - neighbors = parse_neighbors('A: B; B: C; C: ') - domains = {'A': [0, 1, 2, 3, 4], 'B': [4], 'C': [0, 1, 2, 3, 4]} - constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4 - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - assignment = {'A': 0} - - assert mrv(assignment, csp) == 'B' - - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4], 'C': [0, 1, 2, 3, 4]} - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - - assert (mrv(assignment, csp) == 'B' or - mrv(assignment, csp) == 'C') - - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 5, 6], 'C': [0, 1, 2, 3, 4]} - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - csp.support_pruning() - - assert mrv(assignment, csp) == 'C' - - -def test_unordered_domain_values(): - map_coloring_test = MapColoringCSP(list('123'), 'A: B C; B: C; C: ') - assignment = None - assert unordered_domain_values('A', assignment, map_coloring_test) == ['1', '2', '3'] - - -def test_lcv(): - neighbors = parse_neighbors('A: B; B: C; C: ') - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 5], 'C': [0, 1, 2, 3, 4]} - constraints = lambda X, x, Y, y: x % 2 == 0 and (x+y) == 4 - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - assignment = {'A': 0} - - var = 'B' - - assert lcv(var, assignment, csp) == [4, 0, 1, 2, 3, 5] - assignment = {'A': 1, 'C': 3} - - constraints = lambda X, x, Y, y: (x + y) % 2 == 0 and (x + y) < 5 - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - - assert lcv(var, assignment, csp) == [1, 3, 0, 2, 4, 5] - - -def test_forward_checking(): - neighbors = parse_neighbors('A: B; B: C; C: ') - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 5], 'C': [0, 1, 2, 3, 4]} - constraints = lambda X, x, Y, y: (x + y) % 2 == 0 and (x + y) < 8 - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - - csp.support_pruning() - A_curr_domains = csp.curr_domains['A'] - C_curr_domains = csp.curr_domains['C'] - - var = 'B' - value = 3 - assignment = {'A': 1, 'C': '3'} - assert forward_checking(csp, var, value, assignment, None) == True - assert csp.curr_domains['A'] == A_curr_domains - assert csp.curr_domains['C'] == C_curr_domains - - assignment = {'C': 3} - - assert forward_checking(csp, var, value, assignment, None) == True - assert csp.curr_domains['A'] == [1, 3] - - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - csp.support_pruning() - - assignment = {} - assert forward_checking(csp, var, value, assignment, None) == True - assert csp.curr_domains['A'] == [1, 3] - assert csp.curr_domains['C'] == [1, 3] - - csp = CSP(variables=None, domains=domains, neighbors=neighbors, constraints=constraints) - domains = {'A': [0, 1, 2, 3, 4], 'B': [0, 1, 2, 3, 4, 7], 'C': [0, 1, 2, 3, 4]} - csp.support_pruning() - - value = 7 - assignment = {} - assert forward_checking(csp, var, value, assignment, None) == False - assert (csp.curr_domains['A'] == [] or csp.curr_domains['C'] == []) - - -def test_backtracking_search(): - assert backtracking_search(australia) - assert backtracking_search(australia, select_unassigned_variable=mrv) - assert backtracking_search(australia, order_domain_values=lcv) - assert backtracking_search(australia, select_unassigned_variable=mrv, - order_domain_values=lcv) - assert backtracking_search(australia, inference=forward_checking) - assert backtracking_search(australia, inference=mac) - assert backtracking_search(usa, select_unassigned_variable=mrv, - order_domain_values=lcv, inference=mac) - - -def test_min_conflicts(): - assert min_conflicts(australia) - assert min_conflicts(france) - - tests = [(usa, None)] * 3 - assert failure_test(min_conflicts, tests) >= 1/3 - - australia_impossible = MapColoringCSP(list('RG'), 'SA: WA NT Q NSW V; NT: WA Q; NSW: Q V; T: ') - assert min_conflicts(australia_impossible, 1000) is None - - -def test_universal_dict(): - d = UniversalDict(42) - assert d['life'] == 42 - - -def test_parse_neighbours(): - assert parse_neighbors('X: Y Z; Y: Z') == {'Y': ['X', 'Z'], 'X': ['Y', 'Z'], 'Z': ['X', 'Y']} - - -def test_topological_sort(): - root = 'NT' - Sort, Parents = topological_sort(australia,root) - - assert Sort == ['NT','SA','Q','NSW','V','WA'] - assert Parents['NT'] == None - assert Parents['SA'] == 'NT' - assert Parents['Q'] == 'SA' - assert Parents['NSW'] == 'Q' - assert Parents['V'] == 'NSW' - assert Parents['WA'] == 'SA' - - -def test_tree_csp_solver(): - australia_small = MapColoringCSP(list('RB'), - 'NT: WA Q; NSW: Q V') - tcs = tree_csp_solver(australia_small) - assert (tcs['NT'] == 'R' and tcs['WA'] == 'B' and tcs['Q'] == 'B' and tcs['NSW'] == 'R' and tcs['V'] == 'B') or \ - (tcs['NT'] == 'B' and tcs['WA'] == 'R' and tcs['Q'] == 'R' and tcs['NSW'] == 'B' and tcs['V'] == 'R') - - -if __name__ == "__main__": - pytest.main() diff --git a/tests/test_games.py b/tests/test_games.py deleted file mode 100644 index b5c30ee67..000000000 --- a/tests/test_games.py +++ /dev/null @@ -1,62 +0,0 @@ -from games import * - -# Creating the game instances -f52 = Fig52Game() -ttt = TicTacToe() - - -def gen_state(to_move='X', x_positions=[], o_positions=[], h=3, v=3, k=3): - """Given whose turn it is to move, the positions of X's on the board, the - positions of O's on the board, and, (optionally) number of rows, columns - and how many consecutive X's or O's required to win, return the corresponding - game state""" - - moves = set([(x, y) for x in range(1, h + 1) for y in range(1, v + 1)]) \ - - set(x_positions) - set(o_positions) - moves = list(moves) - board = {} - for pos in x_positions: - board[pos] = 'X' - for pos in o_positions: - board[pos] = 'O' - return GameState(to_move=to_move, utility=0, board=board, moves=moves) - - -def test_minimax_decision(): - assert minimax_decision('A', f52) == 'a1' - assert minimax_decision('B', f52) == 'b1' - assert minimax_decision('C', f52) == 'c1' - assert minimax_decision('D', f52) == 'd3' - - -def test_alphabeta_search(): - assert alphabeta_search('A', f52) == 'a1' - assert alphabeta_search('B', f52) == 'b1' - assert alphabeta_search('C', f52) == 'c1' - assert alphabeta_search('D', f52) == 'd3' - - state = gen_state(to_move='X', x_positions=[(1, 1), (3, 3)], - o_positions=[(1, 2), (3, 2)]) - assert alphabeta_search(state, ttt) == (2, 2) - - state = gen_state(to_move='O', x_positions=[(1, 1), (3, 1), (3, 3)], - o_positions=[(1, 2), (3, 2)]) - assert alphabeta_search(state, ttt) == (2, 2) - - state = gen_state(to_move='O', x_positions=[(1, 1)], - o_positions=[]) - assert alphabeta_search(state, ttt) == (2, 2) - - state = gen_state(to_move='X', x_positions=[(1, 1), (3, 1)], - o_positions=[(2, 2), (3, 1)]) - assert alphabeta_search(state, ttt) == (1, 3) - - -def test_random_tests(): - assert Fig52Game().play_game(alphabeta_player, alphabeta_player) == 3 - - # The player 'X' (one who plays first) in TicTacToe never loses: - assert ttt.play_game(alphabeta_player, alphabeta_player) >= 0 - - # The player 'X' (one who plays first) in TicTacToe never loses: - assert ttt.play_game(alphabeta_player, random_player) >= 0 diff --git a/tests/test_knowledge.py b/tests/test_knowledge.py deleted file mode 100644 index 89fe479a0..000000000 --- a/tests/test_knowledge.py +++ /dev/null @@ -1,284 +0,0 @@ -from knowledge import * -from utils import expr -import random - -random.seed("aima-python") - - -def test_current_best_learning(): - examples = restaurant - hypothesis = [{'Alt': 'Yes'}] - h = current_best_learning(examples, hypothesis) - values = [] - for e in examples: - values.append(guess_value(e, h)) - - assert values == [True, False, True, True, False, True, False, True, False, False, False, True] - - examples = animals_umbrellas - initial_h = [{'Species': 'Cat'}] - h = current_best_learning(examples, initial_h) - values = [] - for e in examples: - values.append(guess_value(e, h)) - - assert values == [True, True, True, False, False, False, True] - - examples = party - initial_h = [{'Pizza': 'Yes'}] - h = current_best_learning(examples, initial_h) - values = [] - for e in examples: - values.append(guess_value(e, h)) - - assert values == [True, True, False] - - -def test_version_space_learning(): - V = version_space_learning(party) - results = [] - for e in party: - guess = False - for h in V: - if guess_value(e, h): - guess = True - break - - results.append(guess) - - assert results == [True, True, False] - assert [{'Pizza': 'Yes'}] in V - - -def test_minimal_consistent_det(): - assert minimal_consistent_det(party, {'Pizza', 'Soda'}) == {'Pizza'} - assert minimal_consistent_det(party[:2], {'Pizza', 'Soda'}) == set() - assert minimal_consistent_det(animals_umbrellas, {'Species', 'Rain', 'Coat'}) == {'Species', 'Rain', 'Coat'} - assert minimal_consistent_det(conductance, {'Mass', 'Temp', 'Material', 'Size'}) == {'Temp', 'Material'} - assert minimal_consistent_det(conductance, {'Mass', 'Temp', 'Size'}) == {'Mass', 'Temp', 'Size'} - - -def test_extend_example(): - assert list(test_network.extend_example({x: A, y: B}, expr('Conn(x, z)'))) == [ - {x: A, y: B, z: B}, {x: A, y: B, z: D}] - assert list(test_network.extend_example({x: G}, expr('Conn(x, y)'))) == [{x: G, y: I}] - assert list(test_network.extend_example({x: C}, expr('Conn(x, y)'))) == [] - assert len(list(test_network.extend_example({}, expr('Conn(x, y)')))) == 10 - assert len(list(small_family.extend_example({x: expr('Andrew')}, expr('Father(x, y)')))) == 2 - assert len(list(small_family.extend_example({x: expr('Andrew')}, expr('Mother(x, y)')))) == 0 - assert len(list(small_family.extend_example({x: expr('Andrew')}, expr('Female(y)')))) == 6 - - -def test_new_literals(): - assert len(list(test_network.new_literals([expr('p | q'), [expr('p')]]))) == 8 - assert len(list(test_network.new_literals([expr('p'), [expr('q'), expr('p | r')]]))) == 15 - assert len(list(small_family.new_literals([expr('p'), []]))) == 8 - assert len(list(small_family.new_literals([expr('p & q'), []]))) == 20 - - -def test_choose_literal(): - literals = [expr('Conn(p, q)'), expr('Conn(x, z)'), expr('Conn(r, s)'), expr('Conn(t, y)')] - examples_pos = [{x: A, y: B}, {x: A, y: D}] - examples_neg = [{x: A, y: C}, {x: C, y: A}, {x: C, y: B}, {x: A, y: I}] - assert test_network.choose_literal(literals, [examples_pos, examples_neg]) == expr('Conn(x, z)') - literals = [expr('Conn(x, p)'), expr('Conn(p, x)'), expr('Conn(p, q)')] - examples_pos = [{x: C}, {x: F}, {x: I}] - examples_neg = [{x: D}, {x: A}, {x: B}, {x: G}] - assert test_network.choose_literal(literals, [examples_pos, examples_neg]) == expr('Conn(p, x)') - literals = [expr('Father(x, y)'), expr('Father(y, x)'), expr('Mother(x, y)'), expr('Mother(x, y)')] - examples_pos = [{x: expr('Philip')}, {x: expr('Mark')}, {x: expr('Peter')}] - examples_neg = [{x: expr('Elizabeth')}, {x: expr('Sarah')}] - assert small_family.choose_literal(literals, [examples_pos, examples_neg]) == expr('Father(x, y)') - literals = [expr('Father(x, y)'), expr('Father(y, x)'), expr('Male(x)')] - examples_pos = [{x: expr('Philip')}, {x: expr('Mark')}, {x: expr('Andrew')}] - examples_neg = [{x: expr('Elizabeth')}, {x: expr('Sarah')}] - assert small_family.choose_literal(literals, [examples_pos, examples_neg]) == expr('Male(x)') - - -def test_new_clause(): - target = expr('Open(x, y)') - examples_pos = [{x: B}, {x: A}, {x: G}] - examples_neg = [{x: C}, {x: F}, {x: I}] - clause = test_network.new_clause([examples_pos, examples_neg], target)[0][1] - assert len(clause) == 1 and clause[0].op == 'Conn' and clause[0].args[0] == x - target = expr('Flow(x, y)') - examples_pos = [{x: B}, {x: D}, {x: E}, {x: G}] - examples_neg = [{x: A}, {x: C}, {x: F}, {x: I}, {x: H}] - clause = test_network.new_clause([examples_pos, examples_neg], target)[0][1] - assert len(clause) == 2 and \ - ((clause[0].args[0] == x and clause[1].args[1] == x) or \ - (clause[0].args[1] == x and clause[1].args[0] == x)) - - -def test_foil(): - target = expr('Reach(x, y)') - examples_pos = [{x: A, y: B}, - {x: A, y: C}, - {x: A, y: D}, - {x: A, y: E}, - {x: A, y: F}, - {x: A, y: G}, - {x: A, y: I}, - {x: B, y: C}, - {x: D, y: C}, - {x: D, y: E}, - {x: D, y: F}, - {x: D, y: G}, - {x: D, y: I}, - {x: E, y: F}, - {x: E, y: G}, - {x: E, y: I}, - {x: G, y: I}, - {x: H, y: G}, - {x: H, y: I}] - nodes = {A, B, C, D, E, F, G, H, I} - examples_neg = [example for example in [{x: a, y: b} for a in nodes for b in nodes] - if example not in examples_pos] - ## TODO: Modify FOIL to recursively check for satisfied positive examples -# clauses = test_network.foil([examples_pos, examples_neg], target) -# assert len(clauses) == 2 - target = expr('Parent(x, y)') - examples_pos = [{x: expr('Elizabeth'), y: expr('Anne')}, - {x: expr('Elizabeth'), y: expr('Andrew')}, - {x: expr('Philip'), y: expr('Anne')}, - {x: expr('Philip'), y: expr('Andrew')}, - {x: expr('Anne'), y: expr('Peter')}, - {x: expr('Anne'), y: expr('Zara')}, - {x: expr('Mark'), y: expr('Peter')}, - {x: expr('Mark'), y: expr('Zara')}, - {x: expr('Andrew'), y: expr('Beatrice')}, - {x: expr('Andrew'), y: expr('Eugenie')}, - {x: expr('Sarah'), y: expr('Beatrice')}, - {x: expr('Sarah'), y: expr('Eugenie')}] - examples_neg = [{x: expr('Anne'), y: expr('Eugenie')}, - {x: expr('Beatrice'), y: expr('Eugenie')}, - {x: expr('Mark'), y: expr('Elizabeth')}, - {x: expr('Beatrice'), y: expr('Philip')}] - clauses = small_family.foil([examples_pos, examples_neg], target) - assert len(clauses) == 2 and \ - ((clauses[0][1][0] == expr('Father(x, y)') and clauses[1][1][0] == expr('Mother(x, y)')) or \ - (clauses[1][1][0] == expr('Father(x, y)') and clauses[0][1][0] == expr('Mother(x, y)'))) - target = expr('Grandparent(x, y)') - examples_pos = [{x: expr('Elizabeth'), y: expr('Peter')}, - {x: expr('Elizabeth'), y: expr('Zara')}, - {x: expr('Elizabeth'), y: expr('Beatrice')}, - {x: expr('Elizabeth'), y: expr('Eugenie')}, - {x: expr('Philip'), y: expr('Peter')}, - {x: expr('Philip'), y: expr('Zara')}, - {x: expr('Philip'), y: expr('Beatrice')}, - {x: expr('Philip'), y: expr('Eugenie')}] - examples_neg = [{x: expr('Anne'), y: expr('Eugenie')}, - {x: expr('Beatrice'), y: expr('Eugenie')}, - {x: expr('Elizabeth'), y: expr('Andrew')}, - {x: expr('Philip'), y: expr('Anne')}, - {x: expr('Philip'), y: expr('Andrew')}, - {x: expr('Anne'), y: expr('Peter')}, - {x: expr('Anne'), y: expr('Zara')}, - {x: expr('Mark'), y: expr('Peter')}, - {x: expr('Mark'), y: expr('Zara')}, - {x: expr('Andrew'), y: expr('Beatrice')}, - {x: expr('Andrew'), y: expr('Eugenie')}, - {x: expr('Sarah'), y: expr('Beatrice')}, - {x: expr('Mark'), y: expr('Elizabeth')}, - {x: expr('Beatrice'), y: expr('Philip')}] -# clauses = small_family.foil([examples_pos, examples_neg], target) -# assert len(clauses) == 2 and \ -# ((clauses[0][1][0] == expr('Father(x, y)') and clauses[1][1][0] == expr('Mother(x, y)')) or \ -# (clauses[1][1][0] == expr('Father(x, y)') and clauses[0][1][0] == expr('Mother(x, y)'))) - - -party = [ - {'Pizza': 'Yes', 'Soda': 'No', 'GOAL': True}, - {'Pizza': 'Yes', 'Soda': 'Yes', 'GOAL': True}, - {'Pizza': 'No', 'Soda': 'No', 'GOAL': False} -] - -animals_umbrellas = [ - {'Species': 'Cat', 'Rain': 'Yes', 'Coat': 'No', 'GOAL': True}, - {'Species': 'Cat', 'Rain': 'Yes', 'Coat': 'Yes', 'GOAL': True}, - {'Species': 'Dog', 'Rain': 'Yes', 'Coat': 'Yes', 'GOAL': True}, - {'Species': 'Dog', 'Rain': 'Yes', 'Coat': 'No', 'GOAL': False}, - {'Species': 'Dog', 'Rain': 'No', 'Coat': 'No', 'GOAL': False}, - {'Species': 'Cat', 'Rain': 'No', 'Coat': 'No', 'GOAL': False}, - {'Species': 'Cat', 'Rain': 'No', 'Coat': 'Yes', 'GOAL': True} -] - -conductance = [ - {'Sample': 'S1', 'Mass': 12, 'Temp': 26, 'Material': 'Cu', 'Size': 3, 'GOAL': 0.59}, - {'Sample': 'S1', 'Mass': 12, 'Temp': 100, 'Material': 'Cu', 'Size': 3, 'GOAL': 0.57}, - {'Sample': 'S2', 'Mass': 24, 'Temp': 26, 'Material': 'Cu', 'Size': 6, 'GOAL': 0.59}, - {'Sample': 'S3', 'Mass': 12, 'Temp': 26, 'Material': 'Pb', 'Size': 2, 'GOAL': 0.05}, - {'Sample': 'S3', 'Mass': 12, 'Temp': 100, 'Material': 'Pb', 'Size': 2, 'GOAL': 0.04}, - {'Sample': 'S4', 'Mass': 18, 'Temp': 100, 'Material': 'Pb', 'Size': 3, 'GOAL': 0.04}, - {'Sample': 'S4', 'Mass': 18, 'Temp': 100, 'Material': 'Pb', 'Size': 3, 'GOAL': 0.04}, - {'Sample': 'S5', 'Mass': 24, 'Temp': 100, 'Material': 'Pb', 'Size': 4, 'GOAL': 0.04}, - {'Sample': 'S6', 'Mass': 36, 'Temp': 26, 'Material': 'Pb', 'Size': 6, 'GOAL': 0.05}, -] - -def r_example(Alt, Bar, Fri, Hun, Pat, Price, Rain, Res, Type, Est, GOAL): - return {'Alt': Alt, 'Bar': Bar, 'Fri': Fri, 'Hun': Hun, 'Pat': Pat, - 'Price': Price, 'Rain': Rain, 'Res': Res, 'Type': Type, 'Est': Est, - 'GOAL': GOAL} - -restaurant = [ - r_example('Yes', 'No', 'No', 'Yes', 'Some', '$$$', 'No', 'Yes', 'French', '0-10', True), - r_example('Yes', 'No', 'No', 'Yes', 'Full', '$', 'No', 'No', 'Thai', '30-60', False), - r_example('No', 'Yes', 'No', 'No', 'Some', '$', 'No', 'No', 'Burger', '0-10', True), - r_example('Yes', 'No', 'Yes', 'Yes', 'Full', '$', 'Yes', 'No', 'Thai', '10-30', True), - r_example('Yes', 'No', 'Yes', 'No', 'Full', '$$$', 'No', 'Yes', 'French', '>60', False), - r_example('No', 'Yes', 'No', 'Yes', 'Some', '$$', 'Yes', 'Yes', 'Italian', '0-10', True), - r_example('No', 'Yes', 'No', 'No', 'None', '$', 'Yes', 'No', 'Burger', '0-10', False), - r_example('No', 'No', 'No', 'Yes', 'Some', '$$', 'Yes', 'Yes', 'Thai', '0-10', True), - r_example('No', 'Yes', 'Yes', 'No', 'Full', '$', 'Yes', 'No', 'Burger', '>60', False), - r_example('Yes', 'Yes', 'Yes', 'Yes', 'Full', '$$$', 'No', 'Yes', 'Italian', '10-30', False), - r_example('No', 'No', 'No', 'No', 'None', '$', 'No', 'No', 'Thai', '0-10', False), - r_example('Yes', 'Yes', 'Yes', 'Yes', 'Full', '$', 'No', 'No', 'Burger', '30-60', True) -] - -""" -A H -|\ /| -| \ / | -v v v v -B D-->E-->G-->I -| / | -| / | -vv v -C F -""" -test_network = FOIL_container([expr("Conn(A, B)"), - expr("Conn(A ,D)"), - expr("Conn(B, C)"), - expr("Conn(D, C)"), - expr("Conn(D, E)"), - expr("Conn(E ,F)"), - expr("Conn(E, G)"), - expr("Conn(G, I)"), - expr("Conn(H, G)"), - expr("Conn(H, I)")]) - -small_family = FOIL_container([expr("Mother(Anne, Peter)"), - expr("Mother(Anne, Zara)"), - expr("Mother(Sarah, Beatrice)"), - expr("Mother(Sarah, Eugenie)"), - expr("Father(Mark, Peter)"), - expr("Father(Mark, Zara)"), - expr("Father(Andrew, Beatrice)"), - expr("Father(Andrew, Eugenie)"), - expr("Father(Philip, Anne)"), - expr("Father(Philip, Andrew)"), - expr("Mother(Elizabeth, Anne)"), - expr("Mother(Elizabeth, Andrew)"), - expr("Male(Philip)"), - expr("Male(Mark)"), - expr("Male(Andrew)"), - expr("Male(Peter)"), - expr("Female(Elizabeth)"), - expr("Female(Anne)"), - expr("Female(Sarah)"), - expr("Female(Zara)"), - expr("Female(Beatrice)"), - expr("Female(Eugenie)"), -]) - -A, B, C, D, E, F, G, H, I, x, y, z = map(expr, 'ABCDEFGHIxyz') diff --git a/tests/test_learning.py b/tests/test_learning.py deleted file mode 100644 index 8a21d6462..000000000 --- a/tests/test_learning.py +++ /dev/null @@ -1,220 +0,0 @@ -import pytest -import math -import random -from utils import open_data -from learning import * - - -random.seed("aima-python") - - -def test_euclidean(): - distance = euclidean_distance([1, 2], [3, 4]) - assert round(distance, 2) == 2.83 - - distance = euclidean_distance([1, 2, 3], [4, 5, 6]) - assert round(distance, 2) == 5.2 - - distance = euclidean_distance([0, 0, 0], [0, 0, 0]) - assert distance == 0 - - -def test_rms_error(): - assert rms_error([2, 2], [2, 2]) == 0 - assert rms_error((0, 0), (0, 1)) == math.sqrt(0.5) - assert rms_error((1, 0), (0, 1)) == 1 - assert rms_error((0, 0), (0, -1)) == math.sqrt(0.5) - assert rms_error((0, 0.5), (0, -0.5)) == math.sqrt(0.5) - - -def test_manhattan_distance(): - assert manhattan_distance([2, 2], [2, 2]) == 0 - assert manhattan_distance([0, 0], [0, 1]) == 1 - assert manhattan_distance([1, 0], [0, 1]) == 2 - assert manhattan_distance([0, 0], [0, -1]) == 1 - assert manhattan_distance([0, 0.5], [0, -0.5]) == 1 - - -def test_mean_boolean_error(): - assert mean_boolean_error([1, 1], [0, 0]) == 1 - assert mean_boolean_error([0, 1], [1, 0]) == 1 - assert mean_boolean_error([1, 1], [0, 1]) == 0.5 - assert mean_boolean_error([0, 0], [0, 0]) == 0 - assert mean_boolean_error([1, 1], [1, 1]) == 0 - - -def test_mean_error(): - assert mean_error([2, 2], [2, 2]) == 0 - assert mean_error([0, 0], [0, 1]) == 0.5 - assert mean_error([1, 0], [0, 1]) == 1 - assert mean_error([0, 0], [0, -1]) == 0.5 - assert mean_error([0, 0.5], [0, -0.5]) == 0.5 - - -def test_exclude(): - iris = DataSet(name='iris', exclude=[3]) - assert iris.inputs == [0, 1, 2] - - -def test_parse_csv(): - Iris = open_data('iris.csv').read() - assert parse_csv(Iris)[0] == [5.1, 3.5, 1.4, 0.2, 'setosa'] - - -def test_weighted_mode(): - assert weighted_mode('abbaa', [1, 2, 3, 1, 2]) == 'b' - - -def test_weighted_replicate(): - assert weighted_replicate('ABC', [1, 2, 1], 4) == ['A', 'B', 'B', 'C'] - - -def test_means_and_deviation(): - iris = DataSet(name="iris") - - means, deviations = iris.find_means_and_deviations() - - assert round(means["setosa"][0], 3) == 5.006 - assert round(means["versicolor"][0], 3) == 5.936 - assert round(means["virginica"][0], 3) == 6.588 - - assert round(deviations["setosa"][0], 3) == 0.352 - assert round(deviations["versicolor"][0], 3) == 0.516 - assert round(deviations["virginica"][0], 3) == 0.636 - - -def test_plurality_learner(): - zoo = DataSet(name="zoo") - - pL = PluralityLearner(zoo) - assert pL([1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1]) == "mammal" - - -def test_naive_bayes(): - iris = DataSet(name="iris") - - # Discrete - nBD = NaiveBayesLearner(iris, continuous=False) - assert nBD([5, 3, 1, 0.1]) == "setosa" - assert nBD([6, 3, 4, 1.1]) == "versicolor" - assert nBD([7.7, 3, 6, 2]) == "virginica" - - # Continuous - nBC = NaiveBayesLearner(iris, continuous=True) - assert nBC([5, 3, 1, 0.1]) == "setosa" - assert nBC([6, 5, 3, 1.5]) == "versicolor" - assert nBC([7, 3, 6.5, 2]) == "virginica" - - # Simple - data1 = 'a'*50 + 'b'*30 + 'c'*15 - dist1 = CountingProbDist(data1) - data2 = 'a'*30 + 'b'*45 + 'c'*20 - dist2 = CountingProbDist(data2) - data3 = 'a'*20 + 'b'*20 + 'c'*35 - dist3 = CountingProbDist(data3) - - dist = {('First', 0.5): dist1, ('Second', 0.3): dist2, ('Third', 0.2): dist3} - nBS = NaiveBayesLearner(dist, simple=True) - assert nBS('aab') == 'First' - assert nBS(['b', 'b']) == 'Second' - assert nBS('ccbcc') == 'Third' - - -def test_k_nearest_neighbors(): - iris = DataSet(name="iris") - kNN = NearestNeighborLearner(iris, k=3) - assert kNN([5, 3, 1, 0.1]) == "setosa" - assert kNN([5, 3, 1, 0.1]) == "setosa" - assert kNN([6, 5, 3, 1.5]) == "versicolor" - assert kNN([7.5, 4, 6, 2]) == "virginica" - - -def test_truncated_svd(): - test_mat = [[17, 0], - [0, 11]] - _, _, eival = truncated_svd(test_mat) - assert isclose(abs(eival[0]), 17) - assert isclose(abs(eival[1]), 11) - - test_mat = [[17, 0], - [0, -34]] - _, _, eival = truncated_svd(test_mat) - assert isclose(abs(eival[0]), 34) - assert isclose(abs(eival[1]), 17) - - test_mat = [[1, 0, 0, 0, 2], - [0, 0, 3, 0, 0], - [0, 0, 0, 0, 0], - [0, 2, 0, 0, 0]] - _, _, eival = truncated_svd(test_mat) - assert isclose(abs(eival[0]), 3) - assert isclose(abs(eival[1]), 5**0.5) - - test_mat = [[3, 2, 2], - [2, 3, -2]] - _, _, eival = truncated_svd(test_mat) - assert isclose(abs(eival[0]), 5) - assert isclose(abs(eival[1]), 3) - - -def test_decision_tree_learner(): - iris = DataSet(name="iris") - dTL = DecisionTreeLearner(iris) - assert dTL([5, 3, 1, 0.1]) == "setosa" - assert dTL([6, 5, 3, 1.5]) == "versicolor" - assert dTL([7.5, 4, 6, 2]) == "virginica" - - -def test_random_forest(): - iris = DataSet(name="iris") - rF = RandomForest(iris) - tests = [([5.0, 3.0, 1.0, 0.1], "setosa"), - ([5.1, 3.3, 1.1, 0.1], "setosa"), - ([6.0, 5.0, 3.0, 1.0], "versicolor"), - ([6.1, 2.2, 3.5, 1.0], "versicolor"), - ([7.5, 4.1, 6.2, 2.3], "virginica"), - ([7.3, 3.7, 6.1, 2.5], "virginica")] - assert grade_learner(rF, tests) >= 1/3 - - -def test_neural_network_learner(): - iris = DataSet(name="iris") - classes = ["setosa", "versicolor", "virginica"] - iris.classes_to_numbers(classes) - nNL = NeuralNetLearner(iris, [5], 0.15, 75) - tests = [([5.0, 3.1, 0.9, 0.1], 0), - ([5.1, 3.5, 1.0, 0.0], 0), - ([4.9, 3.3, 1.1, 0.1], 0), - ([6.0, 3.0, 4.0, 1.1], 1), - ([6.1, 2.2, 3.5, 1.0], 1), - ([5.9, 2.5, 3.3, 1.1], 1), - ([7.5, 4.1, 6.2, 2.3], 2), - ([7.3, 4.0, 6.1, 2.4], 2), - ([7.0, 3.3, 6.1, 2.5], 2)] - assert grade_learner(nNL, tests) >= 1/3 - assert err_ratio(nNL, iris) < 0.2 - - -def test_perceptron(): - iris = DataSet(name="iris") - iris.classes_to_numbers() - classes_number = len(iris.values[iris.target]) - perceptron = PerceptronLearner(iris) - tests = [([5, 3, 1, 0.1], 0), - ([5, 3.5, 1, 0], 0), - ([6, 3, 4, 1.1], 1), - ([6, 2, 3.5, 1], 1), - ([7.5, 4, 6, 2], 2), - ([7, 3, 6, 2.5], 2)] - assert grade_learner(perceptron, tests) > 1/2 - assert err_ratio(perceptron, iris) < 0.4 - - -def test_random_weights(): - min_value = -0.5 - max_value = 0.5 - num_weights = 10 - test_weights = random_weights(min_value, max_value, num_weights) - assert len(test_weights) == num_weights - for weight in test_weights: - assert weight >= min_value and weight <= max_value diff --git a/tests/test_logic.py b/tests/test_logic.py deleted file mode 100644 index 86bcc9ed6..000000000 --- a/tests/test_logic.py +++ /dev/null @@ -1,319 +0,0 @@ -import pytest -from logic import * -from utils import expr_handle_infix_ops, count, Symbol - - -def test_is_symbol(): - assert is_symbol('x') - assert is_symbol('X') - assert is_symbol('N245') - assert not is_symbol('') - assert not is_symbol('1L') - assert not is_symbol([1, 2, 3]) - - -def test_is_var_symbol(): - assert is_var_symbol('xt') - assert not is_var_symbol('Txt') - assert not is_var_symbol('') - assert not is_var_symbol('52') - - -def test_is_prop_symbol(): - assert not is_prop_symbol('xt') - assert is_prop_symbol('Txt') - assert not is_prop_symbol('') - assert not is_prop_symbol('52') - - -def test_variables(): - assert variables(expr('F(x, x) & G(x, y) & H(y, z) & R(A, z, 2)')) == {x, y, z} - assert variables(expr('(x ==> y) & B(x, y) & A')) == {x, y} - - -def test_expr(): - assert repr(expr('P <=> Q(1)')) == '(P <=> Q(1))' - assert repr(expr('P & Q | ~R(x, F(x))')) == '((P & Q) | ~R(x, F(x)))' - assert (expr_handle_infix_ops('P & Q ==> R & ~S') - == "P & Q |'==>'| R & ~S") - - -def test_extend(): - assert extend({x: 1}, y, 2) == {x: 1, y: 2} - - -def test_subst(): - assert subst({x: 42, y:0}, F(x) + y) == (F(42) + 0) - - -def test_PropKB(): - kb = PropKB() - assert count(kb.ask(expr) for expr in [A, C, D, E, Q]) is 0 - kb.tell(A & E) - assert kb.ask(A) == kb.ask(E) == {} - kb.tell(E |'==>'| C) - assert kb.ask(C) == {} - kb.retract(E) - assert kb.ask(E) is False - assert kb.ask(C) is False - - -def test_wumpus_kb(): - # Statement: There is no pit in [1,1]. - assert wumpus_kb.ask(~P11) == {} - - # Statement: There is no pit in [1,2]. - assert wumpus_kb.ask(~P12) == {} - - # Statement: There is a pit in [2,2]. - assert wumpus_kb.ask(P22) is False - - # Statement: There is a pit in [3,1]. - assert wumpus_kb.ask(P31) is False - - # Statement: Neither [1,2] nor [2,1] contains a pit. - assert wumpus_kb.ask(~P12 & ~P21) == {} - - # Statement: There is a pit in either [2,2] or [3,1]. - assert wumpus_kb.ask(P22 | P31) == {} - - -def test_is_definite_clause(): - assert is_definite_clause(expr('A & B & C & D ==> E')) - assert is_definite_clause(expr('Farmer(Mac)')) - assert not is_definite_clause(expr('~Farmer(Mac)')) - assert is_definite_clause(expr('(Farmer(f) & Rabbit(r)) ==> Hates(f, r)')) - assert not is_definite_clause(expr('(Farmer(f) & ~Rabbit(r)) ==> Hates(f, r)')) - assert not is_definite_clause(expr('(Farmer(f) | Rabbit(r)) ==> Hates(f, r)')) - - -def test_parse_definite_clause(): - assert parse_definite_clause(expr('A & B & C & D ==> E')) == ([A, B, C, D], E) - assert parse_definite_clause(expr('Farmer(Mac)')) == ([], expr('Farmer(Mac)')) - assert parse_definite_clause(expr('(Farmer(f) & Rabbit(r)) ==> Hates(f, r)')) == ([expr('Farmer(f)'), expr('Rabbit(r)')], expr('Hates(f, r)')) - - -def test_pl_true(): - assert pl_true(P, {}) is None - assert pl_true(P, {P: False}) is False - assert pl_true(P | Q, {P: True}) is True - assert pl_true((A | B) & (C | D), {A: False, B: True, D: True}) is True - assert pl_true((A & B) & (C | D), {A: False, B: True, D: True}) is False - assert pl_true((A & B) | (A & C), {A: False, B: True, C: True}) is False - assert pl_true((A | B) & (C | D), {A: True, D: False}) is None - assert pl_true(P | P, {}) is None - - -def test_tt_true(): - assert tt_true(P | ~P) - assert tt_true('~~P <=> P') - assert not tt_true((P | ~Q) & (~P | Q)) - assert not tt_true(P & ~P) - assert not tt_true(P & Q) - assert tt_true((P | ~Q) | (~P | Q)) - assert tt_true('(A & B) ==> (A | B)') - assert tt_true('((A & B) & C) <=> (A & (B & C))') - assert tt_true('((A | B) | C) <=> (A | (B | C))') - assert tt_true('(A ==> B) <=> (~B ==> ~A)') - assert tt_true('(A ==> B) <=> (~A | B)') - assert tt_true('(A <=> B) <=> ((A ==> B) & (B ==> A))') - assert tt_true('~(A & B) <=> (~A | ~B)') - assert tt_true('~(A | B) <=> (~A & ~B)') - assert tt_true('(A & (B | C)) <=> ((A & B) | (A & C))') - assert tt_true('(A | (B & C)) <=> ((A | B) & (A | C))') - - -def test_dpll(): - assert (dpll_satisfiable(A & ~B & C & (A | ~D) & (~E | ~D) & (C | ~D) & (~A | ~F) & (E | ~F) - & (~D | ~F) & (B | ~C | D) & (A | ~E | F) & (~A | E | D)) - == {B: False, C: True, A: True, F: False, D: True, E: False}) - assert dpll_satisfiable(A & ~B) == {A: True, B: False} - assert dpll_satisfiable(P & ~P) is False - - -def test_find_pure_symbol(): - assert find_pure_symbol([A, B, C], [A|~B,~B|~C,C|A]) == (A, True) - assert find_pure_symbol([A, B, C], [~A|~B,~B|~C,C|A]) == (B, False) - assert find_pure_symbol([A, B, C], [~A|B,~B|~C,C|A]) == (None, None) - - -def test_unit_clause_assign(): - assert unit_clause_assign(A|B|C, {A:True}) == (None, None) - assert unit_clause_assign(B|C, {A:True}) == (None, None) - assert unit_clause_assign(B|~A, {A:True}) == (B, True) - - -def test_find_unit_clause(): - assert find_unit_clause([A|B|C, B|~C, ~A|~B], {A:True}) == (B, False) - - -def test_unify(): - assert unify(x, x, {}) == {} - assert unify(x, 3, {}) == {x: 3} - - -def test_pl_fc_entails(): - assert pl_fc_entails(horn_clauses_KB, expr('Q')) - assert not pl_fc_entails(horn_clauses_KB, expr('SomethingSilly')) - - -def test_tt_entails(): - assert tt_entails(P & Q, Q) - assert not tt_entails(P | Q, Q) - assert tt_entails(A & (B | C) & E & F & ~(P | Q), A & E & F & ~P & ~Q) - - -def test_prop_symbols(): - assert prop_symbols(expr('x & y & z | A')) == {A} - assert prop_symbols(expr('(x & B(z)) ==> Farmer(y) | A')) == {A, expr('Farmer(y)'), expr('B(z)')} - - -def test_constant_symbols(): - assert constant_symbols(expr('x & y & z | A')) == {A} - assert constant_symbols(expr('(x & B(z)) & Father(John) ==> Farmer(y) | A')) == {A, expr('John')} - - -def test_predicate_symbols(): - assert predicate_symbols(expr('x & y & z | A')) == set() - assert predicate_symbols(expr('(x & B(z)) & Father(John) ==> Farmer(y) | A')) == { - ('B', 1), - ('Father', 1), - ('Farmer', 1)} - assert predicate_symbols(expr('(x & B(x, y, z)) & F(G(x, y), x) ==> P(Q(R(x, y)), x, y, z)')) == { - ('B', 3), - ('F', 2), - ('G', 2), - ('P', 4), - ('Q', 1), - ('R', 2)} - - -def test_eliminate_implications(): - assert repr(eliminate_implications('A ==> (~B <== C)')) == '((~B | ~C) | ~A)' - assert repr(eliminate_implications(A ^ B)) == '((A & ~B) | (~A & B))' - assert repr(eliminate_implications(A & B | C & ~D)) == '((A & B) | (C & ~D))' - - -def test_dissociate(): - assert dissociate('&', [A & B]) == [A, B] - assert dissociate('|', [A, B, C & D, P | Q]) == [A, B, C & D, P, Q] - assert dissociate('&', [A, B, C & D, P | Q]) == [A, B, C, D, P | Q] - - -def test_associate(): - assert (repr(associate('&', [(A & B), (B | C), (B & C)])) - == '(A & B & (B | C) & B & C)') - assert (repr(associate('|', [A | (B | (C | (A & B)))])) - == '(A | B | C | (A & B))') - - -def test_move_not_inwards(): - assert repr(move_not_inwards(~(A | B))) == '(~A & ~B)' - assert repr(move_not_inwards(~(A & B))) == '(~A | ~B)' - assert repr(move_not_inwards(~(~(A | ~B) | ~~C))) == '((A | ~B) & ~C)' - - -def test_distribute_and_over_or(): - def test_enatilment(s, has_and = False): - result = distribute_and_over_or(s) - if has_and: - assert result.op == '&' - assert tt_entails(s, result) - assert tt_entails(result, s) - test_enatilment((A & B) | C, True) - test_enatilment((A | B) & C, True) - test_enatilment((A | B) | C, False) - test_enatilment((A & B) | (C | D), True) - -def test_to_cnf(): - assert (repr(to_cnf(wumpus_world_inference & ~expr('~P12'))) == - "((~P12 | B11) & (~P21 | B11) & (P12 | P21 | ~B11) & ~B11 & P12)") - assert repr(to_cnf((P & Q) | (~P & ~Q))) == '((~P | P) & (~Q | P) & (~P | Q) & (~Q | Q))' - assert repr(to_cnf("B <=> (P1 | P2)")) == '((~P1 | B) & (~P2 | B) & (P1 | P2 | ~B))' - assert repr(to_cnf("a | (b & c) | d")) == '((b | a | d) & (c | a | d))' - assert repr(to_cnf("A & (B | (D & E))")) == '(A & (D | B) & (E | B))' - assert repr(to_cnf("A | (B | (C | (D & E)))")) == '((D | A | B | C) & (E | A | B | C))' - - -def test_pl_resolution(): - # TODO: Add fast test cases - assert pl_resolution(wumpus_kb, ~P11) - - -def test_standardize_variables(): - e = expr('F(a, b, c) & G(c, A, 23)') - assert len(variables(standardize_variables(e))) == 3 - # assert variables(e).intersection(variables(standardize_variables(e))) == {} - assert is_variable(standardize_variables(expr('x'))) - - -def test_fol_bc_ask(): - def test_ask(query, kb=None): - q = expr(query) - test_variables = variables(q) - answers = fol_bc_ask(kb or test_kb, q) - return sorted( - [dict((x, v) for x, v in list(a.items()) if x in test_variables) - for a in answers], key=repr) - assert repr(test_ask('Farmer(x)')) == '[{x: Mac}]' - assert repr(test_ask('Human(x)')) == '[{x: Mac}, {x: MrsMac}]' - assert repr(test_ask('Rabbit(x)')) == '[{x: MrsRabbit}, {x: Pete}]' - assert repr(test_ask('Criminal(x)', crime_kb)) == '[{x: West}]' - - -def test_fol_fc_ask(): - def test_ask(query, kb=None): - q = expr(query) - test_variables = variables(q) - answers = fol_fc_ask(kb or test_kb, q) - return sorted( - [dict((x, v) for x, v in list(a.items()) if x in test_variables) - for a in answers], key=repr) - assert repr(test_ask('Criminal(x)', crime_kb)) == '[{x: West}]' - assert repr(test_ask('Enemy(x, America)', crime_kb)) == '[{x: Nono}]' - assert repr(test_ask('Farmer(x)')) == '[{x: Mac}]' - assert repr(test_ask('Human(x)')) == '[{x: Mac}, {x: MrsMac}]' - assert repr(test_ask('Rabbit(x)')) == '[{x: MrsRabbit}, {x: Pete}]' - - -def test_d(): - assert d(x * x - x, x) == 2 * x - 1 - - -def test_WalkSAT(): - def check_SAT(clauses, single_solution={}): - # Make sure the solution is correct if it is returned by WalkSat - # Sometimes WalkSat may run out of flips before finding a solution - soln = WalkSAT(clauses) - if soln: - assert all(pl_true(x, soln) for x in clauses) - if single_solution: # Cross check the solution if only one exists - assert all(pl_true(x, single_solution) for x in clauses) - assert soln == single_solution - # Test WalkSat for problems with solution - check_SAT([A & B, A & C]) - check_SAT([A | B, P & Q, P & B]) - check_SAT([A & B, C | D, ~(D | P)], {A: True, B: True, C: True, D: False, P: False}) - # Test WalkSat for problems without solution - assert WalkSAT([A & ~A], 0.5, 100) is None - assert WalkSAT([A | B, ~A, ~(B | C), C | D, P | Q], 0.5, 100) is None - assert WalkSAT([A | B, B & C, C | D, D & A, P, ~P], 0.5, 100) is None - - -def test_SAT_plan(): - transition = {'A': {'Left': 'A', 'Right': 'B'}, - 'B': {'Left': 'A', 'Right': 'C'}, - 'C': {'Left': 'B', 'Right': 'C'}} - assert SAT_plan('A', transition, 'C', 2) is None - assert SAT_plan('A', transition, 'B', 3) == ['Right'] - assert SAT_plan('C', transition, 'A', 3) == ['Left', 'Left'] - - transition = {(0, 0): {'Right': (0, 1), 'Down': (1, 0)}, - (0, 1): {'Left': (1, 0), 'Down': (1, 1)}, - (1, 0): {'Right': (1, 0), 'Up': (1, 0), 'Left': (1, 0), 'Down': (1, 0)}, - (1, 1): {'Left': (1, 0), 'Up': (0, 1)}} - assert SAT_plan((0, 0), transition, (1, 1), 4) == ['Right', 'Down'] - - -if __name__ == '__main__': - pytest.main() diff --git a/tests/test_mdp.py b/tests/test_mdp.py deleted file mode 100644 index b27c1af71..000000000 --- a/tests/test_mdp.py +++ /dev/null @@ -1,41 +0,0 @@ -from mdp import * - - -def test_value_iteration(): - assert value_iteration(sequential_decision_environment, .01) == { - (3, 2): 1.0, (3, 1): -1.0, - (3, 0): 0.12958868267972745, (0, 1): 0.39810203830605462, - (0, 2): 0.50928545646220924, (1, 0): 0.25348746162470537, - (0, 0): 0.29543540628363629, (1, 2): 0.64958064617168676, - (2, 0): 0.34461306281476806, (2, 1): 0.48643676237737926, - (2, 2): 0.79536093684710951} - - -def test_policy_iteration(): - assert policy_iteration(sequential_decision_environment) == { - (0, 0): (0, 1), (0, 1): (0, 1), (0, 2): (1, 0), - (1, 0): (1, 0), (1, 2): (1, 0), (2, 0): (0, 1), - (2, 1): (0, 1), (2, 2): (1, 0), (3, 0): (-1, 0), - (3, 1): None, (3, 2): None} - - -def test_best_policy(): - pi = best_policy(sequential_decision_environment, - value_iteration(sequential_decision_environment, .01)) - assert sequential_decision_environment.to_arrows(pi) == [['>', '>', '>', '.'], - ['^', None, '^', '.'], - ['^', '>', '^', '<']] - - -def test_transition_model(): - transition_model = { - "A": {"a1": (0.3, "B"), "a2": (0.7, "C")}, - "B": {"a1": (0.5, "B"), "a2": (0.5, "A")}, - "C": {"a1": (0.9, "A"), "a2": (0.1, "B")}, - } - - mdp = MDP(init="A", actlist={"a1","a2"}, terminals={"C"}, states={"A","B","C"}, transitions=transition_model) - - assert mdp.T("A","a1") == (0.3, "B") - assert mdp.T("B","a2") == (0.5, "A") - assert mdp.T("C","a1") == (0.9, "A") diff --git a/tests/test_nlp.py b/tests/test_nlp.py deleted file mode 100644 index 1d8320cdc..000000000 --- a/tests/test_nlp.py +++ /dev/null @@ -1,259 +0,0 @@ -import pytest -import nlp - -from nlp import loadPageHTML, stripRawHTML, findOutlinks, onlyWikipediaURLS -from nlp import expand_pages, relevant_pages, normalize, ConvergenceDetector, getInlinks -from nlp import getOutlinks, Page, determineInlinks, HITS -from nlp import Rules, Lexicon, Grammar, ProbRules, ProbLexicon, ProbGrammar -from nlp import Chart, CYK_parse -# Clumsy imports because we want to access certain nlp.py globals explicitly, because -# they are accessed by functions within nlp.py - -from unittest.mock import patch -from io import BytesIO - - -def test_rules(): - check = {'A': [['B', 'C'], ['D', 'E']], 'B': [['E'], ['a'], ['b', 'c']]} - assert Rules(A="B C | D E", B="E | a | b c") == check - - -def test_lexicon(): - check = {'Article': ['the', 'a', 'an'], 'Pronoun': ['i', 'you', 'he']} - lexicon = Lexicon(Article="the | a | an", Pronoun="i | you | he") - assert lexicon == check - - -def test_grammar(): - rules = Rules(A="B C | D E", B="E | a | b c") - lexicon = Lexicon(Article="the | a | an", Pronoun="i | you | he") - grammar = Grammar("Simplegram", rules, lexicon) - - assert grammar.rewrites_for('A') == [['B', 'C'], ['D', 'E']] - assert grammar.isa('the', 'Article') - - grammar = nlp.E_Chomsky - for rule in grammar.cnf_rules(): - assert len(rule) == 3 - - -def test_generation(): - lexicon = Lexicon(Article="the | a | an", - Pronoun="i | you | he") - - rules = Rules( - S="Article | More | Pronoun", - More="Article Pronoun | Pronoun Pronoun" - ) - - grammar = Grammar("Simplegram", rules, lexicon) - - sentence = grammar.generate_random('S') - for token in sentence.split(): - found = False - for non_terminal, terminals in grammar.lexicon.items(): - if token in terminals: - found = True - assert found - - -def test_prob_rules(): - check = {'A': [(['B', 'C'], 0.3), (['D', 'E'], 0.7)], - 'B': [(['E'], 0.1), (['a'], 0.2), (['b', 'c'], 0.7)]} - rules = ProbRules(A="B C [0.3] | D E [0.7]", B="E [0.1] | a [0.2] | b c [0.7]") - assert rules == check - - -def test_prob_lexicon(): - check = {'Article': [('the', 0.5), ('a', 0.25), ('an', 0.25)], - 'Pronoun': [('i', 0.4), ('you', 0.3), ('he', 0.3)]} - lexicon = ProbLexicon(Article="the [0.5] | a [0.25] | an [0.25]", - Pronoun="i [0.4] | you [0.3] | he [0.3]") - assert lexicon == check - - -def test_prob_grammar(): - rules = ProbRules(A="B C [0.3] | D E [0.7]", B="E [0.1] | a [0.2] | b c [0.7]") - lexicon = ProbLexicon(Article="the [0.5] | a [0.25] | an [0.25]", - Pronoun="i [0.4] | you [0.3] | he [0.3]") - grammar = ProbGrammar("Simplegram", rules, lexicon) - - assert grammar.rewrites_for('A') == [(['B', 'C'], 0.3), (['D', 'E'], 0.7)] - assert grammar.isa('the', 'Article') - - grammar = nlp.E_Prob_Chomsky - for rule in grammar.cnf_rules(): - assert len(rule) == 4 - - -def test_prob_generation(): - lexicon = ProbLexicon(Verb="am [0.5] | are [0.25] | is [0.25]", - Pronoun="i [0.4] | you [0.3] | he [0.3]") - - rules = ProbRules( - S="Verb [0.5] | More [0.3] | Pronoun [0.1] | nobody is here [0.1]", - More="Pronoun Verb [0.7] | Pronoun Pronoun [0.3]" - ) - - grammar = ProbGrammar("Simplegram", rules, lexicon) - - sentence = grammar.generate_random('S') - assert len(sentence) == 2 - - -def test_chart_parsing(): - chart = Chart(nlp.E0) - parses = chart.parses('the stench is in 2 2') - assert len(parses) == 1 - - -def test_CYK_parse(): - grammar = nlp.E_Prob_Chomsky - words = ['the', 'robot', 'is', 'good'] - P = CYK_parse(words, grammar) - assert len(P) == 52 - - -# ______________________________________________________________________________ -# Data Setup - -testHTML = """Keyword String 1: A man is a male human. - Keyword String 2: Like most other male mammals, a man inherits an - X from his mom and a Y from his dad. - Links: - href="https://google.com.au" - < href="/wiki/TestThing" > href="/wiki/TestBoy" - href="/wiki/TestLiving" href="/wiki/TestMan" >""" -testHTML2 = "a mom and a dad" -testHTML3 = """ - - - - Page Title - - - -

    AIMA book

    - - - - """ - -pA = Page("A", ["B", "C", "E"], ["D"], 1, 6) -pB = Page("B", ["E"], ["A", "C", "D"], 2, 5) -pC = Page("C", ["B", "E"], ["A", "D"], 3, 4) -pD = Page("D", ["A", "B", "C", "E"], [], 4, 3) -pE = Page("E", [], ["A", "B", "C", "D", "F"], 5, 2) -pF = Page("F", ["E"], [], 6, 1) -pageDict = {pA.address: pA, pB.address: pB, pC.address: pC, - pD.address: pD, pE.address: pE, pF.address: pF} -nlp.pagesIndex = pageDict -nlp.pagesContent ={pA.address: testHTML, pB.address: testHTML2, - pC.address: testHTML, pD.address: testHTML2, - pE.address: testHTML, pF.address: testHTML2} - -# This test takes a long time (> 60 secs) -# def test_loadPageHTML(): -# # first format all the relative URLs with the base URL -# addresses = [examplePagesSet[0] + x for x in examplePagesSet[1:]] -# loadedPages = loadPageHTML(addresses) -# relURLs = ['Ancient_Greek','Ethics','Plato','Theology'] -# fullURLs = ["https://en.wikipedia.org/wiki/"+x for x in relURLs] -# assert all(x in loadedPages for x in fullURLs) -# assert all(loadedPages.get(key,"") != "" for key in addresses) - - -@patch('urllib.request.urlopen', return_value=BytesIO(testHTML3.encode())) -def test_stripRawHTML(html_mock): - addr = "https://en.wikipedia.org/wiki/Ethics" - aPage = loadPageHTML([addr]) - someHTML = aPage[addr] - strippedHTML = stripRawHTML(someHTML) - assert "" not in strippedHTML and "" not in strippedHTML - assert "AIMA book" in someHTML and "AIMA book" in strippedHTML - - -def test_determineInlinks(): - assert set(determineInlinks(pA)) == set(['B', 'C', 'E']) - assert set(determineInlinks(pE)) == set([]) - assert set(determineInlinks(pF)) == set(['E']) - -def test_findOutlinks_wiki(): - testPage = pageDict[pA.address] - outlinks = findOutlinks(testPage, handleURLs=onlyWikipediaURLS) - assert "https://en.wikipedia.org/wiki/TestThing" in outlinks - assert "https://en.wikipedia.org/wiki/TestThing" in outlinks - assert "https://google.com.au" not in outlinks -# ______________________________________________________________________________ -# HITS Helper Functions - - -def test_expand_pages(): - pages = {k: pageDict[k] for k in ('F')} - pagesTwo = {k: pageDict[k] for k in ('A', 'E')} - expanded_pages = expand_pages(pages) - assert all(x in expanded_pages for x in ['F', 'E']) - assert all(x not in expanded_pages for x in ['A', 'B', 'C', 'D']) - expanded_pages = expand_pages(pagesTwo) - print(expanded_pages) - assert all(x in expanded_pages for x in ['A', 'B', 'C', 'D', 'E', 'F']) - - -def test_relevant_pages(): - pages = relevant_pages("his dad") - assert all((x in pages) for x in ['A', 'C', 'E']) - assert all((x not in pages) for x in ['B', 'D', 'F']) - pages = relevant_pages("mom and dad") - assert all((x in pages) for x in ['A', 'B', 'C', 'D', 'E', 'F']) - pages = relevant_pages("philosophy") - assert all((x not in pages) for x in ['A', 'B', 'C', 'D', 'E', 'F']) - - -def test_normalize(): - normalize(pageDict) - print(page.hub for addr, page in nlp.pagesIndex.items()) - expected_hub = [1/91**0.5, 2/91**0.5, 3/91**0.5, 4/91**0.5, 5/91**0.5, 6/91**0.5] # Works only for sample data above - expected_auth = list(reversed(expected_hub)) - assert len(expected_hub) == len(expected_auth) == len(nlp.pagesIndex) - assert expected_hub == [page.hub for addr, page in sorted(nlp.pagesIndex.items())] - assert expected_auth == [page.authority for addr, page in sorted(nlp.pagesIndex.items())] - - -def test_detectConvergence(): - # run detectConvergence once to initialise history - convergence = ConvergenceDetector() - convergence() - assert convergence() # values haven't changed so should return True - # make tiny increase/decrease to all values - for _, page in nlp.pagesIndex.items(): - page.hub += 0.0003 - page.authority += 0.0004 - # retest function with values. Should still return True - assert convergence() - for _, page in nlp.pagesIndex.items(): - page.hub += 3000000 - page.authority += 3000000 - # retest function with values. Should now return false - assert not convergence() - - -def test_getInlinks(): - inlnks = getInlinks(pageDict['A']) - assert sorted(inlnks) == pageDict['A'].inlinks - - -def test_getOutlinks(): - outlnks = getOutlinks(pageDict['A']) - assert sorted(outlnks) == pageDict['A'].outlinks - - -def test_HITS(): - HITS('inherit') - auth_list = [pA.authority, pB.authority, pC.authority, pD.authority, pE.authority, pF.authority] - hub_list = [pA.hub, pB.hub, pC.hub, pD.hub, pE.hub, pF.hub] - assert max(auth_list) == pD.authority - assert max(hub_list) == pE.hub - - -if __name__ == '__main__': - pytest.main() diff --git a/tests/test_planning.py b/tests/test_planning.py deleted file mode 100644 index 2c355f54c..000000000 --- a/tests/test_planning.py +++ /dev/null @@ -1,147 +0,0 @@ -from planning import * -from utils import expr -from logic import FolKB - - -def test_action(): - precond = [[expr("P(x)"), expr("Q(y, z)")], [expr("Q(x)")]] - effect = [[expr("Q(x)")], [expr("P(x)")]] - a=Action(expr("A(x,y,z)"), precond, effect) - args = [expr("A"), expr("B"), expr("C")] - assert a.substitute(expr("P(x, z, y)"), args) == expr("P(A, C, B)") - test_kb = FolKB([expr("P(A)"), expr("Q(B, C)"), expr("R(D)")]) - assert a.check_precond(test_kb, args) - a.act(test_kb, args) - assert test_kb.ask(expr("P(A)")) is False - assert test_kb.ask(expr("Q(A)")) is not False - assert test_kb.ask(expr("Q(B, C)")) is not False - assert not a.check_precond(test_kb, args) - - -def test_air_cargo_1(): - p = air_cargo() - assert p.goal_test() is False - solution_1 = [expr("Load(C1 , P1, SFO)"), - expr("Fly(P1, SFO, JFK)"), - expr("Unload(C1, P1, JFK)"), - expr("Load(C2, P2, JFK)"), - expr("Fly(P2, JFK, SFO)"), - expr("Unload (C2, P2, SFO)")] - - for action in solution_1: - p.act(action) - - assert p.goal_test() - - -def test_air_cargo_2(): - p = air_cargo() - assert p.goal_test() is False - solution_2 = [expr("Load(C2, P2, JFK)"), - expr("Fly(P2, JFK, SFO)"), - expr("Unload (C2, P2, SFO)"), - expr("Load(C1 , P1, SFO)"), - expr("Fly(P1, SFO, JFK)"), - expr("Unload(C1, P1, JFK)")] - - for action in solution_2: - p.act(action) - - assert p.goal_test() - - -def test_spare_tire(): - p = spare_tire() - assert p.goal_test() is False - solution = [expr("Remove(Flat, Axle)"), - expr("Remove(Spare, Trunk)"), - expr("PutOn(Spare, Axle)")] - - for action in solution: - p.act(action) - - assert p.goal_test() - - -def test_three_block_tower(): - p = three_block_tower() - assert p.goal_test() is False - solution = [expr("MoveToTable(C, A)"), - expr("Move(B, Table, C)"), - expr("Move(A, Table, B)")] - - for action in solution: - p.act(action) - - assert p.goal_test() - - -def test_have_cake_and_eat_cake_too(): - p = have_cake_and_eat_cake_too() - assert p.goal_test() is False - solution = [expr("Eat(Cake)"), - expr("Bake(Cake)")] - - for action in solution: - p.act(action) - - assert p.goal_test() - - -def test_graph_call(): - pddl = spare_tire() - negkb = FolKB([expr('At(Flat, Trunk)')]) - graph = Graph(pddl, negkb) - - levels_size = len(graph.levels) - graph() - - assert levels_size == len(graph.levels) - 1 - - -def test_job_shop_problem(): - p = job_shop_problem() - assert p.goal_test() is False - - solution = [p.jobs[1][0], - p.jobs[0][0], - p.jobs[0][1], - p.jobs[0][2], - p.jobs[1][1], - p.jobs[1][2]] - - for action in solution: - p.act(action) - - assert p.goal_test() - -def test_refinements() : - init = [expr('At(Home)')] - def goal_test(kb): - return kb.ask(expr('At(SFO)')) - - library = {"HLA": ["Go(Home,SFO)","Taxi(Home, SFO)"], - "steps": [["Taxi(Home, SFO)"],[]], - "precond_pos": [["At(Home)"],["At(Home)"]], - "precond_neg": [[],[]], - "effect_pos": [["At(SFO)"],["At(SFO)"]], - "effect_neg": [["At(Home)"],["At(Home)"],]} - # Go SFO - precond_pos = [expr("At(Home)")] - precond_neg = [] - effect_add = [expr("At(SFO)")] - effect_rem = [expr("At(Home)")] - go_SFO = HLA(expr("Go(Home,SFO)"), - [precond_pos, precond_neg], [effect_add, effect_rem]) - # Taxi SFO - precond_pos = [expr("At(Home)")] - precond_neg = [] - effect_add = [expr("At(SFO)")] - effect_rem = [expr("At(Home)")] - taxi_SFO = HLA(expr("Go(Home,SFO)"), - [precond_pos, precond_neg], [effect_add, effect_rem]) - prob = Problem(init, [go_SFO, taxi_SFO], goal_test) - result = [i for i in Problem.refinements(go_SFO, prob, library)] - assert(len(result) == 1) - assert(result[0].name == "Taxi") - assert(result[0].args == (expr("Home"), expr("SFO"))) diff --git a/tests/test_probability.py b/tests/test_probability.py deleted file mode 100644 index a40ef9728..000000000 --- a/tests/test_probability.py +++ /dev/null @@ -1,277 +0,0 @@ -import random -from probability import * -from utils import rounder - - -def tests(): - cpt = burglary.variable_node('Alarm') - event = {'Burglary': True, 'Earthquake': True} - assert cpt.p(True, event) == 0.95 - event = {'Burglary': False, 'Earthquake': True} - assert cpt.p(False, event) == 0.71 - # #enumeration_ask('Earthquake', {}, burglary) - - s = {'A': True, 'B': False, 'C': True, 'D': False} - assert consistent_with(s, {}) - assert consistent_with(s, s) - assert not consistent_with(s, {'A': False}) - assert not consistent_with(s, {'D': True}) - - random.seed(21) - p = rejection_sampling('Earthquake', {}, burglary, 1000) - assert p[True], p[False] == (0.001, 0.999) - - random.seed(71) - p = likelihood_weighting('Earthquake', {}, burglary, 1000) - assert p[True], p[False] == (0.002, 0.998) - - -def test_probdist_basic(): - P = ProbDist('Flip') - P['H'], P['T'] = 0.25, 0.75 - assert P['H'] == 0.25 - - -def test_probdist_frequency(): - P = ProbDist('X', {'lo': 125, 'med': 375, 'hi': 500}) - assert (P['lo'], P['med'], P['hi']) == (0.125, 0.375, 0.5) - - -def test_probdist_normalize(): - P = ProbDist('Flip') - P['H'], P['T'] = 35, 65 - P = P.normalize() - assert (P.prob['H'], P.prob['T']) == (0.350, 0.650) - - -def test_jointprob(): - P = JointProbDist(['X', 'Y']) - P[1, 1] = 0.25 - assert P[1, 1] == 0.25 - P[dict(X=0, Y=1)] = 0.5 - assert P[dict(X=0, Y=1)] == 0.5 - - -def test_event_values(): - assert event_values({'A': 10, 'B': 9, 'C': 8}, ['C', 'A']) == (8, 10) - assert event_values((1, 2), ['C', 'A']) == (1, 2) - - -def test_enumerate_joint(): - P = JointProbDist(['X', 'Y']) - P[0, 0] = 0.25 - P[0, 1] = 0.5 - P[1, 1] = P[2, 1] = 0.125 - assert enumerate_joint(['Y'], dict(X=0), P) == 0.75 - assert enumerate_joint(['X'], dict(Y=2), P) == 0 - assert enumerate_joint(['X'], dict(Y=1), P) == 0.75 - - -def test_enumerate_joint_ask(): - P = JointProbDist(['X', 'Y']) - P[0, 0] = 0.25 - P[0, 1] = 0.5 - P[1, 1] = P[2, 1] = 0.125 - assert enumerate_joint_ask( - 'X', dict(Y=1), P).show_approx() == '0: 0.667, 1: 0.167, 2: 0.167' - - -def test_bayesnode_p(): - bn = BayesNode('X', 'Burglary', {T: 0.2, F: 0.625}) - assert bn.p(False, {'Burglary': False, 'Earthquake': True}) == 0.375 - assert BayesNode('W', '', 0.75).p(False, {'Random': True}) == 0.25 - - -def test_bayesnode_sample(): - X = BayesNode('X', 'Burglary', {T: 0.2, F: 0.625}) - assert X.sample({'Burglary': False, 'Earthquake': True}) in [True, False] - Z = BayesNode('Z', 'P Q', {(True, True): 0.2, (True, False): 0.3, - (False, True): 0.5, (False, False): 0.7}) - assert Z.sample({'P': True, 'Q': False}) in [True, False] - - -def test_enumeration_ask(): - assert enumeration_ask( - 'Burglary', dict(JohnCalls=T, MaryCalls=T), - burglary).show_approx() == 'False: 0.716, True: 0.284' - - -def test_elemination_ask(): - elimination_ask( - 'Burglary', dict(JohnCalls=T, MaryCalls=T), - burglary).show_approx() == 'False: 0.716, True: 0.284' - - -def test_rejection_sampling(): - random.seed(47) - rejection_sampling( - 'Burglary', dict(JohnCalls=T, MaryCalls=T), - burglary, 10000).show_approx() == 'False: 0.7, True: 0.3' - - -def test_likelihood_weighting(): - random.seed(1017) - assert likelihood_weighting( - 'Burglary', dict(JohnCalls=T, MaryCalls=T), - burglary, 10000).show_approx() == 'False: 0.702, True: 0.298' - - -def test_forward_backward(): - umbrella_prior = [0.5, 0.5] - umbrella_transition = [[0.7, 0.3], [0.3, 0.7]] - umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]] - umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor) - - umbrella_evidence = [T, T, F, T, T] - assert (rounder(forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior)) == - [[0.6469, 0.3531], [0.8673, 0.1327], [0.8204, 0.1796], [0.3075, 0.6925], - [0.8204, 0.1796], [0.8673, 0.1327]]) - - umbrella_evidence = [T, F, T, F, T] - assert rounder(forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior)) == [ - [0.5871, 0.4129], [0.7177, 0.2823], [0.2324, 0.7676], [0.6072, 0.3928], - [0.2324, 0.7676], [0.7177, 0.2823]] - - -def test_fixed_lag_smoothing(): - umbrella_evidence = [T, F, T, F, T] - e_t = F - t = 4 - umbrella_transition = [[0.7, 0.3], [0.3, 0.7]] - umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]] - umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor) - - d = 2 - assert rounder(fixed_lag_smoothing(e_t, umbrellaHMM, d, - umbrella_evidence, t)) == [0.1111, 0.8889] - d = 5 - assert fixed_lag_smoothing(e_t, umbrellaHMM, d, umbrella_evidence, t) is None - - umbrella_evidence = [T, T, F, T, T] - # t = 4 - e_t = T - - d = 1 - assert rounder(fixed_lag_smoothing(e_t, umbrellaHMM, - d, umbrella_evidence, t)) == [0.9939, 0.0061] - - -def test_particle_filtering(): - N = 10 - umbrella_evidence = T - umbrella_transition = [[0.7, 0.3], [0.3, 0.7]] - umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]] - umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor) - s = particle_filtering(umbrella_evidence, N, umbrellaHMM) - assert len(s) == N - assert all(state in 'AB' for state in s) - # XXX 'A' and 'B' are really arbitrary names, but I'm letting it stand for now - - -def test_monte_carlo_localization(): - ## TODO: Add tests for random motion/inaccurate sensors - random.seed('aima-python') - m = MCLmap([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], - [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0]]) - - def P_motion_sample(kin_state, v, w): - """Sample from possible kinematic states. - Returns from a single element distribution (no uncertainity in motion)""" - pos = kin_state[:2] - orient = kin_state[2] - - # for simplicity the robot first rotates and then moves - orient = (orient + w)%4 - for _ in range(orient): - v = (v[1], -v[0]) - pos = vector_add(pos, v) - return pos + (orient,) - - def P_sensor(x, y): - """Conditional probability for sensor reading""" - # Need not be exact probability. Can use a scaled value. - if x == y: - return 0.8 - elif abs(x - y) <= 2: - return 0.05 - else: - return 0 - - from utils import print_table - a = {'v': (0, 0), 'w': 0} - z = (2, 4, 1, 6) - S = monte_carlo_localization(a, z, 1000, P_motion_sample, P_sensor, m) - grid = [[0]*17 for _ in range(11)] - for x, y, _ in S: - if 0 <= x < 11 and 0 <= y < 17: - grid[x][y] += 1 - print("GRID:") - print_table(grid) - - a = {'v': (0, 1), 'w': 0} - z = (2, 3, 5, 7) - S = monte_carlo_localization(a, z, 1000, P_motion_sample, P_sensor, m, S) - grid = [[0]*17 for _ in range(11)] - for x, y, _ in S: - if 0 <= x < 11 and 0 <= y < 17: - grid[x][y] += 1 - print("GRID:") - print_table(grid) - - assert grid[6][7] > 700 - - -def test_gibbs_ask(): - possible_solutions = ['False: 0.16, True: 0.84', 'False: 0.17, True: 0.83', - 'False: 0.15, True: 0.85'] - g_solution = gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200).show_approx() - assert g_solution in possible_solutions - - -# The following should probably go in .ipynb: - -""" -# We can build up a probability distribution like this (p. 469): ->>> P = ProbDist() ->>> P['sunny'] = 0.7 ->>> P['rain'] = 0.2 ->>> P['cloudy'] = 0.08 ->>> P['snow'] = 0.02 - -# and query it like this: (Never mind this ELLIPSIS option -# added to make the doctest portable.) ->>> P['rain'] #doctest:+ELLIPSIS -0.2... - -# A Joint Probability Distribution is dealt with like this [Figure 13.3]: ->>> P = JointProbDist(['Toothache', 'Cavity', 'Catch']) ->>> T, F = True, False ->>> P[T, T, T] = 0.108; P[T, T, F] = 0.012; P[F, T, T] = 0.072; P[F, T, F] = 0.008 ->>> P[T, F, T] = 0.016; P[T, F, F] = 0.064; P[F, F, T] = 0.144; P[F, F, F] = 0.576 - ->>> P[T, T, T] -0.108 - -# Ask for P(Cavity|Toothache=T) ->>> PC = enumerate_joint_ask('Cavity', {'Toothache': T}, P) ->>> PC.show_approx() -'False: 0.4, True: 0.6' - ->>> 0.6-epsilon < PC[T] < 0.6+epsilon -True - ->>> 0.4-epsilon < PC[F] < 0.4+epsilon -True -""" - -if __name__ == '__main__': - pytest.main() diff --git a/tests/test_rl.py b/tests/test_rl.py deleted file mode 100644 index 05f071266..000000000 --- a/tests/test_rl.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest - -from rl import * -from mdp import sequential_decision_environment - - -north = (0, 1) -south = (0,-1) -west = (-1, 0) -east = (1, 0) - -policy = { - (0, 2): east, (1, 2): east, (2, 2): east, (3, 2): None, - (0, 1): north, (2, 1): north, (3, 1): None, - (0, 0): north, (1, 0): west, (2, 0): west, (3, 0): west, -} - - - -def test_PassiveADPAgent(): - agent = PassiveADPAgent(policy, sequential_decision_environment) - for i in range(75): - run_single_trial(agent,sequential_decision_environment) - - # Agent does not always produce same results. - # Check if results are good enough. - assert agent.U[(0, 0)] > 0.15 # In reality around 0.3 - assert agent.U[(0, 1)] > 0.15 # In reality around 0.4 - assert agent.U[(1, 0)] > 0 # In reality around 0.2 - - - -def test_PassiveTDAgent(): - agent = PassiveTDAgent(policy, sequential_decision_environment, alpha=lambda n: 60./(59+n)) - for i in range(200): - run_single_trial(agent,sequential_decision_environment) - - # Agent does not always produce same results. - # Check if results are good enough. - assert agent.U[(0, 0)] > 0.15 # In reality around 0.3 - assert agent.U[(0, 1)] > 0.15 # In reality around 0.35 - assert agent.U[(1, 0)] > 0.15 # In reality around 0.25 - - -def test_QLearning(): - q_agent = QLearningAgent(sequential_decision_environment, Ne=5, Rplus=2, - alpha=lambda n: 60./(59+n)) - - for i in range(200): - run_single_trial(q_agent,sequential_decision_environment) - - # Agent does not always produce same results. - # Check if results are good enough. - assert q_agent.Q[((0, 1), (0, 1))] >= -0.5 # In reality around 0.1 - assert q_agent.Q[((1, 0), (0, -1))] <= 0.5 # In reality around -0.1 diff --git a/tests/test_search.py b/tests/test_search.py deleted file mode 100644 index f22ca6f89..000000000 --- a/tests/test_search.py +++ /dev/null @@ -1,237 +0,0 @@ -import pytest -from search import * - - -romania_problem = GraphProblem('Arad', 'Bucharest', romania_map) -vacumm_world = GraphProblemStochastic('State_1', ['State_7', 'State_8'], vacumm_world) -LRTA_problem = OnlineSearchProblem('State_3', 'State_5', one_dim_state_space) - -def test_find_min_edge(): - assert romania_problem.find_min_edge() == 70 - - -def test_breadth_first_tree_search(): - assert breadth_first_tree_search( - romania_problem).solution() == ['Sibiu', 'Fagaras', 'Bucharest'] - - -def test_breadth_first_search(): - assert breadth_first_search(romania_problem).solution() == ['Sibiu', 'Fagaras', 'Bucharest'] - - -def test_best_first_graph_search(): - # uniform_cost_search and astar_search test it indirectly - assert best_first_graph_search( - romania_problem, - lambda node: node.state).solution() == ['Sibiu', 'Fagaras', 'Bucharest'] - assert best_first_graph_search( - romania_problem, - lambda node: node.state[::-1]).solution() == ['Timisoara', - 'Lugoj', - 'Mehadia', - 'Drobeta', - 'Craiova', - 'Pitesti', - 'Bucharest'] - - -def test_uniform_cost_search(): - assert uniform_cost_search( - romania_problem).solution() == ['Sibiu', 'Rimnicu', 'Pitesti', 'Bucharest'] - - -def test_depth_first_graph_search(): - solution = depth_first_graph_search(romania_problem).solution() - assert solution[-1] == 'Bucharest' - - -def test_iterative_deepening_search(): - assert iterative_deepening_search( - romania_problem).solution() == ['Sibiu', 'Fagaras', 'Bucharest'] - - -def test_depth_limited_search(): - solution_3 = depth_limited_search(romania_problem, 3).solution() - assert solution_3[-1] == 'Bucharest' - assert depth_limited_search(romania_problem, 2) == 'cutoff' - solution_50 = depth_limited_search(romania_problem).solution() - assert solution_50[-1] == 'Bucharest' - - -def test_bidirectional_search(): - assert bidirectional_search(romania_problem) == 418 - - -def test_astar_search(): - assert astar_search(romania_problem).solution() == ['Sibiu', 'Rimnicu', 'Pitesti', 'Bucharest'] - - -def test_recursive_best_first_search(): - assert recursive_best_first_search( - romania_problem).solution() == ['Sibiu', 'Rimnicu', 'Pitesti', 'Bucharest'] - - -def test_hill_climbing(): - prob = PeakFindingProblem((0, 0), [[0, 5, 10, 20], - [-3, 7, 11, 5]]) - assert hill_climbing(prob) == (0, 3) - prob = PeakFindingProblem((0, 0), [[0, 5, 10, 8], - [-3, 7, 9, 999], - [1, 2, 5, 11]]) - assert hill_climbing(prob) == (0, 2) - prob = PeakFindingProblem((2, 0), [[0, 5, 10, 8], - [-3, 7, 9, 999], - [1, 2, 5, 11]]) - assert hill_climbing(prob) == (1, 3) - - -def test_simulated_annealing(): - random.seed("aima-python") - prob = PeakFindingProblem((0, 0), [[0, 5, 10, 20], - [-3, 7, 11, 5]]) - sols = {prob.value(simulated_annealing(prob)) for i in range(100)} - assert max(sols) == 20 - prob = PeakFindingProblem((0, 0), [[0, 5, 10, 8], - [-3, 7, 9, 999], - [1, 2, 5, 11]]) - sols = {prob.value(simulated_annealing(prob)) for i in range(100)} - assert max(sols) == 999 - - -def test_BoggleFinder(): - board = list('SARTELNID') - """ - >>> print_boggle(board) - S A R - T E L - N I D - """ - f = BoggleFinder(board) - assert len(f) == 206 - - -def test_and_or_graph_search(): - def run_plan(state, problem, plan): - if problem.goal_test(state): - return True - if len(plan) is not 2: - return False - predicate = lambda x: run_plan(x, problem, plan[1][x]) - return all(predicate(r) for r in problem.result(state, plan[0])) - plan = and_or_graph_search(vacumm_world) - assert run_plan('State_1', vacumm_world, plan) - - -def test_LRTAStarAgent(): - my_agent = LRTAStarAgent(LRTA_problem) - assert my_agent('State_3') == 'Right' - assert my_agent('State_4') == 'Left' - assert my_agent('State_3') == 'Right' - assert my_agent('State_4') == 'Right' - assert my_agent('State_5') is None - - my_agent = LRTAStarAgent(LRTA_problem) - assert my_agent('State_4') == 'Left' - - my_agent = LRTAStarAgent(LRTA_problem) - assert my_agent('State_5') is None - - -def test_genetic_algorithm(): - # Graph coloring - edges = { - 'A': [0, 1], - 'B': [0, 3], - 'C': [1, 2], - 'D': [2, 3] - } - - def fitness(c): - return sum(c[n1] != c[n2] for (n1, n2) in edges.values()) - - solution_chars = GA_GraphColoringChars(edges, fitness) - assert solution_chars == ['R', 'G', 'R', 'G'] or solution_chars == ['G', 'R', 'G', 'R'] - - solution_bools = GA_GraphColoringBools(edges, fitness) - assert solution_bools == [True, False, True, False] or solution_bools == [False, True, False, True] - - solution_ints = GA_GraphColoringInts(edges, fitness) - assert solution_ints == [0, 1, 0, 1] or solution_ints == [1, 0, 1, 0] - - # Queens Problem - gene_pool = range(8) - population = init_population(100, gene_pool, 8) - - def fitness(q): - non_attacking = 0 - for row1 in range(len(q)): - for row2 in range(row1+1, len(q)): - col1 = int(q[row1]) - col2 = int(q[row2]) - row_diff = row1 - row2 - col_diff = col1 - col2 - - if col1 != col2 and row_diff != col_diff and row_diff != -col_diff: - non_attacking += 1 - - return non_attacking - - - solution = genetic_algorithm(population, fitness, gene_pool=gene_pool, f_thres=25) - assert fitness(solution) >= 25 - - -def GA_GraphColoringChars(edges, fitness): - gene_pool = ['R', 'G'] - population = init_population(8, gene_pool, 4) - - return genetic_algorithm(population, fitness, gene_pool=gene_pool) - - -def GA_GraphColoringBools(edges, fitness): - gene_pool = [True, False] - population = init_population(8, gene_pool, 4) - - return genetic_algorithm(population, fitness, gene_pool=gene_pool) - - -def GA_GraphColoringInts(edges, fitness): - population = init_population(8, [0, 1], 4) - - return genetic_algorithm(population, fitness) - - - -# TODO: for .ipynb: -""" ->>> compare_graph_searchers() - Searcher romania_map(A, B) romania_map(O, N) australia_map - breadth_first_tree_search < 21/ 22/ 59/B> <1158/1159/3288/N> < 7/ 8/ 22/WA> - breadth_first_search < 7/ 11/ 18/B> < 19/ 20/ 45/N> < 2/ 6/ 8/WA> - depth_first_graph_search < 8/ 9/ 20/B> < 16/ 17/ 38/N> < 4/ 5/ 11/WA> - iterative_deepening_search < 11/ 33/ 31/B> < 656/1815/1812/N> < 3/ 11/ 11/WA> - depth_limited_search < 54/ 65/ 185/B> < 387/1012/1125/N> < 50/ 54/ 200/WA> - recursive_best_first_search < 5/ 6/ 15/B> <5887/5888/16532/N> < 11/12/ 43/WA> - ->>> ' '.join(f.words()) -'LID LARES DEAL LIE DIETS LIN LINT TIL TIN RATED ERAS LATEN DEAR TIE LINE INTER -STEAL LATED LAST TAR SAL DITES RALES SAE RETS TAE RAT RAS SAT IDLE TILDES LEAST -IDEAS LITE SATED TINED LEST LIT RASE RENTS TINEA EDIT EDITS NITES ALES LATE -LETS RELIT TINES LEI LAT ELINT LATI SENT TARED DINE STAR SEAR NEST LITAS TIED -SEAT SERAL RATE DINT DEL DEN SEAL TIER TIES NET SALINE DILATE EAST TIDES LINTER -NEAR LITS ELINTS DENI RASED SERA TILE NEAT DERAT IDLEST NIDE LIEN STARED LIER -LIES SETA NITS TINE DITAS ALINE SATIN TAS ASTER LEAS TSAR LAR NITE RALE LAS -REAL NITER ATE RES RATEL IDEA RET IDEAL REI RATS STALE DENT RED IDES ALIEN SET -TEL SER TEN TEA TED SALE TALE STILE ARES SEA TILDE SEN SEL ALINES SEI LASE -DINES ILEA LINES ELD TIDE RENT DIEL STELA TAEL STALED EARL LEA TILES TILER LED -ETA TALI ALE LASED TELA LET IDLER REIN ALIT ITS NIDES DIN DIE DENTS STIED LINER -LASTED RATINE ERA IDLES DIT RENTAL DINER SENTI TINEAL DEIL TEAR LITER LINTS -TEAL DIES EAR EAT ARLES SATE STARE DITS DELI DENTAL REST DITE DENTIL DINTS DITA -DIET LENT NETS NIL NIT SETAL LATS TARE ARE SATI' - ->>> boggle_hill_climbing(list('ABCDEFGHI'), verbose=False) -(['E', 'P', 'R', 'D', 'O', 'A', 'G', 'S', 'T'], 123) -""" - -if __name__ == '__main__': - pytest.main() diff --git a/tests/test_text.py b/tests/test_text.py deleted file mode 100644 index 311243745..000000000 --- a/tests/test_text.py +++ /dev/null @@ -1,296 +0,0 @@ -import pytest -import os -import random - -from text import * -from utils import isclose, open_data - - - -def test_text_models(): - flatland = open_data("EN-text/flatland.txt").read() - wordseq = words(flatland) - P1 = UnigramWordModel(wordseq) - P2 = NgramWordModel(2, wordseq) - P3 = NgramWordModel(3, wordseq) - - # Test top - assert P1.top(5) == [(2081, 'the'), (1479, 'of'), - (1021, 'and'), (1008, 'to'), - (850, 'a')] - - assert P2.top(5) == [(368, ('of', 'the')), (152, ('to', 'the')), - (152, ('in', 'the')), (86, ('of', 'a')), - (80, ('it', 'is'))] - - assert P3.top(5) == [(30, ('a', 'straight', 'line')), - (19, ('of', 'three', 'dimensions')), - (16, ('the', 'sense', 'of')), - (13, ('by', 'the', 'sense')), - (13, ('as', 'well', 'as'))] - - # Test isclose - assert isclose(P1['the'], 0.0611, rel_tol=0.001) - assert isclose(P2['of', 'the'], 0.0108, rel_tol=0.01) - assert isclose(P3['so', 'as', 'to'], 0.000323, rel_tol=0.001) - - # Test cond_prob.get - assert P2.cond_prob.get(('went',)) is None - assert P3.cond_prob['in', 'order'].dictionary == {'to': 6} - - # Test dictionary - test_string = 'unigram' - wordseq = words(test_string) - P1 = UnigramWordModel(wordseq) - assert P1.dictionary == {('unigram'): 1} - - test_string = 'bigram text' - wordseq = words(test_string) - P2 = NgramWordModel(2, wordseq) - assert P2.dictionary == {('bigram', 'text'): 1} - - test_string = 'test trigram text here' - wordseq = words(test_string) - P3 = NgramWordModel(3, wordseq) - assert ('test', 'trigram', 'text') in P3.dictionary - assert ('trigram', 'text', 'here') in P3.dictionary - - -def test_char_models(): - test_string = 'test unigram' - wordseq = words(test_string) - P1 = UnigramCharModel(wordseq) - - expected_unigrams = {'n': 1, 's': 1, 'e': 1, 'i': 1, 'm': 1, 'g': 1, 'r': 1, 'a': 1, 't': 2, 'u': 1} - assert len(P1.dictionary) == len(expected_unigrams) - for char in test_string.replace(' ', ''): - assert char in P1.dictionary - - test_string = 'alpha beta' - wordseq = words(test_string) - P1 = NgramCharModel(1, wordseq) - - assert len(P1.dictionary) == len(set(test_string)) - for char in set(test_string): - assert tuple(char) in P1.dictionary - - test_string = 'bigram' - wordseq = words(test_string) - P2 = NgramCharModel(2, wordseq) - - expected_bigrams = {(' ', 'b'): 1, ('b', 'i'): 1, ('i', 'g'): 1, ('g', 'r'): 1, ('r', 'a'): 1, ('a', 'm'): 1} - - assert len(P2.dictionary) == len(expected_bigrams) - for bigram, count in expected_bigrams.items(): - assert bigram in P2.dictionary - assert P2.dictionary[bigram] == count - - test_string = 'bigram bigram' - wordseq = words(test_string) - P2 = NgramCharModel(2, wordseq) - - expected_bigrams = {(' ', 'b'): 2, ('b', 'i'): 2, ('i', 'g'): 2, ('g', 'r'): 2, ('r', 'a'): 2, ('a', 'm'): 2} - - assert len(P2.dictionary) == len(expected_bigrams) - for bigram, count in expected_bigrams.items(): - assert bigram in P2.dictionary - assert P2.dictionary[bigram] == count - - test_string = 'trigram' - wordseq = words(test_string) - P3 = NgramCharModel(3, wordseq) - expected_trigrams = {(' ', 't', 'r'): 1, ('t', 'r', 'i'): 1, - ('r', 'i', 'g'): 1, ('i', 'g', 'r'): 1, - ('g', 'r', 'a'): 1, ('r', 'a', 'm'): 1} - - assert len(P3.dictionary) == len(expected_trigrams) - for bigram, count in expected_trigrams.items(): - assert bigram in P3.dictionary - assert P3.dictionary[bigram] == count - - test_string = 'trigram trigram trigram' - wordseq = words(test_string) - P3 = NgramCharModel(3, wordseq) - expected_trigrams = {(' ', 't', 'r'): 3, ('t', 'r', 'i'): 3, - ('r', 'i', 'g'): 3, ('i', 'g', 'r'): 3, - ('g', 'r', 'a'): 3, ('r', 'a', 'm'): 3} - - assert len(P3.dictionary) == len(expected_trigrams) - for bigram, count in expected_trigrams.items(): - assert bigram in P3.dictionary - assert P3.dictionary[bigram] == count - - -def test_samples(): - story = open_data("EN-text/flatland.txt").read() - story += open_data("gutenberg.txt").read() - wordseq = words(story) - P1 = UnigramWordModel(wordseq) - P2 = NgramWordModel(2, wordseq) - P3 = NgramWordModel(3, wordseq) - - s1 = P1.samples(10) - s2 = P3.samples(10) - s3 = P3.samples(10) - - assert len(s1.split(' ')) == 10 - assert len(s2.split(' ')) == 10 - assert len(s3.split(' ')) == 10 - - -def test_viterbi_segmentation(): - flatland = open_data("EN-text/flatland.txt").read() - wordseq = words(flatland) - P = UnigramWordModel(wordseq) - text = "itiseasytoreadwordswithoutspaces" - - s, p = viterbi_segment(text, P) - assert s == [ - 'it', 'is', 'easy', 'to', 'read', 'words', 'without', 'spaces'] - - -def test_shift_encoding(): - code = shift_encode("This is a secret message.", 17) - - assert code == 'Kyzj zj r jvtivk dvjjrxv.' - - -def test_shift_decoding(): - flatland = open_data("EN-text/flatland.txt").read() - ring = ShiftDecoder(flatland) - msg = ring.decode('Kyzj zj r jvtivk dvjjrxv.') - - assert msg == 'This is a secret message.' - - -def test_permutation_decoder(): - gutenberg = open_data("gutenberg.txt").read() - flatland = open_data("EN-text/flatland.txt").read() - - pd = PermutationDecoder(canonicalize(gutenberg)) - assert pd.decode('aba') in ('ece', 'ete', 'tat', 'tit', 'txt') - - pd = PermutationDecoder(canonicalize(flatland)) - assert pd.decode('aba') in ('ded', 'did', 'ece', 'ele', 'eme', 'ere', 'eve', 'eye', 'iti', 'mom', 'ses', 'tat', 'tit') - - -def test_rot13_encoding(): - code = rot13('Hello, world!') - - assert code == 'Uryyb, jbeyq!' - - -def test_rot13_decoding(): - flatland = open_data("EN-text/flatland.txt").read() - ring = ShiftDecoder(flatland) - msg = ring.decode(rot13('Hello, world!')) - - assert msg == 'Hello, world!' - - -def test_counting_probability_distribution(): - D = CountingProbDist() - - for i in range(10000): - D.add(random.choice('123456')) - - ps = [D[n] for n in '123456'] - - assert 1 / 7 <= min(ps) <= max(ps) <= 1 / 5 - - -def test_ir_system(): - from collections import namedtuple - Results = namedtuple('IRResults', ['score', 'url']) - - uc = UnixConsultant() - - def verify_query(query, expected): - assert len(expected) == len(query) - - for expected, (score, d) in zip(expected, query): - doc = uc.documents[d] - assert "{0:.2f}".format( - expected.score) == "{0:.2f}".format(score * 100) - assert os.path.basename(expected.url) == os.path.basename(doc.url) - - return True - - q1 = uc.query("how do I remove a file") - assert verify_query(q1, [ - Results(76.83, "aima-data/MAN/rm.txt"), - Results(67.83, "aima-data/MAN/tar.txt"), - Results(67.79, "aima-data/MAN/cp.txt"), - Results(66.58, "aima-data/MAN/zip.txt"), - Results(64.58, "aima-data/MAN/gzip.txt"), - Results(63.74, "aima-data/MAN/pine.txt"), - Results(62.95, "aima-data/MAN/shred.txt"), - Results(57.46, "aima-data/MAN/pico.txt"), - Results(43.38, "aima-data/MAN/login.txt"), - Results(41.93, "aima-data/MAN/ln.txt"), - ]) - - q2 = uc.query("how do I delete a file") - assert verify_query(q2, [ - Results(75.47, "aima-data/MAN/diff.txt"), - Results(69.12, "aima-data/MAN/pine.txt"), - Results(63.56, "aima-data/MAN/tar.txt"), - Results(60.63, "aima-data/MAN/zip.txt"), - Results(57.46, "aima-data/MAN/pico.txt"), - Results(51.28, "aima-data/MAN/shred.txt"), - Results(26.72, "aima-data/MAN/tr.txt"), - ]) - - q3 = uc.query("email") - assert verify_query(q3, [ - Results(18.39, "aima-data/MAN/pine.txt"), - Results(12.01, "aima-data/MAN/info.txt"), - Results(9.89, "aima-data/MAN/pico.txt"), - Results(8.73, "aima-data/MAN/grep.txt"), - Results(8.07, "aima-data/MAN/zip.txt"), - ]) - - q4 = uc.query("word count for files") - assert verify_query(q4, [ - Results(128.15, "aima-data/MAN/grep.txt"), - Results(94.20, "aima-data/MAN/find.txt"), - Results(81.71, "aima-data/MAN/du.txt"), - Results(55.45, "aima-data/MAN/ps.txt"), - Results(53.42, "aima-data/MAN/more.txt"), - Results(42.00, "aima-data/MAN/dd.txt"), - Results(12.85, "aima-data/MAN/who.txt"), - ]) - - q5 = uc.query("learn: date") - assert verify_query(q5, []) - - q6 = uc.query("2003") - assert verify_query(q6, [ - Results(14.58, "aima-data/MAN/pine.txt"), - Results(11.62, "aima-data/MAN/jar.txt"), - ]) - - -def test_words(): - assert words("``EGAD!'' Edgar cried.") == ['egad', 'edgar', 'cried'] - - -def test_canonicalize(): - assert canonicalize("``EGAD!'' Edgar cried.") == 'egad edgar cried' - - -def test_translate(): - text = 'orange apple lemon ' - func = lambda x: ('s ' + x) if x ==' ' else x - - assert translate(text, func) == 'oranges apples lemons ' - - -def test_bigrams(): - assert bigrams('this') == ['th', 'hi', 'is'] - assert bigrams(['this', 'is', 'a', 'test']) == [['this', 'is'], ['is', 'a'], ['a', 'test']] - - - -if __name__ == '__main__': - pytest.main() diff --git a/tests/test_utils.py b/tests/test_utils.py deleted file mode 100644 index a07bc76ef..000000000 --- a/tests/test_utils.py +++ /dev/null @@ -1,307 +0,0 @@ -import pytest -from utils import * -import random - - -def test_removeall_list(): - assert removeall(4, []) == [] - assert removeall(4, [1, 2, 3, 4]) == [1, 2, 3] - assert removeall(4, [4, 1, 4, 2, 3, 4, 4]) == [1, 2, 3] - - -def test_removeall_string(): - assert removeall('s', '') == '' - assert removeall('s', 'This is a test. Was a test.') == 'Thi i a tet. Wa a tet.' - - -def test_unique(): - assert unique([1, 2, 3, 2, 1]) == [1, 2, 3] - assert unique([1, 5, 6, 7, 6, 5]) == [1, 5, 6, 7] - - -def test_count(): - assert count([1, 2, 3, 4, 2, 3, 4]) == 7 - assert count("aldpeofmhngvia") == 14 - assert count([True, False, True, True, False]) == 3 - assert count([5 > 1, len("abc") == 3, 3+1 == 5]) == 2 - - -def test_product(): - assert product([1, 2, 3, 4]) == 24 - assert product(list(range(1, 11))) == 3628800 - - -def test_first(): - assert first('word') == 'w' - assert first('') is None - assert first('', 'empty') == 'empty' - assert first(range(10)) == 0 - assert first(x for x in range(10) if x > 3) == 4 - assert first(x for x in range(10) if x > 100) is None - - -def test_is_in(): - e = [] - assert is_in(e, [1, e, 3]) is True - assert is_in(e, [1, [], 3]) is False - - -def test_mode(): - assert mode([12, 32, 2, 1, 2, 3, 2, 3, 2, 3, 44, 3, 12, 4, 9, 0, 3, 45, 3]) == 3 - assert mode("absndkwoajfkalwpdlsdlfllalsflfdslgflal") == 'l' - - -def test_powerset(): - assert powerset([1, 2, 3]) == [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] - - -def test_argminmax(): - assert argmin([-2, 1], key=abs) == 1 - assert argmax([-2, 1], key=abs) == -2 - assert argmax(['one', 'to', 'three'], key=len) == 'three' - - -def test_histogram(): - assert histogram([1, 2, 4, 2, 4, 5, 7, 9, 2, 1]) == [(1, 2), (2, 3), - (4, 2), (5, 1), - (7, 1), (9, 1)] - assert histogram([1, 2, 4, 2, 4, 5, 7, 9, 2, 1], 0, lambda x: x*x) == [(1, 2), (4, 3), - (16, 2), (25, 1), - (49, 1), (81, 1)] - assert histogram([1, 2, 4, 2, 4, 5, 7, 9, 2, 1], 1) == [(2, 3), (4, 2), - (1, 2), (9, 1), - (7, 1), (5, 1)] - - -def test_dotproduct(): - assert dotproduct([1, 2, 3], [1000, 100, 10]) == 1230 - - -def test_element_wise_product(): - assert element_wise_product([1, 2, 5], [7, 10, 0]) == [7, 20, 0] - assert element_wise_product([1, 6, 3, 0], [9, 12, 0, 0]) == [9, 72, 0, 0] - - -def test_matrix_multiplication(): - assert matrix_multiplication([[1, 2, 3], - [2, 3, 4]], - [[3, 4], - [1, 2], - [1, 0]]) == [[8, 8], [13, 14]] - - assert matrix_multiplication([[1, 2, 3], - [2, 3, 4]], - [[3, 4, 8, 1], - [1, 2, 5, 0], - [1, 0, 0, 3]], - [[1, 2], - [3, 4], - [5, 6], - [1, 2]]) == [[132, 176], [224, 296]] - - -def test_vector_to_diagonal(): - assert vector_to_diagonal([1, 2, 3]) == [[1, 0, 0], [0, 2, 0], [0, 0, 3]] - assert vector_to_diagonal([0, 3, 6]) == [[0, 0, 0], [0, 3, 0], [0, 0, 6]] - - -def test_vector_add(): - assert vector_add((0, 1), (8, 9)) == (8, 10) - - -def test_scalar_vector_product(): - assert scalar_vector_product(2, [1, 2, 3]) == [2, 4, 6] - - -def test_scalar_matrix_product(): - assert rounder(scalar_matrix_product(-5, [[1, 2], [3, 4], [0, 6]])) == [[-5, -10], [-15, -20], - [0, -30]] - assert rounder(scalar_matrix_product(0.2, [[1, 2], [2, 3]])) == [[0.2, 0.4], [0.4, 0.6]] - - -def test_inverse_matrix(): - assert rounder(inverse_matrix([[1, 0], [0, 1]])) == [[1, 0], [0, 1]] - assert rounder(inverse_matrix([[2, 1], [4, 3]])) == [[1.5, -0.5], [-2.0, 1.0]] - assert rounder(inverse_matrix([[4, 7], [2, 6]])) == [[0.6, -0.7], [-0.2, 0.4]] - - -def test_rounder(): - assert rounder(5.3330000300330) == 5.3330 - assert rounder(10.234566) == 10.2346 - assert rounder([1.234566, 0.555555, 6.010101]) == [1.2346, 0.5556, 6.0101] - assert rounder([[1.234566, 0.555555, 6.010101], - [10.505050, 12.121212, 6.030303]]) == [[1.2346, 0.5556, 6.0101], - [10.5051, 12.1212, 6.0303]] - - -def test_num_or_str(): - assert num_or_str('42') == 42 - assert num_or_str(' 42x ') == '42x' - - -def test_normalize(): - assert normalize([1, 2, 1]) == [0.25, 0.5, 0.25] - - -def test_norm(): - assert isclose(norm([1, 2, 1], 1), 4) - assert isclose(norm([3, 4], 2), 5) - assert isclose(norm([-1, 1, 2], 4), 18**0.25) - - -def test_clip(): - assert [clip(x, 0, 1) for x in [-1, 0.5, 10]] == [0, 0.5, 1] - - -def test_sigmoid(): - assert isclose(0.5, sigmoid(0)) - assert isclose(0.7310585786300049, sigmoid(1)) - assert isclose(0.2689414213699951, sigmoid(-1)) - - -def test_gaussian(): - assert gaussian(1,0.5,0.7) == 0.6664492057835993 - assert gaussian(5,2,4.5) == 0.19333405840142462 - assert gaussian(3,1,3) == 0.3989422804014327 - - -def test_sigmoid_derivative(): - value = 1 - assert sigmoid_derivative(value) == 0 - - value = 3 - assert sigmoid_derivative(value) == -6 - - -def test_weighted_choice(): - choices = [('a', 0.5), ('b', 0.3), ('c', 0.2)] - choice = weighted_choice(choices) - assert choice in choices - - -def compare_list(x, y): - return all([elm_x == y[i] for i, elm_x in enumerate(x)]) - - -def test_distance(): - assert distance((1, 2), (5, 5)) == 5.0 - - -def test_distance_squared(): - assert distance_squared((1, 2), (5, 5)) == 25.0 - - -def test_vector_clip(): - assert vector_clip((-1, 10), (0, 0), (9, 9)) == (0, 9) - - -def test_turn_heading(): - assert turn_heading((0, 1), 1) == (-1, 0) - assert turn_heading((0, 1), -1) == (1, 0) - assert turn_heading((1, 0), 1) == (0, 1) - assert turn_heading((1, 0), -1) == (0, -1) - assert turn_heading((0, -1), 1) == (1, 0) - assert turn_heading((0, -1), -1) == (-1, 0) - assert turn_heading((-1, 0), 1) == (0, -1) - assert turn_heading((-1, 0), -1) == (0, 1) - - -def test_turn_left(): - assert turn_left((0, 1)) == (-1, 0) - - -def test_turn_right(): - assert turn_right((0, 1)) == (1, 0) - - -def test_step(): - assert step(1) == step(0.5) == 1 - assert step(0) == 1 - assert step(-1) == step(-0.5) == 0 - - -def test_Expr(): - A, B, C = symbols('A, B, C') - assert symbols('A, B, C') == (Symbol('A'), Symbol('B'), Symbol('C')) - assert A.op == repr(A) == 'A' - assert arity(A) == 0 and A.args == () - - b = Expr('+', A, 1) - assert arity(b) == 2 and b.op == '+' and b.args == (A, 1) - - u = Expr('-', b) - assert arity(u) == 1 and u.op == '-' and u.args == (b,) - - assert (b ** u) == (b ** u) - assert (b ** u) != (u ** b) - - assert A + b * C ** 2 == A + (b * (C ** 2)) - - ex = C + 1 / (A % 1) - assert list(subexpressions(ex)) == [(C + (1 / (A % 1))), C, (1 / (A % 1)), 1, (A % 1), A, 1] - assert A in subexpressions(ex) - assert B not in subexpressions(ex) - - -def test_expr(): - P, Q, x, y, z, GP = symbols('P, Q, x, y, z, GP') - assert (expr(y + 2 * x) - == expr('y + 2 * x') - == Expr('+', y, Expr('*', 2, x))) - assert expr('P & Q ==> P') == Expr('==>', P & Q, P) - assert expr('P & Q <=> Q & P') == Expr('<=>', (P & Q), (Q & P)) - assert expr('P(x) | P(y) & Q(z)') == (P(x) | (P(y) & Q(z))) - # x is grandparent of z if x is parent of y and y is parent of z: - assert (expr('GP(x, z) <== P(x, y) & P(y, z)') - == Expr('<==', GP(x, z), P(x, y) & P(y, z))) - -def test_FIFOQueue() : - # Create an object - queue = FIFOQueue() - # Generate an array of number to be used for testing - test_data = [ random.choice(range(100)) for i in range(100) ] - # Index of the element to be added in the queue - front_head = 0 - # Index of the element to be removed from the queue - back_head = 0 - while front_head < 100 or back_head < 100 : - if front_head == 100 : # only possible to remove - # check for pop and append method - assert queue.pop() == test_data[back_head] - back_head += 1 - elif back_head == front_head : # only possible to push element into queue - queue.append(test_data[front_head]) - front_head += 1 - # else do it in a random manner - elif random.random() < 0.5 : - assert queue.pop() == test_data[back_head] - back_head += 1 - else : - queue.append(test_data[front_head]) - front_head += 1 - # check for __len__ method - assert len(queue) == front_head - back_head - # chek for __contains__ method - if front_head - back_head > 0 : - assert random.choice(test_data[back_head:front_head]) in queue - - # check extend method - test_data1 = [ random.choice(range(100)) for i in range(50) ] - test_data2 = [ random.choice(range(100)) for i in range(50) ] - # append elements of test data 1 - queue.extend(test_data1) - # append elements of test data 2 - queue.extend(test_data2) - # reset front_head - front_head = 0 - - while front_head < 50 : - assert test_data1[front_head] == queue.pop() - front_head += 1 - - while front_head < 100 : - assert test_data2[front_head - 50] == queue.pop() - front_head += 1 - -if __name__ == '__main__': - pytest.main() diff --git a/text.ipynb b/text.ipynb deleted file mode 100644 index aeebf8ecd..000000000 --- a/text.ipynb +++ /dev/null @@ -1,780 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# TEXT\n", - "\n", - "This notebook serves as supporting material for topics covered in **Chapter 22 - Natural Language Processing** from the book *Artificial Intelligence: A Modern Approach*. This notebook uses implementations from [text.py](https://github.com/aimacode/aima-python/blob/master/text.py)." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from text import *\n", - "from utils import open_data\n", - "from notebook import psource" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CONTENTS\n", - "\n", - "* Text Models\n", - "* Viterbi Text Segmentation\n", - "* Information Retrieval\n", - "* Information Extraction\n", - "* Decoders" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEXT MODELS\n", - "\n", - "Before we start analyzing text processing algorithms, we will need to build some language models. Those models serve as a look-up table for character or word probabilities (depending on the type of model). These models can give us the probabilities of words or character sequences appearing in text. Take as example \"the\". Text models can give us the probability of \"the\", *P(\"the\")*, either as a word or as a sequence of characters (\"t\" followed by \"h\" followed by \"e\"). The first representation is called \"word model\" and deals with words as distinct objects, while the second is a \"character model\" and deals with sequences of characters as objects. Note that we can specify the number of words or the length of the char sequences to better suit our needs. So, given that number of words equals 2, we have probabilities in the form *P(word1, word2)*. For example, *P(\"of\", \"the\")*. For char models, we do the same but for chars.\n", - "\n", - "It is also useful to store the conditional probabilities of words given preceding words. That means, given we found the words \"of\" and \"the\", what is the chance the next word will be \"world\"? More formally, *P(\"world\"|\"of\", \"the\")*. Generalizing, *P(Wi|Wi-1, Wi-2, ... , Wi-n)*.\n", - "\n", - "We call the word model *N-Gram Word Model* (from the Greek \"gram\", the root of \"write\", or the word for \"letter\") and the char model *N-Gram Character Model*. In the special case where *N* is 1, we call the models *Unigram Word Model* and *Unigram Character Model* respectively.\n", - "\n", - "In the `text` module we implement the two models (both their unigram and n-gram variants) by inheriting from the `CountingProbDist` from `learning.py`. Note that `CountingProbDist` does not return the actual probability of each object, but the number of times it appears in our test data.\n", - "\n", - "For word models we have `UnigramWordModel` and `NgramWordModel`. We supply them with a text file and they show the frequency of the different words. We have `UnigramCharModel` and `NgramCharModel` for the character models.\n", - "\n", - "Execute the cells below to take a look at the code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(UnigramWordModel, NgramWordModel, UnigramCharModel, NgramCharModel)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we build our models. The text file we will use to build them is *Flatland*, by Edwin A. Abbott. We will load it from [here](https://github.com/aimacode/aima-data/blob/a21fc108f52ad551344e947b0eb97df82f8d2b2b/EN-text/flatland.txt). In that directory you can find other text files we might get to use here." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Probabilities\n", - "\n", - "Here we will take a look at how to read text and find the probabilities for each model, and how to retrieve them.\n", - "\n", - "First the word models:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "\n", - "P1 = UnigramWordModel(wordseq)\n", - "P2 = NgramWordModel(2, wordseq)\n", - "\n", - "print(P1.top(5))\n", - "print(P2.top(5))\n", - "\n", - "print(P1['an'])\n", - "print(P2[('i', 'was')])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that the most used word in *Flatland* is 'the', with 2081 occurences, while the most used sequence is 'of the' with 368 occurences. Also, the probability of 'an' is approximately 0.003, while for 'i was' it is close to 0.001. Note that the strings used as keys are all lowercase. For the unigram model, the keys are single strings, while for n-gram models we have n-tuples of strings.\n", - "\n", - "Below we take a look at how we can get information from the conditional probabilities of the model, and how we can generate the next word in a sequence." - ] - }, - { - "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" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "\n", - "P3 = NgramWordModel(3, wordseq)\n", - "\n", - "print(\"Conditional Probabilities Table:\", P3.cond_prob[('i', 'was')].dictionary, '\\n')\n", - "print(\"Conditional Probability of 'once' give 'i was':\", P3.cond_prob[('i', 'was')]['once'], '\\n')\n", - "print(\"Next word after 'i was':\", P3.cond_prob[('i', 'was')].sample())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we print all the possible words that come after 'i was' and the times they have appeared in the model. Next we print the probability of 'once' appearing after 'i was', and finally we pick a word to proceed after 'i was'. Note that the word is picked according to its probability of appearing (high appearance count means higher chance to get picked)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's take a look at the two character models:" - ] - }, - { - "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" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "\n", - "P1 = UnigramCharModel(wordseq)\n", - "P2 = NgramCharModel(2, wordseq)\n", - "\n", - "print(P1.top(5))\n", - "print(P2.top(5))\n", - "\n", - "print(P1['z'])\n", - "print(P2[('g', 'h')])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The most common letter is 'e', appearing more than 19000 times, and the most common sequence is \"\\_t\". That is, a space followed by a 't'. Note that even though we do not count spaces for word models or unigram character models, we do count them for n-gram char models.\n", - "\n", - "Also, the probability of the letter 'z' appearing is close to 0.0006, while for the bigram 'gh' it is 0.003." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating Samples\n", - "\n", - "Apart from reading the probabilities for n-grams, we can also use our model to generate word sequences, using the `samples` function in the word models." - ] - }, - { - "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" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "\n", - "P1 = UnigramWordModel(wordseq)\n", - "P2 = NgramWordModel(2, wordseq)\n", - "P3 = NgramWordModel(3, wordseq)\n", - "\n", - "print(P1.samples(10))\n", - "print(P2.samples(10))\n", - "print(P3.samples(10))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the unigram model, we mostly get gibberish, since each word is picked according to its frequency of appearance in the text, without taking into consideration preceding words. As we increase *n* though, we start to get samples that do have some semblance of conherency and do remind a little bit of normal English. As we increase our data, these samples will get better.\n", - "\n", - "Let's try it. We will add to the model more data to work with and let's see what comes out." - ] - }, - { - "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" - ] - } - ], - "source": [ - "data = open_data(\"EN-text/flatland.txt\").read()\n", - "data += open_data(\"EN-text/sense.txt\").read()\n", - "\n", - "wordseq = words(data)\n", - "\n", - "P3 = NgramWordModel(3, wordseq)\n", - "P4 = NgramWordModel(4, wordseq)\n", - "P5 = NgramWordModel(5, wordseq)\n", - "P7 = NgramWordModel(7, wordseq)\n", - "\n", - "print(P3.samples(15))\n", - "print(P4.samples(15))\n", - "print(P5.samples(15))\n", - "print(P7.samples(15))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice how the samples start to become more and more reasonable as we add more data and increase the *n* parameter. We are still a long way to go though from realistic text generation, but at the same time we can see that with enough data even rudimentary algorithms can output something almost passable." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VITERBI TEXT SEGMENTATION\n", - "\n", - "### Overview\n", - "\n", - "We are given a string containing words of a sentence, but all the spaces are gone! It is very hard to read and we would like to separate the words in the string. We can accomplish this by employing the `Viterbi Segmentation` algorithm. It takes as input the string to segment and a text model, and it returns a list of the separate words.\n", - "\n", - "The algorithm operates in a dynamic programming approach. It starts from the beginning of the string and iteratively builds the best solution using previous solutions. It accomplishes that by segmentating the string into \"windows\", each window representing a word (real or gibberish). It then calculates the probability of the sequence up that window/word occuring and updates its solution. When it is done, it traces back from the final word and finds the complete sequence of words." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(viterbi_segment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The function takes as input a string and a text model, and returns the most probable sequence of words, together with the probability of that sequence.\n", - "\n", - "The \"window\" is `w` and it includes the characters from *j* to *i*. We use it to \"build\" the following sequence: from the start to *j* and then `w`. We have previously calculated the probability from the start to *j*, so now we multiply that probability by `P[w]` to get the probability of the whole sequence. If that probability is greater than the probability we have calculated so far for the sequence from the start to *i* (`best[i]`), we update it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "The model the algorithm uses is the `UnigramTextModel`. First we will build the model using the *Flatland* text and then we will try and separate a space-devoid sentence." - ] - }, - { - "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" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "wordseq = words(flatland)\n", - "P = UnigramWordModel(wordseq)\n", - "text = \"itiseasytoreadwordswithoutspaces\"\n", - "\n", - "s, p = viterbi_segment(text,P)\n", - "print(\"Sequence of words is:\",s)\n", - "print(\"Probability of sequence is:\",p)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The algorithm correctly retrieved the words from the string. It also gave us the probability of this sequence, which is small, but still the most probable segmentation of the string." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## INFORMATION RETRIEVAL\n", - "\n", - "### Overview\n", - "\n", - "With **Information Retrieval (IR)** we find documents that are relevant to a user's needs for information. A popular example is a web search engine, which finds and presents to a user pages relevant to a query. Information retrieval is not limited only to returning documents though, but can also be used for other type of queries. For example, answering questions when the query is a question, returning information when the query is a concept, and many other applications. An IR system is comprised of the following:\n", - "\n", - "* A body (called corpus) of documents: A collection of documents, where the IR will work on.\n", - "\n", - "* A query language: A query represents what the user wants.\n", - "\n", - "* Results: The documents the system grades as relevant to a user's query and needs.\n", - "\n", - "* Presententation of the results: How the results are presented to the user.\n", - "\n", - "How does an IR system determine which documents are relevant though? We can sign a document as relevant if all the words in the query appear in it, and sign it as irrelevant otherwise. We can even extend the query language to support boolean operations (for example, \"paint AND brush\") and then sign as relevant the outcome of the query for the document. This technique though does not give a level of relevancy. All the documents are either relevant or irrelevant, but in reality some documents are more relevant than others.\n", - "\n", - "So, instead of a boolean relevancy system, we use a *scoring function*. There are many scoring functions around for many different situations. One of the most used takes into account the frequency of the words appearing in a document, the frequency of a word appearing across documents (for example, the word \"a\" appears a lot, so it is not very important) and the length of a document (since large documents will have higher occurences for the query terms, but a short document with a lot of occurences seems very relevant). We combine these properties in a formula and we get a numeric score for each document, so we can then quantify relevancy and pick the best documents.\n", - "\n", - "These scoring functions are not perfect though and there is room for improvement. For instance, for the above scoring function we assume each word is independent. That is not the case though, since words can share meaning. For example, the words \"painter\" and \"painters\" are closely related. If in a query we have the word \"painter\" and in a document the word \"painters\" appears a lot, this might be an indication that the document is relevant but we are missing out since we are only looking for \"painter\". There are a lot of ways to combat this. One of them is to reduce the query and document words into their stems. For example, both \"painter\" and \"painters\" have \"paint\" as their stem form. This can improve slightly the performance of algorithms.\n", - "\n", - "To determine how good an IR system is, we give the system a set of queries (for which we know the relevant pages beforehand) and record the results. The two measures for performance are *precision* and *recall*. Precision measures the proportion of result documents that actually are relevant. Recall measures the proportion of relevant documents (which, as mentioned before, we know in advance) appearing in the result documents." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementation\n", - "\n", - "You can read the source code by running the command below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(IRSystem)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `stopwords` argument signifies words in the queries that should not be accounted for in documents. Usually they are very common words that do not add any significant information for a document's relevancy.\n", - "\n", - "A quick guide for the functions in the `IRSystem` class:\n", - "\n", - "* `index_document`: Add document to the collection of documents (named `documents`), which is a list of tuples. Also, count how many times each word in the query appears in each document.\n", - "\n", - "* `index_collection`: Index a collection of documents given by `filenames`.\n", - "\n", - "* `query`: Returns a list of `n` pairs of `(score, docid)` sorted on the score of each document. Also takes care of the special query \"learn: X\", where instead of the normal functionality we present the output of the terminal command \"X\".\n", - "\n", - "* `score`: Scores a given document for the given word using `log(1+k)/log(1+n)`, where `k` is the number of query words in a document and `k` is the total number of words in the document. Other scoring functions can be used and you can overwrite this function to better suit your needs.\n", - "\n", - "* `total_score`: Calculate the sum of all the query words in given document.\n", - "\n", - "* `present`/`present_results`: Presents the results as a list.\n", - "\n", - "We also have the class `Document` that holds metadata of documents, like their title, url and number of words. An additional class, `UnixConsultant`, can be used to initialize an IR System for Unix command manuals. This is the example we will use to showcase the implementation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example\n", - "\n", - "First let's take a look at the source code of `UnixConsultant`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "psource(UnixConsultant)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The class creates an IR System with the stopwords \"how do i the a of\". We could add more words to exclude, but the queries we will test will generally be in that format, so it is convenient. After the initialization of the system, we get the manual files and start indexing them.\n", - "\n", - "Let's build our Unix consultant and run a query:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7682667868462166 aima-data/MAN/rm.txt\n" - ] - } - ], - "source": [ - "uc = UnixConsultant()\n", - "\n", - "q = uc.query(\"how do I remove a file\")\n", - "\n", - "top_score, top_doc = q[0][0], q[0][1]\n", - "print(top_score, uc.documents[top_doc].url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We asked how to remove a file and the top result was the `rm` (the Unix command for remove) manual. This is exactly what we wanted! Let's try another query:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.7546722691607105 aima-data/MAN/diff.txt\n" - ] - } - ], - "source": [ - "q = uc.query(\"how do I delete a file\")\n", - "\n", - "top_score, top_doc = q[0][0], q[0][1]\n", - "print(top_score, uc.documents[top_doc].url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Even though we are basically asking for the same thing, we got a different top result. The `diff` command shows the differences between two files. So the system failed us and presented us an irrelevant document. Why is that? Unfortunately our IR system considers each word independent. \"Remove\" and \"delete\" have similar meanings, but since they are different words our system will not make the connection. So, the `diff` manual which mentions a lot the word `delete` gets the nod ahead of other manuals, while the `rm` one isn't in the result set since it doesn't use the word at all." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## INFORMATION EXTRACTION\n", - "\n", - "**Information Extraction (IE)** is a method for finding occurences of object classes and relationships in text. Unlike IR systems, an IE system includes (limited) notions of syntax and semantics. While it is difficult to extract object information in a general setting, for more specific domains the system is very useful. One model of an IE system makes use of templates that match with strings in a text.\n", - "\n", - "A typical example of such a model is reading prices from web pages. Prices usually appear after a dollar and consist of numbers, maybe followed by two decimal points. Before the price, usually there will appear a string like \"price:\". Let's build a sample template.\n", - "\n", - "With the following regular expression (*regex*) we can extract prices from text:\n", - "\n", - "`[$][0-9]+([.][0-9][0-9])?`\n", - "\n", - "Where `+` means 1 or more occurences and `?` means at most 1 occurence. Usually a template consists of a prefix, a target and a postfix regex. In this template, the prefix regex can be \"price:\", the target regex can be the above regex and the postfix regex can be empty.\n", - "\n", - "A template can match with multiple strings. If this is the case, we need a way to resolve the multiple matches. Instead of having just one template, we can use multiple templates (ordered by priority) and pick the match from the highest-priority template. We can also use other ways to pick. For the dollar example, we can pick the match closer to the numerical half of the highest match. For the text \"Price $90, special offer $70, shipping $5\" we would pick \"$70\" since it is closer to the half of the highest match (\"$90\")." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The above is called *attribute-based* extraction, where we want to find attributes in the text (in the example, the price). A more sophisticated extraction system aims at dealing with multiple objects and the relations between them. When such a system reads the text \"$100\", it should determine not only the price but also which object has that price.\n", - "\n", - "Relation extraction systems can be built as a series of finite state automata. Each automaton receives as input text, performs transformations on the text and passes it on to the next automaton as input. An automata setup can consist of the following stages:\n", - "\n", - "1. **Tokenization**: Segments text into tokens (words, numbers and punctuation).\n", - "\n", - "2. **Complex-word Handling**: Handles complex words such as \"give up\", or even names like \"Smile Inc.\".\n", - "\n", - "3. **Basic-group Handling**: Handles noun and verb groups, segmenting the text into strings of verbs or nouns (for example, \"had to give up\").\n", - "\n", - "4. **Complex Phrase Handling**: Handles complex phrases using finite-state grammar rules. For example, \"Human+PlayedChess(\"with\" Human+)?\" can be one template/rule for capturing a relation of someone playing chess with others.\n", - "\n", - "5. **Structure Merging**: Merges the structures built in the previous steps." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finite-state, template based information extraction models work well for restricted domains, but perform poorly as the domain becomes more and more general. There are many models though to choose from, each with its own strengths and weaknesses. Some of the models are the following:\n", - "\n", - "* **Probabilistic**: Using Hidden Markov Models, we can extract information in the form of prefix, target and postfix from a given text. Two advantages of using HMMs over templates is that we can train HMMs from data and don't need to design elaborate templates, and that a probabilistic approach behaves well even with noise. In a regex, if one character is off, we do not have a match, while with a probabilistic approach we have a smoother process.\n", - "\n", - "* **Conditional Random Fields**: One problem with HMMs is the assumption of state independence. CRFs are very similar to HMMs, but they don't have the latter's constraint. In addition, CRFs make use of *feature functions*, which act as transition weights. For example, if for observation $e_{i}$ and state $x_{i}$ we have $e_{i}$ is \"run\" and $x_{i}$ is the state ATHLETE, we can have $f(x_{i}, e_{i}) = 1$ and equal to 0 otherwise. We can use multiple, overlapping features, and we can even use features for state transitions. Feature functions don't have to be binary (like the above example) but they can be real-valued as well. Also, we can use any $e$ for the function, not just the current observation. To bring it all together, we weigh a transition by the sum of features.\n", - "\n", - "* **Ontology Extraction**: This is a method for compiling information and facts in a general domain. A fact can be in the form of `NP is NP`, where `NP` denotes a noun-phrase. For example, \"Rabbit is a mammal\"." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DECODERS\n", - "\n", - "### Introduction\n", - "\n", - "In this section we will try to decode ciphertext using probabilistic text models. A ciphertext is obtained by performing encryption on a text message. This encryption lets us communicate safely, as anyone who has access to the ciphertext but doesn't know how to decode it cannot read the message. We will restrict our study to Monoalphabetic Substitution Ciphers. These are primitive forms of cipher where each letter in the message text (also known as plaintext) is replaced by another another letter of the alphabet.\n", - "\n", - "### Shift Decoder\n", - "\n", - "#### The Caesar cipher\n", - "\n", - "The Caesar cipher, also known as shift cipher is a form of monoalphabetic substitution ciphers where each letter is shifted by a fixed value. A shift by `n` in this context means that each letter in the plaintext is replaced with a letter corresponding to `n` letters down in the alphabet. For example the plaintext `\"ABCDWXYZ\"` shifted by `3` yields `\"DEFGZABC\"`. Note how `X` became `A`. This is because the alphabet is cyclic, i.e. the letter after the last letter in the alphabet, `Z`, is the first letter of the alphabet - `A`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DEFGZABC\n" - ] - } - ], - "source": [ - "plaintext = \"ABCDWXYZ\"\n", - "ciphertext = shift_encode(plaintext, 3)\n", - "print(ciphertext)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Decoding a Caesar cipher\n", - "\n", - "To decode a Caesar cipher we exploit the fact that not all letters in the alphabet are used equally. Some letters are used more than others and some pairs of letters are more probable to occur together. We call a pair of consecutive letters a bigram." - ] - }, - { - "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" - ] - } - ], - "source": [ - "print(bigrams('this is a sentence'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use `CountingProbDist` to get the probability distribution of bigrams. In the latin alphabet consists of only only `26` letters. This limits the total number of possible substitutions to `26`. We reverse the shift encoding for a given `n` and check how probable it is using the bigram distribution. We try all `26` values of `n`, i.e. from `n = 0` to `n = 26` and use the value of `n` which gives the most probable plaintext." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%psource ShiftDecoder" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Example\n", - "\n", - "Let us encode a secret message using Caeasar cipher and then try decoding it using `ShiftDecoder`. We will again use `flatland.txt` to build the text model" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The code is \"Guvf vf n frperg zrffntr\"\n" - ] - } - ], - "source": [ - "plaintext = \"This is a secret message\"\n", - "ciphertext = shift_encode(plaintext, 13)\n", - "print('The code is', '\"' + ciphertext + '\"')" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The decoded message is \"This is a secret message\"\n" - ] - } - ], - "source": [ - "flatland = open_data(\"EN-text/flatland.txt\").read()\n", - "decoder = ShiftDecoder(flatland)\n", - "\n", - "decoded_message = decoder.decode(ciphertext)\n", - "print('The decoded message is', '\"' + decoded_message + '\"')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Permutation Decoder\n", - "Now let us try to decode messages encrypted by a general monoalphabetic substitution cipher. The letters in the alphabet can be replaced by any permutation of letters. For example if the alpahbet consisted of `{A B C}` then it can be replaced by `{A C B}`, `{B A C}`, `{B C A}`, `{C A B}`, `{C B A}` or even `{A B C}` itself. Suppose we choose the permutation `{C B A}`, then the plain text `\"CAB BA AAC\"` would become `\"ACB BC CCA\"`. We can see that Caesar cipher is also a form of permutation cipher where the permutation is a cyclic permutation. Unlike the Caesar cipher, it is infeasible to try all possible permutations. The number of possible permutations in Latin alphabet is `26!` which is of the order $10^{26}$. We use graph search algorithms to search for a 'good' permutation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "psource(PermutationDecoder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each state/node in the graph is represented as a letter-to-letter map. If there no mapping for a letter it means the letter is unchanged in the permutation. These maps are stored as dictionaries. Each dictionary is a 'potential' permutation. We use the word 'potential' because every dictionary doesn't necessarily represent a valid permutation since a permutation cannot have repeating elements. For example the dictionary `{'A': 'B', 'C': 'X'}` is invalid because `'A'` is replaced by `'B'`, but so is `'B'` because the dictionary doesn't have a mapping for `'B'`. Two dictionaries can also represent the same permutation e.g. `{'A': 'C', 'C': 'A'}` and `{'A': 'C', 'B': 'B', 'C': 'A'}` represent the same permutation where `'A'` and `'C'` are interchanged and all other letters remain unaltered. To ensure we get a valid permutation a goal state must map all letters in the alphabet. We also prevent repetions in the permutation by allowing only those actions which go to new state/node in which the newly added letter to the dictionary maps to previously unmapped letter. These two rules togeter ensure that the dictionary of a goal state will represent a valid permutation.\n", - "The score of a state is determined using word scores, unigram scores, and bigram scores. Experiment with different weightages for word, unigram and bigram scores and see how they affect the decoding." - ] - }, - { - "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" - ] - } - ], - "source": [ - "ciphertexts = ['ahed world', 'ahed woxld']\n", - "\n", - "pd = PermutationDecoder(canonicalize(flatland))\n", - "for ctext in ciphertexts:\n", - " print('\"{}\" decodes to \"{}\"'.format(ctext, pd.decode(ctext)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As evident from the above example, permutation decoding using best first search is sensitive to initial text. This is because not only the final dictionary, with substitutions for all letters, must have good score but so must the intermediate dictionaries. You could think of it as performing a local search by finding substitutons for each letter one by one. We could get very different results by changing even a single letter because that letter could be a deciding factor for selecting substitution in early stages which snowballs and affects the later stages. To make the search better we can use different definition of score in different stages and optimize on which letter to substitute first." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/text.py b/text.py deleted file mode 100644 index c62c1627a..000000000 --- a/text.py +++ /dev/null @@ -1,413 +0,0 @@ -"""Statistical Language Processing tools. (Chapter 22) -We define Unigram and Ngram text models, use them to generate random text, -and show the Viterbi algorithm for segmentatioon of letters into words. -Then we show a very simple Information Retrieval system, and an example -working on a tiny sample of Unix manual pages.""" - -from utils import argmin, argmax, hashabledict -from learning import CountingProbDist -import search - -from math import log, exp -from collections import defaultdict -import heapq -import re -import os - - -class UnigramWordModel(CountingProbDist): - - """This is a discrete probability distribution over words, so you - can add, sample, or get P[word], just like with CountingProbDist. You can - also generate a random text, n words long, with P.samples(n).""" - - def samples(self, n): - """Return a string of n words, random according to the model.""" - return ' '.join(self.sample() for i in range(n)) - - -class NgramWordModel(CountingProbDist): - - """This is a discrete probability distribution over n-tuples of words. - You can add, sample or get P[(word1, ..., wordn)]. The method P.samples(n) - builds up an n-word sequence; P.add_cond_prob and P.add_sequence add data.""" - - def __init__(self, n, observation_sequence=[], default=0): - # In addition to the dictionary of n-tuples, cond_prob is a - # mapping from (w1, ..., wn-1) to P(wn | w1, ... wn-1) - CountingProbDist.__init__(self, default=default) - self.n = n - self.cond_prob = defaultdict() - self.add_sequence(observation_sequence) - - # __getitem__, top, sample inherited from CountingProbDist - # Note that they deal with tuples, not strings, as inputs - - def add_cond_prob(self, ngram): - """Builds the conditional probabilities P(wn | (w1, ..., wn-1)""" - if ngram[:-1] not in self.cond_prob: - self.cond_prob[ngram[:-1]] = CountingProbDist() - self.cond_prob[ngram[:-1]].add(ngram[-1]) - - def add_sequence(self, words): - """Add each tuple words[i:i+n], using a sliding window.""" - n = self.n - - for i in range(len(words) - n + 1): - t = tuple(words[i:i + n]) - self.add(t) - self.add_cond_prob(t) - - def samples(self, nwords): - """Generate an n-word sentence by picking random samples - according to the model. At first pick a random n-gram and - from then on keep picking a character according to - P(c|wl-1, wl-2, ..., wl-n+1) where wl-1 ... wl-n+1 are the - last n - 1 words in the generated sentence so far.""" - n = self.n - output = list(self.sample()) - - for i in range(n, nwords): - last = output[-n+1:] - next_word = self.cond_prob[tuple(last)].sample() - output.append(next_word) - - return ' '.join(output) - - -class NgramCharModel(NgramWordModel): - def add_sequence(self, words): - """Add an empty space to every word to catch the beginning of words.""" - for word in words: - super().add_sequence(' ' + word) - - -class UnigramCharModel(NgramCharModel): - def __init__(self, observation_sequence=[], default=0): - CountingProbDist.__init__(self, default=default) - self.n = 1 - self.cond_prob = defaultdict() - self.add_sequence(observation_sequence) - - def add_sequence(self, words): - [self.add(char) for word in words for char in list(word)] - -# ______________________________________________________________________________ - - -def viterbi_segment(text, P): - """Find the best segmentation of the string of characters, given the - UnigramWordModel P.""" - # best[i] = best probability for text[0:i] - # words[i] = best word ending at position i - n = len(text) - words = [''] + list(text) - best = [1.0] + [0.0] * n - # Fill in the vectors best words via dynamic programming - for i in range(n+1): - for j in range(0, i): - w = text[j:i] - curr_score = P[w] * best[i - len(w)] - if curr_score >= best[i]: - best[i] = curr_score - words[i] = w - # Now recover the sequence of best words - sequence = [] - i = len(words) - 1 - while i > 0: - sequence[0:0] = [words[i]] - i = i - len(words[i]) - # Return sequence of best words and overall probability - return sequence, best[-1] - - -# ______________________________________________________________________________ - - -# TODO(tmrts): Expose raw index -class IRSystem: - - """A very simple Information Retrieval System, as discussed in Sect. 23.2. - The constructor s = IRSystem('the a') builds an empty system with two - stopwords. Next, index several documents with s.index_document(text, url). - Then ask queries with s.query('query words', n) to retrieve the top n - matching documents. Queries are literal words from the document, - except that stopwords are ignored, and there is one special syntax: - The query "learn: man cat", for example, runs "man cat" and indexes it.""" - - def __init__(self, stopwords='the a of'): - """Create an IR System. Optionally specify stopwords.""" - # index is a map of {word: {docid: count}}, where docid is an int, - # indicating the index into the documents list. - self.index = defaultdict(lambda: defaultdict(int)) - self.stopwords = set(words(stopwords)) - self.documents = [] - - def index_collection(self, filenames): - """Index a whole collection of files.""" - prefix = os.path.dirname(__file__) - for filename in filenames: - self.index_document(open(filename).read(), - os.path.relpath(filename, prefix)) - - def index_document(self, text, url): - """Index the text of a document.""" - # For now, use first line for title - title = text[:text.index('\n')].strip() - docwords = words(text) - docid = len(self.documents) - self.documents.append(Document(title, url, len(docwords))) - for word in docwords: - if word not in self.stopwords: - self.index[word][docid] += 1 - - def query(self, query_text, n=10): - """Return a list of n (score, docid) pairs for the best matches. - Also handle the special syntax for 'learn: command'.""" - if query_text.startswith("learn:"): - doctext = os.popen(query_text[len("learn:"):], 'r').read() - self.index_document(doctext, query_text) - return [] - - qwords = [w for w in words(query_text) if w not in self.stopwords] - shortest = argmin(qwords, key=lambda w: len(self.index[w])) - docids = self.index[shortest] - return heapq.nlargest(n, ((self.total_score(qwords, docid), docid) for docid in docids)) - - def score(self, word, docid): - """Compute a score for this word on the document with this docid.""" - # There are many options; here we take a very simple approach - return (log(1 + self.index[word][docid]) / - log(1 + self.documents[docid].nwords)) - - def total_score(self, words, docid): - """Compute the sum of the scores of these words on the document with this docid.""" - return sum(self.score(word, docid) for word in words) - - def present(self, results): - """Present the results as a list.""" - for (score, docid) in results: - doc = self.documents[docid] - print( - ("{:5.2}|{:25} | {}".format(100 * score, doc.url, - doc.title[:45].expandtabs()))) - - def present_results(self, query_text, n=10): - """Get results for the query and present them.""" - self.present(self.query(query_text, n)) - - -class UnixConsultant(IRSystem): - - """A trivial IR system over a small collection of Unix man pages.""" - - def __init__(self): - IRSystem.__init__(self, stopwords="how do i the a of") - - import os - aima_root = os.path.dirname(__file__) - mandir = os.path.join(aima_root, 'aima-data/MAN/') - man_files = [mandir + f for f in os.listdir(mandir) - if f.endswith('.txt')] - - self.index_collection(man_files) - - -class Document: - - """Metadata for a document: title and url; maybe add others later.""" - - def __init__(self, title, url, nwords): - self.title = title - self.url = url - self.nwords = nwords - - -def words(text, reg=re.compile('[a-z0-9]+')): - """Return a list of the words in text, ignoring punctuation and - converting everything to lowercase (to canonicalize). - >>> words("``EGAD!'' Edgar cried.") - ['egad', 'edgar', 'cried'] - """ - return reg.findall(text.lower()) - - -def canonicalize(text): - """Return a canonical text: only lowercase letters and blanks. - >>> canonicalize("``EGAD!'' Edgar cried.") - 'egad edgar cried' - """ - return ' '.join(words(text)) - - -# ______________________________________________________________________________ - -# Example application (not in book): decode a cipher. -# A cipher is a code that substitutes one character for another. -# A shift cipher is a rotation of the letters in the alphabet, -# such as the famous rot13, which maps A to N, B to M, etc. - -alphabet = 'abcdefghijklmnopqrstuvwxyz' - -# Encoding - - -def shift_encode(plaintext, n): - """Encode text with a shift cipher that moves each letter up by n letters. - >>> shift_encode('abc z', 1) - 'bcd a' - """ - return encode(plaintext, alphabet[n:] + alphabet[:n]) - - -def rot13(plaintext): - """Encode text by rotating letters by 13 spaces in the alphabet. - >>> rot13('hello') - 'uryyb' - >>> rot13(rot13('hello')) - 'hello' - """ - return shift_encode(plaintext, 13) - - -def translate(plaintext, function): - """Translate chars of a plaintext with the given function.""" - result = "" - for char in plaintext: - result += function(char) - return result - - -def maketrans(from_, to_): - """Create a translation table and return the proper function.""" - trans_table = {} - for n, char in enumerate(from_): - trans_table[char] = to_[n] - - return lambda char: trans_table.get(char, char) - - -def encode(plaintext, code): - """Encode text using a code which is a permutation of the alphabet.""" - trans = maketrans(alphabet + alphabet.upper(), code + code.upper()) - - return translate(plaintext, trans) - - -def bigrams(text): - """Return a list of pairs in text (a sequence of letters or words). - >>> bigrams('this') - ['th', 'hi', 'is'] - >>> bigrams(['this', 'is', 'a', 'test']) - [['this', 'is'], ['is', 'a'], ['a', 'test']] - """ - return [text[i:i + 2] for i in range(len(text) - 1)] - -# Decoding a Shift (or Caesar) Cipher - - -class ShiftDecoder: - - """There are only 26 possible encodings, so we can try all of them, - and return the one with the highest probability, according to a - bigram probability distribution.""" - - def __init__(self, training_text): - training_text = canonicalize(training_text) - self.P2 = CountingProbDist(bigrams(training_text), default=1) - - def score(self, plaintext): - """Return a score for text based on how common letters pairs are.""" - - s = 1.0 - for bi in bigrams(plaintext): - s = s * self.P2[bi] - - return s - - def decode(self, ciphertext): - """Return the shift decoding of text with the best score.""" - - return argmax(all_shifts(ciphertext), key=lambda shift: self.score(shift)) - - -def all_shifts(text): - """Return a list of all 26 possible encodings of text by a shift cipher.""" - - yield from (shift_encode(text, i) for i, _ in enumerate(alphabet)) - -# Decoding a General Permutation Cipher - - -class PermutationDecoder: - - """This is a much harder problem than the shift decoder. There are 26! - permutations, so we can't try them all. Instead we have to search. - We want to search well, but there are many things to consider: - Unigram probabilities (E is the most common letter); Bigram probabilities - (TH is the most common bigram); word probabilities (I and A are the most - common one-letter words, etc.); etc. - We could represent a search state as a permutation of the 26 letters, - and alter the solution through hill climbing. With an initial guess - based on unigram probabilities, this would probably fare well. However, - I chose instead to have an incremental representation. A state is - represented as a letter-to-letter map; for example {'z': 'e'} to - represent that 'z' will be translated to 'e'.""" - - def __init__(self, training_text, ciphertext=None): - self.Pwords = UnigramWordModel(words(training_text)) - self.P1 = UnigramWordModel(training_text) # By letter - self.P2 = NgramWordModel(2, words(training_text)) # By letter pair - - def decode(self, ciphertext): - """Search for a decoding of the ciphertext.""" - self.ciphertext = canonicalize(ciphertext) - # reduce domain to speed up search - self.chardomain = {c for c in self.ciphertext if c is not ' '} - problem = PermutationDecoderProblem(decoder=self) - solution = search.best_first_graph_search( - problem, lambda node: self.score(node.state)) - - solution.state[' '] = ' ' - return translate(self.ciphertext, lambda c: solution.state[c]) - - def score(self, code): - """Score is product of word scores, unigram scores, and bigram scores. - This can get very small, so we use logs and exp.""" - - # remake code dictionary to contain translation for all characters - full_code = code.copy() - full_code.update({x: x for x in self.chardomain if x not in code}) - full_code[' '] = ' ' - text = translate(self.ciphertext, lambda c: full_code[c]) - - # add small positive value to prevent computing log(0) - # TODO: Modify the values to make score more accurate - logP = (sum([log(self.Pwords[word] + 1e-20) for word in words(text)]) + - sum([log(self.P1[c] + 1e-5) for c in text]) + - sum([log(self.P2[b] + 1e-10) for b in bigrams(text)])) - return -exp(logP) - - -class PermutationDecoderProblem(search.Problem): - - def __init__(self, initial=None, goal=None, decoder=None): - self.initial = initial or hashabledict() - self.decoder = decoder - - def actions(self, state): - search_list = [c for c in self.decoder.chardomain if c not in state] - target_list = [c for c in alphabet if c not in state.values()] - # Find the best charater to replace - plainchar = argmax(search_list, key=lambda c: self.decoder.P1[c]) - for cipherchar in target_list: - yield (plainchar, cipherchar) - - def result(self, state, action): - new_state = hashabledict(state) # copy to prevent hash issues - new_state[action[0]] = action[1] - return new_state - - def goal_test(self, state): - """We're done when all letters in search domain are assigned.""" - return len(state) >= len(self.decoder.chardomain) diff --git a/Queens/utility_measures.py b/utility_measures.py similarity index 100% rename from Queens/utility_measures.py rename to utility_measures.py diff --git a/utils.py b/utils.py deleted file mode 100644 index e5dbfd5cd..000000000 --- a/utils.py +++ /dev/null @@ -1,795 +0,0 @@ -"""Provides some utilities widely used by other modules""" - -import bisect -import collections -import collections.abc -import operator -import os.path -import random -import math -import functools -from itertools import chain, combinations - - -# ______________________________________________________________________________ -# Functions on Sequences and Iterables - - -def sequence(iterable): - """Coerce iterable to sequence, if it is not already one.""" - return (iterable if isinstance(iterable, collections.abc.Sequence) - else tuple(iterable)) - - -def removeall(item, seq): - """Return a copy of seq (or string) with all occurences of item removed.""" - if isinstance(seq, str): - return seq.replace(item, '') - else: - return [x for x in seq if x != item] - - -def unique(seq): # TODO: replace with set - """Remove duplicate elements from seq. Assumes hashable elements.""" - return list(set(seq)) - - -def count(seq): - """Count the number of items in sequence that are interpreted as true.""" - return sum(bool(x) for x in seq) - - -def product(numbers): - """Return the product of the numbers, e.g. product([2, 3, 10]) == 60""" - result = 1 - for x in numbers: - result *= x - return result - - -def first(iterable, default=None): - """Return the first element of an iterable or the next element of a generator; or default.""" - try: - return iterable[0] - except IndexError: - return default - except TypeError: - return next(iterable, default) - - -def is_in(elt, seq): - """Similar to (elt in seq), but compares with 'is', not '=='.""" - return any(x is elt for x in seq) - - -def mode(data): - """Return the most common data item. If there are ties, return any one of them.""" - [(item, count)] = collections.Counter(data).most_common(1) - return item - - -def powerset(iterable): - """powerset([1,2,3]) --> (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)""" - s = list(iterable) - return list(chain.from_iterable(combinations(s, r) for r in range(len(s)+1)))[1:] - - -# ______________________________________________________________________________ -# argmin and argmax - - -identity = lambda x: x - -argmin = min -argmax = max - - -def argmin_random_tie(seq, key=identity): - """Return a minimum element of seq; break ties at random.""" - return argmin(shuffled(seq), key=key) - - -def argmax_random_tie(seq, key=identity): - """Return an element with highest fn(seq[i]) score; break ties at random.""" - return argmax(shuffled(seq), key=key) - - -def shuffled(iterable): - """Randomly shuffle a copy of iterable.""" - items = list(iterable) - random.shuffle(items) - return items - - -# ______________________________________________________________________________ -# Statistical and mathematical functions - - -def histogram(values, mode=0, bin_function=None): - """Return a list of (value, count) pairs, summarizing the input values. - Sorted by increasing value, or if mode=1, by decreasing count. - If bin_function is given, map it over values first.""" - if bin_function: - values = map(bin_function, values) - - bins = {} - for val in values: - bins[val] = bins.get(val, 0) + 1 - - if mode: - return sorted(list(bins.items()), key=lambda x: (x[1], x[0]), - reverse=True) - else: - return sorted(bins.items()) - - -def dotproduct(X, Y): - """Return the sum of the element-wise product of vectors X and Y.""" - return sum(x * y for x, y in zip(X, Y)) - - -def element_wise_product(X, Y): - """Return vector as an element-wise product of vectors X and Y""" - assert len(X) == len(Y) - return [x * y for x, y in zip(X, Y)] - - -def matrix_multiplication(X_M, *Y_M): - """Return a matrix as a matrix-multiplication of X_M and arbitary number of matrices *Y_M""" - - def _mat_mult(X_M, Y_M): - """Return a matrix as a matrix-multiplication of two matrices X_M and Y_M - >>> matrix_multiplication([[1, 2, 3], - [2, 3, 4]], - [[3, 4], - [1, 2], - [1, 0]]) - [[8, 8],[13, 14]] - """ - assert len(X_M[0]) == len(Y_M) - - result = [[0 for i in range(len(Y_M[0]))] for j in range(len(X_M))] - for i in range(len(X_M)): - for j in range(len(Y_M[0])): - for k in range(len(Y_M)): - result[i][j] += X_M[i][k] * Y_M[k][j] - return result - - result = X_M - for Y in Y_M: - result = _mat_mult(result, Y) - - return result - - -def vector_to_diagonal(v): - """Converts a vector to a diagonal matrix with vector elements - as the diagonal elements of the matrix""" - diag_matrix = [[0 for i in range(len(v))] for j in range(len(v))] - for i in range(len(v)): - diag_matrix[i][i] = v[i] - - return diag_matrix - - -def vector_add(a, b): - """Component-wise addition of two vectors.""" - return tuple(map(operator.add, a, b)) - - -def scalar_vector_product(X, Y): - """Return vector as a product of a scalar and a vector""" - return [X * y for y in Y] - - -def scalar_matrix_product(X, Y): - """Return matrix as a product of a scalar and a matrix""" - return [scalar_vector_product(X, y) for y in Y] - - -def inverse_matrix(X): - """Inverse a given square matrix of size 2x2""" - assert len(X) == 2 - assert len(X[0]) == 2 - det = X[0][0] * X[1][1] - X[0][1] * X[1][0] - assert det != 0 - inv_mat = scalar_matrix_product(1.0/det, [[X[1][1], -X[0][1]], [-X[1][0], X[0][0]]]) - - return inv_mat - - -def probability(p): - """Return true with probability p.""" - return p > random.uniform(0.0, 1.0) - - -def weighted_sample_with_replacement(n, seq, weights): - """Pick n samples from seq at random, with replacement, with the - probability of each element in proportion to its corresponding - weight.""" - sample = weighted_sampler(seq, weights) - - return [sample() for _ in range(n)] - - -def weighted_sampler(seq, weights): - """Return a random-sample function that picks from seq weighted by weights.""" - totals = [] - for w in weights: - totals.append(w + totals[-1] if totals else w) - - return lambda: seq[bisect.bisect(totals, random.uniform(0, totals[-1]))] - - -def rounder(numbers, d=4): - """Round a single number, or sequence of numbers, to d decimal places.""" - if isinstance(numbers, (int, float)): - return round(numbers, d) - else: - constructor = type(numbers) # Can be list, set, tuple, etc. - return constructor(rounder(n, d) for n in numbers) - - -def num_or_str(x): - """The argument is a string; convert to a number if - possible, or strip it.""" - try: - return int(x) - except ValueError: - try: - return float(x) - except ValueError: - return str(x).strip() - - -def normalize(dist): - """Multiply each number by a constant such that the sum is 1.0""" - if isinstance(dist, dict): - total = sum(dist.values()) - for key in dist: - dist[key] = dist[key] / total - assert 0 <= dist[key] <= 1, "Probabilities must be between 0 and 1." - return dist - total = sum(dist) - return [(n / total) for n in dist] - - -def norm(X, n=2): - """Return the n-norm of vector X""" - return sum([x**n for x in X])**(1/n) - - -def clip(x, lowest, highest): - """Return x clipped to the range [lowest..highest].""" - return max(lowest, min(x, highest)) - - -def sigmoid_derivative(value): - return value * (1 - value) - - -def sigmoid(x): - """Return activation value of x with sigmoid function""" - return 1/(1 + math.exp(-x)) - - -def step(x): - """Return activation value of x with sign function""" - return 1 if x >= 0 else 0 - - -def gaussian(mean, st_dev, x): - """Given the mean and standard deviation of a distribution, it returns the probability of x.""" - return 1/(math.sqrt(2*math.pi)*st_dev)*math.e**(-0.5*(float(x-mean)/st_dev)**2) - - -try: # math.isclose was added in Python 3.5; but we might be in 3.4 - from math import isclose -except ImportError: - def isclose(a, b, rel_tol=1e-09, abs_tol=0.0): - """Return true if numbers a and b are close to each other.""" - return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) - - -def weighted_choice(choices): - """A weighted version of random.choice""" - # NOTE: Shoule be replaced by random.choices if we port to Python 3.6 - - total = sum(w for _, w in choices) - r = random.uniform(0, total) - upto = 0 - for c, w in choices: - if upto + w >= r: - return c, w - upto += w - - -# ______________________________________________________________________________ -# Grid Functions - - -orientations = EAST, NORTH, WEST, SOUTH = [(1, 0), (0, 1), (-1, 0), (0, -1)] -turns = LEFT, RIGHT = (+1, -1) - - -def turn_heading(heading, inc, headings=orientations): - return headings[(headings.index(heading) + inc) % len(headings)] - - -def turn_right(heading): - return turn_heading(heading, RIGHT) - - -def turn_left(heading): - return turn_heading(heading, LEFT) - - -def distance(a, b): - """The distance between two (x, y) points.""" - xA, yA = a - xB, yB = b - return math.hypot((xA - xB), (yA - yB)) - - -def distance_squared(a, b): - """The square of the distance between two (x, y) points.""" - xA, yA = a - xB, yB = b - return (xA - xB)**2 + (yA - yB)**2 - - -def vector_clip(vector, lowest, highest): - """Return vector, except if any element is less than the corresponding - value of lowest or more than the corresponding value of highest, clip to - those values.""" - return type(vector)(map(clip, vector, lowest, highest)) - - -# ______________________________________________________________________________ -# Misc Functions - - -def memoize(fn, slot=None, maxsize=32): - """Memoize fn: make it remember the computed value for any argument list. - If slot is specified, store result in that slot of first argument. - If slot is false, use lru_cache for caching the values.""" - if slot: - def memoized_fn(obj, *args): - if hasattr(obj, slot): - return getattr(obj, slot) - else: - val = fn(obj, *args) - setattr(obj, slot, val) - return val - else: - @functools.lru_cache(maxsize=maxsize) - def memoized_fn(*args): - return fn(*args) - - return memoized_fn - - -def name(obj): - """Try to find some reasonable name for the object.""" - return (getattr(obj, 'name', 0) or getattr(obj, '__name__', 0) or - getattr(getattr(obj, '__class__', 0), '__name__', 0) or - str(obj)) - - -def isnumber(x): - """Is x a number?""" - return hasattr(x, '__int__') - - -def issequence(x): - """Is x a sequence?""" - return isinstance(x, collections.abc.Sequence) - - -def print_table(table, header=None, sep=' ', numfmt='{}'): - """Print a list of lists as a table, so that columns line up nicely. - header, if specified, will be printed as the first row. - numfmt is the format for all numbers; you might want e.g. '{:.2f}'. - (If you want different formats in different columns, - don't use print_table.) sep is the separator between columns.""" - justs = ['rjust' if isnumber(x) else 'ljust' for x in table[0]] - - if header: - table.insert(0, header) - - table = [[numfmt.format(x) if isnumber(x) else x for x in row] - for row in table] - - sizes = list( - map(lambda seq: max(map(len, seq)), - list(zip(*[map(str, row) for row in table])))) - - for row in table: - print(sep.join(getattr( - str(x), j)(size) for (j, size, x) in zip(justs, sizes, row))) - - -def open_data(name, mode='r'): - aima_root = os.path.dirname(__file__) - aima_file = os.path.join(aima_root, *['aima-data', name]) - - return open(aima_file) - - -def failure_test(algorithm, tests): - """Grades the given algorithm based on how many tests it passes. - Most algorithms have arbitary output on correct execution, which is difficult - to check for correctness. On the other hand, a lot of algorithms output something - particular on fail (for example, False, or None). - tests is a list with each element in the form: (values, failure_output).""" - from statistics import mean - return mean(int(algorithm(x) != y) for x, y in tests) - - -# ______________________________________________________________________________ -# Expressions - -# See https://docs.python.org/3/reference/expressions.html#operator-precedence -# See https://docs.python.org/3/reference/datamodel.html#special-method-names - -class Expr(object): - """A mathematical expression with an operator and 0 or more arguments. - op is a str like '+' or 'sin'; args are Expressions. - Expr('x') or Symbol('x') creates a symbol (a nullary Expr). - Expr('-', x) creates a unary; Expr('+', x, 1) creates a binary.""" - - def __init__(self, op, *args): - self.op = str(op) - self.args = args - - # Operator overloads - def __neg__(self): - return Expr('-', self) - - def __pos__(self): - return Expr('+', self) - - def __invert__(self): - return Expr('~', self) - - def __add__(self, rhs): - return Expr('+', self, rhs) - - def __sub__(self, rhs): - return Expr('-', self, rhs) - - def __mul__(self, rhs): - return Expr('*', self, rhs) - - def __pow__(self, rhs): - return Expr('**', self, rhs) - - def __mod__(self, rhs): - return Expr('%', self, rhs) - - def __and__(self, rhs): - return Expr('&', self, rhs) - - def __xor__(self, rhs): - return Expr('^', self, rhs) - - def __rshift__(self, rhs): - return Expr('>>', self, rhs) - - def __lshift__(self, rhs): - return Expr('<<', self, rhs) - - def __truediv__(self, rhs): - return Expr('/', self, rhs) - - def __floordiv__(self, rhs): - return Expr('//', self, rhs) - - def __matmul__(self, rhs): - return Expr('@', self, rhs) - - def __or__(self, rhs): - """Allow both P | Q, and P |'==>'| Q.""" - if isinstance(rhs, Expression): - return Expr('|', self, rhs) - else: - return PartialExpr(rhs, self) - - # Reverse operator overloads - def __radd__(self, lhs): - return Expr('+', lhs, self) - - def __rsub__(self, lhs): - return Expr('-', lhs, self) - - def __rmul__(self, lhs): - return Expr('*', lhs, self) - - def __rdiv__(self, lhs): - return Expr('/', lhs, self) - - def __rpow__(self, lhs): - return Expr('**', lhs, self) - - def __rmod__(self, lhs): - return Expr('%', lhs, self) - - def __rand__(self, lhs): - return Expr('&', lhs, self) - - def __rxor__(self, lhs): - return Expr('^', lhs, self) - - def __ror__(self, lhs): - return Expr('|', lhs, self) - - def __rrshift__(self, lhs): - return Expr('>>', lhs, self) - - def __rlshift__(self, lhs): - return Expr('<<', lhs, self) - - def __rtruediv__(self, lhs): - return Expr('/', lhs, self) - - def __rfloordiv__(self, lhs): - return Expr('//', lhs, self) - - def __rmatmul__(self, lhs): - return Expr('@', lhs, self) - - def __call__(self, *args): - "Call: if 'f' is a Symbol, then f(0) == Expr('f', 0)." - if self.args: - raise ValueError('can only do a call for a Symbol, not an Expr') - else: - return Expr(self.op, *args) - - # Equality and repr - def __eq__(self, other): - "'x == y' evaluates to True or False; does not build an Expr." - return (isinstance(other, Expr) - and self.op == other.op - and self.args == other.args) - - def __hash__(self): return hash(self.op) ^ hash(self.args) - - def __repr__(self): - op = self.op - args = [str(arg) for arg in self.args] - if op.isidentifier(): # f(x) or f(x, y) - return '{}({})'.format(op, ', '.join(args)) if args else op - elif len(args) == 1: # -x or -(x + 1) - return op + args[0] - else: # (x - y) - opp = (' ' + op + ' ') - return '(' + opp.join(args) + ')' - -# An 'Expression' is either an Expr or a Number. -# Symbol is not an explicit type; it is any Expr with 0 args. - - -Number = (int, float, complex) -Expression = (Expr, Number) - - -def Symbol(name): - """A Symbol is just an Expr with no args.""" - return Expr(name) - - -def symbols(names): - """Return a tuple of Symbols; names is a comma/whitespace delimited str.""" - return tuple(Symbol(name) for name in names.replace(',', ' ').split()) - - -def subexpressions(x): - """Yield the subexpressions of an Expression (including x itself).""" - yield x - if isinstance(x, Expr): - for arg in x.args: - yield from subexpressions(arg) - - -def arity(expression): - """The number of sub-expressions in this expression.""" - if isinstance(expression, Expr): - return len(expression.args) - else: # expression is a number - return 0 - -# For operators that are not defined in Python, we allow new InfixOps: - - -class PartialExpr: - """Given 'P |'==>'| Q, first form PartialExpr('==>', P), then combine with Q.""" - def __init__(self, op, lhs): - self.op, self.lhs = op, lhs - - def __or__(self, rhs): - return Expr(self.op, self.lhs, rhs) - - def __repr__(self): - return "PartialExpr('{}', {})".format(self.op, self.lhs) - - -def expr(x): - """Shortcut to create an Expression. x is a str in which: - - identifiers are automatically defined as Symbols. - - ==> is treated as an infix |'==>'|, as are <== and <=>. - If x is already an Expression, it is returned unchanged. Example: - >>> expr('P & Q ==> Q') - ((P & Q) ==> Q) - """ - if isinstance(x, str): - return eval(expr_handle_infix_ops(x), defaultkeydict(Symbol)) - else: - return x - - -infix_ops = '==> <== <=>'.split() - - -def expr_handle_infix_ops(x): - """Given a str, return a new str with ==> replaced by |'==>'|, etc. - >>> expr_handle_infix_ops('P ==> Q') - "P |'==>'| Q" - """ - for op in infix_ops: - x = x.replace(op, '|' + repr(op) + '|') - return x - - -class defaultkeydict(collections.defaultdict): - """Like defaultdict, but the default_factory is a function of the key. - >>> d = defaultkeydict(len); d['four'] - 4 - """ - def __missing__(self, key): - self[key] = result = self.default_factory(key) - return result - - -class hashabledict(dict): - """Allows hashing by representing a dictionary as tuple of key:value pairs - May cause problems as the hash value may change during runtime - """ - def __tuplify__(self): - return tuple(sorted(self.items())) - - def __hash__(self): - return hash(self.__tuplify__()) - - def __lt__(self, odict): - assert isinstance(odict, hashabledict) - return self.__tuplify__() < odict.__tuplify__() - - def __gt__(self, odict): - assert isinstance(odict, hashabledict) - return self.__tuplify__() > odict.__tuplify__() - - def __le__(self, odict): - assert isinstance(odict, hashabledict) - return self.__tuplify__() <= odict.__tuplify__() - - def __ge__(self, odict): - assert isinstance(odict, hashabledict) - return self.__tuplify__() >= odict.__tuplify__() - - -# ______________________________________________________________________________ -# Queues: Stack, FIFOQueue, PriorityQueue - -# TODO: queue.PriorityQueue -# TODO: Priority queues may not belong here -- see treatment in search.py - - -class Queue: - - """Queue is an abstract class/interface. There are three types: - Stack(): A Last In First Out Queue. - FIFOQueue(): A First In First Out Queue. - PriorityQueue(order, f): Queue in sorted order (default min-first). - Each type supports the following methods and functions: - q.append(item) -- add an item to the queue - q.extend(items) -- equivalent to: for item in items: q.append(item) - q.pop() -- return the top item from the queue - len(q) -- number of items in q (also q.__len()) - item in q -- does q contain item? - Note that isinstance(Stack(), Queue) is false, because we implement stacks - as lists. If Python ever gets interfaces, Queue will be an interface.""" - - def __init__(self): - raise NotImplementedError - - def extend(self, items): - for item in items: - self.append(item) - - -def Stack(): - """Return an empty list, suitable as a Last-In-First-Out Queue.""" - return [] - - -class FIFOQueue(Queue): - - """A First-In-First-Out Queue.""" - - def __init__(self, maxlen=None, items=[]): - self.queue = collections.deque(items, maxlen) - - def append(self, item): - if not self.queue.maxlen or len(self.queue) < self.queue.maxlen: - self.queue.append(item) - else: - raise Exception('FIFOQueue is full') - - def extend(self, items): - if not self.queue.maxlen or len(self.queue) + len(items) <= self.queue.maxlen: - self.queue.extend(items) - else: - raise Exception('FIFOQueue max length exceeded') - - def pop(self): - if len(self.queue) > 0: - return self.queue.popleft() - else: - raise Exception('FIFOQueue is empty') - - def __len__(self): - return len(self.queue) - - def __contains__(self, item): - return item in self.queue - - -class PriorityQueue(Queue): - - """A queue in which the minimum (or maximum) element (as determined by f and - order) is returned first. If order is min, the item with minimum f(x) is - returned first; if order is max, then it is the item with maximum f(x). - Also supports dict-like lookup.""" - - def __init__(self, order=min, f=lambda x: x): - self.A = [] - self.order = order - self.f = f - - def append(self, item): - bisect.insort(self.A, (self.f(item), item)) - - def __len__(self): - return len(self.A) - - def pop(self): - if self.order == min: - return self.A.pop(0)[1] - else: - return self.A.pop()[1] - - def __contains__(self, item): - return any(item == pair[1] for pair in self.A) - - def __getitem__(self, key): - for _, item in self.A: - if item == key: - return item - - def __delitem__(self, key): - for i, (value, item) in enumerate(self.A): - if item == key: - self.A.pop(i) - - -# ______________________________________________________________________________ -# Useful Shorthands - - -class Bool(int): - """Just like `bool`, except values display as 'T' and 'F' instead of 'True' and 'False'""" - __str__ = __repr__ = lambda self: 'T' if self else 'F' - - -T = Bool(True) -F = Bool(False) From 9b6f84f6af2fbbe898e6844c393c86314e16b26d Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Tue, 16 Jan 2018 09:47:53 +0000 Subject: [PATCH 33/34] Added .gitignore --- .gitignore | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..5b1b12334 --- /dev/null +++ b/.gitignore @@ -0,0 +1,107 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# idea cache +.idea/ + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +.static_storage/ +.media/ +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ From 05d888fea4319f50b966fc9005eb6ee5367d61fa Mon Sep 17 00:00:00 2001 From: Ddedalus Date: Sun, 11 Feb 2018 15:57:56 +0000 Subject: [PATCH 34/34] R tutorial --- R/BigMartSales/Test_u94Q5KV.csv | 5682 ++++++++++++++++ R/BigMartSales/Train_UWu5bXk.csv | 8524 +++++++++++++++++++++++++ R/BigMartSales/Tutorial_on_DS.Rmd | 61 + R/BigMartSales/Tutorial_on_DS.nb.html | 329 + R/decision_tree_learning.Rmd | 82 + R/decision_tree_learning.nb.html | 316 + 6 files changed, 14994 insertions(+) create mode 100644 R/BigMartSales/Test_u94Q5KV.csv create mode 100644 R/BigMartSales/Train_UWu5bXk.csv create mode 100644 R/BigMartSales/Tutorial_on_DS.Rmd create mode 100644 R/BigMartSales/Tutorial_on_DS.nb.html create mode 100644 R/decision_tree_learning.Rmd create mode 100644 R/decision_tree_learning.nb.html diff --git a/R/BigMartSales/Test_u94Q5KV.csv b/R/BigMartSales/Test_u94Q5KV.csv new file mode 100644 index 000000000..2815f64b5 --- /dev/null +++ b/R/BigMartSales/Test_u94Q5KV.csv @@ -0,0 +1,5682 @@ +Item_Identifier,Item_Weight,Item_Fat_Content,Item_Visibility,Item_Type,Item_MRP,Outlet_Identifier,Outlet_Establishment_Year,Outlet_Size,Outlet_Location_Type,Outlet_Type +FDW58,20.75,Low Fat,0.007564836,Snack Foods,107.8622,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW14,8.3,reg,0.038427677,Dairy,87.3198,OUT017,2007,,Tier 2,Supermarket Type1 +NCN55,14.6,Low Fat,0.099574908,Others,241.7538,OUT010,1998,,Tier 3,Grocery Store +FDQ58,7.315,Low Fat,0.015388393,Snack Foods,155.034,OUT017,2007,,Tier 2,Supermarket Type1 +FDY38,,Regular,0.118599314,Dairy,234.23,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH56,9.8,Regular,0.063817206,Fruits and Vegetables,117.1492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL48,19.35,Regular,0.082601537,Baking Goods,50.1034,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC48,,Low Fat,0.015782495,Baking Goods,81.0592,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN33,6.305,Regular,0.123365446,Snack Foods,95.7436,OUT045,2002,,Tier 2,Supermarket Type1 +FDA36,5.985,Low Fat,0.005698435,Baking Goods,186.8924,OUT017,2007,,Tier 2,Supermarket Type1 +FDT44,16.6,Low Fat,0.103569075,Fruits and Vegetables,118.3466,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ56,6.59,Low Fat,0.10581147,Fruits and Vegetables,85.3908,OUT045,2002,,Tier 2,Supermarket Type1 +NCC54,,Low Fat,0.171079215,Health and Hygiene,240.4196,OUT019,1985,Small,Tier 1,Grocery Store +FDU11,4.785,Low Fat,0.092737611,Breads,122.3098,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL59,16.75,LF,0.021206464,Hard Drinks,52.0298,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM24,6.135,Regular,0.0794507,Baking Goods,151.6366,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI57,19.85,Low Fat,0.05413521,Seafood,198.7768,OUT045,2002,,Tier 2,Supermarket Type1 +DRC12,17.85,Low Fat,0.037980963,Soft Drinks,192.2188,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM42,,Low Fat,0.028184344,Household,109.6912,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA46,13.6,Low Fat,0.196897637,Snack Foods,193.7136,OUT010,1998,,Tier 3,Grocery Store +FDA31,7.1,Low Fat,0.109920138,Fruits and Vegetables,175.008,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ31,19.2,Low Fat,0.182619235,Others,239.9196,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG52,13.65,LF,0.065630844,Frozen Foods,47.7402,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL19,,Low Fat,0.027447057,Others,142.347,OUT019,1985,Small,Tier 1,Grocery Store +FDS10,19.2,Low Fat,0.035178935,Snack Foods,180.7318,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX22,6.785,Regular,0.038455125,Snack Foods,209.4928,OUT010,1998,,Tier 3,Grocery Store +NCF19,13.0,Low Fat,0.035102094,Household,47.6034,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCE06,5.825,Low Fat,0.091485232,Household,161.3894,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC27,13.8,Low Fat,0.058102469,Dairy,244.6802,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE21,12.8,LF,0.022940349,Fruits and Vegetables,116.5492,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCR42,,Low Fat,0.06737681,Household,32.09,OUT019,1985,Small,Tier 1,Grocery Store +FDX51,9.5,Regular,0.022148582,Meat,194.9452,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR06,12.5,Low Fat,0.006792707,Household,42.4112,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU31,,Regular,0.024870035,Fruits and Vegetables,217.7508,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU59,5.78,Low Fat,0.096931426,Breads,164.2552,OUT017,2007,,Tier 2,Supermarket Type1 +FDR03,,Regular,0.008693632,Meat,205.098,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS49,,Low Fat,0.078961284,Canned,80.3644,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD48,10.395,Low Fat,0.050479463,Baking Goods,114.0176,OUT010,1998,,Tier 3,Grocery Store +NCF18,18.35,Low Fat,0.089485918,Household,192.1504,OUT017,2007,,Tier 2,Supermarket Type1 +NCD43,,Low Fat,0.01594238,Household,103.3964,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCD54,21.1,Low Fat,0.029127115,Household,143.3786,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY19,19.75,LF,0.069236421,Fruits and Vegetables,116.6466,OUT010,1998,,Tier 3,Grocery Store +NCY54,8.43,Low Fat,0.178699961,Household,173.9422,OUT017,2007,,Tier 2,Supermarket Type1 +NCL19,15.35,Low Fat,0.015740089,Others,144.847,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP23,6.71,Low Fat,0.059565107,Breads,217.2166,OUT010,1998,,Tier 3,Grocery Store +FDC26,10.195,Low Fat,0.126277921,Canned,112.1886,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR14,11.65,Low Fat,0.291322397,Dairy,55.8298,OUT010,1998,,Tier 3,Grocery Store +NCS41,12.85,Low Fat,0.053433908,Health and Hygiene,183.2608,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF41,12.15,Low Fat,0.131155007,Frozen Foods,248.146,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU34,18.25,Low Fat,0.075194929,Snack Foods,124.9046,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH11,5.98,Low Fat,0.075557965,Hard Drinks,57.0614,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM03,12.65,Low Fat,0.122928415,Meat,106.6938,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS31,13.1,Regular,0.044442342,Fruits and Vegetables,181.0318,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ20,20.7,Regular,0.100741569,Fruits and Vegetables,122.3388,OUT017,2007,,Tier 2,Supermarket Type1 +FDV44,,Regular,0.039651481,Fruits and Vegetables,188.7188,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG02,7.855,Low Fat,0.011278673,Canned,188.8188,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA09,13.35,Regular,0.0,Snack Foods,179.666,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT04,17.25,LF,0.106952661,Frozen Foods,38.3822,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL58,,Regular,0.129825457,Snack Foods,263.2568,OUT019,1985,Small,Tier 1,Grocery Store +FDE52,10.395,Regular,0.029947409,Dairy,90.1514,OUT045,2002,,Tier 2,Supermarket Type1 +FDW12,8.315,Regular,0.035565457,Baking Goods,144.8444,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL51,20.7,Regular,0.047760002,Dairy,214.9876,OUT017,2007,,Tier 2,Supermarket Type1 +NCY42,,Low Fat,0.015089147,Household,141.347,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR07,21.35,Low Fat,0.07818366,Fruits and Vegetables,96.8094,OUT017,2007,,Tier 2,Supermarket Type1 +FDN40,5.88,Low Fat,0.086632125,Frozen Foods,152.6998,OUT045,2002,,Tier 2,Supermarket Type1 +FDB35,,Regular,0.064306056,Starchy Foods,90.3804,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA22,7.435,low fat,0.08493006,Starchy Foods,165.8158,OUT017,2007,,Tier 2,Supermarket Type1 +NCL06,14.65,Low Fat,0.072066634,Household,262.5594,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI35,14.0,Low Fat,0.041256807,Starchy Foods,181.2634,OUT013,1987,High,Tier 3,Supermarket Type1 +NCW42,18.2,Low Fat,0.058587558,Household,221.6456,OUT045,2002,,Tier 2,Supermarket Type1 +NCX06,17.6,Low Fat,0.015711434,Household,180.0976,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC37,,Low Fat,0.032714163,Baking Goods,108.1938,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ14,7.71,Regular,0.047782552,Dairy,122.3756,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRG49,7.81,Low Fat,0.067560171,Soft Drinks,245.2486,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG06,16.35,Low Fat,0.029505077,Household,256.2646,OUT045,2002,,Tier 2,Supermarket Type1 +DRC36,13.0,Regular,0.045076104,Soft Drinks,173.7054,OUT045,2002,,Tier 2,Supermarket Type1 +FDV21,,Low Fat,0.299544153,Snack Foods,124.8704,OUT019,1985,Small,Tier 1,Grocery Store +FDB53,13.35,Low Fat,0.139452413,Frozen Foods,148.6392,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRP47,,Low Fat,0.246178257,Hard Drinks,252.4382,OUT019,1985,Small,Tier 1,Grocery Store +FDA14,16.1,LF,0.065128984,Dairy,145.176,OUT013,1987,High,Tier 3,Supermarket Type1 +DRC24,17.85,Low Fat,0.024816585,Soft Drinks,152.6998,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW21,5.34,Regular,0.005988175,Snack Foods,100.6358,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCH29,5.51,Low Fat,0.034473804,Health and Hygiene,97.3726,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU58,6.61,Regular,0.028987582,Snack Foods,188.6898,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY27,6.38,Low Fat,0.032078604,Dairy,177.6344,OUT017,2007,,Tier 2,Supermarket Type1 +FDV56,16.1,Regular,0.013593151,Fruits and Vegetables,108.9596,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT59,13.65,LF,0.015911432,Breads,230.5668,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB23,19.2,Regular,0.005588601,Starchy Foods,225.5062,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR49,8.71,Low Fat,0.139510771,Canned,46.2376,OUT045,2002,,Tier 2,Supermarket Type1 +FDB03,17.75,Regular,0.262504325,Dairy,242.2538,OUT010,1998,,Tier 3,Grocery Store +FDN39,19.35,Regular,0.0,Meat,165.7816,OUT045,2002,,Tier 2,Supermarket Type1 +FDX02,,Low Fat,0.056783774,Dairy,223.1404,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ16,,Low Fat,0.041536279,Frozen Foods,107.7912,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU35,6.44,Low Fat,0.079538056,Breads,99.47,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCT29,12.6,Low Fat,0.064057374,Health and Hygiene,122.1414,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ27,7.935,Low Fat,0.017156262,Dairy,48.135,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN57,18.25,Low Fat,0.054540968,Snack Foods,140.4154,OUT017,2007,,Tier 2,Supermarket Type1 +FDA03,18.5,Regular,0.045648973,Dairy,145.6102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ36,6.035,Regular,0.065917194,Baking Goods,185.724,OUT045,2002,,Tier 2,Supermarket Type1 +NCU05,11.8,Low Fat,0.058687359,Health and Hygiene,81.1618,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT39,6.26,Regular,0.009908113,Meat,151.1366,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK60,16.5,Regular,0.094395215,Baking Goods,97.2068,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ25,15.7,Regular,0.02777326,Canned,169.279,OUT017,2007,,Tier 2,Supermarket Type1 +FDG12,6.635,reg,0.006326106,Baking Goods,122.1098,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRB01,,low fat,0.143990546,Soft Drinks,191.553,OUT019,1985,Small,Tier 1,Grocery Store +NCC43,,Low Fat,0.09233359,Household,250.6066,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX13,,Low Fat,0.083661793,Canned,248.6092,OUT019,1985,Small,Tier 1,Grocery Store +FDM22,14.0,Regular,0.042022999,Snack Foods,53.064,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ03,,Regular,0.072044336,Dairy,48.8692,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU14,17.75,Low Fat,0.0,Dairy,249.775,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB33,17.75,Low Fat,0.024404214,Fruits and Vegetables,159.0262,OUT010,1998,,Tier 3,Grocery Store +FDP27,8.155,Low Fat,0.119450639,Meat,190.653,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO38,17.25,Low Fat,0.121917641,Canned,76.6986,OUT010,1998,,Tier 3,Grocery Store +FDE28,,Regular,0.131905128,Frozen Foods,232.0668,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO27,6.175,Regular,0.179043614,Meat,95.3752,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRL23,,Low Fat,0.0152302,Hard Drinks,107.0938,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS28,8.18,Regular,0.082401592,Frozen Foods,55.9588,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX24,8.355,Low Fat,0.013917468,Baking Goods,92.5462,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ02,6.905,Regular,0.038140213,Dairy,96.3726,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL46,20.35,Low Fat,0.054166556,Snack Foods,116.9466,OUT045,2002,,Tier 2,Supermarket Type1 +FDS60,,Low Fat,0.03229139,Baking Goods,178.766,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO06,19.25,Low Fat,0.108641498,Household,33.0558,OUT017,2007,,Tier 2,Supermarket Type1 +FDO16,5.48,Low Fat,0.015105338,Frozen Foods,84.625,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC60,5.425,Regular,0.114650377,Baking Goods,87.3514,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA48,12.1,Low Fat,0.115342009,Baking Goods,220.2114,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ36,,Regular,0.0,Baking Goods,186.424,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK27,11.0,Low Fat,0.00896468,Meat,120.6756,OUT045,2002,,Tier 2,Supermarket Type1 +FDW23,5.765,Low Fat,0.082346376,Baking Goods,38.8164,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM14,13.8,Low Fat,0.013318,Canned,110.1254,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM14,13.8,Low Fat,0.01325293,Canned,108.2254,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW60,5.44,Regular,0.017131453,Baking Goods,177.837,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE21,12.8,Low Fat,0.022925594,Fruits and Vegetables,116.4492,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM42,6.13,Low Fat,0.028316137,Household,109.3912,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY59,8.195,Low Fat,0.052562923,Baking Goods,93.9462,OUT010,1998,,Tier 3,Grocery Store +DRI49,14.15,Low Fat,0.1837926,Soft Drinks,81.3276,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT28,,Low Fat,0.111296158,Frozen Foods,151.2708,OUT019,1985,Small,Tier 1,Grocery Store +FDQ22,16.75,Low Fat,0.029860799,Snack Foods,39.5822,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR60,14.3,LF,0.130617879,Baking Goods,76.5328,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC50,,LF,0.238990225,Canned,94.7094,OUT019,1985,Small,Tier 1,Grocery Store +FDV24,5.635,Low Fat,0.103186396,Baking Goods,151.805,OUT013,1987,High,Tier 3,Supermarket Type1 +DRF48,5.73,Low Fat,0.0,Soft Drinks,188.3898,OUT010,1998,,Tier 3,Grocery Store +FDQ47,7.155,Regular,0.168186376,Breads,36.5874,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN36,15.2,low fat,0.050255855,Soft Drinks,97.3752,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCY06,15.25,Low Fat,0.061173235,Household,128.5968,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE52,10.395,Regular,0.029881147,Dairy,89.5514,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCB54,8.76,Low Fat,0.050154219,Health and Hygiene,126.9336,OUT045,2002,,Tier 2,Supermarket Type1 +NCF31,9.13,Low Fat,0.051837621,Household,152.6024,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ08,,Low Fat,0.11013617,Fruits and Vegetables,189.7846,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCC07,19.6,Low Fat,0.024086626,Household,106.0964,OUT017,2007,,Tier 2,Supermarket Type1 +NCD19,,Low Fat,0.013115567,Household,53.7614,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL46,20.35,Low Fat,0.0,Snack Foods,118.9466,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM20,10.0,Low Fat,0.038764258,Fruits and Vegetables,246.2144,OUT045,2002,,Tier 2,Supermarket Type1 +NCI06,11.3,Low Fat,0.07986963,Household,180.466,OUT010,1998,,Tier 3,Grocery Store +DRM11,6.57,Low Fat,0.066057085,Hard Drinks,259.3278,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCH07,13.15,Low Fat,0.093044518,Household,158.4604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS23,4.635,Low Fat,0.140771867,Breads,129.4994,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO49,10.6,Regular,0.033186809,Breakfast,49.1008,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS35,9.3,Low Fat,0.11139344,Breads,65.2826,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK39,7.02,Low Fat,0.049966527,Dairy,82.525,OUT045,2002,,Tier 2,Supermarket Type1 +DRI39,13.8,Low Fat,0.097212998,Dairy,58.293,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV04,7.825,Regular,0.150863781,Frozen Foods,158.0288,OUT017,2007,,Tier 2,Supermarket Type1 +NCN14,19.1,Low Fat,0.091900406,Others,182.5608,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH08,7.51,Low Fat,0.017414576,Fruits and Vegetables,231.101,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS20,8.85,Low Fat,0.053866912,Fruits and Vegetables,183.0292,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV40,17.35,Low Fat,0.014714625,Frozen Foods,75.4038,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ48,17.75,Low Fat,0.127140836,Baking Goods,110.5544,OUT010,1998,,Tier 3,Grocery Store +FDS24,,Regular,0.061923154,Baking Goods,87.5514,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK44,16.6,Low Fat,0.122417514,Fruits and Vegetables,174.3738,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS48,15.15,Low Fat,0.0,Baking Goods,150.4708,OUT045,2002,,Tier 2,Supermarket Type1 +FDK26,5.46,Regular,0.053858378,Canned,186.924,OUT010,1998,,Tier 3,Grocery Store +FDD23,9.5,Regular,0.048784266,Starchy Foods,188.5898,OUT045,2002,,Tier 2,Supermarket Type1 +NCH54,13.5,LF,0.073080167,Household,161.492,OUT017,2007,,Tier 2,Supermarket Type1 +NCP14,8.275,Low Fat,0.184602443,Household,106.5306,OUT010,1998,,Tier 3,Grocery Store +FDM60,10.8,Regular,0.080582001,Baking Goods,39.4138,OUT010,1998,,Tier 3,Grocery Store +FDV24,5.635,Low Fat,0.103856487,Baking Goods,151.305,OUT017,2007,,Tier 2,Supermarket Type1 +FDH08,7.51,Low Fat,0.017500079,Fruits and Vegetables,228.801,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS12,,Low Fat,0.173275373,Baking Goods,127.6362,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR39,,Low Fat,0.083393481,Meat,180.6292,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP12,,Regular,0.0450476,Baking Goods,36.4874,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRF60,,Low Fat,0.051816577,Soft Drinks,236.4564,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC09,15.5,Regular,0.026297031,Fruits and Vegetables,102.7332,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF50,4.905,low fat,0.117808305,Canned,198.5768,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG28,9.285,Regular,0.049270974,Frozen Foods,243.9144,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCE19,8.97,Low Fat,0.093540749,Household,55.4956,OUT017,2007,,Tier 2,Supermarket Type1 +NCM53,18.75,Low Fat,0.087105823,Health and Hygiene,108.228,OUT010,1998,,Tier 3,Grocery Store +NCN18,8.895,Low Fat,0.0,Household,110.9544,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF32,16.35,Low Fat,0.068068082,Fruits and Vegetables,199.1426,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF11,10.195,Regular,0.01761655,Starchy Foods,239.4538,OUT013,1987,High,Tier 3,Supermarket Type1 +DRI59,9.5,Low Fat,0.040898157,Hard Drinks,225.2088,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG54,12.1,Low Fat,0.079791176,Household,169.5106,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM44,12.5,Low Fat,0.031049674,Fruits and Vegetables,101.399,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT57,15.2,Low Fat,0.019112323,Snack Foods,236.2248,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV24,5.635,Low Fat,0.103272336,Baking Goods,151.205,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI50,,Regular,0.054001526,Canned,227.8352,OUT019,1985,Small,Tier 1,Grocery Store +FDS09,8.895,Regular,0.081073148,Snack Foods,51.2008,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCC31,,Low Fat,0.019774239,Household,154.5972,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ07,,Regular,0.153038134,Fruits and Vegetables,219.0456,OUT019,1985,Small,Tier 1,Grocery Store +FDC22,6.89,Regular,0.13720009,Snack Foods,191.882,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ56,16.25,Low Fat,0.02573698,Fruits and Vegetables,169.3474,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ40,,Low Fat,0.070354806,Frozen Foods,53.9298,OUT019,1985,Small,Tier 1,Grocery Store +FDS46,,Regular,0.047028483,Snack Foods,118.3782,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRD24,13.85,Low Fat,0.030857538,Soft Drinks,140.6154,OUT045,2002,,Tier 2,Supermarket Type1 +FDV45,16.75,Low Fat,0.045302246,Snack Foods,189.1556,OUT017,2007,,Tier 2,Supermarket Type1 +FDL26,18.0,Low Fat,0.073341257,Canned,155.7972,OUT045,2002,,Tier 2,Supermarket Type1 +FDA56,9.21,Low Fat,0.00880049,Fruits and Vegetables,123.0414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN27,20.85,Low Fat,0.039562497,Meat,118.1808,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM20,10.0,Low Fat,0.038745948,Fruits and Vegetables,245.0144,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO16,5.48,Low Fat,0.015193653,Frozen Foods,82.825,OUT017,2007,,Tier 2,Supermarket Type1 +FDL03,19.25,Regular,0.027075481,Meat,195.611,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE58,18.5,Low Fat,0.052068722,Snack Foods,117.0124,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI02,,Regular,0.114010306,Canned,112.2202,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCC55,,LF,0.111641021,Household,38.8848,OUT019,1985,Small,Tier 1,Grocery Store +FDR03,15.7,Regular,0.008771522,Meat,205.798,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB14,20.25,Regular,0.103304968,Canned,92.612,OUT017,2007,,Tier 2,Supermarket Type1 +FDR45,10.8,LF,0.028919203,Snack Foods,240.9222,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN07,18.5,Low Fat,0.034136703,Others,130.0284,OUT017,2007,,Tier 2,Supermarket Type1 +FDM51,,Regular,0.045393469,Meat,102.2674,OUT019,1985,Small,Tier 1,Grocery Store +FDT52,,Regular,0.047199898,Frozen Foods,244.9144,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL26,18.0,Low Fat,0.07319282,Canned,154.2972,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCZ42,10.5,Low Fat,0.011287929,Household,238.9248,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRI47,,Low Fat,0.036628533,Hard Drinks,145.6128,OUT019,1985,Small,Tier 1,Grocery Store +FDW40,14.0,Regular,0.105057952,Frozen Foods,141.1812,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN34,15.6,Regular,0.0,Snack Foods,169.2132,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS01,11.6,Low Fat,0.017741644,Canned,178.3686,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCG55,16.25,Low Fat,0.039225553,Household,116.2176,OUT045,2002,,Tier 2,Supermarket Type1 +FDC11,20.5,Low Fat,0.141766029,Starchy Foods,87.4172,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX35,5.035,Regular,0.080236064,Breads,226.4036,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCB06,17.6,Low Fat,0.082332074,Health and Hygiene,160.392,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR09,,Low Fat,0.136085739,Snack Foods,259.8962,OUT019,1985,Small,Tier 1,Grocery Store +FDC53,8.68,Low Fat,0.008885672,Frozen Foods,96.9384,OUT017,2007,,Tier 2,Supermarket Type1 +FDY45,17.5,Low Fat,0.0,Snack Foods,255.2356,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA22,7.435,Low Fat,0.141355941,Starchy Foods,168.5158,OUT010,1998,,Tier 3,Grocery Store +FDE02,8.71,Low Fat,0.121227447,Canned,95.2778,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW21,5.34,Regular,0.005975976,Snack Foods,100.8358,OUT045,2002,,Tier 2,Supermarket Type1 +FDV34,10.695,Regular,0.011425458,Snack Foods,73.6038,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS59,14.8,Regular,0.043961689,Breads,109.157,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW17,18.0,Low Fat,0.01949589,Health and Hygiene,127.8994,OUT017,2007,,Tier 2,Supermarket Type1 +NCK54,12.15,Low Fat,0.029523375,Household,117.215,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG17,,Regular,0.062751586,Frozen Foods,244.2486,OUT019,1985,Small,Tier 1,Grocery Store +FDG35,21.2,Regular,0.0,Starchy Foods,173.0738,OUT017,2007,,Tier 2,Supermarket Type1 +FDD08,8.3,Low Fat,0.059175953,Fruits and Vegetables,37.8506,OUT010,1998,,Tier 3,Grocery Store +NCO07,9.06,Low Fat,0.009831566,Others,211.156,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ10,5.095,reg,0.216762584,Snack Foods,142.2838,OUT010,1998,,Tier 3,Grocery Store +FDW36,11.15,Low Fat,0.057254675,Baking Goods,104.0622,OUT017,2007,,Tier 2,Supermarket Type1 +FDW21,5.34,Regular,0.0,Snack Foods,101.0358,OUT010,1998,,Tier 3,Grocery Store +FDY19,19.75,Low Fat,0.041598912,Fruits and Vegetables,118.0466,OUT017,2007,,Tier 2,Supermarket Type1 +DRE03,19.6,Low Fat,0.024206741,Dairy,47.0718,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC55,10.695,Low Fat,0.063862271,Household,38.1848,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH52,9.42,Regular,0.073484791,Frozen Foods,63.6194,OUT010,1998,,Tier 3,Grocery Store +FDO09,13.5,Regular,0.125983278,Snack Foods,264.691,OUT017,2007,,Tier 2,Supermarket Type1 +FDU43,19.35,Regular,0.058161092,Fruits and Vegetables,239.4564,OUT045,2002,,Tier 2,Supermarket Type1 +FDX09,9.0,Low Fat,0.1092139,Snack Foods,175.037,OUT010,1998,,Tier 3,Grocery Store +FDH40,,Regular,0.138195491,Frozen Foods,83.1276,OUT019,1985,Small,Tier 1,Grocery Store +FDW58,20.75,Low Fat,0.007595816,Snack Foods,104.4622,OUT017,2007,,Tier 2,Supermarket Type1 +FDC47,15.0,Low Fat,0.11956313,Snack Foods,227.2694,OUT017,2007,,Tier 2,Supermarket Type1 +NCR41,17.85,LF,0.018020588,Health and Hygiene,94.4094,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG49,7.81,Low Fat,0.067442541,Soft Drinks,244.7486,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC52,,Regular,0.008239804,Dairy,152.2708,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY13,12.1,Low Fat,0.030127406,Canned,74.567,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY35,17.6,Regular,0.016014343,Breads,44.0402,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI35,14.0,Low Fat,0.041524729,Starchy Foods,181.7634,OUT017,2007,,Tier 2,Supermarket Type1 +NCU18,15.1,Low Fat,0.055926872,Household,141.4496,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY33,14.5,Regular,0.097597084,Snack Foods,158.5262,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC15,,Low Fat,0.177107232,Dairy,157.5288,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU01,20.25,Regular,0.0,Canned,186.4924,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCU42,9.0,Low Fat,0.019506654,Household,169.5474,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCV29,11.8,Low Fat,0.022936556,Health and Hygiene,177.6686,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY30,20.25,Low Fat,0.02610006,Household,182.8976,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ46,7.51,Low Fat,0.103974431,Snack Foods,112.1544,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG58,,Regular,0.086360962,Snack Foods,153.7972,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK33,17.85,Low Fat,0.011298801,Snack Foods,213.256,OUT017,2007,,Tier 2,Supermarket Type1 +NCD07,9.1,Low Fat,0.055541153,Household,115.6518,OUT045,2002,,Tier 2,Supermarket Type1 +NCX29,,Low Fat,0.088720803,Health and Hygiene,144.4102,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCT42,5.88,Low Fat,0.024866609,Household,148.3392,OUT013,1987,High,Tier 3,Supermarket Type1 +DRN59,15.0,Low Fat,0.064129493,Hard Drinks,45.906,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI44,16.1,Low Fat,0.100213917,Fruits and Vegetables,79.0328,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA45,21.25,Low Fat,0.155621254,Snack Foods,178.237,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP31,21.1,Regular,0.161832494,Fruits and Vegetables,65.7168,OUT045,2002,,Tier 2,Supermarket Type1 +FDY01,11.8,Regular,0.170283492,Canned,115.1834,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT09,15.15,Regular,0.012313256,Snack Foods,132.8284,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH03,,Low Fat,0.0,Dairy,94.812,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA36,5.985,Low Fat,0.005689466,Baking Goods,186.6924,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCF31,9.13,Low Fat,0.052140695,Household,153.4024,OUT017,2007,,Tier 2,Supermarket Type1 +FDG14,9.0,Regular,0.050579228,Canned,151.3024,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG28,,Regular,0.04904165,Frozen Foods,245.5144,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU14,17.75,Low Fat,0.034806679,Dairy,250.175,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY47,,Regular,0.095395258,Breads,131.131,OUT019,1985,Small,Tier 1,Grocery Store +FDI56,7.325,Low Fat,0.093530571,Fruits and Vegetables,90.4146,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRD01,12.1,Regular,0.061124626,Soft Drinks,56.4614,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM22,14.0,Regular,0.0,Snack Foods,54.864,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH33,12.85,Low Fat,0.121624114,Snack Foods,42.2428,OUT013,1987,High,Tier 3,Supermarket Type1 +DRZ24,7.535,Low Fat,0.081719458,Soft Drinks,118.444,OUT013,1987,High,Tier 3,Supermarket Type1 +NCQ38,16.35,Low Fat,0.01336643,Others,105.228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO16,,Low Fat,0.015035032,Frozen Foods,84.025,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU07,,Low Fat,0.059557164,Fruits and Vegetables,149.2366,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCB07,19.2,Low Fat,0.077443049,Household,194.511,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU48,18.85,Low Fat,0.055470721,Baking Goods,132.1284,OUT045,2002,,Tier 2,Supermarket Type1 +NCM43,14.5,Low Fat,0.019514867,Others,165.121,OUT045,2002,,Tier 2,Supermarket Type1 +FDR31,6.46,Regular,0.08228859,Fruits and Vegetables,144.4102,OUT010,1998,,Tier 3,Grocery Store +DRK49,14.15,Low Fat,0.036090136,Soft Drinks,41.1138,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCI30,20.25,Low Fat,0.098645981,Household,244.746,OUT010,1998,,Tier 3,Grocery Store +DRD60,15.7,Low Fat,0.03744271,Soft Drinks,181.1634,OUT017,2007,,Tier 2,Supermarket Type1 +NCG19,20.25,Low Fat,0.147933567,Household,235.3616,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH12,9.6,LF,0.084937598,Baking Goods,105.028,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM32,20.5,Low Fat,0.020601136,Fruits and Vegetables,91.683,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM27,12.35,Regular,0.158439388,Meat,156.0946,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCU53,,Low Fat,0.0,Health and Hygiene,165.7842,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ18,15.75,Low Fat,0.135072801,Household,99.17,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS10,19.2,Low Fat,0.035156307,Snack Foods,179.1318,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB33,,Low Fat,0.014509564,Fruits and Vegetables,157.4262,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI12,9.395,Regular,0.100315391,Baking Goods,85.8856,OUT013,1987,High,Tier 3,Supermarket Type1 +NCW42,18.2,Low Fat,0.058420325,Household,221.4456,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC06,19.0,Low Fat,0.027096298,Household,128.6336,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW02,4.805,Regular,0.037912667,Dairy,125.8704,OUT017,2007,,Tier 2,Supermarket Type1 +NCD43,8.85,Low Fat,0.016110572,Household,104.2964,OUT017,2007,,Tier 2,Supermarket Type1 +FDM57,11.65,Regular,0.076158144,Snack Foods,82.9908,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA58,9.395,Low Fat,0.104338095,Snack Foods,236.8932,OUT017,2007,,Tier 2,Supermarket Type1 +FDK56,9.695,Low Fat,0.129998012,Fruits and Vegetables,185.1898,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP52,18.7,Regular,0.0,Frozen Foods,231.201,OUT045,2002,,Tier 2,Supermarket Type1 +FDW20,20.75,LF,0.024247803,Fruits and Vegetables,123.973,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS52,8.89,Low Fat,0.005483027,Frozen Foods,100.4016,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT29,12.6,Low Fat,0.064371885,Health and Hygiene,119.8414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCL54,12.6,Low Fat,0.082684949,Household,176.6054,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC05,13.1,Regular,0.098984923,Frozen Foods,198.2768,OUT045,2002,,Tier 2,Supermarket Type1 +FDF34,9.3,Regular,0.014016743,Snack Foods,196.8084,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP03,,Regular,0.060880827,Meat,124.4388,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD32,17.7,Regular,0.068511767,Fruits and Vegetables,83.2276,OUT010,1998,,Tier 3,Grocery Store +FDZ10,17.85,Low Fat,0.0,Snack Foods,127.502,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ40,8.935,Low Fat,0.04017515,Frozen Foods,54.1298,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD51,11.15,Low Fat,0.120441348,Dairy,43.7744,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY30,,Low Fat,0.045440803,Household,179.5976,OUT019,1985,Small,Tier 1,Grocery Store +FDP58,11.1,LF,0.135906738,Snack Foods,217.9482,OUT017,2007,,Tier 2,Supermarket Type1 +FDV49,10.0,Low Fat,0.025973288,Canned,264.3226,OUT017,2007,,Tier 2,Supermarket Type1 +FDY24,,Regular,0.23372937,Baking Goods,52.4298,OUT019,1985,Small,Tier 1,Grocery Store +NCO55,12.8,Low Fat,0.091552173,Others,107.1938,OUT017,2007,,Tier 2,Supermarket Type1 +FDR13,9.895,Regular,0.028883289,Canned,116.6492,OUT017,2007,,Tier 2,Supermarket Type1 +FDS51,13.35,Low Fat,0.03236252,Meat,62.0194,OUT017,2007,,Tier 2,Supermarket Type1 +FDP26,7.785,Low Fat,0.139835844,Dairy,104.7306,OUT045,2002,,Tier 2,Supermarket Type1 +NCB54,,Low Fat,0.049810328,Health and Hygiene,129.2336,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF32,16.35,Low Fat,0.068466049,Fruits and Vegetables,197.1426,OUT017,2007,,Tier 2,Supermarket Type1 +FDN31,11.5,Low Fat,0.073178424,Fruits and Vegetables,189.153,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRM48,15.2,Low Fat,0.113535259,Soft Drinks,36.0848,OUT017,2007,,Tier 2,Supermarket Type1 +FDN20,19.35,Low Fat,0.026222599,Fruits and Vegetables,169.0474,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL01,19.5,Regular,0.0,Soft Drinks,233.1958,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV56,16.1,Regular,0.01361686,Fruits and Vegetables,107.2596,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH13,,Low Fat,0.023770288,Soft Drinks,107.728,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA03,18.5,Regular,0.045720935,Dairy,145.6102,OUT017,2007,,Tier 2,Supermarket Type1 +FDF47,,Low Fat,0.097145513,Starchy Foods,223.8746,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX32,15.1,Regular,0.099858247,Fruits and Vegetables,146.4786,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX57,17.25,Regular,0.047339698,Snack Foods,96.5068,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCA30,19.0,LF,0.129596025,Household,190.5872,OUT045,2002,,Tier 2,Supermarket Type1 +FDO49,10.6,Regular,0.033024663,Breakfast,49.3008,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL04,,Low Fat,0.195963464,Frozen Foods,105.1622,OUT019,1985,Small,Tier 1,Grocery Store +DRM48,15.2,Low Fat,0.112875322,Soft Drinks,37.2848,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR16,5.845,Regular,0.104930609,Frozen Foods,212.3218,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC19,6.57,Low Fat,0.097275225,Household,192.682,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCE42,21.1,Low Fat,0.010623794,Household,235.4958,OUT045,2002,,Tier 2,Supermarket Type1 +FDY24,4.88,Regular,0.134248297,Baking Goods,54.9298,OUT017,2007,,Tier 2,Supermarket Type1 +FDH19,19.35,Low Fat,0.033139916,Meat,175.4738,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ46,11.1,Low Fat,0.044786137,Snack Foods,173.4054,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN45,19.35,Low Fat,0.197679823,Snack Foods,224.6088,OUT010,1998,,Tier 3,Grocery Store +FDY08,9.395,Regular,0.171042873,Fruits and Vegetables,139.9838,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ37,8.1,Regular,0.019764765,Canned,86.6198,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT30,9.1,LF,0.080455726,Household,47.3718,OUT045,2002,,Tier 2,Supermarket Type1 +DRY23,9.395,Regular,0.109540783,Soft Drinks,41.9112,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCZ30,6.59,Low Fat,0.026291649,Household,121.7098,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC44,15.6,Low Fat,0.173299972,Fruits and Vegetables,113.3518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB45,20.85,Low Fat,0.021325759,Fruits and Vegetables,104.6306,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY04,17.7,Regular,0.042441097,Frozen Foods,163.221,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM27,12.35,reg,0.0,Meat,158.8946,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ43,11.0,Regular,0.057381292,Fruits and Vegetables,241.2512,OUT017,2007,,Tier 2,Supermarket Type1 +FDT39,,Regular,0.017277445,Meat,150.7366,OUT019,1985,Small,Tier 1,Grocery Store +NCC06,,LF,0.047249645,Household,126.7336,OUT019,1985,Small,Tier 1,Grocery Store +FDL15,,Low Fat,0.046408928,Meat,153.5682,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL57,15.1,Regular,0.067456225,Snack Foods,257.5304,OUT017,2007,,Tier 2,Supermarket Type1 +FDU08,10.3,Low Fat,0.027315417,Fruits and Vegetables,98.7042,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK40,7.035,Low Fat,0.021972988,Frozen Foods,264.091,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ12,12.65,Low Fat,0.059270332,Baking Goods,229.101,OUT010,1998,,Tier 3,Grocery Store +FDS48,15.15,Low Fat,0.027936385,Baking Goods,151.1708,OUT017,2007,,Tier 2,Supermarket Type1 +FDP09,19.75,Low Fat,0.033958586,Snack Foods,212.0902,OUT045,2002,,Tier 2,Supermarket Type1 +FDW21,5.34,Regular,0.005973153,Snack Foods,99.0358,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY25,12.0,Low Fat,0.033968012,Canned,181.0976,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRE13,6.28,Low Fat,0.027861814,Soft Drinks,85.5198,OUT017,2007,,Tier 2,Supermarket Type1 +FDV43,,Low Fat,0.134564284,Fruits and Vegetables,42.7086,OUT019,1985,Small,Tier 1,Grocery Store +FDD22,10.0,Low Fat,0.099851786,Snack Foods,111.7544,OUT045,2002,,Tier 2,Supermarket Type1 +FDM46,,Low Fat,0.280083047,Snack Foods,92.712,OUT019,1985,Small,Tier 1,Grocery Store +NCO30,19.5,Low Fat,0.026320247,Household,184.9608,OUT010,1998,,Tier 3,Grocery Store +FDM25,10.695,Regular,0.060665739,Breakfast,173.7712,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN41,17.0,Low Fat,0.052290474,Health and Hygiene,122.873,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU24,6.78,Regular,0.140447292,Baking Goods,93.312,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ50,12.8,Regular,0.079076331,Dairy,183.7608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP45,15.7,Regular,0.030599358,Snack Foods,251.4724,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM54,17.7,Low Fat,0.051042366,Household,126.1678,OUT045,2002,,Tier 2,Supermarket Type1 +FDW10,,Low Fat,0.123745045,Snack Foods,175.337,OUT019,1985,Small,Tier 1,Grocery Store +FDP20,19.85,Low Fat,0.04592756,Fruits and Vegetables,127.902,OUT017,2007,,Tier 2,Supermarket Type1 +FDK32,16.25,Regular,0.048975573,Fruits and Vegetables,151.0682,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN52,9.395,Regular,0.13177444,Frozen Foods,87.7198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM58,16.85,Regular,0.0,Snack Foods,111.0544,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ46,,Low Fat,0.068788985,Snack Foods,110.8228,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA18,10.1,Low Fat,0.05630601,Household,117.1492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD35,12.15,Low Fat,0.025864429,Starchy Foods,121.844,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCK31,10.895,Low Fat,0.02704266,Others,49.4666,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI40,,Regular,0.124994714,Frozen Foods,100.5358,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT50,,Regular,0.189512493,Dairy,97.7752,OUT019,1985,Small,Tier 1,Grocery Store +NCT06,17.1,Low Fat,0.038737554,Household,164.7842,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT31,19.75,Low Fat,0.012445941,Fruits and Vegetables,187.8872,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT45,15.85,Low Fat,0.05740255,Snack Foods,53.0956,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT13,14.85,Low Fat,0.018609305,Canned,187.1214,OUT045,2002,,Tier 2,Supermarket Type1 +FDO50,16.25,Low Fat,0.078327268,Canned,90.9804,OUT045,2002,,Tier 2,Supermarket Type1 +NCU18,15.1,Low Fat,0.093464804,Household,140.8496,OUT010,1998,,Tier 3,Grocery Store +NCR54,16.35,Low Fat,0.090702992,Household,195.111,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO18,13.15,Low Fat,0.024751688,Household,178.2686,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU09,7.71,Regular,0.0667322,Snack Foods,56.2956,OUT045,2002,,Tier 2,Supermarket Type1 +FDT13,14.85,Low Fat,0.018647294,Canned,187.5214,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE09,8.775,Low Fat,0.021603383,Fruits and Vegetables,112.2228,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCK53,,Low Fat,0.065799906,Health and Hygiene,101.1042,OUT019,1985,Small,Tier 1,Grocery Store +FDG45,8.1,Low Fat,0.0,Fruits and Vegetables,213.2902,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH15,8.775,Low Fat,0.109890489,Dairy,45.0428,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO21,,Regular,0.017093789,Snack Foods,224.0404,OUT019,1985,Small,Tier 1,Grocery Store +FDD14,,LF,0.16898615,Canned,184.2266,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC09,15.5,Regular,0.026302004,Fruits and Vegetables,102.7332,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH45,,Regular,0.105155137,Fruits and Vegetables,43.2796,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV32,7.785,Low Fat,0.088708388,Fruits and Vegetables,65.051,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG12,6.635,Regular,0.00632491,Baking Goods,119.1098,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS32,17.75,Regular,0.029629236,Fruits and Vegetables,140.1838,OUT013,1987,High,Tier 3,Supermarket Type1 +NCL55,12.15,Low Fat,0.064924087,Others,251.204,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRE01,10.1,Low Fat,0.167123591,Soft Drinks,243.5512,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRE15,13.35,Low Fat,0.017813048,Dairy,77.0012,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCL42,18.85,Low Fat,0.04045348,Household,247.0144,OUT045,2002,,Tier 2,Supermarket Type1 +FDP31,21.1,Regular,0.161370557,Fruits and Vegetables,64.0168,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN33,6.305,Regular,0.123617286,Snack Foods,93.5436,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ59,6.63,Regular,0.104021582,Baking Goods,164.85,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE45,12.1,Low Fat,0.067549872,Fruits and Vegetables,178.3002,OUT010,1998,,Tier 3,Grocery Store +FDJ07,7.26,Low Fat,0.01441152,Meat,118.415,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ45,9.5,Regular,0.010961524,Snack Foods,184.4608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM33,,Low Fat,0.087294906,Snack Foods,219.1798,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO15,16.75,Regular,0.014338639,Meat,75.7038,OUT010,1998,,Tier 3,Grocery Store +FDM46,7.365,Low Fat,0.159834724,Snack Foods,92.512,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR03,15.7,Regular,0.008753653,Meat,205.698,OUT045,2002,,Tier 2,Supermarket Type1 +FDY49,17.2,Regular,0.012061003,Canned,166.4184,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ60,6.195,Regular,0.109596256,Baking Goods,118.8098,OUT045,2002,,Tier 2,Supermarket Type1 +FDW10,21.2,Low Fat,0.0,Snack Foods,176.137,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO51,6.785,Regular,0.042047755,Meat,44.6112,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ40,13.6,Regular,0.049791265,Frozen Foods,108.7912,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS20,8.85,Low Fat,0.054086343,Fruits and Vegetables,182.2292,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU45,15.6,Regular,0.035476594,Snack Foods,112.4518,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV02,16.75,Low Fat,0.060534179,Dairy,169.4106,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN09,14.15,Low Fat,0.034874689,Snack Foods,242.2828,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM55,,Low Fat,0.066403009,Others,186.6924,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN23,6.575,Regular,0.075815345,Breads,144.6444,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY31,5.98,Low Fat,0.072915282,Fruits and Vegetables,145.1418,OUT010,1998,,Tier 3,Grocery Store +FDW03,5.63,Regular,0.041077066,Meat,106.5306,OUT010,1998,,Tier 3,Grocery Store +FDD14,20.7,Low Fat,0.169808455,Canned,183.4266,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV23,11.0,Low Fat,0.106435421,Breads,125.7046,OUT017,2007,,Tier 2,Supermarket Type1 +DRI03,6.03,Low Fat,0.022749737,Dairy,175.7028,OUT045,2002,,Tier 2,Supermarket Type1 +FDN13,18.6,Low Fat,0.152029528,Breakfast,99.3358,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF45,,Regular,0.01214561,Fruits and Vegetables,59.7904,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU46,10.3,Regular,0.011124197,Snack Foods,87.454,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB57,20.25,Regular,0.018834342,Fruits and Vegetables,222.3772,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV12,16.7,Regular,0.0,Baking Goods,99.6384,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ58,7.315,Low Fat,0.015289106,Snack Foods,151.134,OUT013,1987,High,Tier 3,Supermarket Type1 +NCA18,10.1,Low Fat,0.056394771,Household,115.9492,OUT017,2007,,Tier 2,Supermarket Type1 +FDH52,9.42,Regular,0.0,Frozen Foods,61.3194,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM24,6.135,Regular,0.079650513,Baking Goods,150.1366,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP43,,Low Fat,0.030359318,Others,181.166,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO18,,Low Fat,0.04316119,Household,176.4686,OUT019,1985,Small,Tier 1,Grocery Store +FDM32,20.5,LF,0.020721583,Fruits and Vegetables,91.183,OUT017,2007,,Tier 2,Supermarket Type1 +NCL07,13.85,Low Fat,0.031515822,Others,37.948,OUT017,2007,,Tier 2,Supermarket Type1 +FDK03,12.6,Regular,0.073858923,Dairy,253.2356,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP59,20.85,Regular,0.056785107,Breads,102.2648,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ24,15.7,Low Fat,0.0,Baking Goods,250.6724,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ16,19.7,Low Fat,0.041908424,Frozen Foods,109.5912,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU44,12.15,Regular,0.058377105,Fruits and Vegetables,160.6552,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH28,15.85,Regular,0.184169331,Frozen Foods,38.6506,OUT010,1998,,Tier 3,Grocery Store +FDV28,,Regular,0.279663801,Frozen Foods,35.6558,OUT019,1985,Small,Tier 1,Grocery Store +FDM22,14.0,Regular,0.042042857,Snack Foods,53.864,OUT045,2002,,Tier 2,Supermarket Type1 +FDR56,15.5,Regular,0.100765839,Fruits and Vegetables,196.0768,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV39,11.3,Low Fat,0.007291207,Meat,196.8426,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU37,,Regular,0.182980378,Canned,80.496,OUT019,1985,Small,Tier 1,Grocery Store +FDQ11,5.695,Regular,0.0,Breads,256.4988,OUT010,1998,,Tier 3,Grocery Store +FDX02,16.0,Low Fat,0.057175809,Dairy,223.5404,OUT045,2002,,Tier 2,Supermarket Type1 +NCS42,8.6,Low Fat,0.06969924,Household,92.6146,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY57,,Regular,0.120667057,Snack Foods,94.6752,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB21,7.475,Low Fat,0.148751515,Fruits and Vegetables,241.8854,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE28,9.5,Regular,0.133296733,Frozen Foods,229.8668,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ55,13.65,Regular,0.013111823,Fruits and Vegetables,113.2834,OUT017,2007,,Tier 2,Supermarket Type1 +FDA48,12.1,Low Fat,0.115052659,Baking Goods,222.6114,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ19,6.425,Low Fat,0.093644428,Fruits and Vegetables,174.3712,OUT045,2002,,Tier 2,Supermarket Type1 +NCC43,7.39,Low Fat,0.092971061,Household,252.4066,OUT045,2002,,Tier 2,Supermarket Type1 +NCV18,6.775,Low Fat,0.105245865,Household,81.925,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA42,6.965,Low Fat,0.028664878,Household,159.0604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY45,17.5,Low Fat,0.026142114,Snack Foods,256.3356,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCC30,16.6,Low Fat,0.027635129,Household,178.8344,OUT045,2002,,Tier 2,Supermarket Type1 +FDM57,11.65,Regular,0.075786047,Snack Foods,85.3908,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL09,19.6,Regular,0.214306131,Snack Foods,166.7816,OUT010,1998,,Tier 3,Grocery Store +FDB09,,Low Fat,0.057118149,Fruits and Vegetables,124.8046,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT44,16.6,Low Fat,0.102967068,Fruits and Vegetables,118.8466,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT06,,Low Fat,0.038549965,Household,164.2842,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX26,17.7,Low Fat,0.087945039,Dairy,183.3292,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK32,16.25,reg,0.048934817,Fruits and Vegetables,153.0682,OUT013,1987,High,Tier 3,Supermarket Type1 +DRA12,11.6,Low Fat,0.040945898,Soft Drinks,142.9154,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO46,9.6,Regular,0.023788808,Snack Foods,187.8872,OUT010,1998,,Tier 3,Grocery Store +FDE52,10.395,Regular,0.029861927,Dairy,86.6514,OUT013,1987,High,Tier 3,Supermarket Type1 +NCH42,6.86,Low Fat,0.036611419,Household,230.201,OUT045,2002,,Tier 2,Supermarket Type1 +FDV08,7.35,Low Fat,0.028589521,Fruits and Vegetables,42.0454,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB47,8.8,Low Fat,0.071720362,Snack Foods,210.6612,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC28,7.905,Low Fat,0.09203683,Frozen Foods,110.5254,OUT010,1998,,Tier 3,Grocery Store +FDD22,10.0,Low Fat,0.099649694,Snack Foods,113.7544,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS07,,Low Fat,0.099274751,Fruits and Vegetables,115.2518,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRI13,15.35,Low Fat,0.020368186,Soft Drinks,216.9508,OUT045,2002,,Tier 2,Supermarket Type1 +FDG32,19.85,Low Fat,0.176712457,Fruits and Vegetables,222.9772,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU14,17.75,Low Fat,0.034949223,Dairy,250.275,OUT017,2007,,Tier 2,Supermarket Type1 +FDD28,,Low Fat,0.093315935,Frozen Foods,58.7904,OUT019,1985,Small,Tier 1,Grocery Store +NCP41,16.6,Low Fat,0.0163024,Health and Hygiene,109.5596,OUT017,2007,,Tier 2,Supermarket Type1 +FDS08,5.735,Low Fat,0.05704978,Fruits and Vegetables,175.037,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX47,6.55,Regular,0.034674522,Breads,157.5288,OUT045,2002,,Tier 2,Supermarket Type1 +FDC53,,Low Fat,0.015470159,Frozen Foods,100.4384,OUT019,1985,Small,Tier 1,Grocery Store +FDQ19,7.35,Regular,0.014362412,Fruits and Vegetables,241.1512,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL14,8.115,Regular,0.032224086,Canned,154.8972,OUT045,2002,,Tier 2,Supermarket Type1 +FDM33,,LF,0.153585858,Snack Foods,221.1798,OUT019,1985,Small,Tier 1,Grocery Store +FDA51,8.05,Regular,0.165013572,Dairy,113.2518,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ27,7.935,Low Fat,0.017226149,Dairy,48.635,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT04,17.25,LF,0.107041738,Frozen Foods,41.2822,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC13,8.26,Regular,0.03249201,Soft Drinks,124.773,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR16,,Regular,0.104509448,Frozen Foods,214.7218,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ03,,Regular,0.077636468,Meat,236.2248,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE38,6.52,Low Fat,0.044598726,Canned,167.7842,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH23,,Low Fat,0.169493477,Hard Drinks,57.0614,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT11,,Regular,0.051427223,Breads,187.7556,OUT019,1985,Small,Tier 1,Grocery Store +FDD09,13.5,Low Fat,0.021492339,Fruits and Vegetables,179.6976,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR40,9.1,Regular,0.0,Frozen Foods,81.9618,OUT045,2002,,Tier 2,Supermarket Type1 +FDX07,19.2,Regular,0.02304845,Fruits and Vegetables,183.495,OUT017,2007,,Tier 2,Supermarket Type1 +FDR07,21.35,Low Fat,0.077729209,Fruits and Vegetables,97.0094,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA51,8.05,Regular,0.165611092,Dairy,114.2518,OUT017,2007,,Tier 2,Supermarket Type1 +FDT59,,Low Fat,0.027858864,Breads,230.2668,OUT019,1985,Small,Tier 1,Grocery Store +FDF20,12.85,Low Fat,0.033408076,Fruits and Vegetables,195.0768,OUT017,2007,,Tier 2,Supermarket Type1 +FDR13,9.895,Regular,0.028779079,Canned,114.8492,OUT045,2002,,Tier 2,Supermarket Type1 +FDY26,20.6,Regular,0.030557961,Dairy,210.2244,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW04,8.985,Regular,0.058154195,Frozen Foods,129.831,OUT017,2007,,Tier 2,Supermarket Type1 +FDK52,18.25,Low Fat,0.079666936,Frozen Foods,226.9062,OUT017,2007,,Tier 2,Supermarket Type1 +FDN60,15.1,Low Fat,0.095306027,Baking Goods,157.1604,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM09,,Regular,0.150455041,Snack Foods,170.879,OUT019,1985,Small,Tier 1,Grocery Store +FDP46,15.35,Low Fat,0.074731622,Snack Foods,87.883,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB50,,Low Fat,0.268966279,Canned,79.1986,OUT019,1985,Small,Tier 1,Grocery Store +NCQ29,12.0,Low Fat,0.104392185,Health and Hygiene,258.8278,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP16,,Low Fat,0.039104567,Frozen Foods,245.3802,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX33,9.195,Regular,0.117963418,Snack Foods,161.1578,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP07,18.2,LF,0.0,Fruits and Vegetables,195.411,OUT010,1998,,Tier 3,Grocery Store +FDN22,18.85,Regular,0.138305372,Snack Foods,251.1724,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF39,14.85,Regular,0.0,Dairy,261.691,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS21,19.85,Regular,0.020994235,Snack Foods,60.7194,OUT017,2007,,Tier 2,Supermarket Type1 +NCM42,6.13,LF,0.028297924,Household,107.1912,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK50,,Low Fat,0.049660306,Canned,163.4894,OUT019,1985,Small,Tier 1,Grocery Store +DRF13,,Low Fat,0.029637145,Soft Drinks,146.9444,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH35,18.25,Low Fat,0.06049406,Starchy Foods,163.9526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP60,17.35,Low Fat,0.056146632,Baking Goods,99.5016,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ49,,Low Fat,0.013925484,Soft Drinks,130.1652,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCT42,,Low Fat,0.043574485,Household,148.3392,OUT019,1985,Small,Tier 1,Grocery Store +FDE38,6.52,Low Fat,0.044676513,Canned,167.6842,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI04,13.65,Regular,0.073025792,Frozen Foods,198.6426,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH54,13.5,Low Fat,0.072816495,Household,157.892,OUT045,2002,,Tier 2,Supermarket Type1 +FDT56,16.0,Regular,0.115772125,Fruits and Vegetables,58.9246,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRD15,10.6,Low Fat,0.057027285,Dairy,232.3642,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV58,20.85,Low Fat,0.0,Snack Foods,193.8452,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP21,7.42,Regular,0.025780862,Snack Foods,187.0872,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH05,14.35,Regular,0.090837986,Frozen Foods,232.7984,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR10,,Low Fat,0.009991275,Snack Foods,161.5552,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCP06,20.7,Low Fat,0.039325397,Household,149.4366,OUT045,2002,,Tier 2,Supermarket Type1 +FDF33,7.97,Low Fat,0.02156897,Seafood,106.4596,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK37,5.0,Low Fat,0.0,Soft Drinks,188.353,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH49,19.7,Low Fat,0.0,Soft Drinks,84.2592,OUT045,2002,,Tier 2,Supermarket Type1 +FDT58,9.0,Low Fat,0.085883187,Snack Foods,167.4816,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD41,6.765,Regular,0.087615564,Frozen Foods,104.3306,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP40,4.555,Regular,0.034497126,Frozen Foods,110.3544,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM51,,Regular,0.025800674,Meat,101.6674,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO45,13.15,Regular,0.063525167,Snack Foods,86.3856,OUT010,1998,,Tier 3,Grocery Store +FDW33,9.395,Low Fat,0.165907543,Snack Foods,106.528,OUT010,1998,,Tier 3,Grocery Store +FDY24,4.88,Regular,0.0,Baking Goods,54.1298,OUT045,2002,,Tier 2,Supermarket Type1 +FDB10,10.0,Low Fat,0.112492619,Snack Foods,237.559,OUT010,1998,,Tier 3,Grocery Store +FDM40,10.195,Low Fat,0.159906706,Frozen Foods,141.7154,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCI06,11.3,Low Fat,0.0479876,Household,180.866,OUT017,2007,,Tier 2,Supermarket Type1 +FDW12,,Regular,0.062282301,Baking Goods,143.5444,OUT019,1985,Small,Tier 1,Grocery Store +FDX48,,Regular,0.03770442,Baking Goods,154.8656,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW05,,Low Fat,0.147355554,Health and Hygiene,107.0938,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX27,20.7,Regular,0.114762583,Dairy,95.1436,OUT017,2007,,Tier 2,Supermarket Type1 +DRM37,15.35,Low Fat,0.09659331,Soft Drinks,198.2768,OUT045,2002,,Tier 2,Supermarket Type1 +FDA38,5.44,LF,0.025531593,Dairy,241.5538,OUT045,2002,,Tier 2,Supermarket Type1 +FDR36,6.715,Regular,0.121586376,Baking Goods,40.0454,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ45,14.1,Low Fat,0.066875983,Snack Foods,198.8084,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG05,11.0,Regular,0.088344041,Frozen Foods,158.463,OUT017,2007,,Tier 2,Supermarket Type1 +FDK28,5.695,Low Fat,0.065535324,Frozen Foods,258.5646,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV47,17.1,Low Fat,0.054317483,Breads,85.7566,OUT045,2002,,Tier 2,Supermarket Type1 +FDN21,18.6,Low Fat,0.077011493,Snack Foods,160.5236,OUT045,2002,,Tier 2,Supermarket Type1 +FDP20,,low fat,0.045448081,Fruits and Vegetables,127.202,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI35,14.0,Low Fat,0.041374909,Starchy Foods,181.7634,OUT045,2002,,Tier 2,Supermarket Type1 +DRY23,9.395,reg,0.109005584,Soft Drinks,43.3112,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA56,9.21,Low Fat,0.008814363,Fruits and Vegetables,122.7414,OUT017,2007,,Tier 2,Supermarket Type1 +FDB09,16.25,Low Fat,0.057348328,Fruits and Vegetables,123.2046,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO26,,Low Fat,0.076483451,Household,117.3492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ49,20.2,Regular,0.039407615,Breakfast,156.563,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI52,,Low Fat,0.104171229,Frozen Foods,122.4072,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ44,,Low Fat,0.03854151,Fruits and Vegetables,117.4808,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ09,17.6,Low Fat,0.105306199,Snack Foods,164.3868,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY03,17.6,Regular,0.07624018,Meat,113.1202,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG42,19.2,LF,0.041461032,Household,129.931,OUT017,2007,,Tier 2,Supermarket Type1 +DRI13,,Low Fat,0.020228528,Soft Drinks,218.0508,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ32,17.85,Regular,0.046569711,Fruits and Vegetables,125.6388,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW16,17.35,Regular,0.04146639,Frozen Foods,90.9804,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU27,18.6,Regular,0.171476879,Meat,47.0376,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR28,13.85,Regular,0.043345406,Frozen Foods,162.821,OUT010,1998,,Tier 3,Grocery Store +FDQ49,20.2,Regular,0.065692664,Breakfast,158.163,OUT010,1998,,Tier 3,Grocery Store +FDS37,7.655,Low Fat,0.031944868,Canned,116.1492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW26,11.8,Regular,0.107493292,Dairy,220.4772,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX12,18.2,Regular,0.026170661,Baking Goods,241.1196,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP06,20.7,Low Fat,0.039213146,Household,150.7366,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW45,18.0,Low Fat,0.065296399,Snack Foods,145.2418,OUT010,1998,,Tier 3,Grocery Store +NCN30,16.35,Low Fat,0.017019624,Household,94.541,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN24,14.1,Low Fat,0.113443531,Baking Goods,53.0956,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCL41,,Low Fat,0.04153551,Health and Hygiene,32.8216,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR02,,Low Fat,0.03863415,Dairy,109.4886,OUT019,1985,Small,Tier 1,Grocery Store +FDD09,13.5,Low Fat,0.035980572,Fruits and Vegetables,180.8976,OUT010,1998,,Tier 3,Grocery Store +FDS33,6.67,Regular,0.0,Snack Foods,86.5514,OUT010,1998,,Tier 3,Grocery Store +FDU22,12.35,Low Fat,0.093485761,Snack Foods,119.6124,OUT045,2002,,Tier 2,Supermarket Type1 +FDI53,8.895,Regular,0.137530409,Frozen Foods,162.5236,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH01,17.5,Low Fat,0.098056243,Soft Drinks,175.7738,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX32,15.1,Regular,0.099775148,Fruits and Vegetables,142.9786,OUT013,1987,High,Tier 3,Supermarket Type1 +NCP30,20.5,Low Fat,0.032902177,Household,39.7822,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB60,9.3,Low Fat,0.028579933,Baking Goods,195.9136,OUT045,2002,,Tier 2,Supermarket Type1 +FDB14,20.25,Regular,0.102883628,Canned,93.412,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP02,7.105,Low Fat,0.044800289,Household,58.0562,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ10,5.095,Regular,0.13023619,Snack Foods,140.3838,OUT017,2007,,Tier 2,Supermarket Type1 +FDG34,11.5,Regular,0.0,Snack Foods,110.5254,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCB18,19.6,Low Fat,0.041524729,Household,87.8514,OUT017,2007,,Tier 2,Supermarket Type1 +FDM16,8.155,Regular,0.033607569,Frozen Foods,74.2354,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW25,5.175,Low Fat,0.0375513,Canned,84.1224,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB35,12.3,Regular,0.108158918,Starchy Foods,91.2804,OUT010,1998,,Tier 3,Grocery Store +DRN11,7.85,Low Fat,0.162844648,Hard Drinks,143.2444,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF41,,Low Fat,0.229678918,Frozen Foods,248.246,OUT019,1985,Small,Tier 1,Grocery Store +FDH16,10.5,Low Fat,0.05266193,Frozen Foods,88.183,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ50,18.75,Low Fat,0.034447102,Household,212.5218,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH23,14.65,Low Fat,0.171012056,Hard Drinks,57.1614,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ37,10.8,Low Fat,0.061050536,Soft Drinks,151.9024,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ24,,Low Fat,0.112780422,Soft Drinks,184.7924,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY16,18.35,Regular,0.092209315,Frozen Foods,183.4266,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ27,5.19,Regular,0.044342366,Meat,105.199,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ33,10.195,Low Fat,0.107614855,Snack Foods,148.6076,OUT045,2002,,Tier 2,Supermarket Type1 +FDF29,15.1,Regular,0.019974614,Frozen Foods,131.331,OUT045,2002,,Tier 2,Supermarket Type1 +FDA08,11.85,Regular,0.050163021,Fruits and Vegetables,163.1526,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG31,12.15,Low Fat,0.0,Meat,65.1826,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE34,,low fat,0.0,Snack Foods,183.3634,OUT019,1985,Small,Tier 1,Grocery Store +NCR30,,Low Fat,0.070649186,Household,73.7696,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV33,9.6,Regular,0.02733844,Snack Foods,258.1304,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRZ24,7.535,Low Fat,0.0,Soft Drinks,120.244,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCL54,12.6,Low Fat,0.082738167,Household,173.5054,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR12,12.6,Regular,0.031583781,Baking Goods,172.8764,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCC54,17.75,Low Fat,0.097710924,Health and Hygiene,241.9196,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN59,15.0,Low Fat,0.0,Hard Drinks,45.906,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX50,,Low Fat,0.130662596,Dairy,110.3228,OUT019,1985,Small,Tier 1,Grocery Store +FDV31,,Low Fat,0.106200539,Fruits and Vegetables,178.437,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA29,,Low Fat,0.027144323,Household,172.8106,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW60,5.44,Regular,0.017088476,Baking Goods,176.837,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX08,12.85,Low Fat,0.022731909,Fruits and Vegetables,182.4318,OUT017,2007,,Tier 2,Supermarket Type1 +DRD49,9.895,Low Fat,0.167691399,Soft Drinks,236.4564,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD33,12.85,Low Fat,0.108192641,Fruits and Vegetables,231.2642,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW35,10.6,Low Fat,0.011079996,Breads,42.2454,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ36,14.5,Regular,0.128985562,Baking Goods,102.9332,OUT017,2007,,Tier 2,Supermarket Type1 +FDV51,16.35,Low Fat,0.032532744,Meat,166.3842,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW36,11.15,Low Fat,0.056932641,Baking Goods,106.4622,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH35,18.25,Low Fat,0.060248633,Starchy Foods,165.2526,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCS30,,Low Fat,0.092575723,Household,130.9652,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN49,17.25,Regular,0.125932787,Breakfast,38.248,OUT017,2007,,Tier 2,Supermarket Type1 +FDL08,10.8,Low Fat,0.04992156,Fruits and Vegetables,246.0144,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI09,20.75,Regular,0.129229963,Seafood,240.088,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP19,11.5,Low Fat,0.174222894,Fruits and Vegetables,129.4652,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU21,11.8,Regular,0.128414313,Snack Foods,33.0558,OUT010,1998,,Tier 3,Grocery Store +NCP41,16.6,Low Fat,0.016243582,Health and Hygiene,107.6596,OUT045,2002,,Tier 2,Supermarket Type1 +FDY10,17.6,Low Fat,0.049027044,Snack Foods,112.6176,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP12,9.8,Regular,0.045451204,Baking Goods,36.2874,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN26,10.85,Low Fat,0.028724484,Household,116.0808,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK44,16.6,LF,0.122125769,Fruits and Vegetables,174.4738,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC28,7.905,Low Fat,0.055072409,Frozen Foods,109.1254,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ41,,Low Fat,0.022772467,Frozen Foods,263.2594,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCT29,12.6,Low Fat,0.064098602,Health and Hygiene,123.5414,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCH42,,Low Fat,0.063972131,Household,228.401,OUT019,1985,Small,Tier 1,Grocery Store +FDU60,20.0,Regular,0.060145056,Baking Goods,167.1132,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS02,10.195,Regular,0.14616317,Dairy,193.1794,OUT045,2002,,Tier 2,Supermarket Type1 +FDC51,10.895,Regular,0.009621861,Dairy,123.073,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU03,18.7,Regular,0.091501713,Meat,182.6292,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX39,14.3,Regular,0.049776901,Meat,211.7586,OUT045,2002,,Tier 2,Supermarket Type1 +NCY05,13.5,Low Fat,0.092042001,Health and Hygiene,36.6874,OUT010,1998,,Tier 3,Grocery Store +NCL06,,Low Fat,0.071717648,Household,259.9594,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD32,17.7,Regular,0.0,Fruits and Vegetables,80.0276,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN41,17.0,Low Fat,0.052315184,Health and Hygiene,122.773,OUT045,2002,,Tier 2,Supermarket Type1 +NCX53,20.1,Low Fat,0.014961062,Health and Hygiene,141.5154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU57,,Regular,0.15679782,Snack Foods,149.8708,OUT019,1985,Small,Tier 1,Grocery Store +FDQ23,6.55,Low Fat,0.024525828,Breads,104.0332,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ52,17.0,Low Fat,0.1196271,Frozen Foods,249.0434,OUT045,2002,,Tier 2,Supermarket Type1 +FDC14,14.5,Regular,0.041332726,Canned,40.1454,OUT045,2002,,Tier 2,Supermarket Type1 +FDY09,15.6,Low Fat,0.025195384,Snack Foods,176.8054,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ28,14.0,Regular,0.060549609,Frozen Foods,156.4656,OUT045,2002,,Tier 2,Supermarket Type1 +FDV25,5.905,LF,0.045652243,Canned,221.0456,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ07,7.26,Low Fat,0.014420795,Meat,116.215,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRB25,12.3,Low Fat,0.069567714,Soft Drinks,106.0938,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK52,,Low Fat,0.138701966,Frozen Foods,225.4062,OUT019,1985,Small,Tier 1,Grocery Store +FDY52,,Low Fat,0.007312702,Frozen Foods,63.1536,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB28,6.615,Low Fat,0.093385381,Dairy,197.8426,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT36,12.3,Low Fat,0.11125355,Baking Goods,36.0874,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV25,5.905,Low Fat,0.045910471,Canned,222.1456,OUT017,2007,,Tier 2,Supermarket Type1 +NCN07,,Low Fat,0.033780319,Others,130.4284,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC57,20.1,Regular,0.054903339,Fruits and Vegetables,193.282,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ03,15.0,Regular,0.078332053,Meat,236.7248,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU23,12.15,Low Fat,0.021846371,Breads,167.1184,OUT017,2007,,Tier 2,Supermarket Type1 +NCX41,19.0,Low Fat,0.017715927,Health and Hygiene,212.6244,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCD06,13.0,Low Fat,0.099306497,Household,46.706,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW08,12.1,LF,0.148682491,Fruits and Vegetables,106.728,OUT045,2002,,Tier 2,Supermarket Type1 +NCU29,7.685,LF,0.025621558,Health and Hygiene,145.076,OUT017,2007,,Tier 2,Supermarket Type1 +NCE06,5.825,Low Fat,0.0914091,Household,160.9894,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV52,20.7,Regular,0.203400773,Frozen Foods,117.9466,OUT010,1998,,Tier 3,Grocery Store +FDB02,9.695,Regular,0.029329243,Canned,176.637,OUT017,2007,,Tier 2,Supermarket Type1 +NCR18,15.85,Low Fat,0.020529174,Household,42.9112,OUT045,2002,,Tier 2,Supermarket Type1 +FDK16,9.065,Low Fat,0.0,Frozen Foods,94.4094,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCQ29,12.0,Low Fat,0.174459878,Health and Hygiene,258.7278,OUT010,1998,,Tier 3,Grocery Store +FDZ01,,Regular,0.015860869,Canned,103.499,OUT019,1985,Small,Tier 1,Grocery Store +FDW27,5.86,Regular,0.150824783,Meat,157.0314,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD17,7.5,Low Fat,0.03275986,Frozen Foods,237.8906,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW39,6.69,Regular,0.036879682,Meat,176.637,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH59,10.8,Low Fat,0.058551954,Hard Drinks,72.638,OUT045,2002,,Tier 2,Supermarket Type1 +FDS52,8.89,Low Fat,0.005469959,Frozen Foods,101.7016,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU40,,Low Fat,0.037222843,Frozen Foods,195.2478,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCF54,18.0,Low Fat,0.047337627,Household,173.6422,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH46,6.935,Regular,0.041366008,Snack Foods,102.8332,OUT045,2002,,Tier 2,Supermarket Type1 +NCP14,8.275,Low Fat,0.110461228,Household,103.6306,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH50,15.0,Regular,0.0,Canned,185.2266,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF15,18.35,Low Fat,0.05559341,Dairy,153.534,OUT010,1998,,Tier 3,Grocery Store +FDV27,,Regular,0.039796377,Meat,87.4514,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCJ06,20.1,Low Fat,0.034706495,Household,120.1782,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN02,16.5,Low Fat,0.074128491,Canned,205.4638,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ51,16.0,Regular,0.017578564,Meat,45.9718,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ07,15.1,Regular,0.087901272,Fruits and Vegetables,222.7456,OUT017,2007,,Tier 2,Supermarket Type1 +FDS45,5.175,reg,0.029541813,Snack Foods,105.1622,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCJ06,20.1,Low Fat,0.034722896,Household,121.1782,OUT045,2002,,Tier 2,Supermarket Type1 +FDD36,13.3,Low Fat,0.021269538,Baking Goods,117.2124,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY25,12.0,Low Fat,0.034043337,Canned,182.5976,OUT045,2002,,Tier 2,Supermarket Type1 +FDU52,7.56,Low Fat,0.063770861,Frozen Foods,154.963,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRK47,7.905,LF,0.064426754,Hard Drinks,227.0694,OUT017,2007,,Tier 2,Supermarket Type1 +NCL30,18.1,Low Fat,0.049217255,Household,128.4336,OUT017,2007,,Tier 2,Supermarket Type1 +FDN22,18.85,Regular,0.13827922,Snack Foods,251.8724,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCF30,,Low Fat,0.125632716,Household,126.2362,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK03,12.6,Regular,0.073906461,Dairy,256.2356,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT45,15.85,Low Fat,0.057637631,Snack Foods,55.0956,OUT017,2007,,Tier 2,Supermarket Type1 +NCC54,,Low Fat,0.097237755,Health and Hygiene,239.6196,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP08,20.5,Regular,0.112867957,Fruits and Vegetables,195.3478,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU44,12.15,Regular,0.058425726,Fruits and Vegetables,163.2552,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRG39,14.15,Low Fat,0.042173019,Dairy,52.7982,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU32,8.785,Low Fat,0.026007997,Fruits and Vegetables,121.9414,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY27,6.38,Low Fat,0.0,Dairy,178.5344,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP54,15.35,Low Fat,0.03512042,Household,123.073,OUT013,1987,High,Tier 3,Supermarket Type1 +NCZ41,19.85,Low Fat,0.064521395,Health and Hygiene,126.4704,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL49,13.15,Low Fat,0.056382065,Soft Drinks,143.4812,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI05,8.35,Regular,0.127386531,Frozen Foods,76.4354,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY56,16.35,Regular,0.062537976,Fruits and Vegetables,226.5062,OUT045,2002,,Tier 2,Supermarket Type1 +DRC13,8.26,Regular,0.032414575,Soft Drinks,124.973,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV29,11.8,Low Fat,0.022972713,Health and Hygiene,179.5686,OUT017,2007,,Tier 2,Supermarket Type1 +FDR24,17.35,Regular,0.062949401,Baking Goods,88.983,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ34,6.695,Low Fat,0.076187616,Starchy Foods,191.382,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP37,15.6,Low Fat,0.143078892,Breakfast,126.4994,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX08,,Low Fat,0.02249459,Fruits and Vegetables,180.9318,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS57,15.5,Low Fat,0.103652052,Snack Foods,141.447,OUT045,2002,,Tier 2,Supermarket Type1 +NCG18,15.3,Low Fat,0.023013626,Household,102.4332,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK25,11.6,Regular,0.157470693,Breakfast,168.9474,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH53,20.5,Regular,0.019229584,Frozen Foods,80.9592,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRI59,9.5,Low Fat,0.041001013,Hard Drinks,223.0088,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA52,16.2,Regular,0.128422279,Frozen Foods,177.237,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT20,10.5,Low Fat,0.069287489,Fruits and Vegetables,38.3164,OUT010,1998,,Tier 3,Grocery Store +FDE36,,Regular,0.073138055,Baking Goods,162.5868,OUT019,1985,Small,Tier 1,Grocery Store +FDI24,10.3,LF,0.079189212,Baking Goods,174.737,OUT017,2007,,Tier 2,Supermarket Type1 +FDB28,6.615,Low Fat,0.093765794,Dairy,199.2426,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV11,9.1,Regular,0.082129741,Breads,176.9054,OUT017,2007,,Tier 2,Supermarket Type1 +FDP01,20.75,Regular,0.063325948,Breakfast,154.1682,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD34,,Low Fat,0.015799406,Snack Foods,161.721,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ50,,Low Fat,0.021481473,Canned,52.0982,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ44,8.185,LF,0.038696828,Fruits and Vegetables,118.5808,OUT013,1987,High,Tier 3,Supermarket Type1 +DRO59,11.8,Low Fat,0.054144012,Hard Drinks,75.8012,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRB48,16.75,reg,0.024903892,Soft Drinks,39.1822,OUT045,2002,,Tier 2,Supermarket Type1 +FDR21,19.7,Low Fat,0.067208126,Snack Foods,175.337,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCE42,21.1,Low Fat,0.017746063,Household,234.7958,OUT010,1998,,Tier 3,Grocery Store +FDO23,17.85,Low Fat,0.146427351,Breads,93.4436,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCE30,16.0,Low Fat,0.099539874,Household,212.3902,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ22,16.75,LF,0.029734029,Snack Foods,37.6822,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY01,11.8,Regular,0.170628832,Canned,115.3834,OUT045,2002,,Tier 2,Supermarket Type1 +FDS08,5.735,Low Fat,0.057283416,Fruits and Vegetables,177.837,OUT017,2007,,Tier 2,Supermarket Type1 +FDG28,9.285,Regular,0.049481039,Frozen Foods,246.7144,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ51,16.0,Regular,0.017622773,Meat,48.1718,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB05,5.155,LF,0.083668945,Frozen Foods,249.4776,OUT017,2007,,Tier 2,Supermarket Type1 +FDO56,10.195,Regular,0.045052492,Fruits and Vegetables,116.5808,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE02,8.71,Low Fat,0.0,Canned,91.9778,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN45,19.35,Low Fat,0.118770807,Snack Foods,223.2088,OUT017,2007,,Tier 2,Supermarket Type1 +FDS09,8.895,reg,0.081021001,Snack Foods,49.0008,OUT013,1987,High,Tier 3,Supermarket Type1 +NCA54,16.5,Low Fat,0.036790859,Household,181.4318,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP09,19.75,Low Fat,0.056724671,Snack Foods,212.7902,OUT010,1998,,Tier 3,Grocery Store +FDC53,8.68,Low Fat,0.008853613,Frozen Foods,99.0384,OUT045,2002,,Tier 2,Supermarket Type1 +NCM55,15.6,Low Fat,0.067103564,Others,186.5924,OUT017,2007,,Tier 2,Supermarket Type1 +FDL09,19.6,Regular,0.128557634,Snack Foods,169.0816,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA11,,Low Fat,0.075705596,Baking Goods,93.2436,OUT019,1985,Small,Tier 1,Grocery Store +FDA50,16.25,Low Fat,0.087351931,Dairy,94.541,OUT045,2002,,Tier 2,Supermarket Type1 +FDC23,18.0,Low Fat,0.018007487,Starchy Foods,178.9686,OUT017,2007,,Tier 2,Supermarket Type1 +FDE22,9.695,Low Fat,0.029618788,Snack Foods,158.892,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD23,9.5,Regular,0.04868553,Starchy Foods,186.8898,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA29,10.5,Low Fat,0.027318818,Household,172.7106,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK38,6.65,Low Fat,0.053289916,Canned,147.0734,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC13,8.26,Regular,0.032441572,Soft Drinks,121.673,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCP43,17.75,Low Fat,0.03055448,Others,179.166,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX28,6.325,Low Fat,0.12537274,Frozen Foods,99.7042,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF08,14.3,Regular,0.065308939,Fruits and Vegetables,89.8856,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ33,10.195,Low Fat,0.10739705,Snack Foods,149.5076,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD10,20.6,reg,0.046092237,Snack Foods,178.6344,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO58,19.6,Low Fat,0.039801037,Snack Foods,162.4526,OUT017,2007,,Tier 2,Supermarket Type1 +FDI50,8.42,Regular,0.031017124,Canned,230.1352,OUT017,2007,,Tier 2,Supermarket Type1 +FDO58,19.6,Low Fat,0.039657436,Snack Foods,165.7526,OUT045,2002,,Tier 2,Supermarket Type1 +FDX08,12.85,Low Fat,0.022585241,Fruits and Vegetables,181.0318,OUT013,1987,High,Tier 3,Supermarket Type1 +NCK17,11.0,Low Fat,0.063428202,Health and Hygiene,40.848,OUT010,1998,,Tier 3,Grocery Store +FDF39,14.85,Regular,0.019507599,Dairy,262.091,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU45,15.6,Regular,0.059430002,Snack Foods,112.0518,OUT010,1998,,Tier 3,Grocery Store +NCJ18,12.35,Low Fat,0.164609767,Household,117.6124,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRC27,,Low Fat,0.101729922,Dairy,246.2802,OUT019,1985,Small,Tier 1,Grocery Store +DRC25,5.73,Low Fat,0.045363276,Soft Drinks,85.1882,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU59,5.78,Low Fat,0.096368001,Breads,160.6552,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU28,19.2,Regular,0.0,Frozen Foods,189.6214,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP30,20.5,Low Fat,0.032768691,Household,40.9822,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB39,11.6,Low Fat,0.038675869,Dairy,55.1272,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE41,9.195,Regular,0.063960902,Frozen Foods,86.4566,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH11,5.98,Low Fat,0.126468543,Hard Drinks,56.3614,OUT010,1998,,Tier 3,Grocery Store +FDA58,9.395,Low Fat,0.103961646,Snack Foods,236.0932,OUT045,2002,,Tier 2,Supermarket Type1 +FDU50,5.75,Regular,0.075170211,Dairy,115.3176,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM34,19.0,Low Fat,0.067391444,Snack Foods,129.6626,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM44,,LF,0.030899314,Fruits and Vegetables,101.999,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR39,20.35,Low Fat,0.08396923,Meat,183.8292,OUT045,2002,,Tier 2,Supermarket Type1 +FDM25,10.695,Regular,0.060788771,Breakfast,175.6712,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ49,20.2,Regular,0.039308756,Breakfast,156.463,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH25,18.7,Low Fat,0.014652476,Soft Drinks,52.3324,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM09,,Regular,0.085515417,Snack Foods,170.979,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL44,,Low Fat,0.021492148,Fruits and Vegetables,161.1894,OUT019,1985,Small,Tier 1,Grocery Store +NCR42,9.105,Low Fat,0.038638642,Household,32.39,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL59,16.75,Low Fat,0.021224126,Hard Drinks,52.7298,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX43,5.655,Low Fat,0.085204025,Fruits and Vegetables,168.45,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK47,7.905,Low Fat,0.107230638,Hard Drinks,226.6694,OUT010,1998,,Tier 3,Grocery Store +FDU48,18.85,Low Fat,0.055583959,Baking Goods,131.7284,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY12,9.8,Regular,0.140896203,Baking Goods,50.2008,OUT045,2002,,Tier 2,Supermarket Type1 +NCN43,12.15,Low Fat,0.006787278,Others,122.573,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM55,15.6,Low Fat,0.066997948,Others,184.0924,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ21,,Low Fat,0.0,Snack Foods,123.1756,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX13,7.725,Low Fat,0.047773924,Canned,251.0092,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK30,,LF,0.060683277,Household,253.3698,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG20,15.5,Regular,0.125883329,Fruits and Vegetables,175.4028,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG27,8.895,Low Fat,0.105705241,Dairy,40.0138,OUT017,2007,,Tier 2,Supermarket Type1 +FDY14,10.3,Low Fat,0.070325509,Dairy,264.3226,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP59,20.85,Regular,0.056455037,Breads,102.7648,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU60,20.0,Regular,0.0,Baking Goods,169.1132,OUT017,2007,,Tier 2,Supermarket Type1 +NCC18,,Low Fat,0.310376916,Household,172.2422,OUT019,1985,Small,Tier 1,Grocery Store +DRJ39,20.25,Low Fat,0.036531539,Dairy,218.1482,OUT017,2007,,Tier 2,Supermarket Type1 +FDS07,12.35,LF,0.09991293,Fruits and Vegetables,113.4518,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM08,,Regular,0.053324723,Fruits and Vegetables,222.5088,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP51,13.85,Regular,0.085447928,Meat,120.4124,OUT045,2002,,Tier 2,Supermarket Type1 +FDU16,19.25,Regular,0.058264085,Frozen Foods,81.9908,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH12,9.6,Low Fat,0.084882966,Baking Goods,106.528,OUT013,1987,High,Tier 3,Supermarket Type1 +DRE48,8.43,Low Fat,0.028999721,Soft Drinks,195.8768,OUT010,1998,,Tier 3,Grocery Store +NCL42,,Low Fat,0.040176104,Household,244.3144,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR21,19.7,Low Fat,0.067071206,Snack Foods,177.637,OUT045,2002,,Tier 2,Supermarket Type1 +NCW29,14.0,Low Fat,0.0288575,Health and Hygiene,131.431,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO11,8.0,Regular,0.030239711,Breads,250.6092,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM31,6.095,Low Fat,0.081322858,Others,141.2154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV35,,Low Fat,0.224472159,Breads,155.4314,OUT019,1985,Small,Tier 1,Grocery Store +FDF58,13.3,Low Fat,0.00963535,Snack Foods,61.651,OUT017,2007,,Tier 2,Supermarket Type1 +NCE43,12.5,Low Fat,0.103603094,Household,169.1448,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA02,14.0,Regular,0.029717039,Dairy,143.8786,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRL37,15.5,Low Fat,0.089334085,Soft Drinks,44.477,OUT010,1998,,Tier 3,Grocery Store +FDR24,17.35,Regular,0.063107714,Baking Goods,91.283,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW59,13.15,Low Fat,0.020748121,Breads,82.7566,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS22,16.85,Regular,0.023190398,Snack Foods,44.8428,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW24,6.8,Low Fat,0.037709148,Baking Goods,49.7034,OUT017,2007,,Tier 2,Supermarket Type1 +FDU24,6.78,Regular,0.140136534,Baking Goods,94.712,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA21,,Low Fat,0.035786568,Snack Foods,186.4924,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH58,,Low Fat,0.036760791,Snack Foods,116.9834,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW36,11.15,Low Fat,0.05716456,Baking Goods,103.8622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI45,,Low Fat,0.037399255,Fruits and Vegetables,173.1054,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU01,20.25,Regular,0.0,Canned,185.7924,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF35,,Low Fat,0.153243627,Starchy Foods,109.1938,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU43,,Regular,0.101626463,Fruits and Vegetables,237.4564,OUT019,1985,Small,Tier 1,Grocery Store +FDE24,,Low Fat,0.163640988,Baking Goods,144.2812,OUT019,1985,Small,Tier 1,Grocery Store +FDK50,7.96,Low Fat,0.0284073,Canned,162.9894,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG31,12.15,Low Fat,0.037973245,Meat,63.0826,OUT045,2002,,Tier 2,Supermarket Type1 +FDC60,5.425,Regular,0.114704556,Baking Goods,90.2514,OUT045,2002,,Tier 2,Supermarket Type1 +FDL36,15.1,Low Fat,0.076012177,Baking Goods,90.283,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP21,7.42,Regular,0.025719421,Snack Foods,189.5872,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW16,17.35,Regular,0.041558343,Frozen Foods,90.5804,OUT045,2002,,Tier 2,Supermarket Type1 +FDX02,16.0,Low Fat,0.057382845,Dairy,224.7404,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ58,,Low Fat,0.01522774,Snack Foods,154.134,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT51,11.65,Regular,0.01091879,Meat,110.7544,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD59,10.5,Regular,0.0662837,Starchy Foods,78.996,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM42,6.13,Low Fat,0.028436862,Household,109.0912,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA57,18.85,Low Fat,0.039805092,Snack Foods,40.348,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ48,17.75,Low Fat,0.0,Baking Goods,112.0544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE46,18.6,Low Fat,0.015801675,Snack Foods,152.4366,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ30,,Low Fat,0.045846525,Household,120.8098,OUT019,1985,Small,Tier 1,Grocery Store +FDB56,8.75,Regular,0.075049323,Fruits and Vegetables,188.2556,OUT017,2007,,Tier 2,Supermarket Type1 +FDA25,,Regular,0.067795854,Canned,104.499,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD20,14.15,Low Fat,0.0,Fruits and Vegetables,125.2046,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL25,6.92,Regular,0.130815962,Breakfast,92.4804,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO18,13.15,Low Fat,0.024689595,Household,177.0686,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ45,17.75,Low Fat,0.073825883,Seafood,34.8216,OUT017,2007,,Tier 2,Supermarket Type1 +FDR12,12.6,Regular,0.03152879,Baking Goods,170.3764,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCF19,13.0,Low Fat,0.05876482,Household,47.3034,OUT010,1998,,Tier 3,Grocery Store +FDK25,11.6,Regular,0.156831826,Breakfast,166.5474,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCR17,9.8,Low Fat,0.024383317,Health and Hygiene,114.0492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC52,11.15,Regular,0.0082799,Dairy,151.8708,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA54,16.5,Low Fat,0.036848856,Household,181.3318,OUT017,2007,,Tier 2,Supermarket Type1 +FDR45,10.8,Low Fat,0.048445132,Snack Foods,239.4222,OUT010,1998,,Tier 3,Grocery Store +NCM19,12.65,Low Fat,0.047310687,Others,113.3202,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF39,,Regular,0.019416804,Dairy,263.491,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX23,6.445,Low Fat,0.029737925,Baking Goods,96.5436,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD58,,Low Fat,0.059064826,Snack Foods,99.67,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX28,6.325,low fat,0.125073951,Frozen Foods,100.6042,OUT013,1987,High,Tier 3,Supermarket Type1 +NCD31,12.1,Low Fat,0.01542162,Household,162.5526,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU57,8.27,Regular,0.089918992,Snack Foods,150.7708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI27,8.71,Regular,0.045986314,Dairy,45.5744,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM42,6.13,Low Fat,0.028321492,Household,108.0912,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD32,,Regular,0.040733779,Fruits and Vegetables,81.2276,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI34,10.65,Regular,0.085065105,Snack Foods,228.9668,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM29,11.5,LF,0.017669658,Health and Hygiene,129.8626,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG46,8.63,Regular,0.033043717,Snack Foods,112.8518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRC01,5.92,Regular,0.03213687,Soft Drinks,49.1692,OUT010,1998,,Tier 3,Grocery Store +FDB15,,Low Fat,0.13614823,Dairy,263.2568,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA17,,Low Fat,0.045198261,Health and Hygiene,150.2392,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF10,15.5,Regular,0.156928379,Snack Foods,148.2418,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR26,,Low Fat,0.042629339,Dairy,178.7028,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI02,15.7,Regular,0.114743211,Canned,112.1202,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM54,17.7,Low Fat,0.085261544,Household,127.7678,OUT010,1998,,Tier 3,Grocery Store +FDF14,7.55,Low Fat,0.027147206,Canned,151.134,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ33,8.895,Regular,0.14783322,Snack Foods,121.273,OUT010,1998,,Tier 3,Grocery Store +FDM20,10.0,Low Fat,0.038678487,Fruits and Vegetables,245.7144,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC03,,Regular,0.071498575,Dairy,195.7794,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCX05,15.2,Low Fat,0.097062093,Health and Hygiene,116.6492,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM41,,Low Fat,0.035483325,Health and Hygiene,91.912,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU29,7.685,Low Fat,0.042644024,Health and Hygiene,147.876,OUT010,1998,,Tier 3,Grocery Store +FDQ59,9.8,Regular,0.056705486,Breads,83.4908,OUT017,2007,,Tier 2,Supermarket Type1 +FDH46,6.935,Regular,0.069098084,Snack Foods,101.6332,OUT010,1998,,Tier 3,Grocery Store +FDH09,12.6,Low Fat,0.056030907,Seafood,50.7982,OUT013,1987,High,Tier 3,Supermarket Type1 +NCD06,13.0,Low Fat,0.099526713,Household,46.706,OUT045,2002,,Tier 2,Supermarket Type1 +FDC15,18.1,Low Fat,0.177935403,Dairy,155.6288,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRD37,,Low Fat,0.013774708,Soft Drinks,45.106,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT28,,LF,0.063258348,Frozen Foods,149.3708,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR28,,Regular,0.02577108,Frozen Foods,163.621,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT38,18.7,Low Fat,0.0578629,Dairy,86.2566,OUT017,2007,,Tier 2,Supermarket Type1 +FDV34,,Regular,0.01137013,Snack Foods,75.2038,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY52,6.365,Low Fat,0.0,Frozen Foods,62.5536,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB34,15.25,LF,0.026587669,Snack Foods,85.9198,OUT013,1987,High,Tier 3,Supermarket Type1 +DRL23,18.35,Low Fat,0.015366655,Hard Drinks,105.5938,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRB24,8.785,Low Fat,0.020577225,Soft Drinks,154.2656,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ50,8.645,Low Fat,0.021586004,Canned,53.7982,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ49,20.2,Regular,0.039240315,Breakfast,154.463,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP20,19.85,Low Fat,0.045660601,Fruits and Vegetables,124.502,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV19,,Regular,0.035086303,Fruits and Vegetables,159.1578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCR54,16.35,Low Fat,0.090745855,Household,196.411,OUT045,2002,,Tier 2,Supermarket Type1 +FDO09,13.5,Regular,0.209684121,Snack Foods,261.191,OUT010,1998,,Tier 3,Grocery Store +FDS57,15.5,Low Fat,0.103863648,Snack Foods,143.147,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN10,11.5,Low Fat,0.046195515,Snack Foods,117.4124,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV23,11.0,Low Fat,0.106001313,Breads,125.5046,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY28,7.47,Regular,0.152387525,Frozen Foods,214.3218,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG51,12.1,Low Fat,0.011530019,Dairy,162.4526,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD45,,Low Fat,0.203536932,Fruits and Vegetables,93.2436,OUT019,1985,Small,Tier 1,Grocery Store +NCL18,,Low Fat,0.166772358,Household,193.0136,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCM29,11.5,Low Fat,0.017627547,Health and Hygiene,130.4626,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF17,,Low Fat,0.042414494,Frozen Foods,196.311,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE22,9.695,Low Fat,0.029740086,Snack Foods,161.392,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ22,16.75,Low Fat,0.029907872,Snack Foods,37.4822,OUT017,2007,,Tier 2,Supermarket Type1 +FDS01,11.6,Low Fat,0.017730232,Canned,179.6686,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW35,,LF,0.011035524,Breads,42.1454,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ33,8.895,Regular,0.088322179,Snack Foods,124.273,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCF54,18.0,Low Fat,0.047368095,Household,171.7422,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE09,8.775,Low Fat,0.021585405,Fruits and Vegetables,109.9228,OUT013,1987,High,Tier 3,Supermarket Type1 +NCE06,5.825,Low Fat,0.091670767,Household,161.3894,OUT045,2002,,Tier 2,Supermarket Type1 +DRH49,19.7,Low Fat,0.024693927,Soft Drinks,80.7592,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY43,14.85,Low Fat,0.098601801,Fruits and Vegetables,170.3474,OUT045,2002,,Tier 2,Supermarket Type1 +NCT05,10.895,Low Fat,0.021070361,Health and Hygiene,254.6672,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ34,6.695,Low Fat,0.076032402,Starchy Foods,191.782,OUT045,2002,,Tier 2,Supermarket Type1 +FDL38,13.8,reg,0.014816444,Canned,87.5172,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ31,15.35,Regular,0.113857626,Fruits and Vegetables,190.2504,OUT017,2007,,Tier 2,Supermarket Type1 +FDR14,11.65,Low Fat,0.174016121,Dairy,55.9298,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN54,20.35,Low Fat,0.021359628,Household,78.7328,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCC42,,Low Fat,0.044690933,Health and Hygiene,139.6838,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK08,9.195,Regular,0.0,Fruits and Vegetables,99.9016,OUT017,2007,,Tier 2,Supermarket Type1 +FDP59,20.85,Regular,0.056418725,Breads,105.7648,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV22,14.85,Regular,0.009936905,Snack Foods,156.963,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD33,12.85,Low Fat,0.108172183,Fruits and Vegetables,234.2642,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRE60,,Low Fat,0.158562878,Soft Drinks,227.372,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK52,18.25,Low Fat,0.079218842,Frozen Foods,227.0062,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA02,14.0,reg,0.029890782,Dairy,146.3786,OUT017,2007,,Tier 2,Supermarket Type1 +FDM56,16.7,Low Fat,0.070300718,Fruits and Vegetables,109.3912,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE57,9.6,LF,0.036278264,Fruits and Vegetables,141.4154,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM32,20.5,Low Fat,0.02064682,Fruits and Vegetables,88.783,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ30,,Low Fat,0.028931499,Household,121.5414,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ27,,Regular,0.0,Meat,104.799,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT60,,Low Fat,0.075182464,Baking Goods,124.8388,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU43,19.35,Regular,0.058133621,Fruits and Vegetables,240.3564,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO55,12.8,Low Fat,0.091020015,Others,106.6938,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG02,7.855,Low Fat,0.011284003,Canned,190.8188,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ28,12.3,Low Fat,0.021842793,Frozen Foods,190.7162,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP40,4.555,Regular,0.034426846,Frozen Foods,111.7544,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ38,8.6,Regular,0.040287073,Canned,190.553,OUT045,2002,,Tier 2,Supermarket Type1 +NCC54,17.75,Low Fat,0.098263617,Health and Hygiene,241.8196,OUT017,2007,,Tier 2,Supermarket Type1 +NCZ41,19.85,Low Fat,0.064421237,Health and Hygiene,125.4704,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK38,,Low Fat,0.0,Canned,148.3734,OUT019,1985,Small,Tier 1,Grocery Store +FDU52,7.56,Low Fat,0.063717792,Frozen Foods,155.163,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC40,16.0,Regular,0.065063889,Dairy,76.2986,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCR30,20.6,Low Fat,0.071394538,Household,74.4696,OUT017,2007,,Tier 2,Supermarket Type1 +NCN18,8.895,Low Fat,0.125420107,Household,111.7544,OUT017,2007,,Tier 2,Supermarket Type1 +FDB50,13.0,Low Fat,0.153589518,Canned,78.4986,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG04,13.1,low fat,0.006057667,Frozen Foods,188.0898,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR26,20.7,Low Fat,0.042828678,Dairy,177.3028,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT17,10.8,Low Fat,0.042036392,Health and Hygiene,188.4214,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX35,,Regular,0.079523572,Breads,226.9036,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS12,9.1,Low Fat,0.174118549,Baking Goods,127.4362,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCZ29,,Low Fat,0.071025838,Health and Hygiene,125.8362,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB38,19.5,Regular,0.045772769,Canned,161.392,OUT010,1998,,Tier 3,Grocery Store +FDP12,9.8,Regular,0.045229136,Baking Goods,37.1874,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP22,14.65,reg,0.099132174,Snack Foods,51.6666,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS26,20.35,Low Fat,0.08983368,Dairy,261.0594,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR52,12.65,Regular,0.076044589,Frozen Foods,191.9846,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRJ13,12.65,Low Fat,0.062890304,Soft Drinks,161.2578,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU48,,Low Fat,0.055090377,Baking Goods,130.7284,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE29,8.905,Low Fat,0.14310206,Frozen Foods,60.5878,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT29,12.6,Low Fat,0.0642104,Health and Hygiene,121.7414,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK37,5.0,Low Fat,0.044183931,Soft Drinks,188.653,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK55,18.5,Low Fat,0.025761698,Meat,87.6172,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR07,21.35,Low Fat,0.077743909,Fruits and Vegetables,96.1094,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO21,,Regular,0.009715743,Snack Foods,224.7404,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK46,9.6,Low Fat,0.051547413,Snack Foods,260.662,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB12,11.15,reg,0.105521226,Baking Goods,104.5648,OUT045,2002,,Tier 2,Supermarket Type1 +FDT31,,low fat,0.012388013,Fruits and Vegetables,188.8872,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ33,8.895,Regular,0.088501299,Snack Foods,124.373,OUT045,2002,,Tier 2,Supermarket Type1 +FDC26,,Low Fat,0.125771078,Canned,109.7886,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ02,12.6,Low Fat,0.007471585,Household,188.1556,OUT045,2002,,Tier 2,Supermarket Type1 +FDP08,20.5,Regular,0.188151371,Fruits and Vegetables,193.4478,OUT010,1998,,Tier 3,Grocery Store +FDB11,,Low Fat,0.06055337,Starchy Foods,225.9404,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV55,17.75,Low Fat,0.055027599,Fruits and Vegetables,146.2444,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW20,20.75,Low Fat,0.024186975,Fruits and Vegetables,121.573,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCJ18,,Low Fat,0.28704117,Household,120.5124,OUT019,1985,Small,Tier 1,Grocery Store +FDC41,15.6,Low Fat,0.1173895,Frozen Foods,75.567,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE14,,Regular,0.031292877,Canned,101.37,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG35,21.2,Regular,0.00703512,Starchy Foods,175.5738,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF45,18.2,Regular,0.012202405,Fruits and Vegetables,57.3904,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS19,,Regular,0.063896351,Fruits and Vegetables,77.5012,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS58,,Regular,0.036779867,Snack Foods,159.1578,OUT019,1985,Small,Tier 1,Grocery Store +FDA26,7.855,Regular,0.074338562,Dairy,220.4482,OUT017,2007,,Tier 2,Supermarket Type1 +FDM32,20.5,Low Fat,0.020637068,Fruits and Vegetables,87.883,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL45,15.6,Low Fat,0.037687837,Snack Foods,126.4704,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ55,6.055,Low Fat,0.025448206,Fruits and Vegetables,159.692,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY37,17.0,Regular,0.026610182,Canned,141.547,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO46,9.6,Regular,0.014212498,Snack Foods,190.8872,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ60,6.195,Regular,0.109374441,Baking Goods,119.6098,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA19,7.52,Low Fat,0.055352065,Fruits and Vegetables,130.1994,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL15,17.85,Low Fat,0.046634759,Meat,154.2682,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM10,18.25,Low Fat,0.076281071,Snack Foods,213.0218,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCL05,19.6,Low Fat,0.048168592,Health and Hygiene,42.677,OUT017,2007,,Tier 2,Supermarket Type1 +DRK49,14.15,Low Fat,0.060162413,Soft Drinks,42.0138,OUT010,1998,,Tier 3,Grocery Store +NCE18,,Low Fat,0.021321588,Household,251.375,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG40,13.65,Low Fat,0.039886263,Frozen Foods,34.3558,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRI59,9.5,Low Fat,0.040917483,Hard Drinks,222.0088,OUT045,2002,,Tier 2,Supermarket Type1 +FDK28,5.695,LF,0.065577504,Frozen Foods,256.2646,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCD06,,Low Fat,0.173905741,Household,46.206,OUT019,1985,Small,Tier 1,Grocery Store +FDO11,,Regular,0.052989927,Breads,250.3092,OUT019,1985,Small,Tier 1,Grocery Store +FDK27,11.0,Low Fat,0.008946536,Meat,119.4756,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT43,,Low Fat,0.020448446,Fruits and Vegetables,50.2324,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD38,16.75,Regular,0.008225098,Canned,102.1674,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA16,6.695,Low Fat,0.033994765,Frozen Foods,219.8456,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL14,,Regular,0.032003136,Canned,153.9972,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCM17,7.93,Low Fat,0.071246467,Health and Hygiene,43.8086,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD20,14.15,Low Fat,0.020756532,Fruits and Vegetables,123.9046,OUT045,2002,,Tier 2,Supermarket Type1 +FDA40,16.0,Regular,0.0,Frozen Foods,88.3856,OUT045,2002,,Tier 2,Supermarket Type1 +FDL43,10.1,Low Fat,0.027119268,Meat,77.767,OUT045,2002,,Tier 2,Supermarket Type1 +FDV15,10.3,Low Fat,0.146468894,Meat,102.6648,OUT045,2002,,Tier 2,Supermarket Type1 +FDE52,10.395,Regular,0.029886798,Dairy,89.5514,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL17,7.39,Low Fat,0.113449342,Health and Hygiene,143.7812,OUT010,1998,,Tier 3,Grocery Store +NCJ31,19.2,Low Fat,0.183024199,Others,239.3196,OUT045,2002,,Tier 2,Supermarket Type1 +FDR60,14.3,Low Fat,0.130679603,Baking Goods,78.4328,OUT045,2002,,Tier 2,Supermarket Type1 +NCA18,10.1,Low Fat,0.05606697,Household,115.6492,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS21,,Regular,0.020775058,Snack Foods,63.2194,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW09,13.65,Regular,0.025915914,Snack Foods,78.3302,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL26,18.0,Low Fat,0.0,Canned,154.3972,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS47,16.75,Low Fat,0.129410755,Breads,89.0856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC39,7.405,Low Fat,0.159195426,Dairy,206.4296,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT51,11.65,Regular,0.010916726,Meat,111.1544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK40,7.035,Low Fat,0.021845267,Frozen Foods,263.091,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCG19,20.25,Low Fat,0.14823358,Household,235.7616,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ07,15.1,Regular,0.093891315,Fruits and Vegetables,62.0194,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF08,,Regular,0.064891788,Fruits and Vegetables,88.8856,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO04,16.6,Low Fat,0.026515122,Frozen Foods,55.2614,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK41,14.3,Low Fat,0.128061273,Frozen Foods,83.3224,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP15,15.2,Low Fat,0.084073075,Meat,255.533,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD43,8.85,Low Fat,0.016085216,Household,104.6964,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP18,12.15,Low Fat,0.028574451,Household,148.8708,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ51,11.3,Regular,0.0,Meat,93.3094,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH13,8.575,Low Fat,0.02388144,Soft Drinks,108.428,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF38,11.8,Regular,0.026411459,Canned,40.1138,OUT045,2002,,Tier 2,Supermarket Type1 +NCI43,19.85,Low Fat,0.026021371,Household,49.2376,OUT045,2002,,Tier 2,Supermarket Type1 +FDM38,,reg,0.092322059,Canned,54.3982,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS03,7.825,Low Fat,0.079562345,Meat,64.7826,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ47,18.25,Low Fat,0.044500601,Hard Drinks,171.408,OUT017,2007,,Tier 2,Supermarket Type1 +FDT50,6.75,Regular,0.181169873,Dairy,97.3752,OUT010,1998,,Tier 3,Grocery Store +FDV02,16.75,Low Fat,0.060545628,Dairy,172.5106,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCG18,15.3,low fat,0.023107874,Household,103.8332,OUT017,2007,,Tier 2,Supermarket Type1 +FDW52,14.0,Regular,0.03752254,Frozen Foods,164.6526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS40,15.35,Low Fat,0.014016743,Frozen Foods,36.019,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN31,11.5,low fat,0.073293783,Fruits and Vegetables,191.053,OUT017,2007,,Tier 2,Supermarket Type1 +FDA37,7.81,Regular,0.055338756,Canned,123.1046,OUT045,2002,,Tier 2,Supermarket Type1 +FDA15,9.3,Low Fat,0.01602239,Dairy,249.9092,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL39,16.1,Regular,0.063331355,Dairy,181.1318,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ53,10.5,Low Fat,0.071402425,Frozen Foods,122.0098,OUT045,2002,,Tier 2,Supermarket Type1 +FDX22,6.785,Regular,0.022955693,Snack Foods,210.5928,OUT013,1987,High,Tier 3,Supermarket Type1 +NCZ42,10.5,LF,0.011310821,Household,238.7248,OUT045,2002,,Tier 2,Supermarket Type1 +FDD56,,Regular,0.10327572,Fruits and Vegetables,176.2054,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD40,20.25,Regular,0.014877034,Dairy,193.5162,OUT017,2007,,Tier 2,Supermarket Type1 +FDS50,17.0,Low Fat,0.055387247,Dairy,220.6114,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN14,19.1,Low Fat,0.0,Others,184.4608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT15,12.15,Regular,0.042646003,Meat,183.295,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS18,,Low Fat,0.04200671,Household,108.0938,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO26,7.235,Low Fat,0.128640565,Household,114.6492,OUT010,1998,,Tier 3,Grocery Store +FDF58,13.3,Low Fat,0.009620184,Snack Foods,61.451,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCB19,6.525,Low Fat,0.090220566,Household,86.4882,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH26,19.25,Regular,0.034896013,Canned,141.0496,OUT017,2007,,Tier 2,Supermarket Type1 +DRB24,,Low Fat,0.020477579,Soft Drinks,152.8656,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA49,19.7,Low Fat,0.065186228,Canned,86.3198,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB32,20.6,Low Fat,0.023500502,Fruits and Vegetables,95.5778,OUT045,2002,,Tier 2,Supermarket Type1 +FDI36,12.5,Regular,0.0,Baking Goods,196.7426,OUT017,2007,,Tier 2,Supermarket Type1 +NCA17,20.6,Low Fat,0.076020756,Health and Hygiene,149.3392,OUT010,1998,,Tier 3,Grocery Store +FDH22,6.405,Low Fat,0.13618752,Snack Foods,125.1678,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM26,20.5,Low Fat,0.0,Others,153.334,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT15,,Regular,0.042474835,Meat,183.295,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB16,8.21,Low Fat,0.045108792,Dairy,87.0198,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP54,,Low Fat,0.034979457,Household,123.473,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ36,14.5,Regular,0.128153336,Baking Goods,102.3332,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO28,5.765,Low Fat,0.072444983,Frozen Foods,119.7098,OUT045,2002,,Tier 2,Supermarket Type1 +FDU09,7.71,Regular,0.066541719,Snack Foods,54.2956,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF29,15.1,reg,0.020046943,Frozen Foods,128.831,OUT017,2007,,Tier 2,Supermarket Type1 +FDY08,9.395,Regular,0.170932857,Fruits and Vegetables,140.5838,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ59,11.65,Low Fat,0.019451167,Hard Drinks,37.0164,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT23,,Regular,0.074369587,Breads,79.3986,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU15,13.65,Regular,0.026710454,Meat,37.8532,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT47,5.26,Regular,0.024488439,Breads,96.8068,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI53,,Regular,0.0,Frozen Foods,162.8236,OUT019,1985,Small,Tier 1,Grocery Store +FDR59,14.5,Regular,0.064123704,Breads,262.3594,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD53,16.2,Low Fat,0.044214135,Frozen Foods,40.4454,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY51,12.5,Low Fat,0.081593757,Meat,219.8798,OUT017,2007,,Tier 2,Supermarket Type1 +FDT04,17.25,Low Fat,0.107208159,Frozen Foods,37.9822,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU51,20.2,Regular,0.096663729,Meat,176.9028,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG14,9.0,Regular,0.050491164,Canned,151.7024,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCU06,17.6,Low Fat,0.074557961,Household,231.001,OUT045,2002,,Tier 2,Supermarket Type1 +DRG25,10.5,Low Fat,0.019049691,Soft Drinks,186.024,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH49,19.7,Low Fat,0.024650932,Soft Drinks,83.6592,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN15,17.5,LF,0.016730894,Meat,139.018,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL43,10.1,Low Fat,0.02717463,Meat,76.267,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCT18,14.6,Low Fat,0.059497511,Household,182.4976,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCB31,6.235,Low Fat,0.118575601,Household,260.991,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK57,10.195,Low Fat,0.080277707,Snack Foods,119.144,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY04,,Regular,0.074370772,Frozen Foods,162.921,OUT019,1985,Small,Tier 1,Grocery Store +NCP54,15.35,Low Fat,0.03514967,Household,121.673,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF41,12.15,Low Fat,0.131070648,Frozen Foods,244.346,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM01,7.895,Regular,0.0,Breakfast,102.4332,OUT045,2002,,Tier 2,Supermarket Type1 +FDW03,5.63,Regular,0.024591047,Meat,104.3306,OUT045,2002,,Tier 2,Supermarket Type1 +FDF28,15.7,Regular,0.037941512,Frozen Foods,122.8046,OUT045,2002,,Tier 2,Supermarket Type1 +FDY37,17.0,Regular,0.026719159,Canned,142.047,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ03,15.0,Regular,0.078455536,Meat,237.3248,OUT017,2007,,Tier 2,Supermarket Type1 +FDP51,,Regular,0.08486204,Meat,120.0124,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ40,13.6,Regular,0.049869757,Frozen Foods,110.9912,OUT017,2007,,Tier 2,Supermarket Type1 +FDC32,18.35,Low Fat,0.099263089,Fruits and Vegetables,93.4462,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRI49,,Low Fat,0.182618653,Soft Drinks,81.6276,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW54,7.5,Low Fat,0.096958614,Household,55.3588,OUT017,2007,,Tier 2,Supermarket Type1 +FDF09,6.215,Low Fat,0.012217624,Fruits and Vegetables,37.7848,OUT017,2007,,Tier 2,Supermarket Type1 +FDP45,15.7,Regular,0.030749596,Snack Foods,250.6724,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ23,18.35,Low Fat,0.041838623,Hard Drinks,187.1872,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS59,14.8,Regular,0.044141726,Breads,111.157,OUT017,2007,,Tier 2,Supermarket Type1 +FDY08,9.395,Regular,0.171075221,Fruits and Vegetables,138.9838,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX16,17.85,low fat,0.065912362,Frozen Foods,147.805,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY16,18.35,Regular,0.092602446,Frozen Foods,184.7266,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK32,16.25,Regular,0.0,Fruits and Vegetables,152.8682,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ22,16.75,LF,0.029714904,Snack Foods,39.3822,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC31,8.02,Low Fat,0.019951406,Household,155.9972,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG58,10.695,Regular,0.086916126,Snack Foods,153.7972,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF48,5.73,Low Fat,0.051758358,Soft Drinks,189.0898,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH36,16.2,Low Fat,0.033431957,Soft Drinks,73.3696,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCR30,20.6,Low Fat,0.070979549,Household,75.5696,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB03,,Regular,0.274592283,Dairy,242.2538,OUT019,1985,Small,Tier 1,Grocery Store +FDZ28,,Regular,0.051243144,Frozen Foods,126.1678,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR35,12.5,Low Fat,0.020814797,Breads,198.4742,OUT017,2007,,Tier 2,Supermarket Type1 +DRD15,,LF,0.056520886,Dairy,232.6642,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ33,,Regular,0.154640734,Snack Foods,124.273,OUT019,1985,Small,Tier 1,Grocery Store +FDA56,9.21,LF,0.014670454,Fruits and Vegetables,120.2414,OUT010,1998,,Tier 3,Grocery Store +FDP56,8.185,Low Fat,0.046484138,Fruits and Vegetables,47.9692,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT30,9.1,Low Fat,0.08029289,Household,48.1718,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK15,10.8,Low Fat,0.098970494,Meat,100.3042,OUT017,2007,,Tier 2,Supermarket Type1 +FDH44,19.1,Regular,0.0,Fruits and Vegetables,146.9418,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV01,19.2,Regular,0.084879879,Canned,154.6314,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG03,14.5,Low Fat,0.062337196,Dairy,152.4998,OUT017,2007,,Tier 2,Supermarket Type1 +FDG50,,Low Fat,0.015197838,Canned,89.7146,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR16,5.845,Regular,0.175778605,Frozen Foods,214.9218,OUT010,1998,,Tier 3,Grocery Store +FDZ60,20.5,Low Fat,0.119361811,Baking Goods,107.8596,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRG03,14.5,Low Fat,0.062112285,Dairy,154.2998,OUT045,2002,,Tier 2,Supermarket Type1 +FDS56,5.785,Regular,0.038914743,Fruits and Vegetables,264.0252,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU33,7.63,Regular,0.134982959,Snack Foods,45.2402,OUT045,2002,,Tier 2,Supermarket Type1 +DRD27,18.75,Low Fat,0.023835413,Dairy,99.1042,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW22,9.695,Regular,0.0,Snack Foods,223.1114,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRA24,19.35,Regular,0.040009212,Soft Drinks,163.2868,OUT045,2002,,Tier 2,Supermarket Type1 +FDF38,11.8,Regular,0.026398984,Canned,38.9138,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX48,17.75,Regular,0.037856364,Baking Goods,154.3656,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS58,9.285,Regular,0.021092185,Snack Foods,160.8578,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC32,18.35,Low Fat,0.099109001,Fruits and Vegetables,92.9462,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ29,12.0,Low Fat,0.104441517,Health and Hygiene,261.7278,OUT045,2002,,Tier 2,Supermarket Type1 +DRK39,7.02,Low Fat,0.05006853,Dairy,84.025,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCS38,8.6,Low Fat,0.090701591,Household,114.2176,OUT017,2007,,Tier 2,Supermarket Type1 +DRO47,10.195,Low Fat,0.112131275,Hard Drinks,112.086,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG27,,Low Fat,0.104601689,Dairy,42.3138,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC57,,Regular,0.054330154,Fruits and Vegetables,191.482,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS55,7.02,Low Fat,0.081164178,Fruits and Vegetables,146.7734,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ06,20.1,Low Fat,0.034793779,Household,119.8782,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO01,,Regular,0.036275691,Breakfast,129.5994,OUT019,1985,Small,Tier 1,Grocery Store +NCM55,15.6,Low Fat,0.066861456,Others,185.7924,OUT045,2002,,Tier 2,Supermarket Type1 +FDC52,11.15,Regular,0.008292773,Dairy,152.2708,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ15,20.35,Regular,0.151379828,Meat,80.1276,OUT045,2002,,Tier 2,Supermarket Type1 +NCT30,,Low Fat,0.079904068,Household,47.5718,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCR42,,Low Fat,0.038295533,Household,32.39,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD28,10.695,Low Fat,0.0,Frozen Foods,57.8904,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ34,10.85,Low Fat,0.162494861,Snack Foods,104.5622,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ12,,Low Fat,0.102480138,Baking Goods,142.747,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE13,,Low Fat,0.048508058,Soft Drinks,86.1198,OUT019,1985,Small,Tier 1,Grocery Store +NCN07,,Low Fat,0.059432784,Others,133.0284,OUT019,1985,Small,Tier 1,Grocery Store +FDM28,15.7,Low Fat,0.045195307,Frozen Foods,180.766,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI10,8.51,Regular,0.078847814,Snack Foods,171.5422,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ25,8.63,Regular,0.028253161,Canned,170.4422,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA38,5.44,Low Fat,0.042648161,Dairy,241.5538,OUT010,1998,,Tier 3,Grocery Store +DRI13,15.35,Low Fat,0.020358565,Soft Drinks,216.5508,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY20,,Regular,0.081356869,Fruits and Vegetables,90.2488,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ53,9.6,Low Fat,0.024472537,Health and Hygiene,187.2214,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM31,6.095,Low Fat,0.081129049,Others,143.8154,OUT013,1987,High,Tier 3,Supermarket Type1 +DRB01,7.39,Low Fat,0.082704564,Soft Drinks,189.053,OUT017,2007,,Tier 2,Supermarket Type1 +DRF37,17.25,Low Fat,0.084332638,Soft Drinks,262.091,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCF42,17.35,Low Fat,0.167643297,Household,177.1712,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF16,7.3,LF,0.08648324,Frozen Foods,148.9076,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB41,19.0,Regular,0.097232147,Frozen Foods,47.8718,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR34,17.0,Regular,0.015952023,Snack Foods,227.3352,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR15,9.3,Regular,0.033574204,Meat,155.7314,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV42,,Low Fat,0.05501583,Household,111.8228,OUT019,1985,Small,Tier 1,Grocery Store +FDW51,6.155,Regular,0.094641972,Meat,212.056,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU36,6.15,Low Fat,0.046532678,Baking Goods,97.2384,OUT017,2007,,Tier 2,Supermarket Type1 +FDX60,14.35,Low Fat,0.080719435,Baking Goods,80.996,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY03,17.6,Regular,0.076107437,Meat,113.0202,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW55,12.6,Regular,0.022014451,Fruits and Vegetables,248.2092,OUT045,2002,,Tier 2,Supermarket Type1 +FDT01,13.65,reg,0.308258994,Canned,213.0902,OUT010,1998,,Tier 3,Grocery Store +FDG58,10.695,Regular,0.086708987,Snack Foods,154.6972,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK21,7.905,Low Fat,0.010068952,Snack Foods,249.4408,OUT017,2007,,Tier 2,Supermarket Type1 +NCS41,,Low Fat,0.093573569,Health and Hygiene,182.4608,OUT019,1985,Small,Tier 1,Grocery Store +FDS10,19.2,Low Fat,0.035256945,Snack Foods,181.7318,OUT045,2002,,Tier 2,Supermarket Type1 +NCT53,5.4,Low Fat,0.048116258,Health and Hygiene,164.9526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ28,12.3,Low Fat,0.021950037,Frozen Foods,190.7162,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX44,9.3,Low Fat,0.043053682,Fruits and Vegetables,87.6172,OUT045,2002,,Tier 2,Supermarket Type1 +FDT20,10.5,Low Fat,0.041564073,Fruits and Vegetables,38.4164,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO44,12.6,low fat,0.087947879,Fruits and Vegetables,109.9228,OUT017,2007,,Tier 2,Supermarket Type1 +NCX17,21.25,Low Fat,0.113780055,Health and Hygiene,234.93,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY01,11.8,Regular,0.171246685,Canned,116.5834,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ12,,Regular,0.038852056,Baking Goods,209.5296,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRK35,8.365,low fat,0.072139167,Hard Drinks,36.7506,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD47,,Regular,0.249342884,Starchy Foods,168.5448,OUT019,1985,Small,Tier 1,Grocery Store +NCM53,18.75,Low Fat,0.052031075,Health and Hygiene,106.228,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO45,13.15,Regular,0.037921193,Snack Foods,87.3856,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM42,6.13,LF,0.047404371,Household,109.3912,OUT010,1998,,Tier 3,Grocery Store +FDE04,19.75,Regular,0.0,Frozen Foods,179.666,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCI30,,Low Fat,0.058650124,Household,247.846,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ19,6.425,Low Fat,0.093377128,Fruits and Vegetables,174.6712,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW57,8.31,Regular,0.115581112,Snack Foods,177.5028,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA25,16.5,Regular,0.0,Canned,102.299,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT22,10.395,LF,0.112097216,Snack Foods,59.022,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP51,13.85,Regular,0.085204025,Meat,118.9124,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD48,,Low Fat,0.030012644,Baking Goods,116.1176,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY39,5.305,Regular,0.0470198,Meat,182.7608,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO48,15.0,Regular,0.04492594,Baking Goods,221.9456,OUT010,1998,,Tier 3,Grocery Store +FDD23,,reg,0.048449768,Starchy Foods,185.5898,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRN35,,Low Fat,0.069907412,Hard Drinks,36.9532,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT01,13.65,Regular,0.184132888,Canned,214.0902,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC20,10.65,LF,0.040123315,Fruits and Vegetables,54.6272,OUT010,1998,,Tier 3,Grocery Store +DRJ35,10.1,low fat,0.046575743,Hard Drinks,62.1878,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB32,20.6,Low Fat,0.023452939,Fruits and Vegetables,93.6778,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL24,10.3,Regular,0.024896589,Baking Goods,173.2422,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCV42,6.26,LF,0.031416038,Household,112.5228,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ46,7.485,Low Fat,0.06912372,Snack Foods,109.2228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC15,18.1,Low Fat,0.177820954,Dairy,155.7288,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD08,,LF,0.061900923,Fruits and Vegetables,37.8506,OUT019,1985,Small,Tier 1,Grocery Store +FDY50,5.8,Low Fat,0.0,Dairy,88.8172,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD36,13.3,Low Fat,0.021255857,Baking Goods,119.1124,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG57,,Low Fat,0.071948252,Fruits and Vegetables,48.8034,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL21,15.85,Regular,0.007175526,Snack Foods,40.848,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN16,,Regular,0.06239666,Frozen Foods,101.999,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ09,,LF,0.058112049,Snack Foods,45.5744,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS01,11.6,Low Fat,0.02970149,Canned,179.3686,OUT010,1998,,Tier 3,Grocery Store +FDV33,9.6,Regular,0.027498277,Snack Foods,260.2304,OUT017,2007,,Tier 2,Supermarket Type1 +DRE12,4.59,Low Fat,0.071180921,Soft Drinks,114.186,OUT017,2007,,Tier 2,Supermarket Type1 +FDR07,21.35,Low Fat,0.077679213,Fruits and Vegetables,97.2094,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP48,7.52,Regular,0.073685833,Baking Goods,183.895,OUT010,1998,,Tier 3,Grocery Store +NCB55,15.7,Low Fat,0.160632642,Household,57.8562,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ08,15.7,Regular,0.018914599,Fruits and Vegetables,59.6536,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR34,17.0,Regular,0.01596229,Snack Foods,230.8352,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO33,14.75,Low Fat,0.089322461,Snack Foods,112.2518,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP13,8.1,Regular,0.134595967,Canned,38.448,OUT045,2002,,Tier 2,Supermarket Type1 +FDX12,18.2,Regular,0.0,Baking Goods,243.0196,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT06,17.1,Low Fat,0.03879778,Household,166.3842,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR16,,Regular,0.0,Frozen Foods,213.7218,OUT019,1985,Small,Tier 1,Grocery Store +FDE36,5.26,reg,0.041772386,Baking Goods,165.0868,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ36,6.035,Regular,0.065886059,Baking Goods,184.924,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV13,17.35,Regular,0.027666863,Canned,87.9856,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ17,12.15,Low Fat,0.079416624,Health and Hygiene,36.2506,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU56,16.85,Low Fat,0.044504129,Fruits and Vegetables,183.5266,OUT045,2002,,Tier 2,Supermarket Type1 +FDM09,11.15,Regular,0.085915295,Snack Foods,170.779,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV02,16.75,Low Fat,0.060888099,Dairy,171.9106,OUT017,2007,,Tier 2,Supermarket Type1 +FDS34,19.35,reg,0.07707176,Snack Foods,112.8518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA11,7.75,Low Fat,0.043306047,Baking Goods,95.3436,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP09,19.75,Low Fat,0.034081551,Snack Foods,211.7902,OUT017,2007,,Tier 2,Supermarket Type1 +FDB29,,Regular,0.05215787,Frozen Foods,114.4176,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT19,7.59,Regular,0.0,Fruits and Vegetables,172.808,OUT017,2007,,Tier 2,Supermarket Type1 +DRH15,8.775,Low Fat,0.110532975,Dairy,44.2428,OUT017,2007,,Tier 2,Supermarket Type1 +FDY38,13.6,Regular,0.119176431,Dairy,233.93,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF14,,Low Fat,0.027038245,Canned,151.834,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN48,13.35,Low Fat,0.108714206,Baking Goods,93.2804,OUT010,1998,,Tier 3,Grocery Store +FDQ12,12.65,Low Fat,0.03538128,Baking Goods,230.701,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ43,6.635,Low Fat,0.027124299,Household,172.9396,OUT045,2002,,Tier 2,Supermarket Type1 +FDE17,,Regular,0.095344543,Frozen Foods,152.3366,OUT019,1985,Small,Tier 1,Grocery Store +FDB05,5.155,Low Fat,0.08318261,Frozen Foods,248.8776,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH10,21.0,Low Fat,0.049405001,Snack Foods,192.8478,OUT045,2002,,Tier 2,Supermarket Type1 +NCR06,12.5,Low Fat,0.006803416,Household,40.8112,OUT017,2007,,Tier 2,Supermarket Type1 +FDU32,8.785,Low Fat,0.026073405,Fruits and Vegetables,121.4414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD56,15.2,Regular,0.103939618,Fruits and Vegetables,173.6054,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO36,19.7,Low Fat,0.078231229,Baking Goods,181.466,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH16,10.5,Low Fat,0.087966875,Frozen Foods,91.583,OUT010,1998,,Tier 3,Grocery Store +FDX10,6.385,Regular,0.124214471,Snack Foods,35.5874,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ37,8.1,Regular,0.019880322,Canned,88.0198,OUT017,2007,,Tier 2,Supermarket Type1 +FDU31,10.5,Regular,0.041829904,Fruits and Vegetables,217.8508,OUT010,1998,,Tier 3,Grocery Store +DRC49,8.67,LF,0.065538317,Soft Drinks,141.8128,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL15,17.85,Low Fat,0.046729336,Meat,152.5682,OUT045,2002,,Tier 2,Supermarket Type1 +FDN32,,Low Fat,0.0,Fruits and Vegetables,186.0266,OUT019,1985,Small,Tier 1,Grocery Store +DRH59,,Low Fat,0.058150483,Hard Drinks,74.138,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU29,7.685,Low Fat,0.025517058,Health and Hygiene,147.476,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR37,,Regular,0.0,Breakfast,183.7292,OUT019,1985,Small,Tier 1,Grocery Store +FDS14,7.285,Low Fat,0.050167414,Dairy,156.9288,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU02,,Low Fat,0.102015088,Dairy,227.2352,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ08,11.1,Low Fat,0.110651177,Fruits and Vegetables,192.7846,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCZ06,19.6,Low Fat,0.094352624,Household,253.8698,OUT045,2002,,Tier 2,Supermarket Type1 +FDO31,6.76,Regular,0.029027743,Fruits and Vegetables,81.396,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH31,12.0,Regular,0.020494302,Meat,101.2042,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS58,9.285,Regular,0.021125435,Snack Foods,159.7578,OUT017,2007,,Tier 2,Supermarket Type1 +NCA53,,Low Fat,0.009830622,Health and Hygiene,48.9034,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF50,4.905,Low Fat,0.0,Canned,197.7768,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCW42,18.2,Low Fat,0.058559885,Household,222.6456,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCQ17,10.3,Low Fat,0.117169698,Health and Hygiene,156.163,OUT045,2002,,Tier 2,Supermarket Type1 +FDK51,19.85,Low Fat,0.005256469,Dairy,264.0884,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCW41,18.0,Low Fat,0.025860761,Health and Hygiene,157.1604,OUT010,1998,,Tier 3,Grocery Store +NCR29,7.565,Low Fat,0.054949947,Health and Hygiene,54.993,OUT017,2007,,Tier 2,Supermarket Type1 +FDB08,,Low Fat,0.054457963,Fruits and Vegetables,158.8578,OUT019,1985,Small,Tier 1,Grocery Store +FDA40,,Regular,0.098790484,Frozen Foods,85.8856,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL14,8.115,Regular,0.032289868,Canned,157.6972,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB47,8.8,Low Fat,0.071429389,Snack Foods,207.4612,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO03,10.395,Regular,0.036876003,Meat,228.3352,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRK13,,Low Fat,0.201643565,Soft Drinks,197.7084,OUT019,1985,Small,Tier 1,Grocery Store +FDX13,7.725,Low Fat,0.079978878,Canned,248.3092,OUT010,1998,,Tier 3,Grocery Store +FDF52,9.3,Low Fat,0.066783292,Frozen Foods,183.0292,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT11,5.94,Regular,0.029347924,Breads,188.4556,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB08,6.055,Low Fat,0.0,Fruits and Vegetables,160.1578,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ28,14.0,Regular,0.0,Frozen Foods,155.6656,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD29,12.15,Low Fat,0.018447852,Frozen Foods,252.6698,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ29,,Low Fat,0.103725396,Health and Hygiene,261.7278,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO02,11.15,Low Fat,0.073307104,Others,65.2142,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR56,15.5,Regular,0.168661356,Fruits and Vegetables,195.8768,OUT010,1998,,Tier 3,Grocery Store +NCM54,17.7,Low Fat,0.051018257,Household,125.2678,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP51,13.85,Regular,0.085258864,Meat,116.8124,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT38,18.7,Low Fat,0.057489563,Dairy,84.7566,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ20,16.1,Low Fat,0.034446714,Fruits and Vegetables,253.3356,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ53,10.5,Low Fat,0.071198613,Frozen Foods,120.6098,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX13,7.725,Low Fat,0.047857249,Canned,249.2092,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP58,11.1,Low Fat,0.135116764,Snack Foods,220.4482,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK31,,Low Fat,0.047357161,Others,51.9666,OUT019,1985,Small,Tier 1,Grocery Store +FDA35,14.85,Regular,0.054056872,Baking Goods,123.2072,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV37,13.0,Regular,0.083854075,Canned,198.7426,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO07,,Low Fat,0.009728926,Others,213.656,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA20,6.78,Low Fat,0.066756194,Fruits and Vegetables,187.324,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ59,6.63,Regular,0.104001913,Baking Goods,168.45,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY17,18.2,Low Fat,0.164018678,Health and Hygiene,44.9086,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ28,14.0,Regular,0.060415636,Frozen Foods,153.1656,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV35,19.5,Low Fat,0.128931187,Breads,154.6314,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ36,7.855,Regular,0.161413005,Baking Goods,35.2848,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD34,7.945,Low Fat,0.01594096,Snack Foods,163.121,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK51,19.85,Low Fat,0.0,Dairy,265.0884,OUT045,2002,,Tier 2,Supermarket Type1 +FDV31,9.8,LF,0.106697143,Fruits and Vegetables,175.637,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR04,7.075,Low Fat,0.022562708,Frozen Foods,95.9068,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR14,11.65,Low Fat,0.174319632,Dairy,55.5298,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRC36,13.0,Regular,0.075295456,Soft Drinks,174.4054,OUT010,1998,,Tier 3,Grocery Store +FDE39,,Low Fat,0.063266852,Dairy,120.6782,OUT019,1985,Small,Tier 1,Grocery Store +FDP57,17.5,Low Fat,0.052525654,Snack Foods,104.399,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE57,9.6,Low Fat,0.036285125,Fruits and Vegetables,141.2154,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN18,8.895,Low Fat,0.12471467,Household,111.4544,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ05,11.395,Low Fat,0.021694101,Health and Hygiene,150.0708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW47,15.0,LF,0.046366458,Breads,119.9414,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV46,18.2,Low Fat,0.012605492,Snack Foods,137.818,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP29,8.42,Low Fat,0.112498699,Health and Hygiene,62.8168,OUT045,2002,,Tier 2,Supermarket Type1 +FDE09,8.775,Low Fat,0.021691386,Fruits and Vegetables,110.5228,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCU06,,Low Fat,0.074046742,Household,229.801,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT19,7.59,Regular,0.242768664,Fruits and Vegetables,173.708,OUT010,1998,,Tier 3,Grocery Store +DRF15,18.35,Low Fat,0.033401862,Dairy,152.234,OUT017,2007,,Tier 2,Supermarket Type1 +DRI51,17.25,Low Fat,0.042206477,Dairy,170.2764,OUT013,1987,High,Tier 3,Supermarket Type1 +NCX54,9.195,Low Fat,0.048019877,Household,104.2622,OUT013,1987,High,Tier 3,Supermarket Type1 +DRE01,10.1,Low Fat,0.167016095,Soft Drinks,241.5512,OUT013,1987,High,Tier 3,Supermarket Type1 +NCB07,19.2,Low Fat,0.077664737,Household,195.511,OUT045,2002,,Tier 2,Supermarket Type1 +FDU50,5.75,Regular,0.075155997,Dairy,114.1176,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG40,13.65,Low Fat,0.039816816,Frozen Foods,34.1558,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW10,21.2,Low Fat,0.070964186,Snack Foods,175.637,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX51,9.5,Regular,0.022040367,Meat,194.1452,OUT013,1987,High,Tier 3,Supermarket Type1 +NCP17,19.35,Low Fat,0.027770577,Health and Hygiene,63.1168,OUT045,2002,,Tier 2,Supermarket Type1 +FDP21,7.42,reg,0.025735975,Snack Foods,187.7872,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL04,19.0,Low Fat,0.112150406,Frozen Foods,105.2622,OUT045,2002,,Tier 2,Supermarket Type1 +FDV23,11.0,Low Fat,0.105748691,Breads,123.1046,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF24,15.5,Regular,0.025370468,Baking Goods,81.1934,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH56,,Regular,0.063508168,Fruits and Vegetables,113.8492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB51,6.92,Low Fat,0.038513862,Dairy,61.5852,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI58,,Regular,0.070362085,Snack Foods,95.112,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR20,20.0,Regular,0.028100349,Fruits and Vegetables,46.9744,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC51,10.895,Regular,0.009661057,Dairy,122.973,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB16,,Low Fat,0.044708228,Dairy,86.2198,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE40,15.6,Regular,0.099297902,Dairy,60.5194,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM17,7.93,Low Fat,0.071122419,Health and Hygiene,43.7086,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU56,16.85,Low Fat,0.0,Fruits and Vegetables,185.3266,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS32,,Regular,0.051920175,Fruits and Vegetables,140.9838,OUT019,1985,Small,Tier 1,Grocery Store +FDX02,16.0,Low Fat,0.057148803,Dairy,224.3404,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT39,,reg,0.009820129,Meat,152.7366,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE35,7.06,Regular,0.044148717,Starchy Foods,56.9904,OUT017,2007,,Tier 2,Supermarket Type1 +NCI42,,Low Fat,0.018148732,Household,210.1954,OUT019,1985,Small,Tier 1,Grocery Store +DRL23,18.35,Low Fat,0.015304311,Hard Drinks,105.7938,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA10,20.35,Low Fat,0.141816013,Snack Foods,122.2072,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA11,7.75,Low Fat,0.04320284,Baking Goods,95.6436,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM06,7.475,low fat,0.075727897,Household,154.7656,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT05,10.895,Low Fat,0.020947887,Health and Hygiene,257.5672,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCQ02,12.6,Low Fat,0.012480591,Household,186.2556,OUT010,1998,,Tier 3,Grocery Store +NCY06,15.25,Low Fat,0.06127993,Household,129.6968,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY56,16.35,Regular,0.062399603,Fruits and Vegetables,224.7062,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL02,20.0,Regular,0.104063695,Canned,104.5622,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCI06,11.3,LF,0.047708667,Household,178.366,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ14,9.27,Low Fat,0.061912597,Dairy,150.105,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ12,12.65,Low Fat,0.035611045,Baking Goods,228.301,OUT017,2007,,Tier 2,Supermarket Type1 +FDP36,10.395,Regular,0.091172403,Baking Goods,48.6008,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK21,,Low Fat,0.009963834,Snack Foods,250.8408,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO40,17.1,Low Fat,0.032694281,Frozen Foods,147.8392,OUT045,2002,,Tier 2,Supermarket Type1 +NCK54,,low fat,0.0,Household,117.515,OUT019,1985,Small,Tier 1,Grocery Store +FDY09,15.6,Low Fat,0.025302804,Snack Foods,176.8054,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCW30,5.21,Low Fat,0.011027014,Household,260.6962,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCC55,,LF,0.0,Household,36.2848,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE58,18.5,Low Fat,0.052280828,Snack Foods,117.3124,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR39,20.35,Low Fat,0.083729547,Meat,184.4292,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU28,19.2,Regular,0.094064368,Frozen Foods,187.0214,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH08,7.51,Low Fat,0.017527666,Fruits and Vegetables,228.001,OUT017,2007,,Tier 2,Supermarket Type1 +FDG35,21.2,Regular,0.007055259,Starchy Foods,175.4738,OUT045,2002,,Tier 2,Supermarket Type1 +FDG22,17.6,Regular,0.041445492,Snack Foods,35.219,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC34,16.0,Regular,0.172726426,Snack Foods,156.7972,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP15,15.2,Low Fat,0.084284513,Meat,254.933,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK34,13.35,Low Fat,0.06448577,Snack Foods,239.4564,OUT010,1998,,Tier 3,Grocery Store +FDU45,15.6,Regular,0.035499428,Snack Foods,115.7518,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ04,,LF,0.084343183,Frozen Foods,39.7796,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX22,6.785,Regular,0.023068402,Snack Foods,209.7928,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB45,20.85,Low Fat,0.021450443,Fruits and Vegetables,103.6306,OUT017,2007,,Tier 2,Supermarket Type1 +NCH43,,Low Fat,0.070227182,Household,217.1192,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE60,9.395,Low Fat,0.159334462,Soft Drinks,224.372,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD17,,Low Fat,0.032468955,Frozen Foods,236.1906,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCM54,17.7,Low Fat,0.051227193,Household,127.2678,OUT017,2007,,Tier 2,Supermarket Type1 +NCH55,16.35,Low Fat,0.034643462,Household,127.402,OUT013,1987,High,Tier 3,Supermarket Type1 +NCT06,17.1,Low Fat,0.038956669,Household,165.1842,OUT017,2007,,Tier 2,Supermarket Type1 +FDA48,,Low Fat,0.114317778,Baking Goods,221.5114,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY58,,Low Fat,0.039725274,Snack Foods,228.2694,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO25,6.3,Low Fat,0.127707501,Canned,211.327,OUT045,2002,,Tier 2,Supermarket Type1 +FDN50,16.85,Regular,0.026573609,Canned,94.912,OUT045,2002,,Tier 2,Supermarket Type1 +FDH35,18.25,Low Fat,0.060237241,Starchy Foods,164.9526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK09,15.2,Low Fat,0.091949401,Snack Foods,227.4352,OUT045,2002,,Tier 2,Supermarket Type1 +FDO16,5.48,Low Fat,0.015095622,Frozen Foods,82.325,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW11,12.6,Low Fat,0.048881014,Breads,63.7194,OUT045,2002,,Tier 2,Supermarket Type1 +FDU47,,Regular,0.0,Breads,140.3838,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ42,20.35,Low Fat,0.065726925,Household,128.6678,OUT010,1998,,Tier 3,Grocery Store +FDK55,,Low Fat,0.025636945,Meat,89.1172,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN08,7.72,Regular,0.088502045,Fruits and Vegetables,116.2466,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT57,15.2,Low Fat,0.019073386,Snack Foods,237.7248,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ12,8.895,Regular,0.039200151,Baking Goods,207.5296,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL59,16.75,Low Fat,0.021344178,Hard Drinks,52.2298,OUT017,2007,,Tier 2,Supermarket Type1 +NCN53,5.175,Low Fat,0.030355463,Health and Hygiene,35.0874,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO51,6.785,Regular,0.07027007,Meat,43.9112,OUT010,1998,,Tier 3,Grocery Store +FDK56,9.695,Low Fat,0.130733334,Fruits and Vegetables,188.3898,OUT017,2007,,Tier 2,Supermarket Type1 +FDY12,9.8,Regular,0.140584452,Baking Goods,52.3008,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU15,13.65,Regular,0.026597059,Meat,36.3532,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ19,7.35,Regular,0.014365128,Fruits and Vegetables,242.8512,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRF15,18.35,Low Fat,0.033281349,Dairy,154.134,OUT045,2002,,Tier 2,Supermarket Type1 +DRE25,,Low Fat,0.128309411,Soft Drinks,92.112,OUT019,1985,Small,Tier 1,Grocery Store +FDK57,10.195,Low Fat,0.080619969,Snack Foods,119.144,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD33,12.85,Low Fat,0.181092301,Fruits and Vegetables,231.6642,OUT010,1998,,Tier 3,Grocery Store +FDR34,,Regular,0.015887996,Snack Foods,228.6352,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU04,7.93,Low Fat,0.005559688,Frozen Foods,121.2414,OUT045,2002,,Tier 2,Supermarket Type1 +FDE35,,Regular,0.07686393,Starchy Foods,60.4904,OUT019,1985,Small,Tier 1,Grocery Store +NCD31,12.1,Low Fat,0.015431545,Household,162.7526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ56,8.985,LF,0.183368339,Fruits and Vegetables,100.07,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCU53,5.485,Low Fat,0.042751812,Health and Hygiene,164.5842,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD39,16.7,Low Fat,0.070141633,Dairy,214.985,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCU17,,Low Fat,0.162626685,Health and Hygiene,103.6674,OUT019,1985,Small,Tier 1,Grocery Store +FDJ20,20.7,Regular,0.100174939,Fruits and Vegetables,123.2388,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCW41,18.0,Low Fat,0.015513314,Health and Hygiene,156.9604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL52,6.635,Regular,0.046081489,Frozen Foods,38.0506,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS39,6.895,Low Fat,0.022456327,Meat,141.2812,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ47,18.25,Low Fat,0.044340045,Hard Drinks,173.908,OUT045,2002,,Tier 2,Supermarket Type1 +FDP13,8.1,Regular,0.224830093,Canned,40.248,OUT010,1998,,Tier 3,Grocery Store +DRK39,7.02,LF,0.083464455,Dairy,82.425,OUT010,1998,,Tier 3,Grocery Store +FDF28,15.7,Regular,0.06337778,Frozen Foods,126.2046,OUT010,1998,,Tier 3,Grocery Store +FDB09,16.25,Low Fat,0.057512493,Fruits and Vegetables,125.5046,OUT045,2002,,Tier 2,Supermarket Type1 +FDM51,11.8,Regular,0.025926223,Meat,99.9674,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRM49,6.11,Regular,0.152573001,Soft Drinks,45.1086,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRF23,4.61,Low Fat,0.122550245,Hard Drinks,176.1396,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH01,17.5,Low Fat,0.097885516,Soft Drinks,172.6738,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH12,,Low Fat,0.08454227,Baking Goods,107.128,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA28,,Regular,0.083694927,Frozen Foods,124.8362,OUT019,1985,Small,Tier 1,Grocery Store +FDW37,19.2,Low Fat,0.124555719,Canned,90.3488,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF02,16.2,Low Fat,0.103473165,Canned,103.799,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRL37,15.5,Low Fat,0.053372178,Soft Drinks,43.377,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCF43,8.51,low fat,0.051945908,Household,141.547,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH08,7.51,Low Fat,0.029172707,Fruits and Vegetables,228.201,OUT010,1998,,Tier 3,Grocery Store +FDR34,,Regular,0.027953194,Snack Foods,229.4352,OUT019,1985,Small,Tier 1,Grocery Store +NCK19,9.8,LF,0.09060629,Others,195.0478,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD55,14.0,Low Fat,0.024430294,Household,42.6454,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT27,11.395,Regular,0.069695361,Meat,233.7616,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ57,7.275,Low Fat,0.02800432,Snack Foods,146.976,OUT045,2002,,Tier 2,Supermarket Type1 +FDA47,10.5,Regular,0.116651733,Baking Goods,162.421,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG15,,Low Fat,0.076364306,Dairy,63.0536,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE05,10.895,Regular,0.03258625,Frozen Foods,145.6102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN46,7.21,reg,0.144631478,Snack Foods,100.6332,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX27,,Regular,0.113564473,Dairy,92.6436,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT51,11.65,Regular,0.010940934,Meat,110.4544,OUT045,2002,,Tier 2,Supermarket Type1 +FDU33,7.63,Regular,0.134597662,Snack Foods,44.7402,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ16,,Low Fat,0.114329308,Frozen Foods,59.4246,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD20,,Low Fat,0.036268455,Fruits and Vegetables,122.5046,OUT019,1985,Small,Tier 1,Grocery Store +FDT36,12.3,Low Fat,0.111447593,Baking Goods,33.4874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF15,,Low Fat,0.03305315,Dairy,152.334,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN52,9.395,Regular,0.220221011,Frozen Foods,88.1198,OUT010,1998,,Tier 3,Grocery Store +FDC22,,Regular,0.135767734,Snack Foods,191.282,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX15,17.2,Low Fat,0.156615836,Meat,160.6578,OUT045,2002,,Tier 2,Supermarket Type1 +FDT13,14.85,Low Fat,0.018556186,Canned,187.1214,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU04,7.93,Low Fat,0.00557982,Frozen Foods,121.1414,OUT017,2007,,Tier 2,Supermarket Type1 +FDU31,,Regular,0.043756113,Fruits and Vegetables,216.3508,OUT019,1985,Small,Tier 1,Grocery Store +FDW59,,Low Fat,0.0,Breads,85.4566,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO29,11.15,Low Fat,0.032256191,Health and Hygiene,165.1526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL15,17.85,Low Fat,0.046625941,Meat,152.3682,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI41,18.5,Regular,0.062353714,Frozen Foods,145.4418,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ48,14.3,Regular,0.0,Baking Goods,98.7726,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRI39,13.8,Low Fat,0.09698132,Dairy,55.593,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI08,18.2,Regular,0.066241884,Fruits and Vegetables,250.9092,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC21,14.6,Regular,0.04302561,Fruits and Vegetables,110.0254,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF58,13.3,Low Fat,0.009579343,Snack Foods,62.351,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS08,5.735,Low Fat,0.095341405,Fruits and Vegetables,178.037,OUT010,1998,,Tier 3,Grocery Store +FDE47,14.15,Low Fat,0.037985629,Starchy Foods,123.1046,OUT045,2002,,Tier 2,Supermarket Type1 +NCP18,,Low Fat,0.050071843,Household,152.4708,OUT019,1985,Small,Tier 1,Grocery Store +NCR41,17.85,Low Fat,0.0,Health and Hygiene,96.8094,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA27,20.35,Regular,0.030901894,Dairy,254.2672,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA43,10.895,low fat,0.064663519,Fruits and Vegetables,194.0794,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA49,19.7,Low Fat,0.065053427,Canned,86.6198,OUT045,2002,,Tier 2,Supermarket Type1 +NCE55,8.92,Low Fat,0.0,Household,178.137,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRM49,,Regular,0.15121816,Soft Drinks,45.9086,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF22,,Low Fat,0.056555477,Snack Foods,214.2218,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ15,20.35,Regular,0.151688857,Meat,80.6276,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCS54,13.6,Low Fat,0.010049688,Household,174.937,OUT017,2007,,Tier 2,Supermarket Type1 +NCY05,13.5,Low Fat,0.054944247,Health and Hygiene,36.3874,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR45,10.8,Low Fat,0.028943289,Snack Foods,239.6222,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK57,10.195,Low Fat,0.080417724,Snack Foods,121.244,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF41,12.15,Low Fat,0.219568112,Frozen Foods,248.346,OUT010,1998,,Tier 3,Grocery Store +FDV21,11.5,Low Fat,0.0,Snack Foods,125.6704,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD51,11.15,Low Fat,0.119952711,Dairy,45.2744,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF33,7.97,Low Fat,0.021535488,Seafood,109.6596,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA38,5.44,Low Fat,0.025479919,Dairy,238.5538,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR56,15.5,Regular,0.100970195,Fruits and Vegetables,195.8768,OUT045,2002,,Tier 2,Supermarket Type1 +NCN41,17.0,Low Fat,0.05250462,Health and Hygiene,121.673,OUT017,2007,,Tier 2,Supermarket Type1 +FDC60,,Regular,0.113918065,Baking Goods,87.9514,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB47,8.8,Low Fat,0.07157425,Snack Foods,207.9612,OUT045,2002,,Tier 2,Supermarket Type1 +DRH01,17.5,Low Fat,0.097822555,Soft Drinks,175.4738,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW08,12.1,Low Fat,0.148381569,Fruits and Vegetables,104.928,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF38,,Regular,0.026230365,Canned,39.1138,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY32,7.605,Low Fat,0.129972082,Fruits and Vegetables,162.921,OUT017,2007,,Tier 2,Supermarket Type1 +FDG34,11.5,Regular,0.037628842,Snack Foods,109.5254,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG47,,Low Fat,0.121893603,Starchy Foods,261.3252,OUT019,1985,Small,Tier 1,Grocery Store +NCF18,18.35,Low Fat,0.088965771,Household,189.8504,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL39,,Regular,0.110885027,Dairy,181.3318,OUT019,1985,Small,Tier 1,Grocery Store +NCH55,16.35,Low Fat,0.03466576,Household,125.902,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ35,10.1,Low Fat,0.0,Hard Drinks,60.7878,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS44,12.65,Regular,0.156014453,Fruits and Vegetables,238.9538,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRE01,10.1,LF,0.167836117,Soft Drinks,241.0512,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY39,5.305,Regular,0.046989556,Meat,184.3608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY32,7.605,Low Fat,0.129767515,Fruits and Vegetables,161.821,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR33,,Low Fat,0.02665921,Snack Foods,111.157,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCP50,17.35,Low Fat,0.020591811,Others,81.0618,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ47,20.7,Regular,0.07961949,Baking Goods,98.6042,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU57,8.27,Regular,0.089693419,Snack Foods,152.2708,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY44,14.15,Regular,0.02438425,Fruits and Vegetables,194.411,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH59,10.8,Low Fat,0.058671483,Hard Drinks,73.838,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB03,,Regular,0.156072361,Dairy,240.2538,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY46,18.6,Low Fat,0.047987061,Snack Foods,186.8898,OUT045,2002,,Tier 2,Supermarket Type1 +FDM39,6.42,LF,0.053579102,Dairy,177.3002,OUT045,2002,,Tier 2,Supermarket Type1 +FDY36,12.3,Low Fat,0.009408748,Baking Goods,74.838,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM55,15.6,Low Fat,0.066713516,Others,184.2924,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ50,8.645,Low Fat,0.036130545,Canned,52.6982,OUT010,1998,,Tier 3,Grocery Store +DRL60,8.52,Low Fat,0.027036842,Soft Drinks,150.8682,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ54,9.895,Low Fat,0.060160503,Household,232.2642,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX59,10.195,Low Fat,0.051953489,Breads,33.8558,OUT017,2007,,Tier 2,Supermarket Type1 +FDI07,12.35,Regular,0.0,Meat,199.0426,OUT013,1987,High,Tier 3,Supermarket Type1 +DRF51,15.75,Low Fat,0.277579189,Dairy,39.6506,OUT010,1998,,Tier 3,Grocery Store +FDM14,13.8,Low Fat,0.013338995,Canned,109.7254,OUT017,2007,,Tier 2,Supermarket Type1 +FDP21,7.42,Regular,0.025793045,Snack Foods,187.9872,OUT045,2002,,Tier 2,Supermarket Type1 +FDE40,15.6,Regular,0.099125013,Dairy,63.0194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE05,10.895,Regular,0.032447909,Frozen Foods,146.9102,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM13,,Low Fat,0.062869397,Breakfast,132.8626,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC34,,Regular,0.1719225,Snack Foods,156.7972,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCI55,18.6,Low Fat,0.01270511,Household,122.8414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCE43,12.5,Low Fat,0.103863648,Household,168.8448,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW58,20.75,Low Fat,0.007583861,Snack Foods,107.0622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG60,20.35,Low Fat,0.060822826,Baking Goods,234.6616,OUT045,2002,,Tier 2,Supermarket Type1 +FDV31,9.8,Low Fat,0.107320959,Fruits and Vegetables,176.337,OUT017,2007,,Tier 2,Supermarket Type1 +FDR47,17.85,low fat,0.087395867,Breads,194.2794,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM60,,Regular,0.08429269,Baking Goods,40.6138,OUT019,1985,Small,Tier 1,Grocery Store +NCF06,6.235,Low Fat,0.020280634,Household,258.4962,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN26,,Low Fat,0.0,Household,117.0808,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ59,9.8,Regular,0.056474207,Breads,85.6908,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF09,6.215,Low Fat,0.012148905,Fruits and Vegetables,36.5848,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCS06,7.935,Low Fat,0.0,Household,264.791,OUT017,2007,,Tier 2,Supermarket Type1 +FDT44,16.6,Low Fat,0.102986542,Fruits and Vegetables,117.9466,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI19,15.1,Low Fat,0.05263512,Meat,244.2512,OUT017,2007,,Tier 2,Supermarket Type1 +FDT22,10.395,Low Fat,0.112731284,Snack Foods,59.922,OUT017,2007,,Tier 2,Supermarket Type1 +NCF54,,Low Fat,0.047147628,Household,170.8422,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG25,10.5,Low Fat,0.019088324,Soft Drinks,185.924,OUT045,2002,,Tier 2,Supermarket Type1 +FDB59,18.25,Low Fat,0.015365323,Snack Foods,197.3084,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ37,20.75,Low Fat,0.089765562,Breakfast,194.6478,OUT017,2007,,Tier 2,Supermarket Type1 +FDP56,8.185,Low Fat,0.046475348,Fruits and Vegetables,47.9692,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW44,9.5,Regular,0.035144569,Fruits and Vegetables,171.8448,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ26,15.3,Regular,0.141879554,Canned,215.1218,OUT010,1998,,Tier 3,Grocery Store +FDU43,19.35,Regular,0.058279823,Fruits and Vegetables,237.4564,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW33,9.395,Low Fat,0.099321607,Snack Foods,104.928,OUT045,2002,,Tier 2,Supermarket Type1 +NCX53,,Low Fat,0.0148655,Health and Hygiene,143.2154,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN56,5.46,Regular,0.179191782,Fruits and Vegetables,146.2786,OUT010,1998,,Tier 3,Grocery Store +DRF15,18.35,Low Fat,0.033265629,Dairy,152.334,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO33,14.75,Low Fat,0.089827705,Snack Foods,114.4518,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ39,19.7,Regular,0.030169768,Meat,103.799,OUT010,1998,,Tier 3,Grocery Store +NCJ19,18.6,Low Fat,0.118848485,Others,55.3588,OUT017,2007,,Tier 2,Supermarket Type1 +FDU01,20.25,Regular,0.0,Canned,184.6924,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT12,6.215,Regular,0.049612318,Baking Goods,224.1062,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM18,13.0,Low Fat,0.083179333,Household,62.0194,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP19,11.5,Low Fat,0.174497541,Fruits and Vegetables,128.8652,OUT017,2007,,Tier 2,Supermarket Type1 +NCR42,9.105,Low Fat,0.038541712,Household,33.09,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN10,11.5,Low Fat,0.046123804,Snack Foods,118.6124,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG44,6.13,Low Fat,0.102768984,Fruits and Vegetables,54.7298,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ10,12.85,Low Fat,0.033179231,Snack Foods,171.5422,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH13,8.575,Low Fat,0.023923093,Soft Drinks,105.528,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT52,9.695,Regular,0.047390108,Frozen Foods,245.0144,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM56,16.7,Low Fat,0.070333939,Fruits and Vegetables,110.7912,OUT045,2002,,Tier 2,Supermarket Type1 +NCO43,5.5,Low Fat,0.078832748,Others,101.5016,OUT010,1998,,Tier 3,Grocery Store +NCV29,11.8,Low Fat,0.0,Health and Hygiene,177.2686,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCF06,6.235,Low Fat,0.020181546,Household,260.1962,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO50,16.25,Low Fat,0.078153958,Canned,91.3804,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT59,13.65,Low Fat,0.015898191,Breads,229.7668,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX40,,low fat,0.09851376,Frozen Foods,36.7164,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE50,19.7,Regular,0.016297312,Canned,186.3556,OUT017,2007,,Tier 2,Supermarket Type1 +FDX51,9.5,Regular,0.022183497,Meat,196.9452,OUT017,2007,,Tier 2,Supermarket Type1 +NCD30,19.7,Low Fat,0.026958635,Household,98.5726,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK15,10.8,Low Fat,0.098331927,Meat,100.5042,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL12,15.85,Regular,0.121879396,Baking Goods,61.222,OUT045,2002,,Tier 2,Supermarket Type1 +FDK46,9.6,Low Fat,0.051758515,Snack Foods,259.462,OUT017,2007,,Tier 2,Supermarket Type1 +DRH49,19.7,Low Fat,0.04126841,Soft Drinks,80.6592,OUT010,1998,,Tier 3,Grocery Store +FDQ57,7.275,Low Fat,0.027947642,Snack Foods,146.876,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY59,8.195,Low Fat,0.031581072,Baking Goods,93.4462,OUT017,2007,,Tier 2,Supermarket Type1 +FDO09,13.5,Regular,0.12578499,Snack Foods,261.691,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCG30,20.2,Low Fat,0.112299979,Household,126.4046,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM09,11.15,Regular,0.086417608,Snack Foods,168.679,OUT017,2007,,Tier 2,Supermarket Type1 +NCN17,,Low Fat,0.054672984,Health and Hygiene,101.0358,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCS42,8.6,Low Fat,0.0693587,Household,89.9146,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD02,,Low Fat,0.088053052,Canned,117.0124,OUT019,1985,Small,Tier 1,Grocery Store +FDE34,9.195,Low Fat,0.107801614,Snack Foods,182.3634,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU38,10.8,Low Fat,0.08271731,Dairy,192.6504,OUT045,2002,,Tier 2,Supermarket Type1 +FDB33,17.75,Low Fat,0.014580169,Fruits and Vegetables,157.5262,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ29,10.6,Low Fat,0.035391991,Health and Hygiene,86.8224,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ27,7.935,Low Fat,0.017153018,Dairy,48.135,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI40,11.5,Regular,0.125498428,Frozen Foods,99.7358,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG22,17.6,Regular,0.041346719,Snack Foods,37.819,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT51,11.65,Regular,0.010980551,Meat,110.7544,OUT017,2007,,Tier 2,Supermarket Type1 +FDF20,12.85,Low Fat,0.033355494,Fruits and Vegetables,198.5768,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV50,14.3,Low Fat,0.122548032,Dairy,122.173,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT02,12.6,Low Fat,0.024232347,Dairy,36.1874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRC49,8.67,Low Fat,0.065806717,Soft Drinks,144.6128,OUT017,2007,,Tier 2,Supermarket Type1 +FDF26,6.825,Regular,0.046707264,Canned,151.9998,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV52,20.7,Regular,0.0,Frozen Foods,118.6466,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX59,10.195,Low Fat,0.051741591,Breads,35.2558,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV25,5.905,Low Fat,0.045643611,Canned,222.0456,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW23,,Low Fat,0.081615145,Baking Goods,38.6164,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE53,10.895,Low Fat,0.026989658,Frozen Foods,107.728,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA19,7.52,Low Fat,0.055439323,Fruits and Vegetables,130.0994,OUT017,2007,,Tier 2,Supermarket Type1 +FDH22,6.405,Low Fat,0.136300946,Snack Foods,126.0678,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO41,12.5,Low Fat,0.018833177,Health and Hygiene,97.8384,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX12,18.2,Regular,0.026211917,Baking Goods,241.3196,OUT017,2007,,Tier 2,Supermarket Type1 +FDF17,5.19,Low Fat,0.042585419,Frozen Foods,196.911,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS11,7.05,Regular,0.055671183,Breads,222.3088,OUT045,2002,,Tier 2,Supermarket Type1 +FDR51,9.035,Regular,0.173436917,Meat,150.0708,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT49,7.0,Low Fat,0.253421913,Canned,106.228,OUT010,1998,,Tier 3,Grocery Store +FDC56,7.72,Low Fat,0.121419594,Fruits and Vegetables,120.244,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR13,,Regular,0.02858175,Canned,116.4492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ60,6.195,Regular,0.10935376,Baking Goods,120.4098,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN38,6.615,Regular,0.092114847,Canned,248.7408,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCL29,9.695,Low Fat,0.113844617,Health and Hygiene,157.8604,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO13,,Low Fat,0.060763988,Breakfast,164.0526,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE26,9.3,Low Fat,0.089368341,Canned,143.8786,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA31,7.1,Low Fat,0.18413701,Fruits and Vegetables,172.808,OUT010,1998,,Tier 3,Grocery Store +FDX14,13.1,Low Fat,0.07492586,Dairy,75.3354,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA34,11.5,Low Fat,0.014890695,Starchy Foods,174.108,OUT045,2002,,Tier 2,Supermarket Type1 +FDF26,6.825,Regular,0.046595951,Canned,153.0998,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE38,6.52,Low Fat,0.044697626,Canned,166.5842,OUT045,2002,,Tier 2,Supermarket Type1 +DRI11,8.26,Low Fat,0.034404287,Hard Drinks,113.5834,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ60,,Regular,0.108844791,Baking Goods,118.5098,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL21,,Regular,0.007111808,Snack Foods,39.348,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRC12,,Low Fat,0.037643694,Soft Drinks,192.0188,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC47,15.0,Low Fat,0.118890636,Snack Foods,227.9694,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE57,9.6,Low Fat,0.036358713,Fruits and Vegetables,140.0154,OUT045,2002,,Tier 2,Supermarket Type1 +FDT14,10.695,Regular,0.127986136,Dairy,120.344,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ53,9.6,Low Fat,0.024477166,Health and Hygiene,189.6214,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE28,9.5,Regular,0.133086933,Frozen Foods,230.1668,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR19,13.5,Regular,0.159690469,Fruits and Vegetables,144.2102,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCF54,,Low Fat,0.082951105,Household,173.7422,OUT019,1985,Small,Tier 1,Grocery Store +FDZ08,12.5,Regular,0.109992376,Fruits and Vegetables,81.1592,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ05,18.7,Low Fat,0.046276017,Health and Hygiene,154.2682,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF59,12.5,Low Fat,0.071244009,Starchy Foods,127.102,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO05,7.27,Low Fat,0.046550645,Health and Hygiene,100.4384,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW24,6.8,Low Fat,0.037649797,Baking Goods,49.5034,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCX42,6.36,Low Fat,0.00600295,Household,166.1526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCA53,11.395,LF,0.009876591,Health and Hygiene,48.2034,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI45,,Low Fat,0.065799906,Fruits and Vegetables,177.0054,OUT019,1985,Small,Tier 1,Grocery Store +FDG46,8.63,Regular,0.032909657,Snack Foods,112.9518,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM20,10.0,Low Fat,0.064752101,Fruits and Vegetables,243.3144,OUT010,1998,,Tier 3,Grocery Store +FDW11,12.6,Low Fat,0.081651205,Breads,61.6194,OUT010,1998,,Tier 3,Grocery Store +FDX08,12.85,Low Fat,0.022599777,Fruits and Vegetables,179.2318,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK17,11.0,Low Fat,0.03788768,Health and Hygiene,40.648,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK32,16.25,Regular,0.049175079,Fruits and Vegetables,151.5682,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCA42,6.965,Low Fat,0.028543185,Household,159.4604,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRI01,7.97,Low Fat,0.034446434,Soft Drinks,170.7422,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCL55,12.15,LF,0.0,Others,254.004,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRE25,15.35,Low Fat,0.073581718,Soft Drinks,94.412,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD14,20.7,Low Fat,0.170768961,Canned,183.5266,OUT017,2007,,Tier 2,Supermarket Type1 +FDB10,10.0,Low Fat,0.067208123,Snack Foods,235.559,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN11,7.85,Low Fat,0.162949459,Hard Drinks,145.0444,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP38,10.1,Low Fat,0.032232864,Canned,50.9008,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCA30,19.0,Low Fat,0.130065297,Household,188.6872,OUT017,2007,,Tier 2,Supermarket Type1 +FDT15,12.15,reg,0.042922946,Meat,184.695,OUT017,2007,,Tier 2,Supermarket Type1 +NCP55,14.65,Low Fat,0.011235608,Others,57.0614,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF12,8.235,Low Fat,0.082412268,Baking Goods,148.5076,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM21,20.2,Low Fat,0.06462627,Snack Foods,256.2646,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX56,17.1,Regular,0.07404547,Fruits and Vegetables,205.8638,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF10,15.5,Regular,0.157816029,Snack Foods,145.4418,OUT017,2007,,Tier 2,Supermarket Type1 +FDT32,19.0,Regular,0.065767041,Fruits and Vegetables,189.6214,OUT045,2002,,Tier 2,Supermarket Type1 +FDM51,11.8,Regular,0.026031835,Meat,101.2674,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR50,20.2,Low Fat,0.011868237,Household,154.434,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI19,15.1,Low Fat,0.052420442,Meat,242.4512,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX21,7.05,Low Fat,0.085446623,Snack Foods,107.8912,OUT017,2007,,Tier 2,Supermarket Type1 +FDR31,6.46,Regular,0.049153588,Fruits and Vegetables,145.3102,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY02,8.945,Regular,0.08757299,Dairy,261.191,OUT013,1987,High,Tier 3,Supermarket Type1 +NCA29,10.5,Low Fat,0.0,Household,170.6106,OUT045,2002,,Tier 2,Supermarket Type1 +NCX17,21.25,Low Fat,0.113603432,Health and Hygiene,231.73,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM12,16.7,Regular,0.070058787,Baking Goods,190.3214,OUT045,2002,,Tier 2,Supermarket Type1 +FDI53,,Regular,0.136978402,Frozen Foods,160.4236,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU30,5.11,Low Fat,0.0,Household,164.121,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC56,,Low Fat,0.120932251,Fruits and Vegetables,121.044,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK27,11.0,Low Fat,0.00898298,Meat,123.0756,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCK18,9.6,Low Fat,0.00673599,Household,166.4184,OUT017,2007,,Tier 2,Supermarket Type1 +FDB52,,Low Fat,0.053288809,Dairy,257.5672,OUT019,1985,Small,Tier 1,Grocery Store +DRG25,,Low Fat,0.018957442,Soft Drinks,188.324,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ13,7.84,reg,0.153733623,Canned,51.935,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB57,,Regular,0.032925311,Fruits and Vegetables,223.5772,OUT019,1985,Small,Tier 1,Grocery Store +FDR40,9.1,Regular,0.008034387,Frozen Foods,82.5618,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO14,,Low Fat,0.051902594,Household,44.7086,OUT019,1985,Small,Tier 1,Grocery Store +NCN19,13.1,Low Fat,0.012124086,Others,190.753,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ28,,Regular,0.105799985,Frozen Foods,155.0656,OUT019,1985,Small,Tier 1,Grocery Store +FDO13,7.865,Low Fat,0.061308404,Breakfast,164.8526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK48,7.445,Low Fat,0.0,Baking Goods,77.2354,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU07,11.1,Low Fat,0.060090767,Fruits and Vegetables,152.5366,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW20,20.75,Low Fat,0.0,Fruits and Vegetables,123.373,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV12,16.7,Regular,0.101891731,Baking Goods,98.7384,OUT010,1998,,Tier 3,Grocery Store +FDH24,20.7,Low Fat,0.021413299,Baking Goods,158.2288,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV59,13.35,Low Fat,0.048101713,Breads,216.0166,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK57,10.195,Low Fat,0.080455726,Snack Foods,120.144,OUT045,2002,,Tier 2,Supermarket Type1 +FDL16,,Low Fat,0.16763712,Frozen Foods,45.506,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ17,10.3,Low Fat,0.116932555,Health and Hygiene,155.463,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ15,11.35,Regular,0.023417483,Dairy,185.1608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX24,8.355,Low Fat,0.0,Baking Goods,93.5462,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT47,5.26,Regular,0.0,Breads,96.3068,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT10,16.7,Regular,0.062140968,Snack Foods,60.8562,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ37,8.1,Regular,0.019849032,Canned,87.7198,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW43,,Regular,0.022316641,Fruits and Vegetables,229.5036,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRN36,15.2,Low Fat,0.050461669,Soft Drinks,95.5752,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ14,10.3,Regular,0.05017202,Canned,80.596,OUT045,2002,,Tier 2,Supermarket Type1 +FDA32,14.0,Low Fat,0.030069149,Fruits and Vegetables,217.4192,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ38,,Regular,0.070394702,Canned,190.053,OUT019,1985,Small,Tier 1,Grocery Store +FDQ57,7.275,Low Fat,0.0,Snack Foods,146.776,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ41,,Low Fat,0.0,Health and Hygiene,193.5794,OUT019,1985,Small,Tier 1,Grocery Store +FDG56,13.3,Regular,0.071563651,Fruits and Vegetables,59.9536,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRC13,,Regular,0.032284472,Soft Drinks,123.973,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV55,17.75,Low Fat,0.055063016,Fruits and Vegetables,144.5444,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ49,20.2,Regular,0.0,Breakfast,157.363,OUT045,2002,,Tier 2,Supermarket Type1 +FDE29,8.905,Low Fat,0.239568811,Frozen Foods,60.4878,OUT010,1998,,Tier 3,Grocery Store +FDR03,15.7,Regular,0.0,Meat,205.798,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD45,8.615,Low Fat,0.0,Fruits and Vegetables,92.9436,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN38,6.615,Regular,0.153942031,Canned,249.7408,OUT010,1998,,Tier 3,Grocery Store +FDT56,16.0,Regular,0.115592409,Fruits and Vegetables,58.1246,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT48,4.92,low fat,0.046048229,Baking Goods,200.0084,OUT045,2002,,Tier 2,Supermarket Type1 +FDU03,18.7,Regular,0.091720302,Meat,180.8292,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC56,7.72,LF,0.203400773,Fruits and Vegetables,118.944,OUT010,1998,,Tier 3,Grocery Store +NCO43,,Low Fat,0.046870135,Others,99.3016,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ27,5.19,Regular,0.044502932,Meat,101.699,OUT017,2007,,Tier 2,Supermarket Type1 +FDR03,15.7,Regular,0.008735936,Meat,205.998,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH23,14.65,Low Fat,0.285077835,Hard Drinks,54.1614,OUT010,1998,,Tier 3,Grocery Store +FDG22,17.6,Regular,0.041465078,Snack Foods,38.119,OUT045,2002,,Tier 2,Supermarket Type1 +NCJ42,19.75,Low Fat,0.014289425,Household,103.8332,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR24,17.35,Regular,0.062851683,Baking Goods,90.583,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW60,5.44,Regular,0.017058723,Baking Goods,176.037,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ08,11.1,Low Fat,0.110580006,Fruits and Vegetables,190.0846,OUT013,1987,High,Tier 3,Supermarket Type1 +DRL59,16.75,Low Fat,0.021310584,Hard Drinks,52.2298,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG60,20.35,Low Fat,0.101598896,Baking Goods,232.7616,OUT010,1998,,Tier 3,Grocery Store +FDW27,5.86,Regular,0.0,Meat,155.9314,OUT017,2007,,Tier 2,Supermarket Type1 +FDX14,13.1,Low Fat,0.075245304,Dairy,77.1354,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC20,10.65,Low Fat,0.023951515,Fruits and Vegetables,56.0272,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS29,9.0,Low Fat,0.069828759,Health and Hygiene,263.6884,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ56,8.985,Low Fat,0.183403018,Fruits and Vegetables,100.47,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB20,,Low Fat,0.091011438,Fruits and Vegetables,77.0986,OUT019,1985,Small,Tier 1,Grocery Store +FDL28,,Regular,0.062868628,Frozen Foods,228.6668,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW01,14.5,Low Fat,0.064321473,Canned,151.7682,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL03,19.25,Regular,0.027080602,Meat,197.611,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX22,6.785,Regular,0.023010532,Snack Foods,209.1928,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ21,16.7,Regular,0.038520943,Snack Foods,144.6102,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR31,6.46,Regular,0.049262588,Fruits and Vegetables,147.6102,OUT045,2002,,Tier 2,Supermarket Type1 +FDG21,17.35,Regular,0.146272238,Seafood,151.505,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS22,,Regular,0.023042273,Snack Foods,42.6428,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK08,9.195,Regular,0.122281599,Fruits and Vegetables,99.4016,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE17,20.1,Regular,0.054677324,Frozen Foods,151.7366,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN30,16.35,Low Fat,0.017089325,Household,95.841,OUT017,2007,,Tier 2,Supermarket Type1 +FDT50,6.75,Regular,0.108238986,Dairy,97.2752,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCX42,6.36,Low Fat,0.005987891,Household,163.6526,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ12,8.895,Regular,0.039033732,Baking Goods,207.8296,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCA18,,Low Fat,0.055806016,Household,117.4492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP23,,Low Fat,0.062307997,Breads,217.4166,OUT019,1985,Small,Tier 1,Grocery Store +FDX12,18.2,reg,0.0,Baking Goods,241.4196,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN40,5.88,Low Fat,0.086808977,Frozen Foods,152.7998,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV48,9.195,Regular,0.051607098,Baking Goods,77.8644,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY54,8.43,Low Fat,0.177546973,Household,171.9422,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL16,12.85,Low Fat,0.281955554,Frozen Foods,46.006,OUT010,1998,,Tier 3,Grocery Store +FDR45,10.8,Low Fat,0.029061192,Snack Foods,240.0222,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ52,7.145,Low Fat,0.017786864,Frozen Foods,161.0578,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRG01,14.8,Low Fat,0.04513213,Soft Drinks,77.167,OUT017,2007,,Tier 2,Supermarket Type1 +FDP52,18.7,Regular,0.070632902,Frozen Foods,231.201,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU58,6.61,Regular,0.029175827,Snack Foods,186.5898,OUT017,2007,,Tier 2,Supermarket Type1 +FDL02,20.0,Regular,0.10429446,Canned,105.5622,OUT045,2002,,Tier 2,Supermarket Type1 +FDG28,9.285,Regular,0.049239282,Frozen Foods,244.1144,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA19,7.52,Low Fat,0.055117075,Fruits and Vegetables,128.7994,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW46,,Regular,0.069961219,Snack Foods,66.4484,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCD43,8.85,Low Fat,0.016044864,Household,103.1964,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG39,14.15,Low Fat,0.042145893,Dairy,51.7982,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF55,6.675,Low Fat,0.021700021,Household,35.5874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ07,7.26,LF,0.014423523,Meat,118.015,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE08,18.2,LF,0.049319685,Fruits and Vegetables,150.0734,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP56,,Low Fat,0.081387725,Fruits and Vegetables,49.6692,OUT019,1985,Small,Tier 1,Grocery Store +FDT45,15.85,Low Fat,0.057429676,Snack Foods,53.2956,OUT045,2002,,Tier 2,Supermarket Type1 +FDF17,5.19,Low Fat,0.042794507,Frozen Foods,195.011,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX44,9.3,Low Fat,0.042966544,Fruits and Vegetables,87.7172,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM28,,Low Fat,0.044984953,Frozen Foods,179.866,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI36,12.5,Regular,0.062440359,Baking Goods,197.9426,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS07,12.35,Low Fat,0.099960144,Fruits and Vegetables,115.2518,OUT045,2002,,Tier 2,Supermarket Type1 +FDD36,13.3,Low Fat,0.021316704,Baking Goods,117.7124,OUT045,2002,,Tier 2,Supermarket Type1 +FDW11,12.6,Low Fat,0.048782082,Breads,60.5194,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN40,5.88,Low Fat,0.086591206,Frozen Foods,154.4998,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCQ18,15.75,Low Fat,0.135282803,Household,97.87,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCQ54,17.7,Low Fat,0.01261332,Household,166.5474,OUT017,2007,,Tier 2,Supermarket Type1 +NCS42,8.6,Low Fat,0.069557245,Household,91.5146,OUT045,2002,,Tier 2,Supermarket Type1 +DRH39,20.7,Low Fat,0.1551444,Dairy,75.867,OUT010,1998,,Tier 3,Grocery Store +FDC09,,Regular,0.026174636,Fruits and Vegetables,103.7332,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT08,13.65,Low Fat,0.082381676,Fruits and Vegetables,150.805,OUT010,1998,,Tier 3,Grocery Store +FDC08,19.0,Regular,0.0,Fruits and Vegetables,225.272,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT20,10.5,Low Fat,0.041629595,Fruits and Vegetables,37.3164,OUT017,2007,,Tier 2,Supermarket Type1 +FDS35,9.3,Low Fat,0.111199491,Breads,64.0826,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX58,13.15,Low Fat,0.043941955,Snack Foods,182.295,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW58,20.75,Low Fat,0.0,Snack Foods,105.9622,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD27,18.75,Low Fat,0.0,Dairy,99.3042,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH32,,Low Fat,0.133171307,Fruits and Vegetables,97.641,OUT019,1985,Small,Tier 1,Grocery Store +FDS26,20.35,Low Fat,0.089452302,Dairy,262.7594,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ31,5.785,Regular,0.053847216,Fruits and Vegetables,86.8856,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP11,15.85,Low Fat,0.069382034,Breads,219.6166,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD58,7.76,Low Fat,0.059687962,Snack Foods,99.47,OUT017,2007,,Tier 2,Supermarket Type1 +FDM33,15.6,Low Fat,0.08789759,Snack Foods,218.3798,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ16,16.85,Regular,0.160104378,Frozen Foods,195.7478,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCS29,9.0,LF,0.116404843,Health and Hygiene,264.6884,OUT010,1998,,Tier 3,Grocery Store +NCM18,,Low Fat,0.145045421,Household,60.0194,OUT019,1985,Small,Tier 1,Grocery Store +FDP11,15.85,Low Fat,0.069207981,Breads,219.5166,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCC42,15.0,Low Fat,0.045162424,Health and Hygiene,141.3838,OUT017,2007,,Tier 2,Supermarket Type1 +DRM23,16.6,Low Fat,0.135733218,Hard Drinks,172.7422,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN55,,Low Fat,0.059202419,Others,239.3538,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK46,9.6,Low Fat,0.051424565,Snack Foods,258.162,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR01,5.405,Regular,0.053621283,Canned,198.7742,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA05,20.75,Low Fat,0.025181597,Health and Hygiene,150.2734,OUT045,2002,,Tier 2,Supermarket Type1 +NCP43,17.75,Low Fat,0.03067961,Others,178.066,OUT017,2007,,Tier 2,Supermarket Type1 +FDR12,12.6,Regular,0.052782711,Baking Goods,170.3764,OUT010,1998,,Tier 3,Grocery Store +FDQ01,19.7,Regular,0.16056791,Canned,256.4014,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM13,6.425,Low Fat,0.063175326,Breakfast,131.2626,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ19,7.35,Regular,0.014446383,Fruits and Vegetables,242.9512,OUT017,2007,,Tier 2,Supermarket Type1 +FDK56,,Low Fat,0.227609738,Fruits and Vegetables,186.0898,OUT019,1985,Small,Tier 1,Grocery Store +NCX06,17.6,LF,0.026256897,Household,182.6976,OUT010,1998,,Tier 3,Grocery Store +FDO56,,Regular,0.044764726,Fruits and Vegetables,118.8808,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU45,15.6,Regular,0.035578149,Snack Foods,112.6518,OUT045,2002,,Tier 2,Supermarket Type1 +FDI16,,Regular,0.237725726,Frozen Foods,54.964,OUT019,1985,Small,Tier 1,Grocery Store +FDL32,15.7,Regular,0.122466933,Fruits and Vegetables,113.0544,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA07,7.55,Regular,0.030944625,Fruits and Vegetables,123.5072,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA14,16.1,Low Fat,0.065315421,Dairy,147.176,OUT045,2002,,Tier 2,Supermarket Type1 +FDV46,,Low Fat,0.012546822,Snack Foods,139.918,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO07,9.06,Low Fat,0.009774419,Others,212.856,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP41,16.6,Low Fat,0.016210706,Health and Hygiene,105.8596,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY60,10.5,Regular,0.026478367,Baking Goods,141.9128,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN38,6.615,reg,0.092492086,Canned,251.0408,OUT017,2007,,Tier 2,Supermarket Type1 +FDO15,16.75,Regular,0.008566545,Meat,74.9038,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT60,12.0,Low Fat,0.075485441,Baking Goods,122.3388,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA55,17.2,Regular,0.056978251,Fruits and Vegetables,224.4088,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE02,8.71,Low Fat,0.202948268,Canned,94.7778,OUT010,1998,,Tier 3,Grocery Store +DRJ39,20.25,Low Fat,0.036382541,Dairy,221.0482,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV34,10.695,Regular,0.011423298,Snack Foods,74.6038,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS20,,LF,0.05360606,Fruits and Vegetables,184.3292,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF02,,Low Fat,0.102972092,Canned,102.899,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW40,14.0,Regular,0.105740196,Frozen Foods,143.3812,OUT017,2007,,Tier 2,Supermarket Type1 +NCB43,20.2,Low Fat,0.099912316,Household,186.8898,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR58,6.675,Low Fat,0.042158587,Snack Foods,90.8462,OUT017,2007,,Tier 2,Supermarket Type1 +DRJ59,11.65,Low Fat,0.01936859,Hard Drinks,40.0164,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCD30,19.7,Low Fat,0.027001133,Household,98.9726,OUT017,2007,,Tier 2,Supermarket Type1 +FDE14,13.65,Regular,0.031623019,Canned,97.87,OUT017,2007,,Tier 2,Supermarket Type1 +FDC28,7.905,Low Fat,0.055210913,Frozen Foods,108.0254,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU16,19.25,Regular,0.058512492,Frozen Foods,84.2908,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCD19,8.93,Low Fat,0.013176896,Household,55.9614,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU21,11.8,Regular,0.076720455,Snack Foods,35.8558,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV59,,Low Fat,0.04779447,Breads,217.3166,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU03,18.7,Regular,0.0,Meat,182.1292,OUT045,2002,,Tier 2,Supermarket Type1 +FDC33,8.96,Regular,0.0,Fruits and Vegetables,198.5768,OUT010,1998,,Tier 3,Grocery Store +NCR42,9.105,Low Fat,0.038474607,Household,34.89,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH59,10.8,Low Fat,0.058422401,Hard Drinks,75.238,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM31,6.095,low fat,0.0,Others,142.5154,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS50,17.0,Low Fat,0.055422895,Dairy,222.3114,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP39,12.65,Low Fat,0.069424963,Meat,52.4324,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ55,13.65,Regular,0.013027225,Fruits and Vegetables,116.7834,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV36,,Low Fat,0.046051414,Baking Goods,124.602,OUT019,1985,Small,Tier 1,Grocery Store +FDI05,,Regular,0.126255345,Frozen Foods,76.8354,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS45,,Regular,0.029353119,Snack Foods,107.2622,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA39,6.32,Low Fat,0.012743738,Meat,38.6822,OUT045,2002,,Tier 2,Supermarket Type1 +FDC37,15.5,Low Fat,0.055023254,Baking Goods,108.2938,OUT010,1998,,Tier 3,Grocery Store +FDJ60,,Regular,0.062225629,Baking Goods,166.4184,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRQ35,9.3,Low Fat,0.042291451,Hard Drinks,122.7388,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ06,20.1,Low Fat,0.034652619,Household,119.9782,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCY42,6.38,Low Fat,0.015224339,Household,144.647,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRM37,15.35,Low Fat,0.0,Soft Drinks,196.3768,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR14,11.65,Low Fat,0.174402008,Dairy,51.9298,OUT045,2002,,Tier 2,Supermarket Type1 +FDE51,5.925,Regular,0.096617312,Dairy,44.1086,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT33,7.81,Regular,0.034182922,Snack Foods,166.6158,OUT017,2007,,Tier 2,Supermarket Type1 +FDR08,18.7,Low Fat,0.037591645,Fruits and Vegetables,112.6886,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE36,5.26,Regular,0.06991841,Baking Goods,162.9868,OUT010,1998,,Tier 3,Grocery Store +FDL22,,Low Fat,0.063714498,Snack Foods,90.2488,OUT019,1985,Small,Tier 1,Grocery Store +FDR44,6.11,Regular,0.102835238,Fruits and Vegetables,131.5968,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI56,,Low Fat,0.163505748,Fruits and Vegetables,89.5146,OUT019,1985,Small,Tier 1,Grocery Store +FDE47,14.15,Low Fat,0.063451474,Starchy Foods,126.5046,OUT010,1998,,Tier 3,Grocery Store +FDV27,7.97,Regular,0.066935112,Meat,89.4514,OUT010,1998,,Tier 3,Grocery Store +FDV10,7.645,Regular,0.066809761,Snack Foods,41.7112,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC40,16.0,Regular,0.06519584,Dairy,78.3986,OUT045,2002,,Tier 2,Supermarket Type1 +NCX41,19.0,Low Fat,0.017704532,Health and Hygiene,210.8244,OUT013,1987,High,Tier 3,Supermarket Type1 +NCQ38,,Low Fat,0.013301702,Others,105.028,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV12,,Regular,0.06057989,Baking Goods,100.5384,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE52,10.395,Regular,0.03005585,Dairy,88.1514,OUT017,2007,,Tier 2,Supermarket Type1 +FDG20,,Regular,0.125079268,Fruits and Vegetables,176.9028,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV16,,Regular,0.082529103,Frozen Foods,34.1558,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI32,17.7,Low Fat,0.175359775,Fruits and Vegetables,114.3834,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ32,10.695,Low Fat,0.0,Fruits and Vegetables,61.7536,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN39,19.35,Regular,0.065787291,Meat,169.7816,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY34,10.5,Regular,0.011043976,Snack Foods,167.2842,OUT017,2007,,Tier 2,Supermarket Type1 +FDC14,14.5,Regular,0.041241272,Canned,41.2454,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA55,17.2,Regular,0.057311381,Fruits and Vegetables,224.8088,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ50,12.8,Regular,0.132357566,Dairy,181.9608,OUT010,1998,,Tier 3,Grocery Store +DRG13,17.25,Low Fat,0.037243966,Soft Drinks,165.2526,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP01,20.75,Regular,0.06327325,Breakfast,153.1682,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG54,12.1,Low Fat,0.080257683,Household,172.7106,OUT017,2007,,Tier 2,Supermarket Type1 +FDM13,6.425,Low Fat,0.063303448,Breakfast,132.0626,OUT045,2002,,Tier 2,Supermarket Type1 +NCO18,,Low Fat,0.024531894,Household,178.7686,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW41,18.0,Low Fat,0.015437518,Health and Hygiene,156.4604,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM52,,Low Fat,0.025867549,Frozen Foods,148.1076,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCF55,6.675,Low Fat,0.021662238,Household,34.9874,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT09,15.15,Regular,0.0122633,Snack Foods,131.4284,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM19,12.65,Low Fat,0.047228313,Others,110.7202,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW12,8.315,Regular,0.0,Baking Goods,146.9444,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP15,,Low Fat,0.146972598,Meat,256.333,OUT019,1985,Small,Tier 1,Grocery Store +FDK36,7.09,Low Fat,0.007229947,Baking Goods,48.3034,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ25,15.7,Regular,0.027611824,Canned,171.779,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCW06,16.2,Low Fat,0.050418702,Household,193.4162,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW60,5.44,Regular,0.017061949,Baking Goods,178.437,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC49,8.67,Low Fat,0.065382126,Soft Drinks,145.2128,OUT013,1987,High,Tier 3,Supermarket Type1 +NCT17,10.8,Low Fat,0.041857932,Health and Hygiene,189.6214,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN06,8.39,Low Fat,0.120988121,Household,164.7868,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC45,17.0,Low Fat,0.135620265,Fruits and Vegetables,170.8106,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ47,,Low Fat,0.07747657,Hard Drinks,171.408,OUT019,1985,Small,Tier 1,Grocery Store +NCF06,6.235,Low Fat,0.020239317,Household,258.5962,OUT045,2002,,Tier 2,Supermarket Type1 +FDE21,12.8,Low Fat,0.038404703,Fruits and Vegetables,117.1492,OUT010,1998,,Tier 3,Grocery Store +DRG27,8.895,Low Fat,0.105023222,Dairy,40.6138,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW40,14.0,Regular,0.105308924,Frozen Foods,141.6812,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO53,16.2,Low Fat,0.175184487,Health and Hygiene,184.9608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE23,17.6,Regular,0.053263687,Starchy Foods,44.606,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ16,19.7,Low Fat,0.041738399,Frozen Foods,108.6912,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS26,20.35,Low Fat,0.089650666,Dairy,259.8594,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ13,7.84,Regular,0.256919126,Canned,48.035,OUT010,1998,,Tier 3,Grocery Store +FDS14,7.285,Low Fat,0.050041563,Dairy,156.3288,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC10,9.8,Regular,0.073025471,Snack Foods,119.0098,OUT045,2002,,Tier 2,Supermarket Type1 +FDY16,18.35,Regular,0.0,Frozen Foods,185.0266,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ20,20.7,Regular,0.100155997,Fruits and Vegetables,125.7388,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV43,16.0,Low Fat,0.076841095,Fruits and Vegetables,42.6086,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ32,,Regular,0.037948091,Fruits and Vegetables,105.9964,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR23,15.85,Low Fat,0.081787519,Breads,174.937,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN24,14.1,Low Fat,0.113246012,Baking Goods,52.7956,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE34,,Low Fat,0.107368929,Snack Foods,183.0634,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU31,10.5,Regular,0.024970259,Fruits and Vegetables,218.1508,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW33,9.395,Low Fat,0.099524363,Snack Foods,107.328,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU26,16.7,Regular,0.042618956,Dairy,117.3782,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE20,,Regular,0.005503734,Fruits and Vegetables,169.779,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW05,20.25,Low Fat,0.148044603,Health and Hygiene,105.9938,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB22,8.02,Low Fat,0.0,Snack Foods,151.7998,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO56,10.195,Regular,0.044982556,Fruits and Vegetables,116.1808,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA19,,Low Fat,0.054860542,Fruits and Vegetables,129.7994,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRI39,13.8,Low Fat,0.097258937,Dairy,55.993,OUT045,2002,,Tier 2,Supermarket Type1 +FDH52,9.42,Regular,0.044081944,Frozen Foods,60.1194,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ50,12.8,Regular,0.079061378,Dairy,182.8608,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN42,20.25,Low Fat,0.014219927,Household,147.4418,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB53,13.35,Low Fat,0.139336364,Frozen Foods,148.5392,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG11,6.385,Low Fat,0.084312514,Hard Drinks,109.1596,OUT017,2007,,Tier 2,Supermarket Type1 +DRK11,,low fat,0.010712295,Hard Drinks,148.9392,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ60,6.195,Regular,0.109993108,Baking Goods,122.3098,OUT017,2007,,Tier 2,Supermarket Type1 +FDT36,12.3,Low Fat,0.111904005,Baking Goods,33.9874,OUT017,2007,,Tier 2,Supermarket Type1 +DRG25,10.5,Low Fat,0.019127291,Soft Drinks,185.424,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ23,18.35,Low Fat,0.041668881,Hard Drinks,190.4872,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG05,11.0,Regular,0.08783053,Frozen Foods,158.263,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK06,5.03,Low Fat,0.008681751,Household,121.1756,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU52,7.56,Low Fat,0.064131575,Frozen Foods,154.563,OUT017,2007,,Tier 2,Supermarket Type1 +FDW07,18.0,Regular,0.1432701,Fruits and Vegetables,88.0514,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM17,7.93,Low Fat,0.071280135,Health and Hygiene,44.8086,OUT045,2002,,Tier 2,Supermarket Type1 +FDA22,7.435,Low Fat,0.084623634,Starchy Foods,168.6158,OUT045,2002,,Tier 2,Supermarket Type1 +NCA41,16.75,Low Fat,0.032719454,Health and Hygiene,194.2162,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF38,11.8,Regular,0.026353021,Canned,41.6138,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH52,9.42,Regular,0.043903102,Frozen Foods,62.1194,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY58,,low fat,0.069892283,Snack Foods,226.3694,OUT019,1985,Small,Tier 1,Grocery Store +FDZ16,16.85,Regular,0.160180036,Frozen Foods,195.5478,OUT045,2002,,Tier 2,Supermarket Type1 +NCM18,13.0,Low Fat,0.083310458,Household,61.7194,OUT017,2007,,Tier 2,Supermarket Type1 +FDA22,7.435,Low Fat,0.084796386,Starchy Foods,166.7158,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCJ43,6.635,Low Fat,0.027064283,Household,176.3396,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI34,,Regular,0.084723678,Snack Foods,230.6668,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG56,13.3,Regular,0.071452562,Fruits and Vegetables,61.0536,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS34,19.35,Regular,0.076759076,Snack Foods,115.6518,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC01,5.92,Regular,0.019196373,Soft Drinks,50.3692,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ04,6.4,Low Fat,0.08473758,Frozen Foods,39.3796,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK04,7.36,Low Fat,0.052302143,Frozen Foods,57.9588,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT51,11.65,Regular,0.010935766,Meat,110.0544,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV26,20.25,Regular,0.076591246,Dairy,196.3794,OUT017,2007,,Tier 2,Supermarket Type1 +FDS04,10.195,reg,0.14689096,Frozen Foods,141.2838,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW43,20.1,Regular,0.022516587,Fruits and Vegetables,228.2036,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ28,14.0,Regular,0.101142513,Frozen Foods,154.0656,OUT010,1998,,Tier 3,Grocery Store +NCK06,5.03,Low Fat,0.008695437,Household,121.1756,OUT017,2007,,Tier 2,Supermarket Type1 +FDS23,4.635,Low Fat,0.141463034,Breads,130.0994,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ36,,Regular,0.115178912,Baking Goods,187.824,OUT019,1985,Small,Tier 1,Grocery Store +FDE56,17.25,Regular,0.159843921,Fruits and Vegetables,62.2194,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW10,,Low Fat,0.0,Snack Foods,175.037,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCN14,19.1,Low Fat,0.092104198,Others,185.6608,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ18,15.75,Low Fat,0.135346732,Household,98.37,OUT045,2002,,Tier 2,Supermarket Type1 +FDW08,12.1,Low Fat,0.0,Fruits and Vegetables,106.528,OUT017,2007,,Tier 2,Supermarket Type1 +FDU43,19.35,Regular,0.058032403,Fruits and Vegetables,236.5564,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR33,7.31,Low Fat,0.044839188,Snack Foods,108.257,OUT010,1998,,Tier 3,Grocery Store +FDM24,6.135,Regular,0.132777749,Baking Goods,150.7366,OUT010,1998,,Tier 3,Grocery Store +NCZ05,8.485,Low Fat,0.058132207,Health and Hygiene,102.899,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCV41,14.35,Low Fat,0.017035555,Health and Hygiene,112.5228,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV11,9.1,Regular,0.082000475,Breads,173.9054,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY05,13.5,Low Fat,0.054979611,Health and Hygiene,36.9874,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV44,8.365,Regular,0.040006739,Fruits and Vegetables,188.6188,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW32,18.35,Regular,0.094443441,Fruits and Vegetables,84.3882,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCU18,,Low Fat,0.055569647,Household,143.0496,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCC43,7.39,Low Fat,0.0,Household,251.5066,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW19,12.35,Regular,0.038468382,Fruits and Vegetables,110.957,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN31,11.5,Low Fat,0.072867754,Fruits and Vegetables,191.653,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI48,11.85,Regular,0.055831398,Baking Goods,50.5666,OUT045,2002,,Tier 2,Supermarket Type1 +FDS24,20.85,Regular,0.062576446,Baking Goods,89.9514,OUT017,2007,,Tier 2,Supermarket Type1 +FDF46,7.07,Low Fat,0.0,Snack Foods,115.1834,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG23,8.88,Low Fat,0.087272074,Hard Drinks,151.9682,OUT017,2007,,Tier 2,Supermarket Type1 +FDG14,9.0,Regular,0.050706432,Canned,150.9024,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY30,20.25,Low Fat,0.025993608,Household,179.3976,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO28,5.765,Low Fat,0.0,Frozen Foods,122.1098,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRD24,13.85,Low Fat,0.030789262,Soft Drinks,142.5154,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI33,16.5,Low Fat,0.028463,Snack Foods,89.9146,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN32,17.5,Low Fat,0.015560368,Fruits and Vegetables,185.6266,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR16,5.845,Regular,0.105230981,Frozen Foods,213.0218,OUT045,2002,,Tier 2,Supermarket Type1 +FDF26,6.825,Regular,0.046634759,Canned,153.5998,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN29,15.2,Low Fat,0.012165821,Health and Hygiene,48.9034,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE20,11.35,Regular,0.005541732,Fruits and Vegetables,168.679,OUT045,2002,,Tier 2,Supermarket Type1 +FDA46,13.6,Low Fat,0.117635456,Snack Foods,192.5136,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU28,19.2,Regular,0.094108819,Frozen Foods,188.1214,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ48,14.3,Regular,0.034481025,Baking Goods,99.4726,OUT045,2002,,Tier 2,Supermarket Type1 +FDV36,18.7,Low Fat,0.0,Baking Goods,128.102,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR14,11.65,Low Fat,0.174758034,Dairy,52.7298,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP23,6.71,Low Fat,0.035788153,Breads,216.7166,OUT017,2007,,Tier 2,Supermarket Type1 +FDP56,8.185,Low Fat,0.046445455,Fruits and Vegetables,51.0692,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK48,7.445,Low Fat,0.062988626,Baking Goods,76.1354,OUT010,1998,,Tier 3,Grocery Store +FDR48,11.65,Low Fat,0.131504228,Baking Goods,152.5024,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCY29,13.65,Low Fat,0.077354192,Health and Hygiene,57.293,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM22,14.0,Regular,0.042128684,Snack Foods,53.264,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ01,6.135,Low Fat,0.114936679,Soft Drinks,162.7236,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ43,11.0,Regular,0.057174261,Fruits and Vegetables,244.3512,OUT045,2002,,Tier 2,Supermarket Type1 +FDV03,17.6,Low Fat,0.058080284,Meat,154.5314,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX11,,Regular,0.106235129,Baking Goods,181.7634,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA41,,Low Fat,0.032428906,Health and Hygiene,193.9162,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE38,6.52,Low Fat,0.044859477,Canned,167.0842,OUT017,2007,,Tier 2,Supermarket Type1 +FDI27,8.71,Regular,0.046173643,Dairy,45.3744,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN32,17.5,Low Fat,0.015547419,Fruits and Vegetables,183.3266,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN43,12.15,Low Fat,0.006797978,Others,121.373,OUT017,2007,,Tier 2,Supermarket Type1 +FDB47,,Low Fat,0.071083489,Snack Foods,207.4612,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV03,17.6,Low Fat,0.058419856,Meat,155.4314,OUT017,2007,,Tier 2,Supermarket Type1 +NCN30,16.35,LF,0.017027667,Household,98.241,OUT045,2002,,Tier 2,Supermarket Type1 +NCV54,11.1,Low Fat,0.05541758,Household,120.5124,OUT010,1998,,Tier 3,Grocery Store +FDV07,9.5,Low Fat,0.031256911,Fruits and Vegetables,109.9228,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP07,18.2,Low Fat,0.090041548,Fruits and Vegetables,198.211,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK48,7.445,Low Fat,0.037785521,Baking Goods,73.3354,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM15,,Regular,0.100537777,Meat,151.3366,OUT019,1985,Small,Tier 1,Grocery Store +FDY19,,Low Fat,0.041164623,Fruits and Vegetables,117.7466,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK46,9.6,Low Fat,0.051467395,Snack Foods,259.662,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY11,6.71,Regular,0.0296204,Baking Goods,66.1142,OUT045,2002,,Tier 2,Supermarket Type1 +FDH09,12.6,Low Fat,0.056077574,Seafood,52.1982,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO08,,Regular,0.053514971,Fruits and Vegetables,165.6526,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU14,17.75,Low Fat,0.034723727,Dairy,250.475,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD22,,Low Fat,0.099167136,Snack Foods,113.1544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM27,12.35,Regular,0.159365721,Meat,157.2946,OUT017,2007,,Tier 2,Supermarket Type1 +FDL02,,Regular,0.103579347,Canned,106.3622,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA17,20.6,Low Fat,0.0,Health and Hygiene,147.5392,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE38,,Low Fat,0.078101381,Canned,164.8842,OUT019,1985,Small,Tier 1,Grocery Store +NCG07,12.3,Low Fat,0.052583676,Household,188.653,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRC27,13.8,Low Fat,0.058054117,Dairy,247.1802,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA27,20.35,Regular,0.030921784,Dairy,255.2672,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW40,14.0,Regular,0.105358689,Frozen Foods,142.1812,OUT045,2002,,Tier 2,Supermarket Type1 +DRI11,8.26,Low Fat,0.034375656,Hard Drinks,115.3834,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN50,16.85,Regular,0.026519826,Canned,94.712,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR12,12.6,Regular,0.031534752,Baking Goods,171.1764,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT34,,Low Fat,0.173505976,Snack Foods,104.7964,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW11,12.6,Low Fat,0.048772858,Breads,61.4194,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCO30,,Low Fat,0.015648745,Household,183.7608,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ34,6.695,Low Fat,0.076307719,Starchy Foods,194.282,OUT017,2007,,Tier 2,Supermarket Type1 +FDU45,15.6,Regular,0.035706979,Snack Foods,112.9518,OUT017,2007,,Tier 2,Supermarket Type1 +NCD42,16.5,Low Fat,0.012635456,Health and Hygiene,37.1506,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX25,16.7,LF,0.102262749,Canned,181.6292,OUT045,2002,,Tier 2,Supermarket Type1 +NCR29,7.565,low fat,0.054640876,Health and Hygiene,56.393,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX43,,Low Fat,0.0,Fruits and Vegetables,168.15,OUT019,1985,Small,Tier 1,Grocery Store +FDB04,11.35,Regular,0.105827874,Dairy,86.6856,OUT010,1998,,Tier 3,Grocery Store +FDR49,,Low Fat,0.138554192,Canned,46.4376,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS39,6.895,Low Fat,0.022552069,Meat,141.6812,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW58,20.75,Low Fat,0.007568411,Snack Foods,105.8622,OUT045,2002,,Tier 2,Supermarket Type1 +FDG22,,reg,0.072453062,Snack Foods,37.719,OUT019,1985,Small,Tier 1,Grocery Store +FDG31,12.15,Low Fat,0.038110748,Meat,62.6826,OUT017,2007,,Tier 2,Supermarket Type1 +NCV53,,Low Fat,0.0,Health and Hygiene,240.288,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRJ37,10.8,Low Fat,0.061089829,Soft Drinks,150.4024,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV07,9.5,Low Fat,0.031277029,Fruits and Vegetables,110.1228,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW52,14.0,Regular,0.037675391,Frozen Foods,166.0526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT15,12.15,Regular,0.042768081,Meat,184.795,OUT045,2002,,Tier 2,Supermarket Type1 +FDD02,16.6,Low Fat,0.050495866,Canned,118.7124,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM16,8.155,Regular,0.033549054,Frozen Foods,73.7354,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCE55,8.92,Low Fat,0.129928494,Household,175.737,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB57,20.25,Regular,0.018881709,Fruits and Vegetables,222.0772,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ04,6.4,Low Fat,0.084683076,Frozen Foods,42.9796,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ47,,Regular,0.294472634,Breads,34.1874,OUT019,1985,Small,Tier 1,Grocery Store +FDY14,,Low Fat,0.122631339,Dairy,263.9226,OUT019,1985,Small,Tier 1,Grocery Store +DRK37,5.0,Low Fat,0.044253583,Soft Drinks,188.553,OUT017,2007,,Tier 2,Supermarket Type1 +FDO25,6.3,Low Fat,0.128169935,Canned,209.827,OUT017,2007,,Tier 2,Supermarket Type1 +FDL57,15.1,Regular,0.067076811,Snack Foods,260.0304,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCK29,5.615,Low Fat,0.126281351,Health and Hygiene,123.373,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK46,,Low Fat,0.0,Snack Foods,260.762,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCB43,20.2,Low Fat,0.167232734,Household,185.8898,OUT010,1998,,Tier 3,Grocery Store +DRE01,,Low Fat,0.166345741,Soft Drinks,241.5512,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC46,17.7,Low Fat,0.117017229,Snack Foods,185.1266,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ23,6.55,Low Fat,0.024575567,Breads,104.3332,OUT045,2002,,Tier 2,Supermarket Type1 +FDX38,10.5,Regular,0.048281966,Dairy,49.6376,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG60,20.35,Low Fat,0.06094699,Baking Goods,236.2616,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW55,12.6,Regular,0.022094166,Fruits and Vegetables,247.4092,OUT017,2007,,Tier 2,Supermarket Type1 +FDP39,12.65,Low Fat,0.06936719,Meat,50.0324,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB20,7.72,Low Fat,0.052192414,Fruits and Vegetables,78.7986,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV21,11.5,Low Fat,0.17205066,Snack Foods,125.7704,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ02,6.905,Regular,0.038115681,Dairy,96.7726,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP19,,low fat,0.172675804,Fruits and Vegetables,128.9652,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA38,5.44,Low Fat,0.025475101,Dairy,242.3538,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH22,6.405,LF,0.136577368,Snack Foods,126.7678,OUT045,2002,,Tier 2,Supermarket Type1 +DRM11,6.57,Low Fat,0.066203569,Hard Drinks,261.7278,OUT045,2002,,Tier 2,Supermarket Type1 +FDO12,,Low Fat,0.0,Baking Goods,194.9452,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT14,10.695,Regular,0.127925684,Dairy,120.144,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW34,9.6,Low Fat,0.059552178,Snack Foods,243.417,OUT010,1998,,Tier 3,Grocery Store +FDG04,,Low Fat,0.006033353,Frozen Foods,188.3898,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW59,13.15,Low Fat,0.020800301,Breads,84.9566,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR33,7.31,Low Fat,0.026898064,Snack Foods,109.057,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP32,6.65,Low Fat,0.0,Fruits and Vegetables,128.8678,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL13,,Regular,0.056045843,Breakfast,232.83,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD22,10.0,Low Fat,0.099566768,Snack Foods,113.5544,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV40,,Low Fat,0.0,Frozen Foods,71.9038,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCD55,14.0,LF,0.024331179,Household,41.5454,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ20,8.325,Low Fat,0.049853714,Fruits and Vegetables,41.6138,OUT010,1998,,Tier 3,Grocery Store +FDD28,10.695,Low Fat,0.053404955,Frozen Foods,57.9904,OUT045,2002,,Tier 2,Supermarket Type1 +FDC39,7.405,Low Fat,0.159518279,Dairy,208.8296,OUT045,2002,,Tier 2,Supermarket Type1 +NCR17,9.8,Low Fat,0.024421227,Health and Hygiene,117.3492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRO35,13.85,Low Fat,0.034711182,Hard Drinks,116.3492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF40,20.25,Regular,0.022547134,Dairy,249.5092,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR31,6.46,Regular,0.049363153,Fruits and Vegetables,144.6102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCQ41,14.8,Low Fat,0.0,Health and Hygiene,195.5794,OUT017,2007,,Tier 2,Supermarket Type1 +FDP38,10.1,LF,0.032102094,Canned,49.9008,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCU54,,Low Fat,0.098144795,Household,209.627,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG22,17.6,Regular,0.041549725,Snack Foods,34.919,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRK59,8.895,Low Fat,0.075387039,Hard Drinks,234.4616,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC37,15.5,Low Fat,0.032873353,Baking Goods,106.2938,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO42,21.25,Low Fat,0.024635077,Household,146.1102,OUT013,1987,High,Tier 3,Supermarket Type1 +NCT42,5.88,Low Fat,0.025028093,Household,150.4392,OUT017,2007,,Tier 2,Supermarket Type1 +FDX27,20.7,Regular,0.0,Dairy,93.8436,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV40,17.35,Low Fat,0.014751632,Frozen Foods,74.2038,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT45,,low fat,0.0570359,Snack Foods,54.5956,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS47,,LF,0.225662275,Breads,87.5856,OUT019,1985,Small,Tier 1,Grocery Store +FDR45,10.8,Low Fat,0.028937816,Snack Foods,238.2222,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB03,17.75,Regular,0.157149885,Dairy,239.5538,OUT045,2002,,Tier 2,Supermarket Type1 +FDO49,10.6,Regular,0.033045919,Breakfast,52.3008,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU60,,Regular,0.059610971,Baking Goods,167.3132,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB26,14.0,Regular,0.031394866,Canned,51.964,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB46,10.5,Regular,0.094294233,Snack Foods,213.7244,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ37,,Low Fat,0.156283906,Breakfast,195.3478,OUT019,1985,Small,Tier 1,Grocery Store +FDN03,9.8,Regular,0.01517532,Meat,249.9408,OUT017,2007,,Tier 2,Supermarket Type1 +NCX30,16.7,Low Fat,0.026674614,Household,248.8776,OUT045,2002,,Tier 2,Supermarket Type1 +FDK32,,Regular,0.085749906,Fruits and Vegetables,153.4682,OUT019,1985,Small,Tier 1,Grocery Store +DRM47,9.3,Low Fat,0.043749257,Hard Drinks,192.1846,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO02,11.15,Low Fat,0.073368159,Others,67.2142,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP04,15.35,Low Fat,0.013801277,Frozen Foods,64.3168,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO43,5.5,Low Fat,0.047171435,Others,100.9016,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD59,10.5,Regular,0.066125732,Starchy Foods,81.196,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ10,12.85,Low Fat,0.033366906,Snack Foods,171.7422,OUT017,2007,,Tier 2,Supermarket Type1 +FDW45,18.0,Low Fat,0.039003613,Snack Foods,148.1418,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK30,14.85,Low Fat,0.061073374,Household,255.5698,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU31,10.5,Regular,0.025092859,Fruits and Vegetables,215.1508,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCQ17,,Low Fat,0.20473381,Health and Hygiene,154.563,OUT019,1985,Small,Tier 1,Grocery Store +FDN01,8.895,Low Fat,0.072808291,Breakfast,175.637,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ19,6.425,Low Fat,0.093600196,Fruits and Vegetables,174.8712,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG37,16.2,Low Fat,0.019488044,Soft Drinks,155.7972,OUT017,2007,,Tier 2,Supermarket Type1 +FDE32,20.7,Low Fat,0.048857794,Fruits and Vegetables,37.8506,OUT045,2002,,Tier 2,Supermarket Type1 +FDO34,17.7,Low Fat,0.029985483,Snack Foods,167.7816,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM04,,Regular,0.0,Frozen Foods,50.6666,OUT019,1985,Small,Tier 1,Grocery Store +FDZ25,15.7,Regular,0.027659984,Canned,170.679,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU08,10.3,Low Fat,0.027357885,Fruits and Vegetables,99.1042,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW30,5.21,Low Fat,0.011032225,Household,258.7962,OUT045,2002,,Tier 2,Supermarket Type1 +NCM18,13.0,Low Fat,0.082772931,Household,61.0194,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS22,16.85,Regular,0.023150021,Snack Foods,42.1428,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCH18,9.3,Low Fat,0.044913852,Household,245.1802,OUT017,2007,,Tier 2,Supermarket Type1 +FDC23,18.0,Low Fat,0.017891302,Starchy Foods,178.4686,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY46,18.6,Low Fat,0.047850086,Snack Foods,186.3898,OUT013,1987,High,Tier 3,Supermarket Type1 +NCU06,17.6,Low Fat,0.074407062,Household,229.701,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX57,17.25,Regular,0.047362068,Snack Foods,98.3068,OUT045,2002,,Tier 2,Supermarket Type1 +FDX36,,Regular,0.127662026,Baking Goods,224.7404,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL16,12.85,Low Fat,0.168794488,Frozen Foods,46.606,OUT045,2002,,Tier 2,Supermarket Type1 +FDT16,9.895,Regular,0.08145081,Frozen Foods,260.8278,OUT010,1998,,Tier 3,Grocery Store +FDN16,12.6,Regular,0.062955703,Frozen Foods,102.499,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC03,8.575,reg,0.071846495,Dairy,196.1794,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRF60,10.8,low fat,0.052025392,Soft Drinks,238.6564,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS27,,Regular,0.012397814,Meat,195.511,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP33,18.7,LF,0.14942345,Snack Foods,255.0672,OUT010,1998,,Tier 3,Grocery Store +FDJ36,14.5,reg,0.128782548,Baking Goods,100.6332,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR42,9.105,Low Fat,0.03844986,Household,31.99,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV14,19.85,Low Fat,0.044749173,Dairy,86.2856,OUT017,2007,,Tier 2,Supermarket Type1 +NCP42,8.51,Low Fat,0.01610767,Household,195.3478,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB50,,Low Fat,0.152874661,Canned,78.7986,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCC30,,Low Fat,0.027445644,Household,177.0344,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA23,9.8,Low Fat,0.047379258,Baking Goods,101.3016,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW16,17.35,Regular,0.041708827,Frozen Foods,91.1804,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ52,17.0,Low Fat,0.199825987,Frozen Foods,247.8434,OUT010,1998,,Tier 3,Grocery Store +FDB58,10.5,Regular,0.01351745,Snack Foods,143.5154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP29,8.42,LF,0.112445562,Health and Hygiene,64.8168,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM05,6.825,Low Fat,0.059968347,Health and Hygiene,264.2226,OUT045,2002,,Tier 2,Supermarket Type1 +FDO25,6.3,low fat,0.127342972,Canned,210.927,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM54,17.7,Low Fat,0.0,Household,127.9678,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL54,12.6,Low Fat,0.0,Household,173.2054,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL39,16.1,Regular,0.106003704,Dairy,181.2318,OUT010,1998,,Tier 3,Grocery Store +FDF53,20.75,Regular,0.083947142,Frozen Foods,180.2318,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCQ42,20.35,LF,0.03926078,Household,127.9678,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF58,13.3,Low Fat,0.009573182,Snack Foods,62.551,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ04,9.31,Low Fat,0.037947917,Frozen Foods,63.751,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE26,,Low Fat,0.155837612,Canned,143.0786,OUT019,1985,Small,Tier 1,Grocery Store +FDS60,20.85,Low Fat,0.032632065,Baking Goods,179.566,OUT017,2007,,Tier 2,Supermarket Type1 +FDV58,20.85,Low Fat,0.121936216,Snack Foods,197.5452,OUT017,2007,,Tier 2,Supermarket Type1 +FDM04,9.195,Regular,0.047216172,Frozen Foods,51.4666,OUT045,2002,,Tier 2,Supermarket Type1 +FDE08,18.2,Low Fat,0.04931036,Fruits and Vegetables,146.5734,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCB43,20.2,Low Fat,0.100067654,Household,186.8898,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU11,4.785,Low Fat,0.154982791,Breads,120.7098,OUT010,1998,,Tier 3,Grocery Store +FDF22,,Low Fat,0.099503188,Snack Foods,212.5218,OUT019,1985,Small,Tier 1,Grocery Store +FDE24,14.85,LF,0.093384846,Baking Goods,141.3812,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ49,6.865,Low Fat,0.013993247,Soft Drinks,131.0652,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ53,17.6,Low Fat,0.018901751,Health and Hygiene,235.759,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCL41,12.35,Low Fat,0.041702894,Health and Hygiene,35.4216,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR22,19.35,Regular,0.018547157,Snack Foods,110.8544,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH04,6.115,Regular,0.011370822,Frozen Foods,92.0488,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH15,8.775,low fat,0.110134175,Dairy,43.4428,OUT045,2002,,Tier 2,Supermarket Type1 +FDY40,15.5,Regular,0.0,Frozen Foods,48.8692,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCI17,8.645,Low Fat,0.143395524,Health and Hygiene,98.041,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCC18,19.1,Low Fat,0.0,Household,173.8422,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY28,,Regular,0.151414173,Frozen Foods,211.7218,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB45,,Low Fat,0.021226502,Fruits and Vegetables,104.0306,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCL30,18.1,Low Fat,0.049139791,Household,126.9336,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM10,18.25,Low Fat,0.076401322,Snack Foods,212.7218,OUT017,2007,,Tier 2,Supermarket Type1 +FDH22,,Low Fat,0.135640903,Snack Foods,127.9678,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ53,9.6,Low Fat,0.024615619,Health and Hygiene,190.0214,OUT017,2007,,Tier 2,Supermarket Type1 +NCI18,18.35,Low Fat,0.014012358,Household,222.5746,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH14,,Regular,0.046581881,Canned,142.1838,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR36,,Regular,0.120997589,Baking Goods,43.6454,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW01,14.5,Low Fat,0.064190434,Canned,151.6682,OUT045,2002,,Tier 2,Supermarket Type1 +FDK02,,Low Fat,0.111681212,Canned,119.844,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ02,17.2,Regular,0.0252693,Canned,146.9418,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU55,16.2,Low Fat,0.03588139,Fruits and Vegetables,260.4278,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV18,,Low Fat,0.104736208,Household,84.825,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH14,17.1,Regular,0.046999232,Canned,138.6838,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ37,8.1,Regular,0.019808594,Canned,88.7198,OUT045,2002,,Tier 2,Supermarket Type1 +FDX49,4.615,Regular,0.101990097,Canned,232.53,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD43,8.85,LF,0.016019957,Household,104.5964,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ07,15.1,Regular,0.093813181,Fruits and Vegetables,61.3194,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK43,9.8,Low Fat,0.026835691,Meat,126.302,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR32,6.78,Regular,0.086157502,Fruits and Vegetables,229.1694,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT39,6.26,Regular,0.009859703,Meat,151.8366,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV54,11.1,Low Fat,0.033296219,Household,120.2124,OUT017,2007,,Tier 2,Supermarket Type1 +FDF38,11.8,Regular,0.026465376,Canned,41.7138,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV60,20.2,Regular,0.117361247,Baking Goods,197.511,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH44,,Regular,0.025746866,Fruits and Vegetables,145.1418,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS21,19.85,Regular,0.020876151,Snack Foods,61.2194,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL41,12.35,low fat,0.041822272,Health and Hygiene,35.6216,OUT045,2002,,Tier 2,Supermarket Type1 +FDM46,7.365,Low Fat,0.160872688,Snack Foods,94.012,OUT017,2007,,Tier 2,Supermarket Type1 +FDU27,18.6,Regular,0.171824638,Meat,49.8376,OUT045,2002,,Tier 2,Supermarket Type1 +NCJ54,9.895,Low Fat,0.060406879,Household,233.0642,OUT017,2007,,Tier 2,Supermarket Type1 +DRG51,12.1,Low Fat,0.011586629,Dairy,165.9526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCA29,,Low Fat,0.047757473,Household,170.4106,OUT019,1985,Small,Tier 1,Grocery Store +FDR47,17.85,Low Fat,0.087646045,Breads,194.3794,OUT045,2002,,Tier 2,Supermarket Type1 +NCL19,,Low Fat,0.015600318,Others,141.947,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG01,14.8,Low Fat,0.0,Soft Drinks,76.267,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG10,6.63,Regular,0.010939298,Snack Foods,57.9588,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCV05,10.1,Low Fat,0.030255476,Health and Hygiene,152.6656,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH18,,Low Fat,0.078196049,Household,243.9802,OUT019,1985,Small,Tier 1,Grocery Store +FDV14,19.85,Low Fat,0.044678741,Dairy,86.4856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ23,18.35,Low Fat,0.041661002,Hard Drinks,190.2872,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ11,9.5,Low Fat,0.085091153,Hard Drinks,187.1872,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ03,13.65,Regular,0.079232324,Dairy,185.824,OUT017,2007,,Tier 2,Supermarket Type1 +FDI27,8.71,Regular,0.076971662,Dairy,45.7744,OUT010,1998,,Tier 3,Grocery Store +FDJ14,10.3,Regular,0.050274442,Canned,81.796,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU32,8.785,Low Fat,0.026114508,Fruits and Vegetables,120.5414,OUT017,2007,,Tier 2,Supermarket Type1 +FDD47,,Regular,0.141721145,Starchy Foods,171.3448,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRF36,16.1,Low Fat,0.02357284,Soft Drinks,190.3846,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM21,20.2,LF,0.064364078,Snack Foods,258.3646,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV10,7.645,Regular,0.066977783,Snack Foods,43.0112,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH60,19.7,Regular,0.081065919,Baking Goods,194.711,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX47,6.55,Regular,0.057920576,Breads,156.2288,OUT010,1998,,Tier 3,Grocery Store +FDT19,,reg,0.253947823,Fruits and Vegetables,174.608,OUT019,1985,Small,Tier 1,Grocery Store +FDO11,8.0,Regular,0.030326275,Breads,251.0092,OUT045,2002,,Tier 2,Supermarket Type1 +FDH24,,Low Fat,0.021327353,Baking Goods,157.8288,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL02,20.0,Regular,0.104507367,Canned,107.6622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB02,9.695,Regular,0.02920962,Canned,176.037,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA43,10.895,Low Fat,0.064675749,Fruits and Vegetables,195.5794,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG52,13.65,Low Fat,0.065763945,Frozen Foods,46.4402,OUT045,2002,,Tier 2,Supermarket Type1 +DRC12,17.85,Low Fat,0.037795394,Soft Drinks,189.5188,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY37,17.0,Regular,0.026677105,Canned,142.047,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCU18,15.1,Low Fat,0.0559533,Household,141.5496,OUT045,2002,,Tier 2,Supermarket Type1 +FDU09,7.71,Regular,0.066584547,Snack Foods,56.0956,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ25,,Low Fat,0.149838383,Soft Drinks,49.3692,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE12,4.59,Low Fat,0.071068888,Soft Drinks,113.086,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL47,19.7,Low Fat,0.038955892,Hard Drinks,125.1362,OUT017,2007,,Tier 2,Supermarket Type1 +DRK01,7.63,low fat,0.061064307,Soft Drinks,95.9436,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC22,,Regular,0.238868509,Snack Foods,191.382,OUT019,1985,Small,Tier 1,Grocery Store +FDG44,6.13,Low Fat,0.10210591,Fruits and Vegetables,52.9298,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW04,8.985,Regular,0.057816167,Frozen Foods,130.331,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK09,15.2,Low Fat,0.09190597,Snack Foods,227.9352,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCN43,12.15,Low Fat,0.006758464,Others,121.973,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG04,13.1,Low Fat,0.006072138,Frozen Foods,187.3898,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH32,12.8,Low Fat,0.127308909,Fruits and Vegetables,94.741,OUT010,1998,,Tier 3,Grocery Store +DRI47,14.7,Low Fat,0.021038512,Hard Drinks,145.7128,OUT017,2007,,Tier 2,Supermarket Type1 +DRE15,13.35,Low Fat,0.017770596,Dairy,75.3012,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY11,6.71,Regular,0.029554862,Baking Goods,67.8142,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO60,20.0,Low Fat,0.034422963,Baking Goods,44.4086,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ20,8.325,Low Fat,0.029906169,Fruits and Vegetables,41.1138,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO57,,Low Fat,0.108183728,Snack Foods,161.2578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT14,,Regular,0.223633668,Dairy,119.944,OUT019,1985,Small,Tier 1,Grocery Store +FDA57,18.85,Low Fat,0.039705236,Snack Foods,40.348,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRN35,8.01,Low Fat,0.070644938,Hard Drinks,35.8532,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ03,12.35,Regular,0.072394912,Dairy,50.3692,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX28,6.325,Low Fat,0.12588618,Frozen Foods,101.2042,OUT017,2007,,Tier 2,Supermarket Type1 +DRE25,15.35,Low Fat,0.073431813,Soft Drinks,91.312,OUT045,2002,,Tier 2,Supermarket Type1 +FDR09,18.25,Low Fat,0.077724599,Snack Foods,260.2962,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB23,19.2,Regular,0.005587545,Starchy Foods,226.3062,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO08,11.1,Regular,0.053884439,Fruits and Vegetables,163.8526,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ23,6.55,Low Fat,0.024563959,Breads,100.9332,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW04,8.985,Regular,0.057778979,Frozen Foods,130.331,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK13,11.8,Low Fat,0.192766917,Soft Drinks,198.1084,OUT010,1998,,Tier 3,Grocery Store +NCL17,,LF,0.067451486,Health and Hygiene,142.0812,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY21,15.1,Low Fat,0.173448501,Snack Foods,194.611,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ38,,Regular,0.0,Canned,189.053,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA37,,Regular,0.096694919,Canned,126.5046,OUT019,1985,Small,Tier 1,Grocery Store +FDV43,16.0,Low Fat,0.076791671,Fruits and Vegetables,44.5086,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL36,15.1,Low Fat,0.076075485,Baking Goods,91.683,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD53,16.2,Low Fat,0.044312181,Frozen Foods,40.9454,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ19,6.425,Low Fat,0.156424341,Fruits and Vegetables,176.3712,OUT010,1998,,Tier 3,Grocery Store +FDV21,11.5,Low Fat,0.171429906,Snack Foods,125.8704,OUT045,2002,,Tier 2,Supermarket Type1 +NCL54,12.6,Low Fat,0.0,Household,173.2054,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRI47,,Low Fat,0.020818872,Hard Drinks,144.4128,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG03,14.5,Low Fat,0.062082947,Dairy,155.7998,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG21,17.35,Regular,0.146178155,Seafood,149.905,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW03,5.63,Regular,0.024641247,Meat,104.6306,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCI55,18.6,Low Fat,0.012653565,Household,121.2414,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC36,,Regular,0.078762707,Soft Drinks,175.6054,OUT019,1985,Small,Tier 1,Grocery Store +FDH22,6.405,LF,0.13707192,Snack Foods,128.5678,OUT017,2007,,Tier 2,Supermarket Type1 +FDV20,20.2,Regular,0.059922682,Fruits and Vegetables,127.8678,OUT045,2002,,Tier 2,Supermarket Type1 +NCU41,,Low Fat,0.051802741,Health and Hygiene,192.8846,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN46,,Regular,0.143931094,Snack Foods,104.3332,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK50,7.96,Low Fat,0.028420724,Canned,161.8894,OUT045,2002,,Tier 2,Supermarket Type1 +NCA05,,Low Fat,0.025008936,Health and Hygiene,147.6734,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH01,17.5,Low Fat,0.098302848,Soft Drinks,173.4738,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT08,13.65,Low Fat,0.049418994,Fruits and Vegetables,149.505,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM08,10.1,Regular,0.053802487,Fruits and Vegetables,224.2088,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ07,15.1,Regular,0.093873561,Fruits and Vegetables,60.5194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS22,16.85,Regular,0.02328537,Snack Foods,45.4428,OUT017,2007,,Tier 2,Supermarket Type1 +FDV35,,Low Fat,0.127585158,Breads,156.5314,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI28,14.3,Low Fat,0.044057131,Frozen Foods,77.9302,OUT010,1998,,Tier 3,Grocery Store +FDW58,,Low Fat,0.007516517,Snack Foods,107.6622,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT52,9.695,Regular,0.047525766,Frozen Foods,245.2144,OUT045,2002,,Tier 2,Supermarket Type1 +FDY34,10.5,Regular,0.010981858,Snack Foods,164.1842,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR10,17.6,Low Fat,0.010039894,Snack Foods,160.6552,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK57,10.195,Low Fat,0.080747059,Snack Foods,120.544,OUT017,2007,,Tier 2,Supermarket Type1 +FDR02,,Low Fat,0.021958822,Dairy,109.2886,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX49,4.615,Regular,0.101831776,Canned,234.03,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ20,8.325,Low Fat,0.029784839,Fruits and Vegetables,40.4138,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRK23,8.395,Low Fat,0.072122618,Hard Drinks,252.104,OUT045,2002,,Tier 2,Supermarket Type1 +NCW06,16.2,Low Fat,0.050340436,Household,191.6162,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR31,6.46,Regular,0.04944097,Fruits and Vegetables,146.4102,OUT017,2007,,Tier 2,Supermarket Type1 +NCE43,12.5,Low Fat,0.103356186,Household,168.9448,OUT013,1987,High,Tier 3,Supermarket Type1 +DRO59,,Low Fat,0.053892008,Hard Drinks,76.6012,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN09,14.15,Low Fat,0.03492891,Snack Foods,244.4828,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR11,10.5,Regular,0.142538224,Breads,161.1578,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO57,20.75,Low Fat,0.108619696,Snack Foods,161.9578,OUT013,1987,High,Tier 3,Supermarket Type1 +NCX18,14.15,Low Fat,0.008843726,Household,196.711,OUT017,2007,,Tier 2,Supermarket Type1 +FDB05,5.155,Low Fat,0.083537256,Frozen Foods,248.8776,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ08,15.7,Regular,0.019007466,Fruits and Vegetables,60.3536,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCG43,20.2,Low Fat,0.074225409,Household,94.0462,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ56,8.985,Low Fat,0.183250395,Fruits and Vegetables,101.87,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA13,15.85,Low Fat,0.131484879,Canned,35.9506,OUT010,1998,,Tier 3,Grocery Store +FDO56,10.195,Regular,0.045236996,Fruits and Vegetables,116.3808,OUT017,2007,,Tier 2,Supermarket Type1 +FDB37,20.25,Regular,0.0,Baking Goods,240.4538,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ02,6.905,Regular,0.038302823,Dairy,96.6726,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ24,15.7,Low Fat,0.073666699,Baking Goods,249.9724,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM16,8.155,Regular,0.033527475,Frozen Foods,74.0354,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU35,6.44,Low Fat,0.079338525,Breads,99.47,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT35,19.85,Regular,0.081439977,Breads,168.9816,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCX30,16.7,Low Fat,0.026662015,Household,247.5776,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG04,13.1,Low Fat,0.006097005,Frozen Foods,187.2898,OUT017,2007,,Tier 2,Supermarket Type1 +FDI12,9.395,Regular,0.100379956,Baking Goods,86.2856,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE35,7.06,Regular,0.043892097,Starchy Foods,60.0904,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP14,,Low Fat,0.109755674,Household,106.0306,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCY53,20.0,Low Fat,0.058599942,Health and Hygiene,110.1544,OUT045,2002,,Tier 2,Supermarket Type1 +FDP49,9.0,Regular,0.069479757,Breakfast,55.1614,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ04,6.4,Low Fat,0.085233007,Frozen Foods,42.2796,OUT017,2007,,Tier 2,Supermarket Type1 +FDM39,6.42,Low Fat,0.053460551,Dairy,178.9002,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO58,,Low Fat,0.06929452,Snack Foods,162.5526,OUT019,1985,Small,Tier 1,Grocery Store +FDC56,7.72,Low Fat,0.122208091,Fruits and Vegetables,119.344,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ54,17.7,Low Fat,0.012542375,Household,167.4474,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV10,,Regular,0.066383024,Snack Foods,42.6112,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCK17,11.0,Low Fat,0.037894845,Health and Hygiene,40.348,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCF55,,Low Fat,0.021561415,Household,36.4874,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV33,9.6,Regular,0.027320856,Snack Foods,259.8304,OUT013,1987,High,Tier 3,Supermarket Type1 +NCH29,,Low Fat,0.060359181,Health and Hygiene,96.2726,OUT019,1985,Small,Tier 1,Grocery Store +FDA37,,Regular,0.054959317,Canned,125.5046,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH46,6.935,Regular,0.041450453,Snack Foods,101.9332,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS25,6.885,Regular,0.13998208,Canned,110.6228,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH04,,Regular,0.011317898,Frozen Foods,89.7488,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX52,11.5,Regular,0.042002566,Frozen Foods,191.382,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCD42,16.5,Low Fat,0.012709331,Health and Hygiene,37.1506,OUT017,2007,,Tier 2,Supermarket Type1 +FDW47,15.0,Low Fat,0.046637544,Breads,121.9414,OUT017,2007,,Tier 2,Supermarket Type1 +FDL25,,Regular,0.130290904,Breakfast,92.9804,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCJ06,20.1,Low Fat,0.05800138,Household,120.3782,OUT010,1998,,Tier 3,Grocery Store +FDY09,15.6,Low Fat,0.025179178,Snack Foods,173.7054,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS40,15.35,Low Fat,0.0,Frozen Foods,37.219,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH41,9.0,Low Fat,0.082475411,Frozen Foods,215.1534,OUT017,2007,,Tier 2,Supermarket Type1 +FDG38,8.975,Regular,0.05271917,Canned,84.9224,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU03,,Regular,0.091134452,Meat,180.6292,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV20,20.2,Regular,0.059801403,Fruits and Vegetables,127.9678,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRB13,6.115,Regular,0.007058626,Soft Drinks,190.653,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ30,7.725,Low Fat,0.029048089,Household,120.2414,OUT013,1987,High,Tier 3,Supermarket Type1 +NCH06,12.3,Low Fat,0.076490678,Household,245.146,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU50,5.75,Regular,0.0,Dairy,112.8176,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO42,,Low Fat,0.043168763,Household,145.2102,OUT019,1985,Small,Tier 1,Grocery Store +FDW09,13.65,Regular,0.026026406,Snack Foods,80.0302,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH04,6.115,Regular,0.011363508,Frozen Foods,90.6488,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC21,14.6,Regular,0.043045942,Fruits and Vegetables,107.7254,OUT045,2002,,Tier 2,Supermarket Type1 +FDL21,15.85,Regular,0.007157526,Snack Foods,40.448,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM46,7.365,Low Fat,0.267753377,Snack Foods,93.612,OUT010,1998,,Tier 3,Grocery Store +FDT22,,Low Fat,0.196267755,Snack Foods,60.422,OUT019,1985,Small,Tier 1,Grocery Store +FDB28,6.615,Low Fat,0.093367723,Dairy,198.4426,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI12,9.395,Regular,0.100807923,Baking Goods,88.4856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA28,16.1,Regular,0.047898827,Frozen Foods,126.2362,OUT045,2002,,Tier 2,Supermarket Type1 +FDF59,12.5,Low Fat,0.071184721,Starchy Foods,127.902,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM45,,Regular,0.087767643,Snack Foods,122.2756,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ56,6.59,Low Fat,0.106194617,Fruits and Vegetables,83.1908,OUT017,2007,,Tier 2,Supermarket Type1 +FDR46,16.85,Low Fat,0.139634411,Snack Foods,146.076,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT01,13.65,Regular,0.184014453,Canned,212.4902,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD16,,Low Fat,0.036177057,Frozen Foods,74.7696,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU30,5.11,Low Fat,0.05837308,Household,161.221,OUT010,1998,,Tier 3,Grocery Store +FDM40,10.195,Low Fat,0.267701662,Frozen Foods,143.7154,OUT010,1998,,Tier 3,Grocery Store +FDI56,7.325,Low Fat,0.093367723,Fruits and Vegetables,93.1146,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCS30,5.945,Low Fat,0.092948793,Household,127.5652,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU08,10.3,Low Fat,0.027469924,Fruits and Vegetables,98.9042,OUT017,2007,,Tier 2,Supermarket Type1 +FDX51,,Regular,0.021951904,Meat,195.1452,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA43,10.895,Low Fat,0.064806913,Fruits and Vegetables,196.6794,OUT045,2002,,Tier 2,Supermarket Type1 +FDX59,10.195,Low Fat,0.086470378,Breads,33.6558,OUT010,1998,,Tier 3,Grocery Store +FDC37,15.5,Low Fat,0.033007266,Baking Goods,106.0938,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP58,11.1,Low Fat,0.135029856,Snack Foods,218.9482,OUT013,1987,High,Tier 3,Supermarket Type1 +NCY42,6.38,Low Fat,0.015159706,Household,142.447,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF21,10.3,Regular,0.059067021,Fruits and Vegetables,189.653,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU10,,Regular,0.045470757,Snack Foods,38.1848,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRL47,19.7,Low Fat,0.038894579,Hard Drinks,124.7362,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA58,9.395,Low Fat,0.0,Snack Foods,237.6932,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ22,18.75,LF,0.05289235,Snack Foods,192.7504,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK50,7.96,LF,0.028363203,Canned,160.4894,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO38,17.25,Low Fat,0.072825279,Canned,78.1986,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRF60,10.8,Low Fat,0.052058877,Soft Drinks,239.7564,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCZ42,,Low Fat,0.019763707,Household,236.3248,OUT019,1985,Small,Tier 1,Grocery Store +FDD35,12.15,Low Fat,0.025904641,Starchy Foods,118.844,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL25,6.92,Regular,0.131190433,Breakfast,92.7804,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ16,9.195,Low Fat,0.114790042,Frozen Foods,57.3246,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK59,8.895,Low Fat,0.075567131,Hard Drinks,234.8616,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI50,8.42,Regular,0.030842666,Canned,231.0352,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCB19,6.525,Low Fat,0.09047883,Household,87.1882,OUT045,2002,,Tier 2,Supermarket Type1 +DRI37,15.85,Low Fat,0.107577534,Soft Drinks,59.8904,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA14,,Low Fat,0.064867575,Dairy,147.876,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC08,19.0,Regular,0.103871404,Fruits and Vegetables,227.772,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS45,5.175,Regular,0.029495954,Snack Foods,104.5622,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI21,5.59,Regular,0.056690821,Snack Foods,63.4168,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRJ47,18.25,Low Fat,0.044241936,Hard Drinks,174.308,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRE37,,Low Fat,0.09376333,Soft Drinks,188.8872,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT55,13.6,Regular,0.043832988,Fruits and Vegetables,158.0946,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCG42,,Low Fat,0.041028183,Household,129.131,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA31,7.1,Low Fat,0.110182726,Fruits and Vegetables,171.208,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW42,18.2,Low Fat,0.0,Household,222.0456,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF50,4.905,Low Fat,0.117994019,Canned,195.2768,OUT017,2007,,Tier 2,Supermarket Type1 +FDK56,9.695,Low Fat,0.130200124,Fruits and Vegetables,186.7898,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX10,6.385,Regular,0.123687134,Snack Foods,36.8874,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK07,,Low Fat,0.048450921,Others,163.3526,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ49,11.0,Regular,0.133898743,Canned,222.0798,OUT017,2007,,Tier 2,Supermarket Type1 +FDR33,7.31,Low Fat,0.026766644,Snack Foods,108.657,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO44,12.6,Low Fat,0.0,Fruits and Vegetables,110.8228,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA20,6.78,Low Fat,0.066621085,Fruits and Vegetables,186.624,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL30,18.1,Low Fat,0.049039681,Household,127.8336,OUT045,2002,,Tier 2,Supermarket Type1 +FDI05,,Regular,0.222132498,Frozen Foods,74.4354,OUT019,1985,Small,Tier 1,Grocery Store +FDQ12,12.65,Low Fat,0.035554996,Baking Goods,228.501,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH47,13.5,Regular,0.0,Starchy Foods,95.8068,OUT017,2007,,Tier 2,Supermarket Type1 +FDH34,8.63,Low Fat,0.031221915,Snack Foods,185.8582,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF29,15.1,Regular,0.019934187,Frozen Foods,131.431,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG40,13.65,Low Fat,0.039986574,Frozen Foods,34.3558,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCE18,10.0,Low Fat,0.021546531,Household,249.175,OUT017,2007,,Tier 2,Supermarket Type1 +FDP21,7.42,Regular,0.043084893,Snack Foods,189.1872,OUT010,1998,,Tier 3,Grocery Store +FDY50,5.8,Low Fat,0.130846833,Dairy,88.6172,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB36,5.465,Regular,0.0,Baking Goods,129.2626,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCZ29,15.0,Low Fat,0.071482421,Health and Hygiene,127.2362,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU20,19.35,Regular,0.02154496,Fruits and Vegetables,119.0098,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO56,10.195,Regular,0.044945123,Fruits and Vegetables,117.7808,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW31,11.35,Regular,0.043225203,Fruits and Vegetables,197.7742,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH59,10.8,Low Fat,0.058384823,Hard Drinks,74.838,OUT013,1987,High,Tier 3,Supermarket Type1 +NCB30,14.6,Low Fat,0.02584838,Household,197.5084,OUT017,2007,,Tier 2,Supermarket Type1 +FDK43,,Low Fat,0.026710788,Meat,127.902,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW43,20.1,Regular,0.022470715,Fruits and Vegetables,229.3036,OUT045,2002,,Tier 2,Supermarket Type1 +NCL19,15.35,Low Fat,0.015764902,Others,141.147,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ27,17.7,Regular,0.121876033,Meat,100.3674,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC45,17.0,low fat,0.135733218,Fruits and Vegetables,169.9106,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY40,15.5,Regular,0.085818761,Frozen Foods,51.2692,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM41,16.5,Low Fat,0.035649249,Health and Hygiene,91.912,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK18,,Low Fat,0.011727514,Household,164.5184,OUT019,1985,Small,Tier 1,Grocery Store +FDP37,15.6,Low Fat,0.143328443,Breakfast,129.7994,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA27,,Regular,0.030777863,Dairy,255.5672,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCX30,16.7,Low Fat,0.026615593,Household,247.4776,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR09,18.25,Low Fat,0.078164241,Snack Foods,256.9962,OUT017,2007,,Tier 2,Supermarket Type1 +FDG08,,Regular,0.164558565,Fruits and Vegetables,172.6764,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU30,5.11,Low Fat,0.034845668,Household,164.621,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB16,8.21,Low Fat,0.045179902,Dairy,87.8198,OUT017,2007,,Tier 2,Supermarket Type1 +FDM16,8.155,Regular,0.033745202,Frozen Foods,73.6354,OUT017,2007,,Tier 2,Supermarket Type1 +FDC48,9.195,Low Fat,0.015846096,Baking Goods,81.5592,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF18,18.35,Low Fat,0.088982596,Household,189.9504,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU46,10.3,reg,0.011171624,Snack Foods,86.954,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH41,9.0,Low Fat,0.082345601,Frozen Foods,214.5534,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN42,20.25,Low Fat,0.023805745,Household,145.5418,OUT010,1998,,Tier 3,Grocery Store +FDU49,19.5,Regular,0.030694361,Canned,88.254,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB20,,Low Fat,0.051728948,Fruits and Vegetables,77.9986,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG50,,Low Fat,0.026738937,Canned,89.6146,OUT019,1985,Small,Tier 1,Grocery Store +FDW20,20.75,Low Fat,0.024198404,Fruits and Vegetables,122.073,OUT045,2002,,Tier 2,Supermarket Type1 +NCO55,12.8,Low Fat,0.091178768,Others,109.1938,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX48,17.75,Regular,0.037887894,Baking Goods,154.6656,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU48,18.85,Low Fat,0.055358452,Baking Goods,132.7284,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR48,,Low Fat,0.230246928,Baking Goods,152.1024,OUT019,1985,Small,Tier 1,Grocery Store +FDK27,11.0,Low Fat,0.008939091,Meat,122.7756,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT35,19.85,Regular,0.081387594,Breads,166.0816,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN12,15.6,Low Fat,0.081230024,Baking Goods,109.8544,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCE31,,low fat,0.323637245,Household,35.5216,OUT019,1985,Small,Tier 1,Grocery Store +FDL21,15.85,Regular,0.007186838,Snack Foods,41.148,OUT017,2007,,Tier 2,Supermarket Type1 +FDV56,16.1,Regular,0.013672625,Fruits and Vegetables,106.8596,OUT017,2007,,Tier 2,Supermarket Type1 +FDR16,5.845,Regular,0.105612027,Frozen Foods,214.8218,OUT017,2007,,Tier 2,Supermarket Type1 +NCP41,16.6,Low Fat,0.016235909,Health and Hygiene,108.9596,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ27,17.7,Regular,0.121774611,Meat,101.8674,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA07,7.55,Regular,0.03111966,Fruits and Vegetables,122.6072,OUT017,2007,,Tier 2,Supermarket Type1 +FDK55,18.5,Low Fat,0.02580175,Meat,89.0172,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM33,15.6,Low Fat,0.087856073,Snack Foods,220.7798,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY46,18.6,Low Fat,0.047889939,Snack Foods,186.9898,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD36,13.3,Low Fat,0.021273561,Baking Goods,117.8124,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB12,,Regular,0.104797702,Baking Goods,101.8648,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF28,,Regular,0.066296239,Frozen Foods,125.9046,OUT019,1985,Small,Tier 1,Grocery Store +NCE07,,Low Fat,0.022988989,Household,143.3154,OUT019,1985,Small,Tier 1,Grocery Store +FDW50,,Low Fat,0.075212058,Dairy,165.1158,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW18,15.1,Low Fat,0.059660386,Household,236.7248,OUT017,2007,,Tier 2,Supermarket Type1 +NCJ17,,Low Fat,0.267106722,Health and Hygiene,85.4224,OUT019,1985,Small,Tier 1,Grocery Store +DRZ24,7.535,Low Fat,0.13689554,Soft Drinks,120.244,OUT010,1998,,Tier 3,Grocery Store +FDS07,12.35,Low Fat,0.0,Fruits and Vegetables,115.0518,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCW05,20.25,Low Fat,0.247843179,Health and Hygiene,107.6938,OUT010,1998,,Tier 3,Grocery Store +FDZ22,9.395,Low Fat,0.045454306,Snack Foods,83.125,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK02,12.5,Low Fat,0.0,Canned,118.144,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ45,,Low Fat,0.0,Snack Foods,196.6084,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL25,6.92,Regular,0.130924914,Breakfast,91.1804,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS08,5.735,Low Fat,0.057076739,Fruits and Vegetables,175.737,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ42,,Low Fat,0.011233267,Household,235.5248,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX57,17.25,Regular,0.047257274,Snack Foods,97.0068,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF21,10.3,Regular,0.058827383,Fruits and Vegetables,189.853,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ56,8.985,Low Fat,0.184150125,Fruits and Vegetables,98.47,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX10,6.385,Regular,0.123607578,Snack Foods,36.4874,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG48,5.78,Low Fat,0.014552313,Soft Drinks,145.1102,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRN37,9.6,Low Fat,0.096297398,Soft Drinks,167.3158,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCY41,16.75,Low Fat,0.076044136,Health and Hygiene,34.9532,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN28,5.88,Regular,0.030309247,Frozen Foods,103.499,OUT045,2002,,Tier 2,Supermarket Type1 +FDE34,9.195,Low Fat,0.108110205,Snack Foods,181.5634,OUT045,2002,,Tier 2,Supermarket Type1 +FDR10,17.6,Low Fat,0.010060255,Snack Foods,163.8552,OUT045,2002,,Tier 2,Supermarket Type1 +FDC32,18.35,Low Fat,0.099669602,Fruits and Vegetables,92.9462,OUT017,2007,,Tier 2,Supermarket Type1 +DRG13,17.25,Low Fat,0.037186151,Soft Drinks,164.3526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP59,20.85,Regular,0.056553503,Breads,104.9648,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT53,5.4,LF,0.080536751,Health and Hygiene,165.8526,OUT010,1998,,Tier 3,Grocery Store +FDL57,,Regular,0.066751989,Snack Foods,257.4304,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN32,17.5,Low Fat,0.026044866,Fruits and Vegetables,185.2266,OUT010,1998,,Tier 3,Grocery Store +FDK09,15.2,Low Fat,0.092137107,Snack Foods,227.4352,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA52,16.2,Regular,0.214952566,Frozen Foods,178.437,OUT010,1998,,Tier 3,Grocery Store +FDC57,20.1,Regular,0.054679411,Fruits and Vegetables,193.282,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI09,20.75,Regular,0.129313138,Seafood,239.488,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCB07,19.2,Low Fat,0.077507549,Household,197.911,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP26,7.785,Low Fat,0.139526439,Dairy,103.1306,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP40,,Regular,0.034190793,Frozen Foods,112.0544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL15,17.85,Low Fat,0.046595951,Meat,151.5682,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV07,9.5,Low Fat,0.0,Fruits and Vegetables,111.3228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS03,7.825,Low Fat,0.080079022,Meat,65.1826,OUT017,2007,,Tier 2,Supermarket Type1 +FDE50,19.7,Regular,0.016230842,Canned,185.9556,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ15,20.35,Regular,0.15192798,Meat,79.4276,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ33,13.35,Low Fat,0.15266209,Snack Foods,150.3708,OUT010,1998,,Tier 3,Grocery Store +FDT22,10.395,Low Fat,0.112003932,Snack Foods,58.022,OUT013,1987,High,Tier 3,Supermarket Type1 +DRO35,13.85,Low Fat,0.03456382,Hard Drinks,117.2492,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ41,6.85,LF,0.022918858,Frozen Foods,261.5594,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ27,5.19,Regular,0.044244253,Meat,104.899,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC26,10.195,Low Fat,0.127097968,Canned,112.3886,OUT017,2007,,Tier 2,Supermarket Type1 +NCF43,,Low Fat,0.0,Household,142.947,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCR50,20.2,Low Fat,0.011817852,Household,153.134,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE39,7.89,Low Fat,0.036281701,Dairy,119.6782,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN49,,Regular,0.124618061,Breakfast,40.548,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG11,6.385,Low Fat,0.083822437,Hard Drinks,107.3596,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCA18,10.1,Low Fat,0.05616476,Household,117.0492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM36,11.65,Regular,0.058970075,Baking Goods,171.9422,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW32,18.35,Regular,0.094830216,Fruits and Vegetables,85.6882,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ18,15.75,Low Fat,0.226084177,Household,98.67,OUT010,1998,,Tier 3,Grocery Store +FDX14,,Low Fat,0.07457713,Dairy,76.2354,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD46,6.035,Low Fat,0.142055011,Snack Foods,152.3998,OUT017,2007,,Tier 2,Supermarket Type1 +FDI34,,Regular,0.149062064,Snack Foods,232.1668,OUT019,1985,Small,Tier 1,Grocery Store +NCJ17,7.68,Low Fat,0.152527644,Health and Hygiene,85.2224,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB52,17.75,Low Fat,0.030429846,Dairy,257.2672,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV55,17.75,LF,0.055297776,Fruits and Vegetables,143.7444,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC57,20.1,Regular,0.054594531,Fruits and Vegetables,191.682,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB29,16.7,Regular,0.052411676,Frozen Foods,115.2176,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO43,5.5,Low Fat,0.047089304,Others,100.1016,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG44,6.13,Low Fat,0.102398197,Fruits and Vegetables,52.7298,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ34,11.8,Regular,0.093845664,Snack Foods,126.4704,OUT045,2002,,Tier 2,Supermarket Type1 +FDH40,11.6,Regular,0.079052286,Frozen Foods,82.3276,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD07,,Low Fat,0.055160326,Household,111.9518,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB41,19.0,Regular,0.097863571,Frozen Foods,46.0718,OUT017,2007,,Tier 2,Supermarket Type1 +FDH47,13.5,Regular,0.129340955,Starchy Foods,95.7068,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRK37,5.0,low fat,0.043996354,Soft Drinks,189.353,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM25,,Regular,0.106217878,Breakfast,176.7712,OUT019,1985,Small,Tier 1,Grocery Store +NCX06,17.6,Low Fat,0.015718858,Household,182.3976,OUT045,2002,,Tier 2,Supermarket Type1 +NCS05,11.5,Low Fat,0.021096732,Health and Hygiene,132.8942,OUT017,2007,,Tier 2,Supermarket Type1 +FDS39,6.895,Low Fat,0.022506125,Meat,142.2812,OUT045,2002,,Tier 2,Supermarket Type1 +FDC47,,Low Fat,0.118314903,Snack Foods,226.5694,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG20,15.5,Regular,0.125583323,Fruits and Vegetables,178.3028,OUT013,1987,High,Tier 3,Supermarket Type1 +DRL23,18.35,Low Fat,0.015390879,Hard Drinks,106.1938,OUT017,2007,,Tier 2,Supermarket Type1 +FDY33,14.5,Regular,0.09712024,Snack Foods,158.3262,OUT013,1987,High,Tier 3,Supermarket Type1 +NCH18,9.3,Low Fat,0.044751804,Household,243.8802,OUT045,2002,,Tier 2,Supermarket Type1 +FDX47,6.55,Regular,0.0345978,Breads,155.4288,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCB06,17.6,Low Fat,0.082499046,Health and Hygiene,159.192,OUT045,2002,,Tier 2,Supermarket Type1 +FDP36,10.395,Regular,0.0,Baking Goods,49.6008,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW44,9.5,Regular,0.035294406,Fruits and Vegetables,172.1448,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCU41,18.85,Low Fat,0.052266868,Health and Hygiene,191.8846,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCS17,18.6,Low Fat,0.080501443,Health and Hygiene,96.2436,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD46,6.035,Low Fat,0.1412293,Snack Foods,155.5998,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE45,12.1,Low Fat,0.040585593,Fruits and Vegetables,177.5002,OUT017,2007,,Tier 2,Supermarket Type1 +FDI09,20.75,Regular,0.130069181,Seafood,238.988,OUT017,2007,,Tier 2,Supermarket Type1 +NCJ54,9.895,Low Fat,0.100540036,Household,234.0642,OUT010,1998,,Tier 3,Grocery Store +NCA29,10.5,Low Fat,0.027387523,Household,172.1106,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN41,,Low Fat,0.051956477,Health and Hygiene,122.773,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY34,10.5,Regular,0.010979782,Snack Foods,164.2842,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCG55,16.25,Low Fat,0.039138761,Household,116.1176,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRM49,6.11,Regular,0.151954004,Soft Drinks,44.4086,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCB42,11.8,Low Fat,0.008574487,Health and Hygiene,115.4492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE58,18.5,Low Fat,0.052174319,Snack Foods,116.8124,OUT045,2002,,Tier 2,Supermarket Type1 +DRJ25,14.6,Low Fat,0.150442215,Soft Drinks,50.6692,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS47,16.75,Low Fat,0.215728288,Breads,86.9856,OUT010,1998,,Tier 3,Grocery Store +FDY21,15.1,Low Fat,0.173751022,Snack Foods,198.211,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCI54,15.2,Low Fat,0.03357108,Household,111.1912,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO24,11.1,Low Fat,0.177212413,Baking Goods,158.1604,OUT017,2007,,Tier 2,Supermarket Type1 +FDY43,14.85,Low Fat,0.098383632,Fruits and Vegetables,168.9474,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF35,15.0,Low Fat,0.154616614,Starchy Foods,106.8938,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP29,,Low Fat,0.196572047,Health and Hygiene,63.7168,OUT019,1985,Small,Tier 1,Grocery Store +FDN28,,Regular,0.030101427,Frozen Foods,101.799,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ50,8.645,Low Fat,0.021673936,Canned,51.9982,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ14,,Low Fat,0.061488083,Dairy,150.805,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC37,15.5,Low Fat,0.032867137,Baking Goods,108.0938,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN08,7.72,Regular,0.088364662,Fruits and Vegetables,118.7466,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD04,16.0,LF,0.0,Dairy,141.9154,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW34,9.6,Low Fat,0.035724069,Snack Foods,243.617,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP04,15.35,Low Fat,0.013890902,Frozen Foods,65.2168,OUT017,2007,,Tier 2,Supermarket Type1 +NCG07,12.3,Low Fat,0.052799022,Household,187.753,OUT017,2007,,Tier 2,Supermarket Type1 +NCN14,19.1,Low Fat,0.09229222,Others,184.2608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ16,9.195,Low Fat,0.115118638,Frozen Foods,58.1246,OUT045,2002,,Tier 2,Supermarket Type1 +NCM42,6.13,Low Fat,0.028378929,Household,108.8912,OUT045,2002,,Tier 2,Supermarket Type1 +NCF19,13.0,Low Fat,0.035108732,Household,49.6034,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY21,15.1,Low Fat,0.174187994,Snack Foods,196.911,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY19,19.75,Low Fat,0.041357113,Fruits and Vegetables,116.1466,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV09,12.1,Low Fat,0.020610288,Snack Foods,149.8734,OUT045,2002,,Tier 2,Supermarket Type1 +FDA28,16.1,Regular,0.0,Frozen Foods,126.1362,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC38,15.7,Low Fat,0.122992956,Canned,133.3942,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL28,10.0,Regular,0.063302674,Frozen Foods,230.3668,OUT045,2002,,Tier 2,Supermarket Type1 +NCH43,8.42,Low Fat,0.070678631,Household,217.0192,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCN53,5.175,Low Fat,0.030417024,Health and Hygiene,34.0874,OUT045,2002,,Tier 2,Supermarket Type1 +NCW05,20.25,Low Fat,0.148910161,Health and Hygiene,108.2938,OUT017,2007,,Tier 2,Supermarket Type1 +NCO30,19.5,Low Fat,0.01578895,Household,185.7608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT04,,Low Fat,0.187416266,Frozen Foods,37.5822,OUT019,1985,Small,Tier 1,Grocery Store +FDB27,7.575,Low Fat,0.055615757,Dairy,196.4768,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCK07,10.65,Low Fat,0.048646173,Others,166.1526,OUT013,1987,High,Tier 3,Supermarket Type1 +NCA53,11.395,Low Fat,0.0,Health and Hygiene,48.5034,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB33,17.75,Low Fat,0.014639563,Fruits and Vegetables,160.1262,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU37,9.5,Regular,0.105099347,Canned,79.296,OUT017,2007,,Tier 2,Supermarket Type1 +FDR13,9.895,Regular,0.028715402,Canned,115.1492,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE45,12.1,Low Fat,0.04042006,Fruits and Vegetables,178.0002,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV37,13.0,Regular,0.083986263,Canned,195.9426,OUT017,2007,,Tier 2,Supermarket Type1 +FDX44,,Low Fat,0.075228873,Fruits and Vegetables,90.0172,OUT019,1985,Small,Tier 1,Grocery Store +NCL06,14.65,Low Fat,0.072474272,Household,261.4594,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ28,12.3,Low Fat,0.021905319,Frozen Foods,190.4162,OUT045,2002,,Tier 2,Supermarket Type1 +FDX55,15.1,Low Fat,0.05529173,Fruits and Vegetables,218.7166,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK17,11.0,Low Fat,0.038049213,Health and Hygiene,40.548,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH52,9.42,Regular,0.0438948,Frozen Foods,62.2194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN13,,Low Fat,0.151321932,Breakfast,100.7358,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK44,16.6,Low Fat,0.122725386,Fruits and Vegetables,171.7738,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU16,19.25,Regular,0.058275104,Frozen Foods,82.1908,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ07,15.1,Regular,0.094422403,Fruits and Vegetables,59.9194,OUT017,2007,,Tier 2,Supermarket Type1 +NCN06,,Low Fat,0.119913753,Household,164.5868,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH02,7.27,Regular,0.034783374,Canned,90.5488,OUT010,1998,,Tier 3,Grocery Store +NCW18,15.1,Low Fat,0.0,Household,235.5248,OUT045,2002,,Tier 2,Supermarket Type1 +FDH57,10.895,Low Fat,0.035717774,Fruits and Vegetables,129.9284,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV35,19.5,Low Fat,0.128466007,Breads,155.2314,OUT045,2002,,Tier 2,Supermarket Type1 +NCU29,7.685,Low Fat,0.025456246,Health and Hygiene,144.876,OUT013,1987,High,Tier 3,Supermarket Type1 +NCP02,7.105,low fat,0.044808762,Household,58.7562,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN44,13.15,Low Fat,0.022776641,Fruits and Vegetables,160.892,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX03,15.85,Regular,0.061344855,Meat,44.2744,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR11,10.5,Regular,0.238579765,Breads,158.5578,OUT010,1998,,Tier 3,Grocery Store +FDA36,5.985,Low Fat,0.005666384,Baking Goods,184.3924,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP58,,Low Fat,0.134487886,Snack Foods,217.3482,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH31,12.0,Regular,0.02045255,Meat,97.5042,OUT045,2002,,Tier 2,Supermarket Type1 +FDH34,8.63,LF,0.031089367,Snack Foods,187.1582,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS13,6.465,Low Fat,0.124482575,Canned,263.5884,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT01,13.65,Regular,0.0,Canned,212.7902,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY09,15.6,Low Fat,0.025239329,Snack Foods,176.2054,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV33,,Regular,0.027211198,Snack Foods,257.5304,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW29,14.0,Low Fat,0.048310673,Health and Hygiene,128.431,OUT010,1998,,Tier 3,Grocery Store +NCN17,11.0,Low Fat,0.0,Health and Hygiene,100.6358,OUT045,2002,,Tier 2,Supermarket Type1 +FDX01,10.1,Low Fat,0.024164336,Canned,117.715,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL03,19.25,Regular,0.0,Meat,196.211,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL59,16.75,Low Fat,0.021257124,Hard Drinks,54.5298,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRM11,,Low Fat,0.065749633,Hard Drinks,261.8278,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA43,10.895,Low Fat,0.064776303,Fruits and Vegetables,196.8794,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ56,16.25,low fat,0.043078428,Fruits and Vegetables,169.5474,OUT010,1998,,Tier 3,Grocery Store +FDI44,16.1,Low Fat,0.100641176,Fruits and Vegetables,77.6328,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB50,13.0,Low Fat,0.153490728,Canned,79.1986,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU15,,reg,0.046576823,Meat,34.5532,OUT019,1985,Small,Tier 1,Grocery Store +NCJ19,,LF,0.0,Others,56.7588,OUT019,1985,Small,Tier 1,Grocery Store +FDD48,10.395,Low Fat,0.030133592,Baking Goods,115.1176,OUT013,1987,High,Tier 3,Supermarket Type1 +NCW42,18.2,Low Fat,0.058457925,Household,221.4456,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL24,10.3,Regular,0.025037414,Baking Goods,173.6422,OUT017,2007,,Tier 2,Supermarket Type1 +NCB30,14.6,Low Fat,0.025681604,Household,197.7084,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK25,11.6,Regular,0.156701315,Breakfast,168.9474,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW28,18.25,Low Fat,0.088962349,Frozen Foods,195.6452,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD47,7.6,Regular,0.143216309,Starchy Foods,171.4448,OUT017,2007,,Tier 2,Supermarket Type1 +FDK16,,Low Fat,0.20192757,Frozen Foods,93.4094,OUT019,1985,Small,Tier 1,Grocery Store +FDW37,19.2,Low Fat,0.124050391,Canned,92.4488,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA48,12.1,Low Fat,0.114852339,Baking Goods,220.9114,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA14,16.1,Low Fat,0.065551931,Dairy,146.476,OUT017,2007,,Tier 2,Supermarket Type1 +FDV15,10.3,Low Fat,0.146050812,Meat,102.0648,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN22,18.85,Regular,0.1385204,Snack Foods,252.3724,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD55,14.0,Low Fat,0.024380523,Household,41.4454,OUT045,2002,,Tier 2,Supermarket Type1 +FDY43,14.85,Low Fat,0.098320351,Fruits and Vegetables,167.9474,OUT013,1987,High,Tier 3,Supermarket Type1 +NCU05,11.8,Low Fat,0.059068474,Health and Hygiene,79.9618,OUT017,2007,,Tier 2,Supermarket Type1 +FDF10,15.5,Regular,0.156898705,Snack Foods,147.9418,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR39,20.35,Low Fat,0.084140646,Meat,184.0292,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG40,13.65,Low Fat,0.039791206,Frozen Foods,33.4558,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ28,,Regular,0.090156718,Frozen Foods,127.1678,OUT019,1985,Small,Tier 1,Grocery Store +FDE02,8.71,LF,0.121496273,Canned,94.0778,OUT045,2002,,Tier 2,Supermarket Type1 +FDU60,20.0,Regular,0.059994175,Baking Goods,168.7132,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM21,20.2,Low Fat,0.064310516,Snack Foods,257.3646,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV52,,Regular,0.212767095,Frozen Foods,116.7466,OUT019,1985,Small,Tier 1,Grocery Store +NCW06,16.2,Low Fat,0.050298544,Household,191.8162,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX36,9.695,Regular,0.128258986,Baking Goods,225.3404,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT35,,Regular,0.081060928,Breads,169.2816,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCL19,15.35,LF,0.0,Others,142.747,OUT010,1998,,Tier 3,Grocery Store +NCD31,12.1,Low Fat,0.015434464,Household,164.7526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE53,,Low Fat,0.047063689,Frozen Foods,107.228,OUT019,1985,Small,Tier 1,Grocery Store +FDW58,,Low Fat,0.013224491,Snack Foods,106.4622,OUT019,1985,Small,Tier 1,Grocery Store +DRF48,5.73,Low Fat,0.0,Soft Drinks,187.3898,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW57,8.31,Regular,0.115655502,Snack Foods,176.0028,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH13,8.575,Low Fat,0.024021065,Soft Drinks,106.728,OUT017,2007,,Tier 2,Supermarket Type1 +FDT33,7.81,Regular,0.033962371,Snack Foods,167.8158,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK47,,Low Fat,0.063754145,Hard Drinks,226.4694,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY22,16.5,Regular,0.267339659,Snack Foods,143.5128,OUT010,1998,,Tier 3,Grocery Store +FDC35,,Low Fat,0.215072945,Starchy Foods,208.5638,OUT019,1985,Small,Tier 1,Grocery Store +FDO03,10.395,Regular,0.0,Meat,228.0352,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF24,15.5,Regular,0.02542192,Baking Goods,81.3934,OUT045,2002,,Tier 2,Supermarket Type1 +FDF56,16.7,Regular,0.119948864,Fruits and Vegetables,180.4976,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD28,10.695,Low Fat,0.053252515,Frozen Foods,57.2904,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG53,,Low Fat,0.04563487,Frozen Foods,141.718,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO27,,Regular,0.313541543,Meat,97.6752,OUT019,1985,Small,Tier 1,Grocery Store +NCF54,18.0,Low Fat,0.047570047,Household,171.6422,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC20,,Low Fat,0.023855381,Fruits and Vegetables,54.8272,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU10,10.1,Regular,0.045692023,Snack Foods,38.3848,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRA24,19.35,Regular,0.040090887,Soft Drinks,163.6868,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA02,14.0,Regular,0.049749638,Dairy,144.8786,OUT010,1998,,Tier 3,Grocery Store +FDG10,6.63,Regular,0.011001175,Snack Foods,57.0588,OUT017,2007,,Tier 2,Supermarket Type1 +FDW39,6.69,Regular,0.0,Meat,178.237,OUT010,1998,,Tier 3,Grocery Store +FDP04,,Low Fat,0.02418438,Frozen Foods,64.2168,OUT019,1985,Small,Tier 1,Grocery Store +NCM55,15.6,Low Fat,0.066670606,Others,185.2924,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG47,12.8,Low Fat,0.069760029,Starchy Foods,260.5252,OUT045,2002,,Tier 2,Supermarket Type1 +NCU41,18.85,Low Fat,0.052349262,Health and Hygiene,192.0846,OUT017,2007,,Tier 2,Supermarket Type1 +NCK31,10.895,Low Fat,0.027200767,Others,51.6666,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ46,7.485,Low Fat,0.069263905,Snack Foods,109.6228,OUT045,2002,,Tier 2,Supermarket Type1 +FDU13,,Low Fat,0.186650368,Canned,149.1418,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCF19,13.0,Low Fat,0.035179934,Household,49.8034,OUT045,2002,,Tier 2,Supermarket Type1 +NCJ43,6.635,Low Fat,0.027046875,Household,172.5396,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ05,18.7,Low Fat,0.046181741,Health and Hygiene,153.6682,OUT045,2002,,Tier 2,Supermarket Type1 +FDS04,,Regular,0.145952717,Frozen Foods,138.8838,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX28,6.325,Low Fat,0.0,Frozen Foods,100.4042,OUT010,1998,,Tier 3,Grocery Store +FDB41,,Regular,0.096841885,Frozen Foods,46.1718,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG53,10.0,LF,0.045856934,Frozen Foods,141.818,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL15,17.85,Low Fat,0.078057026,Meat,152.8682,OUT010,1998,,Tier 3,Grocery Store +FDQ08,15.7,reg,0.018959784,Fruits and Vegetables,61.0536,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRN36,15.2,Low Fat,0.050136086,Soft Drinks,97.0752,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI46,9.5,Low Fat,0.0742834,Snack Foods,252.8724,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG16,,Low Fat,0.089381866,Frozen Foods,214.2192,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV32,7.785,Low Fat,0.088634567,Fruits and Vegetables,62.651,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF44,7.17,Regular,0.099972466,Fruits and Vegetables,132.4968,OUT010,1998,,Tier 3,Grocery Store +FDK04,7.36,Low Fat,0.052525131,Frozen Foods,56.4588,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCA41,16.75,Low Fat,0.032559591,Health and Hygiene,193.3162,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD51,11.15,Low Fat,0.120631213,Dairy,43.9744,OUT017,2007,,Tier 2,Supermarket Type1 +NCZ53,9.6,Low Fat,0.024526806,Health and Hygiene,188.5214,OUT045,2002,,Tier 2,Supermarket Type1 +FDP01,,Regular,0.063019289,Breakfast,151.7682,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY25,12.0,Low Fat,0.0,Canned,181.3976,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB17,13.15,Low Fat,0.036821494,Frozen Foods,179.8976,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV54,11.1,Low Fat,0.033243813,Household,119.3124,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ32,10.695,Low Fat,0.05811924,Fruits and Vegetables,63.0536,OUT017,2007,,Tier 2,Supermarket Type1 +FDA37,7.81,Regular,0.055312618,Canned,124.7046,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG35,21.2,Regular,0.007039648,Starchy Foods,172.4738,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM05,6.825,Low Fat,0.060090767,Health and Hygiene,266.3226,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG45,8.1,Low Fat,0.0,Fruits and Vegetables,212.9902,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH28,15.85,Regular,0.109939432,Frozen Foods,39.2506,OUT013,1987,High,Tier 3,Supermarket Type1 +NCE18,10.0,Low Fat,0.0,Household,248.675,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH38,6.425,Low Fat,0.010459399,Canned,117.6808,OUT045,2002,,Tier 2,Supermarket Type1 +FDR56,15.5,Regular,0.100681984,Fruits and Vegetables,198.3768,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH17,,Regular,0.016572696,Frozen Foods,96.2726,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD39,16.7,Low Fat,0.070263971,Dairy,218.385,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB41,19.0,Regular,0.097464425,Frozen Foods,47.7718,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCR53,12.15,Low Fat,0.14504086,Health and Hygiene,224.4404,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX46,12.3,Regular,0.05844549,Snack Foods,57.8562,OUT017,2007,,Tier 2,Supermarket Type1 +FDV28,16.1,Regular,0.0,Frozen Foods,35.6558,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA08,11.85,Regular,0.050289178,Fruits and Vegetables,165.4526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH45,15.1,Regular,0.106264528,Fruits and Vegetables,42.3796,OUT017,2007,,Tier 2,Supermarket Type1 +NCS38,8.6,Low Fat,0.150961966,Household,114.1176,OUT010,1998,,Tier 3,Grocery Store +FDD40,20.25,Regular,0.024761046,Dairy,193.5162,OUT010,1998,,Tier 3,Grocery Store +DRM59,5.88,Low Fat,0.003591414,Hard Drinks,153.3998,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCJ43,6.635,Low Fat,0.0,Household,175.2396,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN29,15.2,Low Fat,0.0,Health and Hygiene,50.1034,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC19,6.57,Low Fat,0.097077051,Household,191.682,OUT045,2002,,Tier 2,Supermarket Type1 +FDR56,15.5,Regular,0.100746785,Fruits and Vegetables,196.7768,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ43,11.0,Regular,0.057147256,Fruits and Vegetables,242.2512,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ32,10.695,Low Fat,0.096732533,Fruits and Vegetables,62.4536,OUT010,1998,,Tier 3,Grocery Store +DRH03,17.25,Low Fat,0.035262656,Dairy,92.412,OUT017,2007,,Tier 2,Supermarket Type1 +NCZ54,14.65,Low Fat,0.083343628,Household,163.6552,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE26,9.3,Low Fat,0.089509222,Canned,145.7786,OUT017,2007,,Tier 2,Supermarket Type1 +FDS03,7.825,Low Fat,0.079790099,Meat,63.7826,OUT045,2002,,Tier 2,Supermarket Type1 +DRZ24,,LF,0.143199389,Soft Drinks,120.144,OUT019,1985,Small,Tier 1,Grocery Store +FDO48,,Regular,0.026710788,Baking Goods,220.4456,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW39,6.69,Regular,0.036967784,Meat,175.037,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK05,20.1,LF,0.0,Health and Hygiene,62.6536,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK30,14.85,low fat,0.061323488,Household,254.4698,OUT017,2007,,Tier 2,Supermarket Type1 +FDT27,11.395,reg,0.06987064,Meat,234.9616,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS08,,Low Fat,0.099731744,Fruits and Vegetables,177.937,OUT019,1985,Small,Tier 1,Grocery Store +NCJ19,18.6,Low Fat,0.118363749,Others,56.1588,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC58,10.195,Low Fat,0.0,Snack Foods,43.0428,OUT045,2002,,Tier 2,Supermarket Type1 +DRE37,13.5,Low Fat,0.094141186,Soft Drinks,188.1872,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW02,4.805,Regular,0.037692295,Dairy,127.0704,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ02,17.2,Regular,0.042124032,Canned,148.7418,OUT010,1998,,Tier 3,Grocery Store +FDX09,9.0,low fat,0.065381597,Snack Foods,177.137,OUT045,2002,,Tier 2,Supermarket Type1 +FDT31,19.75,Low Fat,0.020835893,Fruits and Vegetables,187.9872,OUT010,1998,,Tier 3,Grocery Store +FDI24,10.3,Low Fat,0.07886623,Baking Goods,177.937,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY09,15.6,Low Fat,0.0,Snack Foods,176.0054,OUT045,2002,,Tier 2,Supermarket Type1 +FDV28,16.1,reg,0.160052329,Frozen Foods,35.3558,OUT045,2002,,Tier 2,Supermarket Type1 +DRM47,9.3,Low Fat,0.043853769,Hard Drinks,191.9846,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT52,,Regular,0.083043068,Frozen Foods,246.5144,OUT019,1985,Small,Tier 1,Grocery Store +FDI48,11.85,Regular,0.055945372,Baking Goods,53.2666,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY55,16.75,Low Fat,0.081780186,Fruits and Vegetables,256.6988,OUT017,2007,,Tier 2,Supermarket Type1 +FDU48,18.85,Low Fat,0.055312384,Baking Goods,131.4284,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN25,7.895,Regular,0.061299601,Breakfast,55.4588,OUT045,2002,,Tier 2,Supermarket Type1 +FDP20,19.85,Low Fat,0.04574024,Fruits and Vegetables,127.102,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ15,11.35,Regular,0.023303069,Dairy,185.4608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD04,16.0,Low Fat,0.090337797,Dairy,140.3154,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY58,11.65,Low Fat,0.039999537,Snack Foods,229.8694,OUT045,2002,,Tier 2,Supermarket Type1 +FDR37,16.5,Regular,0.066519424,Breakfast,183.2292,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF44,7.17,Regular,0.059678319,Fruits and Vegetables,129.5968,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD32,17.7,Regular,0.041015006,Fruits and Vegetables,82.6276,OUT045,2002,,Tier 2,Supermarket Type1 +FDR57,5.675,Regular,0.023629875,Snack Foods,156.2288,OUT017,2007,,Tier 2,Supermarket Type1 +DRG39,,Low Fat,0.041976732,Dairy,54.4982,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX15,17.2,Low Fat,0.157182948,Meat,158.9578,OUT017,2007,,Tier 2,Supermarket Type1 +DRN37,9.6,Low Fat,0.096492692,Soft Drinks,165.8158,OUT045,2002,,Tier 2,Supermarket Type1 +FDW40,,Regular,0.0,Frozen Foods,141.5812,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB32,20.6,Low Fat,0.023489402,Fruits and Vegetables,93.7778,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM40,10.195,Low Fat,0.160588464,Frozen Foods,143.4154,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE39,,Low Fat,0.035959521,Dairy,120.8782,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH49,19.7,Low Fat,0.024795057,Soft Drinks,82.2592,OUT017,2007,,Tier 2,Supermarket Type1 +FDT46,11.35,Low Fat,0.030855031,Snack Foods,49.7008,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCF06,6.235,Low Fat,0.020194535,Household,257.6962,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP07,18.2,Low Fat,0.090410295,Fruits and Vegetables,196.211,OUT017,2007,,Tier 2,Supermarket Type1 +FDC04,15.6,Low Fat,0.04494821,Dairy,240.3854,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ32,7.785,Regular,0.038348445,Fruits and Vegetables,103.4964,OUT017,2007,,Tier 2,Supermarket Type1 +FDD50,18.85,Low Fat,0.141929473,Canned,169.9132,OUT045,2002,,Tier 2,Supermarket Type1 +FDU56,16.85,Low Fat,0.04466528,Fruits and Vegetables,184.9266,OUT017,2007,,Tier 2,Supermarket Type1 +FDV34,10.695,Regular,0.011490085,Snack Foods,72.0038,OUT017,2007,,Tier 2,Supermarket Type1 +NCY41,16.75,LF,0.075672596,Health and Hygiene,36.8532,OUT013,1987,High,Tier 3,Supermarket Type1 +NCK18,9.6,Low Fat,0.006698103,Household,165.8184,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH25,18.7,Low Fat,0.014615718,Soft Drinks,52.4324,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT57,15.2,Low Fat,0.019034783,Snack Foods,238.4248,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV56,16.1,Regular,0.013651105,Fruits and Vegetables,106.7596,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV12,16.7,Regular,0.060998134,Baking Goods,97.2384,OUT045,2002,,Tier 2,Supermarket Type1 +FDN52,9.395,Regular,0.132314096,Frozen Foods,88.5198,OUT017,2007,,Tier 2,Supermarket Type1 +FDX38,10.5,Regular,0.048197901,Dairy,48.3376,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE47,14.15,Low Fat,0.038063173,Starchy Foods,122.5046,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO07,9.06,Low Fat,0.009768132,Others,211.456,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV09,,Low Fat,0.02046897,Snack Foods,150.2734,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ23,,Regular,0.118188689,Baking Goods,185.224,OUT019,1985,Small,Tier 1,Grocery Store +DRH51,17.6,Low Fat,0.097612596,Dairy,88.1856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY54,8.43,LF,0.178055216,Household,172.0422,OUT045,2002,,Tier 2,Supermarket Type1 +DRG49,7.81,Low Fat,0.067399162,Soft Drinks,246.2486,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC19,6.57,Low Fat,0.097031198,Household,192.882,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCV53,8.27,Low Fat,0.018851756,Health and Hygiene,241.288,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ47,,Regular,0.0,Baking Goods,101.0042,OUT019,1985,Small,Tier 1,Grocery Store +NCO26,7.235,Low Fat,0.077168705,Household,114.3492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP02,7.105,Low Fat,0.044899636,Household,61.0562,OUT045,2002,,Tier 2,Supermarket Type1 +NCW30,5.21,Low Fat,0.011054747,Household,259.5962,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN55,14.6,Low Fat,0.059490504,Others,241.4538,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB20,7.72,Low Fat,0.08700498,Fruits and Vegetables,75.8986,OUT010,1998,,Tier 3,Grocery Store +DRL11,10.5,Low Fat,0.047978201,Hard Drinks,156.8946,OUT013,1987,High,Tier 3,Supermarket Type1 +DRD60,15.7,LF,0.037307618,Soft Drinks,181.7634,OUT045,2002,,Tier 2,Supermarket Type1 +FDW14,8.3,Regular,0.0,Dairy,87.8198,OUT010,1998,,Tier 3,Grocery Store +FDL27,6.17,Low Fat,0.017794028,Meat,65.9826,OUT010,1998,,Tier 3,Grocery Store +FDU09,7.71,Regular,0.066868428,Snack Foods,55.4956,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH36,,Low Fat,0.033218416,Soft Drinks,74.7696,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP34,,LF,0.136563316,Snack Foods,156.363,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE04,19.75,Regular,0.018125015,Frozen Foods,178.266,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ57,,Regular,0.037581431,Snack Foods,130.1994,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF02,16.2,Low Fat,0.173192865,Canned,104.399,OUT010,1998,,Tier 3,Grocery Store +FDG28,9.285,Regular,0.049380234,Frozen Foods,245.4144,OUT045,2002,,Tier 2,Supermarket Type1 +NCI31,20.0,Low Fat,0.0,Others,35.119,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT43,16.35,Low Fat,0.020530851,Fruits and Vegetables,51.3324,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU20,19.35,Regular,0.021457551,Fruits and Vegetables,121.3098,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD53,16.2,Low Fat,0.0,Frozen Foods,42.9454,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW15,15.35,Regular,0.055225368,Meat,149.1734,OUT045,2002,,Tier 2,Supermarket Type1 +NCT53,5.4,Low Fat,0.048213839,Health and Hygiene,162.8526,OUT045,2002,,Tier 2,Supermarket Type1 +NCG55,,Low Fat,0.038956596,Household,114.6176,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD48,10.395,Low Fat,0.030152986,Baking Goods,114.5176,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG47,12.8,Low Fat,0.069727079,Starchy Foods,263.6252,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI21,5.59,Regular,0.056922987,Snack Foods,63.4168,OUT017,2007,,Tier 2,Supermarket Type1 +FDT27,11.395,Regular,0.069980785,Meat,234.4616,OUT017,2007,,Tier 2,Supermarket Type1 +DRO35,13.85,LF,0.034541588,Hard Drinks,116.8492,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD33,12.85,Low Fat,0.0,Fruits and Vegetables,233.3642,OUT017,2007,,Tier 2,Supermarket Type1 +FDC04,15.6,Low Fat,0.04497714,Dairy,243.0854,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY34,10.5,Regular,0.010972719,Snack Foods,164.0842,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ49,6.865,Low Fat,0.014015003,Soft Drinks,128.0652,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE05,10.895,Regular,0.032504504,Frozen Foods,143.8102,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU31,10.5,Regular,0.025132415,Fruits and Vegetables,218.8508,OUT017,2007,,Tier 2,Supermarket Type1 +NCN19,,Low Fat,0.012040955,Others,188.253,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK56,,Low Fat,0.129368491,Fruits and Vegetables,185.3898,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK58,11.35,Regular,0.045236996,Snack Foods,103.1016,OUT017,2007,,Tier 2,Supermarket Type1 +NCJ42,19.75,Low Fat,0.014298622,Household,102.5332,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ34,,Low Fat,0.075511074,Starchy Foods,192.282,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA52,16.2,Regular,0.0,Frozen Foods,175.637,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR29,7.565,LF,0.054595405,Health and Hygiene,55.693,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT48,4.92,Low Fat,0.0,Baking Goods,200.3084,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ51,,Low Fat,0.154065962,Dairy,229.3668,OUT019,1985,Small,Tier 1,Grocery Store +NCS54,13.6,Low Fat,0.009993163,Household,177.637,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV01,19.2,Regular,0.084934509,Canned,154.9314,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG51,,LF,0.01148374,Dairy,163.4526,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCG42,19.2,Low Fat,0.041193522,Household,131.731,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA51,8.05,Regular,0.16493563,Dairy,115.5518,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV19,14.85,Regular,0.059013051,Fruits and Vegetables,159.7578,OUT010,1998,,Tier 3,Grocery Store +NCT18,14.6,Low Fat,0.059525627,Household,182.1976,OUT045,2002,,Tier 2,Supermarket Type1 +NCS41,12.85,Low Fat,0.053552399,Health and Hygiene,184.6608,OUT045,2002,,Tier 2,Supermarket Type1 +FDO03,10.395,Regular,0.036882977,Meat,228.1352,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL12,15.85,Regular,0.203588239,Baking Goods,61.622,OUT010,1998,,Tier 3,Grocery Store +FDY37,17.0,Regular,0.044470849,Canned,143.647,OUT010,1998,,Tier 3,Grocery Store +FDI58,7.64,Regular,0.070814401,Snack Foods,92.412,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT28,13.3,Low Fat,0.063825112,Frozen Foods,149.2708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC42,15.0,Low Fat,0.075167462,Health and Hygiene,138.5838,OUT010,1998,,Tier 3,Grocery Store +FDO01,21.1,Regular,0.020835848,Breakfast,129.7994,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ02,17.2,Regular,0.025145838,Canned,146.6418,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ04,6.4,Low Fat,0.085098856,Frozen Foods,42.0796,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL47,19.7,Low Fat,0.038704546,Hard Drinks,125.7362,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ32,7.785,Regular,0.03812554,Fruits and Vegetables,106.7964,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC35,7.435,LF,0.122814466,Starchy Foods,207.5638,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX14,13.1,Low Fat,0.075092011,Dairy,73.2354,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ35,9.6,reg,0.022259937,Breads,103.999,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL14,8.115,Regular,0.032132105,Canned,155.4972,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO04,16.6,Low Fat,0.026578464,Frozen Foods,55.0614,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK11,8.21,low fat,0.01082531,Hard Drinks,150.2392,OUT017,2007,,Tier 2,Supermarket Type1 +FDB44,6.655,Low Fat,0.017027915,Fruits and Vegetables,211.0586,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ50,12.8,Regular,0.079199274,Dairy,184.6608,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI12,,Regular,0.099912754,Baking Goods,88.6856,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU43,19.35,Regular,0.058371696,Fruits and Vegetables,237.1564,OUT017,2007,,Tier 2,Supermarket Type1 +FDD58,7.76,Low Fat,0.099343484,Snack Foods,98.17,OUT010,1998,,Tier 3,Grocery Store +FDB27,7.575,Low Fat,0.055703431,Dairy,195.3768,OUT017,2007,,Tier 2,Supermarket Type1 +FDB04,11.35,Regular,0.063483863,Dairy,85.9856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO17,10.0,Low Fat,0.0,Health and Hygiene,118.744,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL12,15.85,Regular,0.122320725,Baking Goods,58.022,OUT017,2007,,Tier 2,Supermarket Type1 +DRJ13,12.65,Low Fat,0.062988082,Soft Drinks,160.6578,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD57,18.1,Low Fat,0.022445019,Fruits and Vegetables,97.0094,OUT045,2002,,Tier 2,Supermarket Type1 +FDW19,12.35,Regular,0.038493141,Fruits and Vegetables,110.957,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRD27,18.75,Low Fat,0.023937034,Dairy,100.4042,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH27,,Low Fat,0.058064391,Dairy,145.1128,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW30,,Low Fat,0.010956581,Household,259.9962,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR40,9.1,Regular,0.008067116,Frozen Foods,79.9618,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG05,11.0,Regular,0.087774037,Frozen Foods,156.663,OUT013,1987,High,Tier 3,Supermarket Type1 +NCY41,,Low Fat,0.132603297,Health and Hygiene,35.3532,OUT019,1985,Small,Tier 1,Grocery Store +FDI38,13.35,Regular,0.014686484,Canned,206.3638,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR20,20.0,Regular,0.028123753,Fruits and Vegetables,43.2744,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE09,8.775,Low Fat,0.021725581,Fruits and Vegetables,109.2228,OUT017,2007,,Tier 2,Supermarket Type1 +FDN50,,Regular,0.046432792,Canned,94.912,OUT019,1985,Small,Tier 1,Grocery Store +DRF27,8.93,Low Fat,0.028474903,Dairy,152.334,OUT045,2002,,Tier 2,Supermarket Type1 +DRF51,15.75,Low Fat,0.165700218,Dairy,37.7506,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO02,,Low Fat,0.128458176,Others,67.8142,OUT019,1985,Small,Tier 1,Grocery Store +FDB51,,Low Fat,0.038267861,Dairy,62.0852,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ50,8.645,Low Fat,0.02156804,Canned,52.8982,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN52,9.395,Regular,0.131460394,Frozen Foods,85.2198,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX14,13.1,Low Fat,0.074877667,Dairy,76.6354,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT27,,Regular,0.121838154,Meat,235.8616,OUT019,1985,Small,Tier 1,Grocery Store +FDV10,7.645,Regular,0.06665054,Snack Foods,41.1112,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU33,7.63,Regular,0.134709764,Snack Foods,44.8402,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU58,6.61,Regular,0.029011725,Snack Foods,185.9898,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCP42,,Low Fat,0.016032699,Household,194.8478,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL51,,reg,0.047261392,Dairy,213.5876,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH15,,Low Fat,0.109379022,Dairy,45.4428,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU16,19.25,Regular,0.058604732,Frozen Foods,85.5908,OUT017,2007,,Tier 2,Supermarket Type1 +FDW15,15.35,Regular,0.055425341,Meat,149.3734,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ44,20.5,Low Fat,0.036213591,Fruits and Vegetables,122.3756,OUT045,2002,,Tier 2,Supermarket Type1 +NCI06,,Low Fat,0.047486615,Household,180.066,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRK23,,Low Fat,0.126021818,Hard Drinks,253.204,OUT019,1985,Small,Tier 1,Grocery Store +FDC28,7.905,Low Fat,0.054976522,Frozen Foods,109.7254,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY17,,Low Fat,0.0,Health and Hygiene,42.9086,OUT019,1985,Small,Tier 1,Grocery Store +NCV05,10.1,Low Fat,0.030331567,Health and Hygiene,153.7656,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM34,,Low Fat,0.118091992,Snack Foods,132.6626,OUT019,1985,Small,Tier 1,Grocery Store +DRD60,,Low Fat,0.037051812,Soft Drinks,182.8634,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT38,18.7,Low Fat,0.057537445,Dairy,86.3566,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ57,7.275,Low Fat,0.028061488,Snack Foods,145.076,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE59,,LF,0.061986186,Starchy Foods,35.6532,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCM43,14.5,Low Fat,0.019475371,Others,163.621,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRI51,17.25,Low Fat,0.042307304,Dairy,171.1764,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG30,20.2,Low Fat,0.112956552,Household,124.9046,OUT017,2007,,Tier 2,Supermarket Type1 +NCK54,12.15,Low Fat,0.029517792,Household,114.815,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ16,,Low Fat,0.073078549,Frozen Foods,109.6912,OUT019,1985,Small,Tier 1,Grocery Store +FDI36,12.5,reg,0.062291551,Baking Goods,197.1426,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX16,,Low Fat,0.065491357,Frozen Foods,148.705,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA34,11.5,Low Fat,0.014860557,Starchy Foods,174.008,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ48,11.3,Low Fat,0.056664709,Baking Goods,248.0118,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU47,12.8,Regular,0.113832939,Breads,138.4838,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS39,6.895,Low Fat,0.022460575,Meat,142.9812,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD11,12.85,Low Fat,0.030616733,Starchy Foods,251.704,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM16,,Regular,0.033392905,Frozen Foods,73.5354,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU56,16.85,Low Fat,0.04459498,Fruits and Vegetables,183.1266,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ32,17.85,Regular,0.046872134,Fruits and Vegetables,122.3388,OUT017,2007,,Tier 2,Supermarket Type1 +DRK35,8.365,Low Fat,0.071786706,Hard Drinks,39.3506,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA58,9.395,Low Fat,0.103912541,Snack Foods,234.2932,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG48,,Low Fat,0.025484041,Soft Drinks,143.8102,OUT019,1985,Small,Tier 1,Grocery Store +FDT59,13.65,Low Fat,0.026632476,Breads,231.9668,OUT010,1998,,Tier 3,Grocery Store +FDQ31,,Regular,0.094279524,Fruits and Vegetables,89.7856,OUT019,1985,Small,Tier 1,Grocery Store +FDS51,13.35,Low Fat,0.032311584,Meat,63.3194,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW32,,Regular,0.093840198,Fruits and Vegetables,86.8882,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI15,,Low Fat,0.140668056,Dairy,264.4884,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCV30,20.2,Low Fat,0.066305026,Household,62.351,OUT017,2007,,Tier 2,Supermarket Type1 +DRG25,10.5,Low Fat,0.019079308,Soft Drinks,187.524,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT02,12.6,Low Fat,0.024174597,Dairy,33.2874,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO33,,Low Fat,0.088889913,Snack Foods,114.1518,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP38,10.1,Low Fat,0.032096024,Canned,51.1008,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ45,14.1,Low Fat,0.066863337,Snack Foods,197.9084,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCA54,,Low Fat,0.036464158,Household,180.1318,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU33,7.63,Regular,0.135471737,Snack Foods,45.2402,OUT017,2007,,Tier 2,Supermarket Type1 +FDN58,13.8,Regular,0.057194086,Snack Foods,233.6984,OUT017,2007,,Tier 2,Supermarket Type1 +FDI05,8.35,Regular,0.127127013,Frozen Foods,75.4354,OUT045,2002,,Tier 2,Supermarket Type1 +FDM57,,Regular,0.1328021,Snack Foods,82.4908,OUT019,1985,Small,Tier 1,Grocery Store +NCS42,,Low Fat,0.069080314,Household,89.6146,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB57,20.25,Regular,0.018843242,Fruits and Vegetables,221.6772,OUT045,2002,,Tier 2,Supermarket Type1 +FDC03,8.575,Regular,0.071992202,Dairy,196.0794,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ58,17.85,Low Fat,0.052133441,Snack Foods,120.6072,OUT013,1987,High,Tier 3,Supermarket Type1 +NCK29,5.615,Low Fat,0.126024084,Health and Hygiene,124.573,OUT045,2002,,Tier 2,Supermarket Type1 +NCR53,12.15,LF,0.145335007,Health and Hygiene,224.9404,OUT045,2002,,Tier 2,Supermarket Type1 +FDE26,,Low Fat,0.088574755,Canned,145.4786,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU52,7.56,Low Fat,0.063870008,Frozen Foods,154.563,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE41,,Regular,0.063704181,Frozen Foods,83.6566,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU38,10.8,Low Fat,0.08288617,Dairy,189.9504,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA52,16.2,Regular,0.129148687,Frozen Foods,176.337,OUT017,2007,,Tier 2,Supermarket Type1 +FDW46,13.0,Regular,0.070301658,Snack Foods,65.5484,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRI59,9.5,Low Fat,0.0,Hard Drinks,225.0088,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT38,18.7,Low Fat,0.057526565,Dairy,85.2566,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL33,7.235,Low Fat,0.100369729,Snack Foods,196.9452,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ01,,Regular,0.159923438,Canned,253.0014,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ08,11.1,Low Fat,0.110672104,Fruits and Vegetables,191.1846,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ47,7.155,Regular,0.168447861,Breads,35.8874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCZ18,7.825,Low Fat,0.185913021,Household,252.4698,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE29,8.905,Low Fat,0.143938721,Frozen Foods,60.3878,OUT017,2007,,Tier 2,Supermarket Type1 +FDF10,,Regular,0.156168446,Snack Foods,146.7418,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC48,9.195,Low Fat,0.015883951,Baking Goods,83.4592,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY58,11.65,Low Fat,0.039885362,Snack Foods,228.9694,OUT013,1987,High,Tier 3,Supermarket Type1 +NCX30,16.7,Low Fat,0.0,Household,247.5776,OUT010,1998,,Tier 3,Grocery Store +FDV11,9.1,Regular,0.081599833,Breads,176.8054,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT46,11.35,Low Fat,0.030807134,Snack Foods,49.4008,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD01,,Regular,0.107110465,Soft Drinks,55.6614,OUT019,1985,Small,Tier 1,Grocery Store +FDQ11,5.695,Regular,0.067644586,Breads,256.5988,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM41,16.5,Low Fat,0.035857676,Health and Hygiene,92.512,OUT017,2007,,Tier 2,Supermarket Type1 +NCC55,10.695,Low Fat,0.063710075,Household,36.4848,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG45,,Low Fat,0.127416049,Fruits and Vegetables,214.2902,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ54,17.7,Low Fat,0.0,Household,167.7474,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM34,19.0,Low Fat,0.067584358,Snack Foods,129.7626,OUT045,2002,,Tier 2,Supermarket Type1 +FDD17,,Low Fat,0.057125581,Frozen Foods,237.8906,OUT019,1985,Small,Tier 1,Grocery Store +FDN38,,Regular,0.091526478,Canned,250.0408,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB53,13.35,Low Fat,0.0,Frozen Foods,148.4392,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCL06,14.65,Low Fat,0.072053007,Household,262.3594,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCV18,,Low Fat,0.184271924,Household,82.725,OUT019,1985,Small,Tier 1,Grocery Store +FDX25,16.7,Low Fat,0.0,Canned,182.4292,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB39,11.6,Low Fat,0.038518959,Dairy,55.3272,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC33,8.96,Regular,0.06904552,Fruits and Vegetables,197.3768,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO14,9.6,Low Fat,0.029764629,Household,44.4086,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA58,,Low Fat,0.103248816,Snack Foods,237.3932,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ02,12.6,Low Fat,0.00749864,Household,186.4556,OUT017,2007,,Tier 2,Supermarket Type1 +NCR53,12.15,Low Fat,0.14586127,Health and Hygiene,227.0404,OUT017,2007,,Tier 2,Supermarket Type1 +FDN52,9.395,Regular,0.131569883,Frozen Foods,88.1198,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG26,18.85,Low Fat,0.042649853,Canned,256.633,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE23,,Regular,0.052923474,Starchy Foods,46.706,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRI37,15.85,Low Fat,0.107508339,Soft Drinks,59.1904,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH37,17.6,Low Fat,0.041785884,Soft Drinks,166.0526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO01,21.1,Regular,0.020714738,Breakfast,127.7994,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK45,11.65,Low Fat,0.033910827,Seafood,113.886,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP23,6.71,Low Fat,0.035642187,Breads,217.6166,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM33,15.6,Low Fat,0.087703106,Snack Foods,220.0798,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD36,13.3,Low Fat,0.021393893,Baking Goods,119.8124,OUT017,2007,,Tier 2,Supermarket Type1 +FDL56,14.1,Low Fat,0.126492074,Fruits and Vegetables,85.3198,OUT017,2007,,Tier 2,Supermarket Type1 +FDT27,11.395,Regular,0.116474658,Meat,236.0616,OUT010,1998,,Tier 3,Grocery Store +FDG52,13.65,Low Fat,0.066002079,Frozen Foods,44.2402,OUT017,2007,,Tier 2,Supermarket Type1 +NCL42,18.85,Low Fat,0.040363971,Household,244.0144,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ24,11.8,low fat,0.113329224,Soft Drinks,185.8924,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV38,19.25,Low Fat,0.101773845,Dairy,52.8956,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT35,19.85,Regular,0.081620573,Breads,169.7816,OUT045,2002,,Tier 2,Supermarket Type1 +FDY51,12.5,Low Fat,0.081299369,Meat,219.0798,OUT045,2002,,Tier 2,Supermarket Type1 +FDC37,15.5,Low Fat,0.033059299,Baking Goods,105.7938,OUT017,2007,,Tier 2,Supermarket Type1 +NCP43,17.75,Low Fat,0.030481663,Others,181.666,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO33,14.75,Low Fat,0.089503609,Snack Foods,112.2518,OUT045,2002,,Tier 2,Supermarket Type1 +FDW04,8.985,Regular,0.058062665,Frozen Foods,130.831,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC31,8.02,Low Fat,0.019870463,Household,154.9972,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK22,9.8,Low Fat,0.026127057,Snack Foods,216.385,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ50,8.645,Low Fat,0.021708103,Canned,54.5982,OUT017,2007,,Tier 2,Supermarket Type1 +FDV13,17.35,Regular,0.027767045,Canned,88.9856,OUT017,2007,,Tier 2,Supermarket Type1 +DRL60,8.52,Low Fat,0.027212419,Soft Drinks,151.8682,OUT017,2007,,Tier 2,Supermarket Type1 +FDW03,5.63,Regular,0.024680092,Meat,103.7306,OUT017,2007,,Tier 2,Supermarket Type1 +FDY27,6.38,Low Fat,0.031892144,Dairy,177.7344,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB39,,Low Fat,0.03833243,Dairy,54.3272,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU59,5.78,Low Fat,0.0965817,Breads,162.4552,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ57,10.0,Regular,0.0,Snack Foods,129.2994,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO21,11.6,Regular,0.0097782,Snack Foods,225.1404,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS43,11.65,Low Fat,0.0,Fruits and Vegetables,187.724,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU28,19.2,Regular,0.157200063,Frozen Foods,189.3214,OUT010,1998,,Tier 3,Grocery Store +FDC51,10.895,Regular,0.016105023,Dairy,121.773,OUT010,1998,,Tier 3,Grocery Store +FDW16,17.35,Regular,0.069419362,Frozen Foods,92.3804,OUT010,1998,,Tier 3,Grocery Store +FDP32,6.65,Low Fat,0.146740745,Fruits and Vegetables,125.5678,OUT010,1998,,Tier 3,Grocery Store +FDB60,,Low Fat,0.049938496,Baking Goods,195.6136,OUT019,1985,Small,Tier 1,Grocery Store +NCQ30,7.725,Low Fat,0.029072283,Household,120.1414,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD26,8.71,Regular,0.072267645,Canned,184.8924,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI44,16.1,Low Fat,0.100436145,Fruits and Vegetables,77.2328,OUT045,2002,,Tier 2,Supermarket Type1 +DRH23,14.65,Low Fat,0.170318251,Hard Drinks,56.1614,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO44,12.6,Low Fat,0.087453208,Fruits and Vegetables,110.0228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG04,13.1,Low Fat,0.006062712,Frozen Foods,187.3898,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM32,,Low Fat,0.020505252,Fruits and Vegetables,91.483,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM09,11.15,Regular,0.085860034,Snack Foods,169.479,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ47,20.7,Regular,0.079230482,Baking Goods,98.8042,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM40,,LF,0.159162446,Frozen Foods,143.1154,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY48,14.0,Low Fat,0.023869126,Baking Goods,101.5332,OUT017,2007,,Tier 2,Supermarket Type1 +NCM30,19.1,Low Fat,0.067431883,Household,42.4796,OUT045,2002,,Tier 2,Supermarket Type1 +FDX36,9.695,Regular,0.21471985,Baking Goods,225.9404,OUT010,1998,,Tier 3,Grocery Store +DRF03,19.1,Low Fat,0.045564412,Dairy,39.1138,OUT017,2007,,Tier 2,Supermarket Type1 +FDN51,17.85,Regular,0.020979394,Meat,259.7936,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM57,11.65,Regular,0.075967092,Snack Foods,84.4908,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB35,12.3,Regular,0.064719441,Starchy Foods,93.6804,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY13,,Low Fat,0.029981513,Canned,77.867,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA37,7.81,Regular,0.05553914,Canned,125.8046,OUT017,2007,,Tier 2,Supermarket Type1 +NCX53,20.1,Low Fat,0.015022332,Health and Hygiene,142.1154,OUT017,2007,,Tier 2,Supermarket Type1 +FDD59,10.5,Regular,0.066450399,Starchy Foods,80.796,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX10,,Regular,0.216601163,Snack Foods,36.7874,OUT019,1985,Small,Tier 1,Grocery Store +FDC03,8.575,Regular,0.072139167,Dairy,195.5794,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW43,20.1,Regular,0.022420996,Fruits and Vegetables,226.2036,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW10,21.2,Low Fat,0.070676281,Snack Foods,176.337,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY14,,Low Fat,0.069701022,Dairy,262.9226,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV43,16.0,Low Fat,0.077011493,Fruits and Vegetables,45.1086,OUT045,2002,,Tier 2,Supermarket Type1 +FDO40,17.1,Low Fat,0.032600958,Frozen Foods,150.4392,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP46,,Low Fat,0.074254285,Snack Foods,91.083,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCE43,,Low Fat,0.181114059,Household,168.8448,OUT019,1985,Small,Tier 1,Grocery Store +FDD05,19.35,Low Fat,0.016608334,Frozen Foods,120.0098,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ60,19.35,Regular,0.104659766,Baking Goods,165.9184,OUT010,1998,,Tier 3,Grocery Store +DRE27,11.85,low fat,0.133211023,Dairy,95.8726,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO11,8.0,Regular,0.030259174,Breads,250.6092,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG11,,Low Fat,0.083432299,Hard Drinks,107.4596,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK33,17.85,Low Fat,0.018805505,Snack Foods,214.956,OUT010,1998,,Tier 3,Grocery Store +DRM23,16.6,Low Fat,0.136008489,Hard Drinks,170.4422,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ02,,Regular,0.02504491,Canned,146.1418,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ05,8.485,Low Fat,0.0582501,Health and Hygiene,104.399,OUT045,2002,,Tier 2,Supermarket Type1 +NCL30,18.1,Low Fat,0.048899701,Household,126.3336,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ19,6.425,Low Fat,0.093835595,Fruits and Vegetables,174.2712,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM45,8.655,Regular,0.088331849,Snack Foods,120.8756,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO36,19.7,Low Fat,0.0,Baking Goods,178.666,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCK31,10.895,Low Fat,0.027102628,Others,50.7666,OUT045,2002,,Tier 2,Supermarket Type1 +DRJ37,10.8,Low Fat,0.061225298,Soft Drinks,153.4024,OUT045,2002,,Tier 2,Supermarket Type1 +FDP24,20.6,Low Fat,0.083342202,Baking Goods,120.1756,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF46,7.07,LF,0.093593225,Snack Foods,115.1834,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX46,,Regular,0.101754942,Snack Foods,58.5562,OUT019,1985,Small,Tier 1,Grocery Store +NCL18,18.85,Low Fat,0.167923755,Household,193.7136,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ26,15.3,Regular,0.084694653,Canned,212.7218,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ07,7.26,Low Fat,0.014452774,Meat,115.015,OUT045,2002,,Tier 2,Supermarket Type1 +FDY15,18.25,Regular,0.170685888,Dairy,155.163,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG01,14.8,Low Fat,0.044969294,Soft Drinks,74.867,OUT045,2002,,Tier 2,Supermarket Type1 +FDF58,13.3,Low Fat,0.009600586,Snack Foods,64.951,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ14,,Regular,0.083321663,Dairy,121.4756,OUT019,1985,Small,Tier 1,Grocery Store +FDP31,21.1,Regular,0.161756055,Fruits and Vegetables,65.7168,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH45,15.1,Regular,0.1055789,Fruits and Vegetables,42.4796,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA09,13.35,Regular,0.250008736,Snack Foods,178.366,OUT010,1998,,Tier 3,Grocery Store +FDW31,11.35,Regular,0.043149943,Fruits and Vegetables,198.5742,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA57,18.85,Low Fat,0.039643601,Snack Foods,41.448,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCE55,8.92,Low Fat,0.129903926,Household,176.637,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC17,,Low Fat,0.027069736,Frozen Foods,212.3928,OUT019,1985,Small,Tier 1,Grocery Store +FDC59,16.7,Regular,0.054583442,Starchy Foods,64.6168,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA22,7.435,Low Fat,0.084382084,Starchy Foods,167.9158,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK52,18.25,Low Fat,0.079203863,Frozen Foods,224.9062,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM26,20.5,Low Fat,0.023143199,Others,152.934,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT53,5.4,Low Fat,0.048107159,Health and Hygiene,166.3526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW45,18.0,Low Fat,0.039169904,Snack Foods,149.0418,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCI18,18.35,Low Fat,0.014021376,Household,222.5746,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE38,6.52,Low Fat,0.044788872,Canned,164.0842,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF08,,Regular,0.114170018,Fruits and Vegetables,89.1856,OUT019,1985,Small,Tier 1,Grocery Store +FDY58,11.65,Low Fat,0.066815522,Snack Foods,229.6694,OUT010,1998,,Tier 3,Grocery Store +FDF58,,Low Fat,0.016775365,Snack Foods,63.451,OUT019,1985,Small,Tier 1,Grocery Store +FDX39,14.3,Regular,0.049957145,Meat,210.0586,OUT017,2007,,Tier 2,Supermarket Type1 +FDB44,6.655,Low Fat,0.016985198,Fruits and Vegetables,211.0586,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF28,15.7,Regular,0.037833211,Frozen Foods,126.1046,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE39,7.89,Low Fat,0.036104434,Dairy,117.1782,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT37,14.15,Low Fat,0.035413843,Canned,253.0014,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ45,14.1,Low Fat,0.06725426,Snack Foods,199.0084,OUT017,2007,,Tier 2,Supermarket Type1 +FDO40,17.1,Low Fat,0.032621941,Frozen Foods,150.9392,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM57,,Regular,0.075481864,Snack Foods,85.3908,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG36,14.15,Low Fat,0.095917719,Soft Drinks,171.8106,OUT017,2007,,Tier 2,Supermarket Type1 +FDY36,12.3,Low Fat,0.015751294,Baking Goods,71.638,OUT010,1998,,Tier 3,Grocery Store +DRL60,,LF,0.026928324,Soft Drinks,151.6682,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS25,,Regular,0.245136905,Canned,110.8228,OUT019,1985,Small,Tier 1,Grocery Store +DRF49,,Low Fat,0.070733741,Soft Drinks,112.0518,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP16,18.6,Low Fat,0.039374545,Frozen Foods,245.5802,OUT045,2002,,Tier 2,Supermarket Type1 +FDS60,20.85,Low Fat,0.032498972,Baking Goods,181.266,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU15,,Regular,0.026473267,Meat,37.9532,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK43,9.8,LF,0.026840766,Meat,126.902,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN25,7.895,Regular,0.061175535,Breakfast,58.6588,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE53,10.895,Low Fat,0.026921951,Frozen Foods,104.928,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB22,8.02,Low Fat,0.111347923,Snack Foods,155.6998,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE39,7.89,Low Fat,0.036338895,Dairy,119.5782,OUT017,2007,,Tier 2,Supermarket Type1 +FDX35,5.035,Regular,0.079895432,Breads,227.0036,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCG54,12.1,Low Fat,0.079930344,Household,169.7106,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH27,7.075,Low Fat,0.058335906,Dairy,145.8128,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK42,7.475,Low Fat,0.01310911,Household,215.4192,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS25,6.885,Regular,0.14022623,Canned,108.8228,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI10,8.51,Regular,0.078723713,Snack Foods,172.4422,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU35,6.44,Low Fat,0.079200387,Breads,100.47,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI04,13.65,Regular,0.073324855,Frozen Foods,199.0426,OUT017,2007,,Tier 2,Supermarket Type1 +DRK23,8.395,Low Fat,0.071963037,Hard Drinks,251.804,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB53,,Low Fat,0.244163174,Frozen Foods,148.1392,OUT019,1985,Small,Tier 1,Grocery Store +FDY02,8.945,Regular,0.087782193,Dairy,261.791,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM60,10.8,Regular,0.048134189,Baking Goods,40.3138,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCJ31,19.2,LF,0.305724969,Others,239.6196,OUT010,1998,,Tier 3,Grocery Store +DRP35,18.85,Low Fat,0.09138128,Hard Drinks,126.6336,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ30,7.725,Low Fat,0.029190711,Household,122.4414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL11,10.5,Low Fat,0.080372556,Hard Drinks,158.4946,OUT010,1998,,Tier 3,Grocery Store +FDU01,20.25,Regular,0.011985289,Canned,184.7924,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR39,20.35,Low Fat,0.083783437,Meat,180.7292,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO08,11.1,Regular,0.053775381,Fruits and Vegetables,165.7526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC02,21.35,Low Fat,0.068962051,Canned,261.1278,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ29,15.0,Low Fat,0.071357962,Health and Hygiene,127.4362,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF29,15.1,Regular,0.033365743,Frozen Foods,130.931,OUT010,1998,,Tier 3,Grocery Store +FDZ23,17.75,Regular,0.067884624,Baking Goods,187.324,OUT017,2007,,Tier 2,Supermarket Type1 +NCU53,5.485,Low Fat,0.042925965,Health and Hygiene,164.5842,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCW30,5.21,Low Fat,0.011000735,Household,258.0962,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM26,,Low Fat,0.023031127,Others,154.534,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV50,,Low Fat,0.121977653,Dairy,122.573,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW15,15.35,Regular,0.055199283,Meat,146.4734,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI35,,Low Fat,0.041091215,Starchy Foods,182.6634,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO11,8.0,Regular,0.030436087,Breads,249.0092,OUT017,2007,,Tier 2,Supermarket Type1 +FDN48,13.35,Low Fat,0.06495073,Baking Goods,92.5804,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA17,20.6,Low Fat,0.045488814,Health and Hygiene,149.9392,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCN54,20.35,Low Fat,0.021308724,Household,79.2328,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP22,14.65,Regular,0.099049679,Snack Foods,49.7666,OUT013,1987,High,Tier 3,Supermarket Type1 +NCB54,8.76,Low Fat,0.050043246,Health and Hygiene,126.2336,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD08,8.3,Low Fat,0.035426061,Fruits and Vegetables,37.7506,OUT045,2002,,Tier 2,Supermarket Type1 +DRM48,15.2,Low Fat,0.188965879,Soft Drinks,35.9848,OUT010,1998,,Tier 3,Grocery Store +FDG41,,Regular,0.076191354,Frozen Foods,110.3228,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE44,,LF,0.170558096,Fruits and Vegetables,48.7692,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE26,9.3,Low Fat,0.088988939,Canned,144.0786,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCS38,8.6,Low Fat,0.0,Household,113.1176,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ54,9.895,Low Fat,0.0,Household,230.4642,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI40,,Regular,0.219914554,Frozen Foods,98.8358,OUT019,1985,Small,Tier 1,Grocery Store +FDN45,19.35,Low Fat,0.11858387,Snack Foods,224.4088,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU43,19.35,Regular,0.058043379,Fruits and Vegetables,239.8564,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI04,13.65,Regular,0.122040464,Frozen Foods,197.5426,OUT010,1998,,Tier 3,Grocery Store +NCC07,19.6,Low Fat,0.024048716,Household,104.9964,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC07,,Low Fat,0.04193537,Household,104.5964,OUT019,1985,Small,Tier 1,Grocery Store +NCD18,16.0,Low Fat,0.072816495,Household,231.3668,OUT045,2002,,Tier 2,Supermarket Type1 +FDU55,16.2,Low Fat,0.035904485,Fruits and Vegetables,258.6278,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX59,10.195,Low Fat,0.051651503,Breads,35.2558,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR52,12.65,Regular,0.076162818,Frozen Foods,190.7846,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP17,19.35,Low Fat,0.027691308,Health and Hygiene,63.3168,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ32,17.85,reg,0.04670302,Fruits and Vegetables,122.2388,OUT045,2002,,Tier 2,Supermarket Type1 +NCT17,10.8,Low Fat,0.041930938,Health and Hygiene,188.0214,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO10,13.65,Regular,0.0,Snack Foods,57.7588,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE32,20.7,Low Fat,0.048834717,Fruits and Vegetables,36.5506,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN44,13.15,Low Fat,0.022841841,Fruits and Vegetables,158.192,OUT045,2002,,Tier 2,Supermarket Type1 +FDH02,7.27,reg,0.020777214,Canned,88.8488,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK60,16.5,Regular,0.093786169,Baking Goods,98.9068,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS24,,Regular,0.108947031,Baking Goods,86.5514,OUT019,1985,Small,Tier 1,Grocery Store +FDL03,19.25,Regular,0.045327376,Meat,198.211,OUT010,1998,,Tier 3,Grocery Store +FDB46,,Regular,0.093309811,Snack Foods,212.6244,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO48,15.0,Regular,0.026882496,Baking Goods,222.6456,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ39,19.7,Regular,0.018052793,Meat,103.399,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT02,,LF,0.0,Dairy,35.1874,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC50,15.85,Low Fat,0.136384322,Canned,94.8094,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP39,12.65,Low Fat,0.069411836,Meat,51.5324,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG15,6.13,Low Fat,0.077048493,Dairy,60.0536,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP10,19.0,Low Fat,0.128611924,Snack Foods,104.1622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF53,,Regular,0.083201696,Frozen Foods,181.8318,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN34,15.6,Regular,0.045857055,Snack Foods,170.4132,OUT045,2002,,Tier 2,Supermarket Type1 +FDK02,12.5,Low Fat,0.11245226,Canned,120.744,OUT045,2002,,Tier 2,Supermarket Type1 +FDC23,18.0,Low Fat,0.017942517,Starchy Foods,176.3686,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ10,,Regular,0.226744199,Snack Foods,140.2838,OUT019,1985,Small,Tier 1,Grocery Store +FDE53,10.895,Low Fat,0.026875077,Frozen Foods,107.028,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR25,17.0,Regular,0.139495548,Canned,266.5884,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW50,13.1,Low Fat,0.075578048,Dairy,165.7158,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS09,8.895,Regular,0.081214552,Snack Foods,51.4008,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW49,19.5,Low Fat,0.138175481,Canned,178.1002,OUT010,1998,,Tier 3,Grocery Store +FDU51,20.2,Regular,0.096513676,Meat,178.7028,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF28,15.7,Regular,0.038018966,Frozen Foods,126.1046,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY30,20.25,Low Fat,0.02605898,Household,179.6976,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD44,8.05,Regular,0.078559463,Fruits and Vegetables,259.3646,OUT045,2002,,Tier 2,Supermarket Type1 +FDX09,9.0,Low Fat,0.065618346,Snack Foods,177.337,OUT017,2007,,Tier 2,Supermarket Type1 +NCF30,17.0,Low Fat,0.126139002,Household,125.9362,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ50,,Regular,0.138452448,Dairy,185.4608,OUT019,1985,Small,Tier 1,Grocery Store +FDW37,19.2,Low Fat,0.0,Canned,89.2488,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD11,12.85,Low Fat,0.030664334,Starchy Foods,254.404,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH39,20.7,Low Fat,0.093067785,Dairy,75.567,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA36,5.985,Low Fat,0.005675194,Baking Goods,184.1924,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG43,20.2,Low Fat,0.07435487,Household,92.4462,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF02,16.2,low fat,0.103453599,Canned,103.699,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP57,,low fat,0.052190155,Snack Foods,101.899,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCE42,21.1,Low Fat,0.010662263,Household,231.9958,OUT017,2007,,Tier 2,Supermarket Type1 +NCR38,,LF,0.112968748,Household,252.8724,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP03,,Regular,0.10711317,Meat,125.1388,OUT019,1985,Small,Tier 1,Grocery Store +FDO51,6.785,Regular,0.041974545,Meat,42.3112,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCQ42,20.35,Low Fat,0.039268205,Household,128.4678,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM41,16.5,Low Fat,0.035655991,Health and Hygiene,91.212,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH48,,Low Fat,0.06018748,Baking Goods,85.054,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRF60,10.8,Low Fat,0.052068722,Soft Drinks,236.4564,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ27,17.7,Regular,0.121852987,Meat,101.4674,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ14,9.27,Low Fat,0.061735873,Dairy,150.805,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN27,20.85,Low Fat,0.0,Meat,118.5808,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ02,12.6,Low Fat,0.007456464,Household,188.6556,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ33,8.895,Regular,0.088459496,Snack Foods,124.873,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP07,,Low Fat,0.089466421,Fruits and Vegetables,196.011,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE01,10.1,LF,0.16741508,Soft Drinks,241.2512,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU36,6.15,Low Fat,0.046364789,Baking Goods,99.9384,OUT045,2002,,Tier 2,Supermarket Type1 +FDL28,10.0,Regular,0.063531895,Frozen Foods,228.6668,OUT017,2007,,Tier 2,Supermarket Type1 +NCX53,20.1,Low Fat,0.014937838,Health and Hygiene,141.2154,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ39,19.7,Regular,0.018009769,Meat,103.699,OUT013,1987,High,Tier 3,Supermarket Type1 +NCP42,8.51,Low Fat,0.016097309,Household,195.3478,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ14,10.3,Regular,0.050061008,Canned,81.296,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK04,7.36,Low Fat,0.052393366,Frozen Foods,55.3588,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCC19,6.57,LF,0.09742857,Household,194.582,OUT017,2007,,Tier 2,Supermarket Type1 +FDS09,8.895,Regular,0.081418801,Snack Foods,51.7008,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ02,6.905,Regular,0.038147426,Dairy,99.6726,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD35,12.15,LF,0.02596979,Starchy Foods,121.344,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY42,6.38,Low Fat,0.015248338,Household,144.147,OUT017,2007,,Tier 2,Supermarket Type1 +FDB05,5.155,Low Fat,0.08336707,Frozen Foods,246.9776,OUT045,2002,,Tier 2,Supermarket Type1 +FDF20,12.85,Low Fat,0.033213888,Fruits and Vegetables,195.2768,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCO41,12.5,Low Fat,0.018925644,Health and Hygiene,97.3384,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC40,,Regular,0.064748814,Dairy,79.4986,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV58,20.85,LF,0.121496273,Snack Foods,197.4452,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ57,10.0,Regular,0.037840894,Snack Foods,129.5994,OUT045,2002,,Tier 2,Supermarket Type1 +DRM35,9.695,Low Fat,0.070444556,Hard Drinks,179.4344,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN36,15.2,Low Fat,0.050382246,Soft Drinks,94.2752,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ13,11.1,Low Fat,0.010641608,Canned,84.0908,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRO35,13.85,Low Fat,0.05786369,Hard Drinks,115.4492,OUT010,1998,,Tier 3,Grocery Store +NCD43,8.85,Low Fat,0.0,Household,104.3964,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA51,8.05,Regular,0.165350432,Dairy,114.2518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCX17,,Low Fat,0.113053302,Health and Hygiene,232.93,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ17,12.15,Low Fat,0.079555138,Health and Hygiene,39.4506,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR11,,Regular,0.141847977,Breads,159.6578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW34,9.6,Low Fat,0.035634451,Snack Foods,242.917,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN50,16.85,Regular,0.026669833,Canned,92.712,OUT017,2007,,Tier 2,Supermarket Type1 +FDS09,8.895,Regular,0.081088481,Snack Foods,50.2008,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS48,15.15,Low Fat,0.027892415,Baking Goods,150.9708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL44,18.25,Low Fat,0.012294203,Fruits and Vegetables,162.8894,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF48,5.73,Low Fat,0.052012483,Soft Drinks,187.5898,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA14,16.1,Low Fat,0.0,Dairy,147.876,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCD30,19.7,LF,0.026891006,Household,96.5726,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI16,14.0,Regular,0.136543704,Frozen Foods,51.564,OUT017,2007,,Tier 2,Supermarket Type1 +NCG06,16.35,Low Fat,0.029439793,Household,258.5646,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRZ24,7.535,Low Fat,0.081772054,Soft Drinks,120.444,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCS17,18.6,Low Fat,0.080664702,Health and Hygiene,95.0436,OUT045,2002,,Tier 2,Supermarket Type1 +FDB37,20.25,Regular,0.02298735,Baking Goods,241.1538,OUT045,2002,,Tier 2,Supermarket Type1 +FDE10,6.67,Regular,0.089931111,Snack Foods,130.0626,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC57,20.1,Regular,0.05470525,Fruits and Vegetables,191.682,OUT045,2002,,Tier 2,Supermarket Type1 +FDM12,16.7,Regular,0.070201806,Baking Goods,187.9214,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE24,14.85,Low Fat,0.093607933,Baking Goods,140.4812,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW22,9.695,Regular,0.030351816,Snack Foods,219.7114,OUT045,2002,,Tier 2,Supermarket Type1 +DRD01,,Regular,0.06087929,Soft Drinks,53.3614,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ18,,Low Fat,0.18516682,Household,253.8698,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN49,17.25,Regular,0.125478425,Breakfast,40.948,OUT045,2002,,Tier 2,Supermarket Type1 +FDR22,19.35,reg,0.018559094,Snack Foods,113.1544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV08,,Low Fat,0.0,Fruits and Vegetables,43.6454,OUT019,1985,Small,Tier 1,Grocery Store +FDY39,5.305,Regular,0.047028693,Meat,185.3608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV36,18.7,Low Fat,0.026342897,Baking Goods,125.702,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO60,20.0,Low Fat,0.03443923,Baking Goods,45.1086,OUT045,2002,,Tier 2,Supermarket Type1 +FDU04,,Low Fat,0.005521567,Frozen Foods,122.3414,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR20,,Regular,0.027987562,Fruits and Vegetables,46.7744,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW19,,Regular,0.067409268,Fruits and Vegetables,110.457,OUT019,1985,Small,Tier 1,Grocery Store +FDU40,20.85,Low Fat,0.037462127,Frozen Foods,194.2478,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK15,10.8,Low Fat,0.098613411,Meat,97.6042,OUT045,2002,,Tier 2,Supermarket Type1 +DRF15,18.35,Low Fat,0.03320771,Dairy,151.834,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ25,8.63,Regular,0.028436636,Canned,173.6422,OUT017,2007,,Tier 2,Supermarket Type1 +FDI48,,Regular,0.097555725,Baking Goods,52.7666,OUT019,1985,Small,Tier 1,Grocery Store +FDS49,9.0,Low Fat,0.079345519,Canned,77.0644,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV22,14.85,Regular,0.009938784,Snack Foods,157.863,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCV42,6.26,Low Fat,0.031421979,Household,109.3228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX26,17.7,Low Fat,0.087808521,Dairy,184.3292,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI33,16.5,Low Fat,0.028534583,Snack Foods,89.8146,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ14,7.71,Regular,0.047662684,Dairy,121.0756,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG10,6.63,Regular,0.010930195,Snack Foods,56.3588,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM38,5.885,Regular,0.09314922,Canned,50.7982,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG26,,Low Fat,0.042443319,Canned,256.033,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH46,6.935,Regular,0.04127448,Snack Foods,101.6332,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN13,18.6,Low Fat,0.152677702,Breakfast,99.9358,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU57,8.27,Regular,0.089537252,Snack Foods,149.7708,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCI06,11.3,Low Fat,0.04771769,Household,179.666,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM38,5.885,Regular,0.092959451,Canned,52.6982,OUT045,2002,,Tier 2,Supermarket Type1 +NCG42,19.2,Low Fat,0.069006936,Household,128.931,OUT010,1998,,Tier 3,Grocery Store +FDL39,16.1,Regular,0.063459792,Dairy,180.0318,OUT045,2002,,Tier 2,Supermarket Type1 +FDT31,,Low Fat,0.021795357,Fruits and Vegetables,190.9872,OUT019,1985,Small,Tier 1,Grocery Store +FDV59,13.35,Low Fat,0.047987076,Breads,217.0166,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB49,8.3,Regular,0.03014565,Baking Goods,100.5384,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD58,7.76,low fat,0.059444518,Snack Foods,101.37,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRN59,15.0,Low Fat,0.064141622,Hard Drinks,45.306,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX48,17.75,Regular,0.037946799,Baking Goods,153.3656,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ11,5.695,Regular,0.067806182,Breads,255.1988,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY12,9.8,Regular,0.140829653,Baking Goods,52.5008,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ11,5.695,Regular,0.067838225,Breads,256.4988,OUT045,2002,,Tier 2,Supermarket Type1 +DRI11,8.26,Low Fat,0.034598891,Hard Drinks,115.9834,OUT017,2007,,Tier 2,Supermarket Type1 +FDY32,,Low Fat,0.128615187,Fruits and Vegetables,163.221,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS51,13.35,LF,0.032245757,Meat,60.5194,OUT045,2002,,Tier 2,Supermarket Type1 +FDR19,13.5,Regular,0.267339659,Fruits and Vegetables,144.2102,OUT010,1998,,Tier 3,Grocery Store +DRB13,6.115,Regular,0.007073035,Soft Drinks,189.753,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS21,19.85,Regular,0.020872204,Snack Foods,62.4194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ40,11.1,Regular,0.036100589,Frozen Foods,176.0712,OUT045,2002,,Tier 2,Supermarket Type1 +NCE55,8.92,Low Fat,0.129820371,Household,176.137,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX43,,Low Fat,0.08486204,Fruits and Vegetables,165.25,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS12,9.1,Low Fat,0.174389257,Baking Goods,125.7362,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK01,,Low Fat,0.0607686,Soft Drinks,94.6436,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN25,7.895,Regular,0.061521569,Breakfast,55.3588,OUT017,2007,,Tier 2,Supermarket Type1 +FDB60,9.3,LF,0.028522089,Baking Goods,195.0136,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ13,11.1,Low Fat,0.010701801,Canned,83.5908,OUT017,2007,,Tier 2,Supermarket Type1 +DRK13,11.8,LF,0.115401142,Soft Drinks,196.8084,OUT045,2002,,Tier 2,Supermarket Type1 +DRF25,9.0,Low Fat,0.039083816,Soft Drinks,35.419,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCD42,,Low Fat,0.022127237,Health and Hygiene,39.2506,OUT019,1985,Small,Tier 1,Grocery Store +FDW25,5.175,Low Fat,0.037474799,Canned,84.7224,OUT045,2002,,Tier 2,Supermarket Type1 +NCV29,,Low Fat,0.02273288,Health and Hygiene,179.4686,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCK42,7.475,Low Fat,0.013117547,Household,214.3192,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ13,,Low Fat,0.062585755,Soft Drinks,158.4578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRD15,10.6,Low Fat,0.057117184,Dairy,232.4642,OUT017,2007,,Tier 2,Supermarket Type1 +FDM27,12.35,Regular,0.158790733,Meat,156.3946,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ50,12.8,Regular,0.079398454,Dairy,184.5608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC04,15.6,Low Fat,0.044985646,Dairy,242.4854,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF50,4.905,Low Fat,0.0,Canned,195.9768,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP15,15.2,Low Fat,0.084112804,Meat,257.733,OUT045,2002,,Tier 2,Supermarket Type1 +FDK46,9.6,LF,0.051457663,Snack Foods,258.962,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ56,16.25,LF,0.025841822,Fruits and Vegetables,168.9474,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY60,10.5,Regular,0.0,Baking Goods,143.5128,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB10,10.0,Low Fat,0.067195414,Snack Foods,236.859,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR57,5.675,Regular,0.023544619,Snack Foods,155.5288,OUT045,2002,,Tier 2,Supermarket Type1 +FDU58,6.61,Regular,0.029056831,Snack Foods,186.9898,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH02,7.27,Regular,0.020781144,Canned,88.7488,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP48,7.52,Regular,0.043986578,Baking Goods,182.295,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI46,9.5,Low Fat,0.07433121,Snack Foods,251.9724,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW56,7.68,Low Fat,0.070841281,Fruits and Vegetables,193.1162,OUT013,1987,High,Tier 3,Supermarket Type1 +NCM19,12.65,Low Fat,0.0,Others,111.8202,OUT010,1998,,Tier 3,Grocery Store +FDS50,,Low Fat,0.055164938,Dairy,221.2114,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK24,9.195,Low Fat,0.10121065,Baking Goods,44.4744,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO36,19.7,Low Fat,0.078354554,Baking Goods,180.566,OUT017,2007,,Tier 2,Supermarket Type1 +FDK45,,Low Fat,0.033694227,Seafood,114.786,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCL05,19.6,Low Fat,0.0,Health and Hygiene,44.377,OUT045,2002,,Tier 2,Supermarket Type1 +FDL32,15.7,Regular,0.122965811,Fruits and Vegetables,113.2544,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA28,16.1,Regular,0.047876203,Frozen Foods,126.0362,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY36,12.3,Low Fat,0.009448862,Baking Goods,74.538,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP32,6.65,Low Fat,0.088026614,Fruits and Vegetables,127.2678,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL50,12.15,Regular,0.042313078,Canned,123.2046,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC24,17.85,Low Fat,0.024859869,Soft Drinks,151.7998,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCS18,12.65,Low Fat,0.042449883,Household,107.3938,OUT017,2007,,Tier 2,Supermarket Type1 +FDD16,20.5,Low Fat,0.036558726,Frozen Foods,75.3696,OUT017,2007,,Tier 2,Supermarket Type1 +NCV18,6.775,Low Fat,0.105158282,Household,84.925,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX07,19.2,Regular,0.022918812,Fruits and Vegetables,183.995,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCZ05,,Low Fat,0.057850699,Health and Hygiene,104.299,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCI31,20.0,Low Fat,0.08125948,Others,36.819,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK14,6.98,Low Fat,0.041169697,Canned,83.2934,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCR06,12.5,Low Fat,0.006778869,Household,42.9112,OUT045,2002,,Tier 2,Supermarket Type1 +NCF54,18.0,Low Fat,0.047450712,Household,173.2422,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG23,8.88,Low Fat,0.145253944,Hard Drinks,150.6682,OUT010,1998,,Tier 3,Grocery Store +FDD53,16.2,Low Fat,0.044222497,Frozen Foods,43.5454,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM31,,Low Fat,0.080803421,Others,140.1154,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT16,9.895,Regular,0.048937612,Frozen Foods,261.6278,OUT017,2007,,Tier 2,Supermarket Type1 +FDR40,9.1,Regular,0.008032868,Frozen Foods,79.1618,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG25,10.5,Low Fat,0.019157444,Soft Drinks,184.524,OUT017,2007,,Tier 2,Supermarket Type1 +FDT10,16.7,Regular,0.062032774,Snack Foods,60.6562,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY32,7.605,Low Fat,0.129133491,Fruits and Vegetables,163.721,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN50,16.85,reg,0.026514812,Canned,93.312,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ35,,Regular,0.039006737,Breads,104.599,OUT019,1985,Small,Tier 1,Grocery Store +NCP54,15.35,Low Fat,0.035220955,Household,121.973,OUT045,2002,,Tier 2,Supermarket Type1 +NCD07,9.1,Low Fat,0.055418261,Household,112.0518,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS02,10.195,Regular,0.0,Dairy,196.7794,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRN59,15.0,Low Fat,0.064402907,Hard Drinks,48.306,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRB24,8.785,LF,0.020560102,Soft Drinks,155.5656,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP37,,Low Fat,0.142412955,Breakfast,126.4994,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRB01,7.39,Low Fat,0.082574393,Soft Drinks,190.253,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR47,17.85,LF,0.087468656,Breads,195.7794,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM31,6.095,Low Fat,0.135906494,Others,141.9154,OUT010,1998,,Tier 3,Grocery Store +NCF06,,Low Fat,0.020100543,Household,258.8962,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCV17,,Low Fat,0.016029548,Health and Hygiene,129.9626,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS10,19.2,Low Fat,0.035240292,Snack Foods,178.7318,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN52,9.395,Regular,0.131545005,Frozen Foods,87.3198,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ48,17.75,Low Fat,0.075896411,Baking Goods,113.3544,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ48,11.3,Low Fat,0.056522558,Baking Goods,248.6118,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRB13,,Regular,0.0,Soft Drinks,190.253,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV59,13.35,Low Fat,0.048298704,Breads,216.9166,OUT017,2007,,Tier 2,Supermarket Type1 +FDL32,15.7,Regular,0.122443776,Fruits and Vegetables,111.3544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ12,9.17,Low Fat,0.102959345,Baking Goods,142.147,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCR06,,LF,0.006732389,Household,41.4112,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP51,13.85,Regular,0.085757338,Meat,119.6124,OUT017,2007,,Tier 2,Supermarket Type1 +FDY22,16.5,Regular,0.159587755,Snack Foods,142.6128,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ38,17.6,Low Fat,0.008013458,Dairy,170.7422,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO54,19.5,Low Fat,0.014271592,Household,54.6614,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR23,15.85,Low Fat,0.081772054,Breads,175.137,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM38,5.885,Regular,0.092915543,Canned,54.5982,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS25,6.885,Regular,0.139892043,Canned,112.4228,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ22,9.395,Low Fat,0.045232223,Snack Foods,83.825,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ20,,Low Fat,0.060067062,Fruits and Vegetables,254.8356,OUT019,1985,Small,Tier 1,Grocery Store +FDD45,8.615,Low Fat,0.194576935,Fruits and Vegetables,95.4436,OUT010,1998,,Tier 3,Grocery Store +FDN03,9.8,Regular,0.015113426,Meat,248.7408,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW30,5.21,Low Fat,0.011009897,Household,258.4962,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY24,,Regular,0.132846758,Baking Goods,55.8298,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ26,,Regular,0.148412909,Canned,212.1218,OUT019,1985,Small,Tier 1,Grocery Store +FDM15,11.8,Regular,0.0,Meat,152.2366,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW54,,Low Fat,0.095946376,Household,57.8588,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA23,9.8,Low Fat,0.047282735,Baking Goods,100.5016,OUT045,2002,,Tier 2,Supermarket Type1 +FDA39,,Low Fat,0.0,Meat,39.5822,OUT019,1985,Small,Tier 1,Grocery Store +FDZ12,9.17,Low Fat,0.103561308,Baking Goods,144.147,OUT017,2007,,Tier 2,Supermarket Type1 +NCB42,11.8,Low Fat,0.008561176,Health and Hygiene,115.8492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL16,12.85,Low Fat,0.168452861,Frozen Foods,46.606,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO24,,Low Fat,0.0,Baking Goods,160.4604,OUT019,1985,Small,Tier 1,Grocery Store +NCP42,8.51,Low Fat,0.016110716,Household,193.1478,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR19,13.5,Regular,0.160371305,Fruits and Vegetables,147.2102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL01,19.5,Regular,0.077328827,Soft Drinks,233.5958,OUT045,2002,,Tier 2,Supermarket Type1 +FDV37,13.0,Regular,0.083513874,Canned,198.9426,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI41,18.5,Regular,0.104205322,Frozen Foods,147.0418,OUT010,1998,,Tier 3,Grocery Store +FDF58,13.3,Low Fat,0.009596051,Snack Foods,62.451,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCF43,8.51,Low Fat,0.052157514,Household,141.947,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN02,16.5,Low Fat,0.073942531,Canned,205.8638,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP41,16.6,Low Fat,0.01620764,Health and Hygiene,107.7596,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY17,,Low Fat,0.162306339,Health and Hygiene,45.6086,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL58,,Regular,0.073790004,Snack Foods,265.0568,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA30,,Low Fat,0.128707428,Household,187.9872,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE46,18.6,low fat,0.015833933,Snack Foods,150.6366,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY38,13.6,reg,0.119153896,Dairy,231.23,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCH29,,Low Fat,0.034306863,Health and Hygiene,96.0726,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO20,12.85,Regular,0.152436318,Fruits and Vegetables,253.9382,OUT045,2002,,Tier 2,Supermarket Type1 +FDP44,16.5,Regular,0.080038295,Fruits and Vegetables,103.0332,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM02,,Regular,0.073377993,Canned,89.2198,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ14,,Regular,0.049828008,Canned,79.996,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH04,6.115,Regular,0.019036024,Frozen Foods,88.9488,OUT010,1998,,Tier 3,Grocery Store +DRK23,8.395,Low Fat,0.071976647,Hard Drinks,253.004,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCW05,20.25,Low Fat,0.148072602,Health and Hygiene,106.8938,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF12,8.235,Low Fat,0.082556008,Baking Goods,146.7076,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL51,,Regular,0.08315126,Dairy,212.7876,OUT019,1985,Small,Tier 1,Grocery Store +FDN03,9.8,Regular,0.015151435,Meat,249.4408,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ37,10.8,Low Fat,0.061196379,Soft Drinks,150.5024,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM12,,Regular,0.122415631,Baking Goods,188.7214,OUT019,1985,Small,Tier 1,Grocery Store +FDA16,6.695,Low Fat,0.03401083,Frozen Foods,221.8456,OUT045,2002,,Tier 2,Supermarket Type1 +NCB07,19.2,Low Fat,0.077945963,Household,196.611,OUT017,2007,,Tier 2,Supermarket Type1 +NCI17,,Low Fat,0.251114535,Health and Hygiene,97.241,OUT019,1985,Small,Tier 1,Grocery Store +FDR51,9.035,Regular,0.173469718,Meat,149.3708,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ55,12.8,Regular,0.023578675,Meat,225.2404,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ17,12.15,Low Fat,0.079365542,Health and Hygiene,38.8506,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU25,12.35,Low Fat,0.026659058,Canned,59.5246,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG18,15.3,Low Fat,0.023024502,Household,104.0332,OUT045,2002,,Tier 2,Supermarket Type1 +DRM11,6.57,Low Fat,0.066443294,Hard Drinks,259.5278,OUT017,2007,,Tier 2,Supermarket Type1 +FDH16,10.5,Low Fat,0.052545408,Frozen Foods,91.683,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ04,9.31,Low Fat,0.038109707,Frozen Foods,61.651,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCX53,20.1,Low Fat,0.0,Health and Hygiene,142.3154,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX38,,Regular,0.0,Dairy,48.3376,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX09,9.0,Low Fat,0.06524927,Snack Foods,177.037,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCW05,20.25,Low Fat,0.148675787,Health and Hygiene,107.8938,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCS41,12.85,Low Fat,0.053746315,Health and Hygiene,184.6608,OUT017,2007,,Tier 2,Supermarket Type1 +FDI26,5.94,Low Fat,0.034886739,Canned,177.7344,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCZ41,,Low Fat,0.064109274,Health and Hygiene,125.9704,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCK06,5.03,Low Fat,0.008646528,Household,122.6756,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX23,,Low Fat,0.029547979,Baking Goods,96.5436,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA42,6.965,Low Fat,0.028548583,Household,157.5604,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC20,10.65,Low Fat,0.024008733,Fruits and Vegetables,54.0272,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRC49,8.67,Low Fat,0.065703142,Soft Drinks,143.8128,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX01,10.1,Low Fat,0.024144227,Canned,117.015,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC08,19.0,Regular,0.103659792,Fruits and Vegetables,226.372,OUT045,2002,,Tier 2,Supermarket Type1 +FDC02,21.35,Low Fat,0.069211765,Canned,258.8278,OUT017,2007,,Tier 2,Supermarket Type1 +FDK10,5.785,Regular,0.040440709,Snack Foods,179.166,OUT045,2002,,Tier 2,Supermarket Type1 +DRC24,17.85,Low Fat,0.024800623,Soft Drinks,153.0998,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW16,,Regular,0.072616027,Frozen Foods,92.5804,OUT019,1985,Small,Tier 1,Grocery Store +NCU06,17.6,LF,0.074710165,Household,229.101,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRA59,8.27,Regular,0.128187372,Soft Drinks,184.3924,OUT045,2002,,Tier 2,Supermarket Type1 +FDR24,,Regular,0.110045184,Baking Goods,90.583,OUT019,1985,Small,Tier 1,Grocery Store +DRL35,15.7,Low Fat,0.0,Hard Drinks,43.277,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA49,19.7,Low Fat,0.064867738,Canned,86.6198,OUT013,1987,High,Tier 3,Supermarket Type1 +NCC55,10.695,Low Fat,0.063763137,Household,36.5848,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD24,,Low Fat,0.053918218,Soft Drinks,143.3154,OUT019,1985,Small,Tier 1,Grocery Store +NCE55,8.92,Low Fat,0.130130499,Household,176.737,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT33,7.81,Regular,0.0,Snack Foods,168.6158,OUT045,2002,,Tier 2,Supermarket Type1 +NCT53,5.4,Low Fat,0.048076217,Health and Hygiene,164.1526,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS26,20.35,Low Fat,0.08946922,Dairy,260.1594,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL22,16.85,Low Fat,0.036538413,Snack Foods,91.4488,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP44,16.5,Regular,0.080164468,Fruits and Vegetables,104.5332,OUT017,2007,,Tier 2,Supermarket Type1 +FDC52,11.15,Regular,0.008313629,Dairy,149.5708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI53,8.895,Regular,0.230389434,Frozen Foods,160.5236,OUT010,1998,,Tier 3,Grocery Store +FDZ23,17.75,Regular,0.0675028,Baking Goods,187.124,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT18,14.6,Low Fat,0.059355717,Household,182.6976,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR13,9.895,Regular,0.028720832,Canned,116.7492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB09,16.25,Low Fat,0.096069291,Fruits and Vegetables,125.0046,OUT010,1998,,Tier 3,Grocery Store +FDZ60,20.5,Low Fat,0.119262481,Baking Goods,108.8596,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB11,16.0,Low Fat,0.06084803,Starchy Foods,225.7404,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC10,9.8,Regular,0.073174546,Snack Foods,119.8098,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW56,7.68,Low Fat,0.070886876,Fruits and Vegetables,193.9162,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK14,,Low Fat,0.0,Canned,83.8934,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE27,,Low Fat,0.132028116,Dairy,96.0726,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA38,5.44,Low Fat,0.025624044,Dairy,240.7538,OUT017,2007,,Tier 2,Supermarket Type1 +FDT11,5.94,Regular,0.029431935,Breads,188.7556,OUT045,2002,,Tier 2,Supermarket Type1 +FDP15,15.2,Low Fat,0.083926694,Meat,257.133,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV27,7.97,Regular,0.039982468,Meat,87.6514,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS36,,Regular,0.046660286,Baking Goods,108.957,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY40,,Regular,0.085419332,Frozen Foods,48.0692,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCF19,13.0,Low Fat,0.035163317,Household,50.2034,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF53,20.75,Regular,0.083776121,Frozen Foods,182.2318,OUT045,2002,,Tier 2,Supermarket Type1 +FDS14,,Low Fat,0.04972193,Dairy,156.5288,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE56,17.25,Regular,0.159195426,Fruits and Vegetables,63.8194,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ19,6.425,Low Fat,0.093437228,Fruits and Vegetables,177.7712,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ46,7.485,Low Fat,0.069066197,Snack Foods,112.1228,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR16,5.845,Regular,0.105018002,Frozen Foods,212.8218,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG29,17.6,Low Fat,0.056521229,Frozen Foods,42.1454,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCE30,16.0,LF,0.09969679,Household,214.3902,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ40,8.935,Low Fat,0.040182749,Frozen Foods,52.9298,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG58,10.695,Regular,0.087134714,Snack Foods,155.4972,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH03,17.25,Low Fat,0.035035139,Dairy,94.912,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ47,20.7,Regular,0.079457285,Baking Goods,99.3042,OUT045,2002,,Tier 2,Supermarket Type1 +FDV04,7.825,Regular,0.150626333,Frozen Foods,157.6288,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ10,17.85,Low Fat,0.044644617,Snack Foods,126.202,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG46,8.63,Regular,0.033095808,Snack Foods,113.2518,OUT017,2007,,Tier 2,Supermarket Type1 +NCF07,9.0,Low Fat,0.032087477,Household,99.4016,OUT045,2002,,Tier 2,Supermarket Type1 +FDY44,14.15,Regular,0.024399944,Fruits and Vegetables,194.711,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB21,7.475,LF,0.148397009,Fruits and Vegetables,242.4854,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS20,8.85,Low Fat,0.053856727,Fruits and Vegetables,182.4292,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS49,9.0,LF,0.07946888,Canned,79.6644,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX55,,Low Fat,0.054938563,Fruits and Vegetables,219.5166,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ02,12.6,Low Fat,0.007486838,Household,186.7556,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR25,17.0,Regular,0.139405824,Canned,264.6884,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG39,14.15,Low Fat,0.042266539,Dairy,53.9982,OUT045,2002,,Tier 2,Supermarket Type1 +FDB46,10.5,Regular,0.093763866,Snack Foods,213.3244,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCC30,16.6,Low Fat,0.027691544,Household,179.2344,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE58,18.5,Low Fat,0.052058877,Snack Foods,119.7124,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC05,,Regular,0.172959058,Frozen Foods,198.6768,OUT019,1985,Small,Tier 1,Grocery Store +FDY15,18.25,Regular,0.170828047,Dairy,157.163,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG14,9.0,Regular,0.050500713,Canned,149.8024,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL08,10.8,Low Fat,0.0,Fruits and Vegetables,243.4144,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ47,7.155,Regular,0.168046416,Breads,33.8874,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN12,15.6,Low Fat,0.081088593,Baking Goods,110.0544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW10,21.2,Low Fat,0.070617466,Snack Foods,178.237,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD02,16.6,Low Fat,0.050281492,Canned,117.7124,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX35,5.035,Regular,0.133753866,Breads,229.4036,OUT010,1998,,Tier 3,Grocery Store +FDT35,19.85,Regular,0.081455379,Breads,169.5816,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN47,,Low Fat,0.029461464,Hard Drinks,181.166,OUT019,1985,Small,Tier 1,Grocery Store +FDB11,16.0,Low Fat,0.101847127,Starchy Foods,225.7404,OUT010,1998,,Tier 3,Grocery Store +FDN20,19.35,Low Fat,0.026234991,Fruits and Vegetables,168.4474,OUT045,2002,,Tier 2,Supermarket Type1 +FDB59,18.25,Low Fat,0.01527601,Snack Foods,199.4084,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ58,15.6,Regular,0.105509616,Snack Foods,172.8764,OUT045,2002,,Tier 2,Supermarket Type1 +FDU60,20.0,Regular,0.059901045,Baking Goods,168.8132,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS03,7.825,Low Fat,0.079752411,Meat,66.2826,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU40,,Low Fat,0.065489529,Frozen Foods,193.3478,OUT019,1985,Small,Tier 1,Grocery Store +DRH15,8.775,Low Fat,0.110082155,Dairy,45.7428,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD04,,Low Fat,0.089535602,Dairy,143.8154,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ01,19.7,reg,0.160701642,Canned,253.5014,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF28,15.7,Regular,0.037857561,Frozen Foods,124.8046,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD22,10.0,Low Fat,0.166793159,Snack Foods,112.6544,OUT010,1998,,Tier 3,Grocery Store +FDY19,19.75,Low Fat,0.041364935,Fruits and Vegetables,117.7466,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN33,6.305,Regular,0.123092484,Snack Foods,92.9436,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV36,18.7,Low Fat,0.026297031,Baking Goods,126.202,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW01,14.5,Low Fat,0.107224173,Canned,152.4682,OUT010,1998,,Tier 3,Grocery Store +FDJ28,12.3,Low Fat,0.021894973,Frozen Foods,192.4162,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB17,13.15,Low Fat,0.036665173,Frozen Foods,179.1976,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM40,10.195,Low Fat,0.160185608,Frozen Foods,140.8154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV46,18.2,Low Fat,0.0,Snack Foods,139.918,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ44,20.5,Low Fat,0.036196486,Fruits and Vegetables,119.5756,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD42,16.5,low fat,0.012637846,Health and Hygiene,37.2506,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH37,17.6,Low Fat,0.041616357,Soft Drinks,163.8526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR10,17.6,Low Fat,0.010080792,Snack Foods,163.5552,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCD06,,Low Fat,0.098844291,Household,46.306,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI53,8.895,Regular,0.137644954,Frozen Foods,161.2236,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG16,15.25,Low Fat,0.089799825,Frozen Foods,216.4192,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRB25,12.3,Low Fat,0.069459722,Soft Drinks,107.1938,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY09,15.6,Low Fat,0.025200149,Snack Foods,175.2054,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX48,17.75,Regular,0.037964731,Baking Goods,153.0656,OUT045,2002,,Tier 2,Supermarket Type1 +FDC03,8.575,Regular,0.120256303,Dairy,196.2794,OUT010,1998,,Tier 3,Grocery Store +FDT47,5.26,Regular,0.024504201,Breads,95.9068,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW44,,Regular,0.034980994,Fruits and Vegetables,170.7448,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT24,12.35,Regular,0.186910605,Baking Goods,75.6328,OUT017,2007,,Tier 2,Supermarket Type1 +FDT12,,Regular,0.0,Baking Goods,227.5062,OUT019,1985,Small,Tier 1,Grocery Store +NCS38,8.6,Low Fat,0.090174377,Household,113.4176,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO39,6.985,Regular,0.137340909,Meat,182.8608,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA13,15.85,Low Fat,0.078554948,Canned,38.7506,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO48,15.0,Regular,0.026835691,Baking Goods,220.9456,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ01,6.135,Low Fat,0.115683076,Soft Drinks,159.2236,OUT017,2007,,Tier 2,Supermarket Type1 +FDD53,16.2,Low Fat,0.04440264,Frozen Foods,39.9454,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCT05,10.895,Low Fat,0.020984423,Health and Hygiene,255.9672,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ51,16.0,Regular,0.0,Meat,45.3718,OUT045,2002,,Tier 2,Supermarket Type1 +FDU60,20.0,reg,0.059851197,Baking Goods,167.3132,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC59,16.7,Regular,0.054628903,Starchy Foods,62.5168,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP36,10.395,Regular,0.091155163,Baking Goods,52.2008,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCM19,12.65,Low Fat,0.047504439,Others,111.4202,OUT017,2007,,Tier 2,Supermarket Type1 +FDL16,12.85,Low Fat,0.168421008,Frozen Foods,44.606,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE50,19.7,reg,0.016271661,Canned,188.1556,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR18,15.85,Low Fat,0.020470576,Household,44.5112,OUT013,1987,High,Tier 3,Supermarket Type1 +NCD30,19.7,Low Fat,0.026844186,Household,97.6726,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH31,12.0,Regular,0.02039417,Meat,100.1042,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD56,,Regular,0.181702355,Fruits and Vegetables,173.4054,OUT019,1985,Small,Tier 1,Grocery Store +FDC47,15.0,Low Fat,0.119075479,Snack Foods,229.7694,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ21,17.6,Regular,0.039301403,Snack Foods,94.741,OUT045,2002,,Tier 2,Supermarket Type1 +FDM01,7.895,Regular,0.094714208,Breakfast,102.5332,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF24,15.5,Regular,0.025349355,Baking Goods,82.8934,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW23,5.765,Low Fat,0.082476188,Baking Goods,38.8164,OUT017,2007,,Tier 2,Supermarket Type1 +FDY52,6.365,Low Fat,0.00737822,Frozen Foods,61.3536,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH37,,Low Fat,0.041414828,Soft Drinks,163.3526,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRO47,,Low Fat,0.111681212,Hard Drinks,113.486,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR25,17.0,Regular,0.13973885,Canned,266.4884,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ24,,Low Fat,0.073309965,Baking Goods,250.9724,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRJ51,14.1,Low Fat,0.088352351,Dairy,230.7668,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCU06,17.6,Low Fat,0.074392992,Household,230.101,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCV18,6.775,Low Fat,0.105674592,Household,81.825,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC06,,low fat,0.026855684,Household,127.5336,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ01,8.975,Regular,0.009095747,Canned,104.399,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT14,10.695,Regular,0.128449579,Dairy,120.344,OUT017,2007,,Tier 2,Supermarket Type1 +FDD11,,Low Fat,0.053605948,Starchy Foods,252.404,OUT019,1985,Small,Tier 1,Grocery Store +FDN09,14.15,Low Fat,0.035071955,Snack Foods,243.8828,OUT017,2007,,Tier 2,Supermarket Type1 +NCO18,13.15,Low Fat,0.04126117,Household,177.7686,OUT010,1998,,Tier 3,Grocery Store +FDZ50,12.8,Regular,0.0792367,Dairy,183.6608,OUT045,2002,,Tier 2,Supermarket Type1 +FDS44,12.65,Regular,0.155914104,Fruits and Vegetables,239.5538,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI36,12.5,Regular,0.062469866,Baking Goods,197.7426,OUT045,2002,,Tier 2,Supermarket Type1 +FDA26,7.855,Regular,0.123727659,Dairy,218.3482,OUT010,1998,,Tier 3,Grocery Store +NCY53,20.0,Low Fat,0.058572263,Health and Hygiene,112.6544,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF32,16.35,Low Fat,0.068186803,Fruits and Vegetables,199.3426,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF59,12.5,Low Fat,0.119247864,Starchy Foods,126.302,OUT010,1998,,Tier 3,Grocery Store +FDB20,7.72,Low Fat,0.051980667,Fruits and Vegetables,76.1986,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH11,5.98,Low Fat,0.075543678,Hard Drinks,57.1614,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT03,21.25,Low Fat,0.010014308,Meat,185.7608,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH06,12.3,Low Fat,0.076539909,Household,245.246,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR55,12.15,Regular,0.132288896,Fruits and Vegetables,187.8872,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI10,8.51,Regular,0.078389501,Snack Foods,171.7422,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ12,9.17,Low Fat,0.103187661,Baking Goods,141.247,OUT045,2002,,Tier 2,Supermarket Type1 +FDM12,16.7,Regular,0.070025696,Baking Goods,187.8214,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRB25,12.3,Low Fat,0.069600588,Soft Drinks,107.4938,OUT045,2002,,Tier 2,Supermarket Type1 +NCS41,12.85,Low Fat,0.053399539,Health and Hygiene,182.7608,OUT013,1987,High,Tier 3,Supermarket Type1 +NCT53,5.4,Low Fat,0.048191066,Health and Hygiene,162.8526,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCD55,14.0,Low Fat,0.024310931,Household,39.9454,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY08,9.395,Regular,0.171341198,Fruits and Vegetables,141.3838,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP55,14.65,Low Fat,0.011207422,Others,54.4614,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA33,6.48,Low Fat,0.033871687,Snack Foods,147.9076,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ33,13.35,Low Fat,0.091131261,Snack Foods,148.6708,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE45,,Low Fat,0.040161883,Fruits and Vegetables,179.6002,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT26,18.85,Regular,0.067896957,Dairy,120.944,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV53,8.27,Low Fat,0.018842851,Health and Hygiene,238.988,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK60,,Regular,0.093409739,Baking Goods,97.6068,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCJ29,10.6,Low Fat,0.035192926,Health and Hygiene,83.4224,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI15,13.8,low fat,0.141639229,Dairy,265.0884,OUT045,2002,,Tier 2,Supermarket Type1 +FDX21,7.05,Low Fat,0.084895314,Snack Foods,110.5912,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV49,,Low Fat,0.045220091,Canned,263.4226,OUT019,1985,Small,Tier 1,Grocery Store +DRO59,11.8,LF,0.054154252,Hard Drinks,76.9012,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ14,7.71,Regular,0.047685207,Dairy,122.4756,OUT045,2002,,Tier 2,Supermarket Type1 +FDP32,,Low Fat,0.087244942,Fruits and Vegetables,126.0678,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC33,8.96,Regular,0.069328283,Fruits and Vegetables,198.6768,OUT017,2007,,Tier 2,Supermarket Type1 +FDT14,10.695,Regular,0.213788983,Dairy,121.644,OUT010,1998,,Tier 3,Grocery Store +NCN54,,Low Fat,0.021223197,Household,78.5328,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR57,,Regular,0.023383182,Snack Foods,155.3288,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRK12,9.5,Low Fat,0.041886317,Soft Drinks,32.39,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX52,11.5,Regular,0.042067869,Frozen Foods,194.882,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX08,12.85,Low Fat,0.037834548,Fruits and Vegetables,179.3318,OUT010,1998,,Tier 3,Grocery Store +FDP10,19.0,Low Fat,0.214396632,Snack Foods,105.8622,OUT010,1998,,Tier 3,Grocery Store +NCP50,17.35,Low Fat,0.020601542,Others,78.7618,OUT045,2002,,Tier 2,Supermarket Type1 +NCL06,14.65,Low Fat,0.072006662,Household,259.8594,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP25,15.2,Low Fat,0.02118987,Canned,219.3824,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE53,10.895,Low Fat,0.02685779,Frozen Foods,104.528,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL27,6.17,Low Fat,0.010691082,Meat,66.3826,OUT017,2007,,Tier 2,Supermarket Type1 +FDC35,7.435,Low Fat,0.123028674,Starchy Foods,208.1638,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRJ47,18.25,Low Fat,0.074065937,Hard Drinks,171.308,OUT010,1998,,Tier 3,Grocery Store +FDD16,20.5,Low Fat,0.036501185,Frozen Foods,75.8696,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN42,20.25,LF,0.014244729,Household,146.9418,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC38,,Low Fat,0.121900785,Canned,132.8942,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO07,9.06,Low Fat,0.009796094,Others,212.156,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ20,8.325,Low Fat,0.029831146,Fruits and Vegetables,38.6138,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI32,17.7,Low Fat,0.174373447,Fruits and Vegetables,113.2834,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN20,19.35,Low Fat,0.043823122,Fruits and Vegetables,170.3474,OUT010,1998,,Tier 3,Grocery Store +DRJ51,,Low Fat,0.087567787,Dairy,229.5668,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU08,10.3,Low Fat,0.027370814,Fruits and Vegetables,97.6042,OUT045,2002,,Tier 2,Supermarket Type1 +DRN37,,Low Fat,0.168604314,Soft Drinks,167.4158,OUT019,1985,Small,Tier 1,Grocery Store +FDD05,19.35,Low Fat,0.027804204,Frozen Foods,121.8098,OUT010,1998,,Tier 3,Grocery Store +FDW15,15.35,Regular,0.055113596,Meat,148.6734,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI52,18.7,Low Fat,0.104678138,Frozen Foods,124.3072,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRM11,6.57,Low Fat,0.0,Hard Drinks,261.6278,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO06,19.25,Low Fat,0.108249522,Household,32.0558,OUT045,2002,,Tier 2,Supermarket Type1 +FDU38,10.8,Low Fat,0.082678239,Dairy,190.4504,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU59,5.78,Low Fat,0.096778863,Breads,161.5552,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ10,5.095,Regular,0.129503664,Snack Foods,138.6838,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM13,6.425,Low Fat,0.063273547,Breakfast,132.8626,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCJ30,,low fat,0.141191067,Household,167.979,OUT019,1985,Small,Tier 1,Grocery Store +FDM45,8.655,Regular,0.088553998,Snack Foods,121.7756,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP36,10.395,Regular,0.091357303,Baking Goods,50.1008,OUT045,2002,,Tier 2,Supermarket Type1 +NCD30,19.7,Low Fat,0.044940161,Household,97.3726,OUT010,1998,,Tier 3,Grocery Store +FDN48,13.35,Low Fat,0.065318118,Baking Goods,93.7804,OUT017,2007,,Tier 2,Supermarket Type1 +FDY32,7.605,Low Fat,0.129441977,Fruits and Vegetables,161.221,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU47,12.8,Regular,0.113854468,Breads,141.5838,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF17,,Low Fat,0.074623672,Frozen Foods,198.211,OUT019,1985,Small,Tier 1,Grocery Store +FDP34,12.85,Low Fat,0.138004065,Snack Foods,156.963,OUT017,2007,,Tier 2,Supermarket Type1 +FDA47,10.5,Regular,0.116855192,Baking Goods,163.621,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRD27,,Low Fat,0.023724475,Dairy,98.7042,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW38,5.325,Regular,0.138961241,Dairy,54.1298,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ15,,Low Fat,0.036541979,Dairy,120.1782,OUT019,1985,Small,Tier 1,Grocery Store +FDZ03,,Regular,0.078405146,Dairy,187.324,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCN19,13.1,Low Fat,0.012118359,Others,188.853,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG02,7.855,Low Fat,0.011259035,Canned,190.2188,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS31,13.1,Regular,0.044184016,Fruits and Vegetables,182.4318,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW43,,Regular,0.039263694,Fruits and Vegetables,228.1036,OUT019,1985,Small,Tier 1,Grocery Store +FDZ47,20.7,Regular,0.132726034,Baking Goods,99.8042,OUT010,1998,,Tier 3,Grocery Store +FDO57,20.75,Low Fat,0.109325071,Snack Foods,160.9578,OUT017,2007,,Tier 2,Supermarket Type1 +NCL07,13.85,Low Fat,0.031312479,Others,39.148,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV42,6.26,Low Fat,0.031395831,Household,110.7228,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP40,4.555,Regular,0.034551507,Frozen Foods,112.5544,OUT017,2007,,Tier 2,Supermarket Type1 +FDP48,,Regular,0.077078963,Baking Goods,184.695,OUT019,1985,Small,Tier 1,Grocery Store +FDH21,10.395,Low Fat,0.031401634,Seafood,160.3604,OUT017,2007,,Tier 2,Supermarket Type1 +NCP02,7.105,Low Fat,0.044878428,Household,59.7562,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK24,9.195,Low Fat,0.0,Baking Goods,45.6744,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC41,15.6,Low Fat,0.117150348,Frozen Foods,75.067,OUT045,2002,,Tier 2,Supermarket Type1 +FDF08,14.3,Regular,0.0655764,Fruits and Vegetables,86.1856,OUT017,2007,,Tier 2,Supermarket Type1 +FDO49,10.6,Regular,0.033239125,Breakfast,52.1008,OUT017,2007,,Tier 2,Supermarket Type1 +FDS56,,Regular,0.038569182,Fruits and Vegetables,260.8252,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX46,12.3,Regular,0.058353501,Snack Foods,60.5562,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ07,15.1,Regular,0.087334125,Fruits and Vegetables,220.4456,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC32,18.35,Low Fat,0.16588815,Fruits and Vegetables,92.0462,OUT010,1998,,Tier 3,Grocery Store +FDT21,,Low Fat,0.035703488,Snack Foods,248.0092,OUT019,1985,Small,Tier 1,Grocery Store +FDG58,10.695,Regular,0.086957199,Snack Foods,155.1972,OUT045,2002,,Tier 2,Supermarket Type1 +FDW14,8.3,Regular,0.038270946,Dairy,85.9198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRA12,,Low Fat,0.040747616,Soft Drinks,140.0154,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV27,7.97,Regular,0.039956751,Meat,88.5514,OUT013,1987,High,Tier 3,Supermarket Type1 +DRD25,6.135,Low Fat,0.078906336,Soft Drinks,112.386,OUT013,1987,High,Tier 3,Supermarket Type1 +DRF48,,Low Fat,0.051550615,Soft Drinks,186.3898,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX24,8.355,Low Fat,0.0,Baking Goods,92.6462,OUT017,2007,,Tier 2,Supermarket Type1 +DRJ51,14.1,Low Fat,0.087993901,Dairy,229.8668,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE45,12.1,Low Fat,0.040439161,Fruits and Vegetables,180.0002,OUT045,2002,,Tier 2,Supermarket Type1 +FDE14,13.65,Regular,0.031445152,Canned,101.17,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG53,10.0,Low Fat,0.045949933,Frozen Foods,138.118,OUT045,2002,,Tier 2,Supermarket Type1 +FDT08,13.65,Low Fat,0.049218499,Fruits and Vegetables,148.905,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC27,,Low Fat,0.057821105,Dairy,246.9802,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG20,15.5,Regular,0.125664151,Fruits and Vegetables,176.7028,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC21,14.6,Regular,0.04295882,Fruits and Vegetables,108.3254,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV31,9.8,Low Fat,0.107152044,Fruits and Vegetables,177.237,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB58,10.5,Regular,0.013523837,Snack Foods,141.1154,OUT045,2002,,Tier 2,Supermarket Type1 +FDV23,11.0,Low Fat,0.105836765,Breads,124.6046,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA25,,Regular,0.119279404,Canned,102.599,OUT019,1985,Small,Tier 1,Grocery Store +FDC15,18.1,Low Fat,0.177969055,Dairy,158.6288,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU47,12.8,Regular,0.114031481,Breads,138.6838,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE23,17.6,Regular,0.0,Starchy Foods,46.606,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS08,5.735,Low Fat,0.056913819,Fruits and Vegetables,177.037,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW03,,Regular,0.024422434,Meat,104.3306,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ60,19.35,Regular,0.06278314,Baking Goods,163.3184,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM34,19.0,Low Fat,0.067829083,Snack Foods,129.2626,OUT017,2007,,Tier 2,Supermarket Type1 +FDW33,9.395,Low Fat,0.099038102,Snack Foods,105.528,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ40,8.935,Low Fat,0.040149309,Frozen Foods,54.3298,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE33,19.35,Regular,0.049837799,Fruits and Vegetables,80.5644,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC06,19.0,Low Fat,0.045169646,Household,127.7336,OUT010,1998,,Tier 3,Grocery Store +FDU11,4.785,Low Fat,0.092593652,Breads,119.4098,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL44,18.25,Low Fat,0.012344551,Fruits and Vegetables,162.9894,OUT017,2007,,Tier 2,Supermarket Type1 +NCZ29,15.0,Low Fat,0.071775164,Health and Hygiene,127.1362,OUT017,2007,,Tier 2,Supermarket Type1 +FDG28,9.285,Regular,0.0,Frozen Foods,244.9144,OUT010,1998,,Tier 3,Grocery Store +FDL12,15.85,Regular,0.122128201,Baking Goods,59.522,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD52,18.25,Regular,0.18433167,Dairy,108.957,OUT017,2007,,Tier 2,Supermarket Type1 +FDO15,16.75,Regular,0.008559416,Meat,72.2038,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN29,,Low Fat,0.012057789,Health and Hygiene,49.3034,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW36,11.15,Low Fat,0.056885263,Baking Goods,107.7622,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB21,7.475,Low Fat,0.148520605,Fruits and Vegetables,239.9854,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ28,20.0,reg,0.051449648,Frozen Foods,128.8678,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY10,17.6,Low Fat,0.049058599,Snack Foods,114.6176,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG39,14.15,Low Fat,0.042419588,Dairy,53.0982,OUT017,2007,,Tier 2,Supermarket Type1 +FDN28,5.88,Regular,0.030222732,Frozen Foods,102.699,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV15,10.3,Low Fat,0.146144813,Meat,104.4648,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRI13,15.35,Low Fat,0.020323118,Soft Drinks,217.6508,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH20,16.1,Regular,0.024949113,Fruits and Vegetables,96.041,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY51,12.5,Low Fat,0.081067307,Meat,220.2798,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE16,8.895,Low Fat,0.026321792,Frozen Foods,207.7954,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX40,12.85,Low Fat,0.099396395,Frozen Foods,37.1164,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC48,9.195,Low Fat,0.015923898,Baking Goods,80.5592,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS14,7.285,Low Fat,0.049963882,Dairy,155.9288,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX56,17.1,Regular,0.074478384,Fruits and Vegetables,208.7638,OUT017,2007,,Tier 2,Supermarket Type1 +FDI10,8.51,Regular,0.078404327,Snack Foods,171.1422,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI14,14.1,Low Fat,0.089603145,Canned,142.3496,OUT013,1987,High,Tier 3,Supermarket Type1 +DRM48,15.2,Low Fat,0.112802719,Soft Drinks,35.8848,OUT013,1987,High,Tier 3,Supermarket Type1 +NCH07,,Low Fat,0.092218288,Household,158.6604,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY26,20.6,Regular,0.030485136,Dairy,210.7244,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD02,,Low Fat,0.050047465,Canned,119.0124,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM12,16.7,Regular,0.069916994,Baking Goods,188.1214,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRF01,5.655,Low Fat,0.293048379,Soft Drinks,145.5102,OUT010,1998,,Tier 3,Grocery Store +FDV36,18.7,Low Fat,0.026302004,Baking Goods,126.502,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRI59,9.5,Low Fat,0.040800688,Hard Drinks,223.5088,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV03,17.6,Low Fat,0.058327908,Meat,156.5314,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO39,6.985,Regular,0.0,Meat,182.9608,OUT017,2007,,Tier 2,Supermarket Type1 +NCB07,19.2,Low Fat,0.077823282,Household,197.811,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH38,,Low Fat,0.010387683,Canned,115.9808,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ13,7.84,Regular,0.153465955,Canned,49.435,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCZ30,6.59,Low Fat,0.026184983,Household,122.3098,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCA06,20.5,Low Fat,0.143256515,Household,35.419,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB04,11.35,Regular,0.063324606,Dairy,86.7856,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN50,16.85,Regular,0.026497757,Canned,93.012,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG06,16.35,Low Fat,0.02949114,Household,256.7646,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCY17,18.2,Low Fat,0.163760524,Health and Hygiene,45.0086,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC23,18.0,Low Fat,0.017906203,Starchy Foods,178.7686,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK33,17.85,Low Fat,0.011252718,Snack Foods,212.256,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR03,15.7,Regular,0.008749518,Meat,208.198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ07,15.1,Regular,0.094081729,Fruits and Vegetables,63.1194,OUT045,2002,,Tier 2,Supermarket Type1 +FDO38,17.25,Low Fat,0.072778438,Canned,78.4986,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS59,14.8,Regular,0.043893446,Breads,108.157,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRM11,,Low Fat,0.115679302,Hard Drinks,260.1278,OUT019,1985,Small,Tier 1,Grocery Store +FDX52,,Regular,0.041799167,Frozen Foods,194.382,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRJ35,10.1,Low Fat,0.046774318,Hard Drinks,59.3878,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP53,14.75,Low Fat,0.032890347,Health and Hygiene,239.3906,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW15,,Regular,0.096496792,Meat,148.8734,OUT019,1985,Small,Tier 1,Grocery Store +DRI47,14.7,Low Fat,0.020962606,Hard Drinks,143.7128,OUT045,2002,,Tier 2,Supermarket Type1 +DRZ11,8.85,Regular,0.11264364,Soft Drinks,123.0388,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS02,10.195,Regular,0.14574596,Dairy,196.2794,OUT013,1987,High,Tier 3,Supermarket Type1 +DRD49,9.895,Low Fat,0.168514737,Soft Drinks,238.1564,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW38,5.325,Regular,0.138895605,Dairy,52.4298,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR21,,Low Fat,0.117195348,Snack Foods,178.037,OUT019,1985,Small,Tier 1,Grocery Store +FDE40,15.6,Regular,0.099061255,Dairy,63.7194,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI02,15.7,Regular,0.114797434,Canned,110.8202,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ04,6.4,Low Fat,0.0,Frozen Foods,39.5796,OUT045,2002,,Tier 2,Supermarket Type1 +FDY14,10.3,Low Fat,0.07043637,Dairy,265.3226,OUT017,2007,,Tier 2,Supermarket Type1 +NCT54,8.695,Low Fat,0.119535605,Household,96.6094,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD25,6.135,Low Fat,0.079418753,Soft Drinks,111.886,OUT017,2007,,Tier 2,Supermarket Type1 +DRE01,10.1,Low Fat,0.167494193,Soft Drinks,241.8512,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ12,8.895,Regular,0.065346821,Baking Goods,209.2296,OUT010,1998,,Tier 3,Grocery Store +NCZ05,8.485,Low Fat,0.058222587,Health and Hygiene,103.799,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRB25,,Low Fat,0.121615007,Soft Drinks,108.7938,OUT019,1985,Small,Tier 1,Grocery Store +NCC31,8.02,Low Fat,0.01991076,Household,157.1972,OUT045,2002,,Tier 2,Supermarket Type1 +FDM16,8.155,Regular,0.03362345,Frozen Foods,75.5354,OUT045,2002,,Tier 2,Supermarket Type1 +DRG11,6.385,Low Fat,0.083968636,Hard Drinks,105.9596,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV24,,Low Fat,0.102772236,Baking Goods,148.705,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV43,16.0,Low Fat,0.076855628,Fruits and Vegetables,44.5086,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG05,11.0,Regular,0.088204994,Frozen Foods,155.163,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV23,11.0,Low Fat,0.0,Breads,123.9046,OUT010,1998,,Tier 3,Grocery Store +FDI58,7.64,Regular,0.070992494,Snack Foods,92.012,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ11,5.695,Regular,0.06808387,Breads,257.9988,OUT017,2007,,Tier 2,Supermarket Type1 +FDC05,,Regular,0.098306217,Frozen Foods,197.4768,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF40,20.25,reg,0.022493399,Dairy,247.8092,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU02,13.35,Low Fat,0.102929093,Dairy,227.9352,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT32,19.0,Regular,0.065579315,Fruits and Vegetables,186.5214,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF06,6.235,Low Fat,0.020312604,Household,260.9962,OUT017,2007,,Tier 2,Supermarket Type1 +FDT46,11.35,Low Fat,0.0,Snack Foods,51.3008,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR58,6.675,Low Fat,0.070167934,Snack Foods,91.5462,OUT010,1998,,Tier 3,Grocery Store +FDY04,17.7,Regular,0.042476445,Frozen Foods,162.321,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT58,9.0,Low Fat,0.086129035,Snack Foods,166.8816,OUT045,2002,,Tier 2,Supermarket Type1 +FDE46,18.6,Low Fat,0.015794211,Snack Foods,152.0366,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH11,5.98,Low Fat,0.075985352,Hard Drinks,56.0614,OUT017,2007,,Tier 2,Supermarket Type1 +DRI51,17.25,Low Fat,0.04224163,Dairy,171.0764,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC35,7.435,Low Fat,0.123532514,Starchy Foods,205.6638,OUT017,2007,,Tier 2,Supermarket Type1 +FDP45,15.7,Regular,0.030619053,Snack Foods,252.4724,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC45,17.0,Low Fat,0.0,Fruits and Vegetables,169.1106,OUT017,2007,,Tier 2,Supermarket Type1 +FDU01,20.25,Regular,0.012019598,Canned,184.0924,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ53,10.5,Low Fat,0.119271136,Frozen Foods,121.0098,OUT010,1998,,Tier 3,Grocery Store +FDJ46,11.1,Low Fat,0.045076978,Snack Foods,173.6054,OUT017,2007,,Tier 2,Supermarket Type1 +FDX07,19.2,Regular,0.022899739,Fruits and Vegetables,185.095,OUT013,1987,High,Tier 3,Supermarket Type1 +NCI30,20.25,Low Fat,0.059027151,Household,248.046,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE47,,Low Fat,0.037725174,Starchy Foods,123.9046,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV48,9.195,Regular,0.0,Baking Goods,78.2644,OUT045,2002,,Tier 2,Supermarket Type1 +FDN16,,Regular,0.109780112,Frozen Foods,102.599,OUT019,1985,Small,Tier 1,Grocery Store +FDM52,15.1,Low Fat,0.025971792,Frozen Foods,146.2076,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA32,,Low Fat,0.02994846,Fruits and Vegetables,217.3192,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH05,14.35,Regular,0.091427887,Frozen Foods,231.6984,OUT017,2007,,Tier 2,Supermarket Type1 +FDW25,5.175,Low Fat,0.06259818,Canned,87.1224,OUT010,1998,,Tier 3,Grocery Store +FDQ09,7.235,Low Fat,0.058132207,Snack Foods,114.0834,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM17,7.93,Low Fat,0.119066863,Health and Hygiene,45.9086,OUT010,1998,,Tier 3,Grocery Store +DRM59,5.88,Low Fat,0.003592093,Hard Drinks,154.1998,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV47,,LF,0.053945046,Breads,83.8566,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRE15,13.35,Low Fat,0.017782033,Dairy,74.2012,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS25,6.885,Regular,0.234345616,Canned,108.9228,OUT010,1998,,Tier 3,Grocery Store +NCZ05,8.485,Low Fat,0.058369013,Health and Hygiene,104.499,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV05,,Low Fat,0.052891202,Health and Hygiene,154.7656,OUT019,1985,Small,Tier 1,Grocery Store +DRM37,15.35,Low Fat,0.096397813,Soft Drinks,196.5768,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV58,,Low Fat,0.120663214,Snack Foods,194.2452,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN22,,Regular,0.0,Snack Foods,252.6724,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO06,19.25,Low Fat,0.108198392,Household,32.4558,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT56,,Regular,0.202387387,Fruits and Vegetables,59.5246,OUT019,1985,Small,Tier 1,Grocery Store +FDM02,12.5,Regular,0.073673697,Canned,88.1198,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA09,13.35,Regular,0.149366403,Snack Foods,180.566,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCC06,19.0,Low Fat,0.026981264,Household,126.5336,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCL54,12.6,Low Fat,0.082882475,Household,176.1054,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCB55,15.7,Low Fat,0.161571797,Household,59.2562,OUT017,2007,,Tier 2,Supermarket Type1 +FDB12,11.15,Regular,0.105903322,Baking Goods,105.1648,OUT017,2007,,Tier 2,Supermarket Type1 +NCA54,16.5,Low Fat,0.036698564,Household,178.9318,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCS38,8.6,Low Fat,0.090331655,Household,115.8176,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC02,21.35,Low Fat,0.068929478,Canned,259.6278,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK44,,Low Fat,0.214004545,Fruits and Vegetables,173.6738,OUT019,1985,Small,Tier 1,Grocery Store +FDE16,8.895,Low Fat,0.026338733,Frozen Foods,207.2954,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCS05,11.5,Low Fat,0.020974105,Health and Hygiene,132.3942,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ59,6.63,Regular,0.104232541,Baking Goods,166.75,OUT045,2002,,Tier 2,Supermarket Type1 +FDI20,19.1,Low Fat,0.038781892,Fruits and Vegetables,212.8586,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ14,9.27,Low Fat,0.06178729,Dairy,150.805,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF53,20.75,Regular,0.084079477,Frozen Foods,181.2318,OUT017,2007,,Tier 2,Supermarket Type1 +FDW25,5.175,Low Fat,0.037610496,Canned,85.0224,OUT017,2007,,Tier 2,Supermarket Type1 +NCQ43,17.75,Low Fat,0.186296103,Others,108.1912,OUT010,1998,,Tier 3,Grocery Store +FDX52,11.5,Regular,0.041967613,Frozen Foods,192.282,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE28,9.5,Regular,0.132815802,Frozen Foods,228.3668,OUT045,2002,,Tier 2,Supermarket Type1 +FDN15,17.5,Low Fat,0.016828712,Meat,138.418,OUT017,2007,,Tier 2,Supermarket Type1 +FDO28,5.765,LF,0.072707309,Frozen Foods,119.3098,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ33,13.35,Low Fat,0.091392132,Snack Foods,151.1708,OUT045,2002,,Tier 2,Supermarket Type1 +FDM22,14.0,Regular,0.070228698,Snack Foods,54.264,OUT010,1998,,Tier 3,Grocery Store +FDJ03,12.35,Regular,0.072804407,Dairy,48.5692,OUT017,2007,,Tier 2,Supermarket Type1 +FDI16,14.0,Regular,0.136051058,Frozen Foods,53.564,OUT045,2002,,Tier 2,Supermarket Type1 +FDI09,,Regular,0.128711271,Seafood,240.488,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX55,15.1,Low Fat,0.055159959,Fruits and Vegetables,217.8166,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS23,,Low Fat,0.140206849,Breads,128.1994,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRC12,17.85,Low Fat,0.037903586,Soft Drinks,191.7188,OUT045,2002,,Tier 2,Supermarket Type1 +FDH41,9.0,Low Fat,0.0,Frozen Foods,215.8534,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN01,8.895,Low Fat,0.072338526,Breakfast,174.837,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV55,17.75,Low Fat,0.05518512,Fruits and Vegetables,143.7444,OUT045,2002,,Tier 2,Supermarket Type1 +NCJ19,18.6,Low Fat,0.118081664,Others,56.3588,OUT013,1987,High,Tier 3,Supermarket Type1 +NCY29,13.65,LF,0.129274071,Health and Hygiene,55.993,OUT010,1998,,Tier 3,Grocery Store +FDP03,5.15,Regular,0.061426289,Meat,122.7388,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ52,19.2,Low Fat,0.100277478,Frozen Foods,110.4886,OUT045,2002,,Tier 2,Supermarket Type1 +FDH31,12.0,Regular,0.0,Meat,101.2042,OUT010,1998,,Tier 3,Grocery Store +FDQ19,7.35,Regular,0.014423645,Fruits and Vegetables,241.3512,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS15,9.195,Regular,0.07804584,Meat,105.8596,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN32,17.5,Low Fat,0.015648384,Fruits and Vegetables,182.5266,OUT017,2007,,Tier 2,Supermarket Type1 +FDH32,12.8,Low Fat,0.07617829,Fruits and Vegetables,98.541,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF33,7.97,Low Fat,0.021657301,Seafood,109.5596,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ22,18.75,Low Fat,0.052810244,Snack Foods,190.3504,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG56,13.3,Regular,0.119596939,Fruits and Vegetables,62.4536,OUT010,1998,,Tier 3,Grocery Store +FDC05,13.1,Regular,0.098784586,Frozen Foods,195.8768,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK09,15.2,Low Fat,0.091686939,Snack Foods,227.4352,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV29,11.8,Low Fat,0.022889828,Health and Hygiene,176.6686,OUT045,2002,,Tier 2,Supermarket Type1 +NCC43,,Low Fat,0.162450872,Household,250.5066,OUT019,1985,Small,Tier 1,Grocery Store +NCA42,6.965,Low Fat,0.028592968,Household,156.7604,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC10,9.8,Regular,0.072877673,Snack Foods,118.5098,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC16,11.5,Regular,0.020552693,Dairy,87.654,OUT013,1987,High,Tier 3,Supermarket Type1 +NCL17,7.39,Low Fat,0.067723308,Health and Hygiene,140.6812,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA51,8.05,Regular,0.164648458,Dairy,114.3518,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW01,14.5,Low Fat,0.06442287,Canned,152.4682,OUT017,2007,,Tier 2,Supermarket Type1 +NCF30,17.0,Low Fat,0.126500085,Household,127.8362,OUT045,2002,,Tier 2,Supermarket Type1 +FDN49,17.25,Regular,0.125120258,Breakfast,41.848,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY20,12.5,Regular,0.081918557,Fruits and Vegetables,89.8488,OUT045,2002,,Tier 2,Supermarket Type1 +FDC15,18.1,Low Fat,0.178329981,Dairy,156.5288,OUT045,2002,,Tier 2,Supermarket Type1 +FDY24,4.88,Regular,0.133493205,Baking Goods,53.3298,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCG43,20.2,Low Fat,0.0,Household,94.4462,OUT017,2007,,Tier 2,Supermarket Type1 +FDA48,12.1,Low Fat,0.114778465,Baking Goods,223.0114,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF55,6.675,Low Fat,0.021788889,Household,36.7874,OUT017,2007,,Tier 2,Supermarket Type1 +FDL38,13.8,Regular,0.014756014,Canned,89.7172,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCQ29,12.0,Low Fat,0.104654725,Health and Hygiene,258.7278,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC34,16.0,Regular,0.173736289,Snack Foods,156.7972,OUT017,2007,,Tier 2,Supermarket Type1 +FDP36,,Regular,0.0,Baking Goods,51.9008,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN50,16.85,Regular,0.0,Canned,93.712,OUT010,1998,,Tier 3,Grocery Store +FDO23,17.85,Low Fat,0.146655006,Breads,94.4436,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT56,16.0,Regular,0.115496216,Fruits and Vegetables,58.2246,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT13,,Low Fat,0.018481707,Canned,188.5214,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ03,13.65,Regular,0.07872111,Dairy,187.624,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ03,15.0,Regular,0.13057987,Meat,235.4248,OUT010,1998,,Tier 3,Grocery Store +FDU44,12.15,reg,0.058544215,Fruits and Vegetables,161.5552,OUT045,2002,,Tier 2,Supermarket Type1 +FDD03,13.3,Low Fat,0.079930344,Dairy,231.03,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH30,17.1,Low Fat,0.067098169,Household,112.286,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS60,20.85,Low Fat,0.054312176,Baking Goods,179.766,OUT010,1998,,Tier 3,Grocery Store +FDG08,13.15,Regular,0.165359325,Fruits and Vegetables,171.6764,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX38,10.5,Regular,0.048479695,Dairy,47.5376,OUT017,2007,,Tier 2,Supermarket Type1 +FDD22,10.0,Low Fat,0.100213353,Snack Foods,113.5544,OUT017,2007,,Tier 2,Supermarket Type1 +FDW51,6.155,Regular,0.094581098,Meat,211.456,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL09,19.6,Regular,0.128760294,Snack Foods,169.4816,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ60,20.5,Low Fat,0.11960388,Baking Goods,107.9596,OUT045,2002,,Tier 2,Supermarket Type1 +NCH07,13.15,Low Fat,0.092667032,Household,159.1604,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ41,14.8,Low Fat,0.019510678,Health and Hygiene,196.9794,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW04,8.985,Regular,0.057917007,Frozen Foods,128.131,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI08,,reg,0.065976009,Fruits and Vegetables,249.0092,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR19,,Regular,0.279650277,Fruits and Vegetables,147.3102,OUT019,1985,Small,Tier 1,Grocery Store +FDV13,17.35,reg,0.027610867,Canned,86.0856,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB52,17.75,Low Fat,0.030607757,Dairy,256.6672,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ48,,Low Fat,0.075591785,Baking Goods,111.6544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO14,9.6,Low Fat,0.029689961,Household,45.7086,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ50,12.8,Regular,0.079010526,Dairy,184.5608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN27,,LF,0.069268825,Meat,116.9808,OUT019,1985,Small,Tier 1,Grocery Store +FDQ60,6.195,Regular,0.109283423,Baking Goods,121.9098,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR49,8.71,Low Fat,0.140015944,Canned,46.3376,OUT017,2007,,Tier 2,Supermarket Type1 +DRJ35,,Low Fat,0.046358964,Hard Drinks,62.3878,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRI49,14.15,Low Fat,0.184545287,Soft Drinks,82.1276,OUT017,2007,,Tier 2,Supermarket Type1 +FDB47,8.8,Low Fat,0.071833423,Snack Foods,210.0612,OUT017,2007,,Tier 2,Supermarket Type1 +FDP37,15.6,LF,0.239530025,Breakfast,126.4994,OUT010,1998,,Tier 3,Grocery Store +FDR26,20.7,Low Fat,0.042903378,Dairy,176.2028,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY31,,Low Fat,0.076272929,Fruits and Vegetables,145.7418,OUT019,1985,Small,Tier 1,Grocery Store +FDC11,20.5,Low Fat,0.1420804,Starchy Foods,89.5172,OUT045,2002,,Tier 2,Supermarket Type1 +DRP47,15.75,Low Fat,0.0,Hard Drinks,250.4382,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY54,8.43,Low Fat,0.1784187,Household,171.1422,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR27,15.1,Regular,0.096100432,Meat,132.4942,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ21,,Low Fat,0.034007573,Snack Foods,122.8756,OUT019,1985,Small,Tier 1,Grocery Store +NCQ29,12.0,Low Fat,0.104210426,Health and Hygiene,262.0278,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ02,17.2,Regular,0.0,Canned,147.0418,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE21,12.8,Low Fat,0.023038155,Fruits and Vegetables,114.1492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM39,6.42,Low Fat,0.053470662,Dairy,178.2002,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ01,8.975,Regular,0.009110086,Canned,101.799,OUT017,2007,,Tier 2,Supermarket Type1 +NCB19,6.525,Low Fat,0.090663534,Household,86.1882,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU03,18.7,Regular,0.091577922,Meat,181.7292,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP27,8.155,Low Fat,0.119636353,Meat,187.853,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF01,5.655,Low Fat,0.175435278,Soft Drinks,145.4102,OUT045,2002,,Tier 2,Supermarket Type1 +FDM03,12.65,Low Fat,0.123222078,Meat,107.6938,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV01,19.2,Regular,0.084950573,Canned,155.7314,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS16,15.15,Regular,0.066176944,Frozen Foods,146.076,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO45,13.15,Regular,0.0379456,Snack Foods,89.1856,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCX06,17.6,Low Fat,0.015684078,Household,180.8976,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP13,8.1,Regular,0.134323555,Canned,38.948,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCR38,17.25,Low Fat,0.113980892,Household,252.4724,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA01,15.0,Regular,0.054333001,Canned,57.5904,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT26,18.85,Regular,0.068337879,Dairy,118.044,OUT017,2007,,Tier 2,Supermarket Type1 +FDD44,,Regular,0.078020807,Fruits and Vegetables,258.3646,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB26,14.0,Regular,0.031241476,Canned,53.864,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP45,,Regular,0.053620148,Snack Foods,250.4724,OUT019,1985,Small,Tier 1,Grocery Store +NCP55,14.65,Low Fat,0.011190025,Others,56.5614,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT23,7.72,Regular,0.075154189,Breads,77.7986,OUT017,2007,,Tier 2,Supermarket Type1 +FDO51,6.785,Regular,0.042067625,Meat,41.4112,OUT045,2002,,Tier 2,Supermarket Type1 +FDA44,19.7,Low Fat,0.053222716,Fruits and Vegetables,57.293,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ31,19.2,Low Fat,0.183397827,Others,239.9196,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX37,16.2,LF,0.063157164,Canned,99.47,OUT045,2002,,Tier 2,Supermarket Type1 +NCD18,16.0,Low Fat,0.0,Household,229.3668,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN40,,Low Fat,0.086038118,Frozen Foods,154.0998,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL33,7.235,Low Fat,0.100527952,Snack Foods,194.9452,OUT017,2007,,Tier 2,Supermarket Type1 +DRF48,5.73,Low Fat,0.051791671,Soft Drinks,188.4898,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW08,12.1,Low Fat,0.148353512,Fruits and Vegetables,105.128,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX39,14.3,Regular,0.049878516,Meat,212.9586,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB38,19.5,Regular,0.0,Canned,161.392,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY46,18.6,LF,0.048085022,Snack Foods,186.0898,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCB06,17.6,Low Fat,0.082460079,Health and Hygiene,158.492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA34,11.5,Low Fat,0.014857747,Starchy Foods,172.808,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA35,14.85,Regular,0.053946745,Baking Goods,120.5072,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ07,15.1,Regular,0.087390335,Fruits and Vegetables,219.1456,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU32,8.785,Low Fat,0.026020287,Fruits and Vegetables,122.1414,OUT045,2002,,Tier 2,Supermarket Type1 +FDU26,16.7,Regular,0.04258349,Dairy,121.1782,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU13,8.355,Low Fat,0.313934693,Canned,146.5418,OUT010,1998,,Tier 3,Grocery Store +FDO09,13.5,Regular,0.125250986,Snack Foods,263.691,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW03,,Regular,0.042968607,Meat,102.8306,OUT019,1985,Small,Tier 1,Grocery Store +FDB38,19.5,Regular,0.027323943,Canned,160.592,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL26,18.0,Low Fat,0.122509775,Canned,154.8972,OUT010,1998,,Tier 3,Grocery Store +NCN43,12.15,Low Fat,0.006773451,Others,123.673,OUT045,2002,,Tier 2,Supermarket Type1 +FDH08,7.51,Low Fat,0.017464427,Fruits and Vegetables,231.201,OUT045,2002,,Tier 2,Supermarket Type1 +NCC31,,Low Fat,0.034790615,Household,157.5972,OUT019,1985,Small,Tier 1,Grocery Store +FDH14,17.1,Regular,0.046799702,Canned,139.5838,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL40,17.7,low fat,0.0,Frozen Foods,98.441,OUT017,2007,,Tier 2,Supermarket Type1 +FDD20,14.15,Low Fat,0.020710606,Fruits and Vegetables,122.9046,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCV53,8.27,Low Fat,0.018810044,Health and Hygiene,240.488,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD16,20.5,Low Fat,0.036426823,Frozen Foods,73.4696,OUT045,2002,,Tier 2,Supermarket Type1 +FDP24,20.6,Low Fat,0.082988383,Baking Goods,120.0756,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ25,8.63,Regular,0.028334038,Canned,172.9422,OUT045,2002,,Tier 2,Supermarket Type1 +FDM38,5.885,Regular,0.092753767,Canned,52.9982,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT18,14.6,Low Fat,0.099432046,Household,179.5976,OUT010,1998,,Tier 3,Grocery Store +FDM34,19.0,Low Fat,0.067552435,Snack Foods,132.5626,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRH37,17.6,Low Fat,0.06965725,Soft Drinks,166.4526,OUT010,1998,,Tier 3,Grocery Store +NCE07,8.18,Low Fat,0.013119104,Household,143.4154,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG12,6.635,Regular,0.006320842,Baking Goods,118.9098,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB59,18.25,Low Fat,0.025573744,Snack Foods,198.4084,OUT010,1998,,Tier 3,Grocery Store +FDS10,19.2,Low Fat,0.0,Snack Foods,179.1318,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN21,18.6,Low Fat,0.0,Snack Foods,161.5236,OUT010,1998,,Tier 3,Grocery Store +FDM02,12.5,reg,0.073884594,Canned,88.4198,OUT045,2002,,Tier 2,Supermarket Type1 +FDO44,12.6,Low Fat,0.087589175,Fruits and Vegetables,112.3228,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCN17,11.0,Low Fat,0.055249787,Health and Hygiene,102.3358,OUT017,2007,,Tier 2,Supermarket Type1 +FDH16,10.5,Low Fat,0.052769434,Frozen Foods,91.883,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL44,18.25,Low Fat,0.012275118,Fruits and Vegetables,160.3894,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY47,8.6,Regular,0.054792647,Breads,128.231,OUT017,2007,,Tier 2,Supermarket Type1 +DRI39,13.8,Low Fat,0.097062093,Dairy,54.993,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCX54,9.195,Low Fat,0.048255647,Household,104.3622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE59,12.15,Low Fat,0.062287818,Starchy Foods,36.2532,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO46,9.6,Regular,0.014241321,Snack Foods,188.6872,OUT045,2002,,Tier 2,Supermarket Type1 +DRE13,6.28,Low Fat,0.027705102,Soft Drinks,88.0198,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW14,8.3,Regular,0.038179738,Dairy,88.7198,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF35,15.0,Low Fat,0.153989327,Starchy Foods,107.7938,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO50,,Low Fat,0.136863372,Canned,90.3804,OUT019,1985,Small,Tier 1,Grocery Store +DRF49,7.27,Low Fat,0.071479984,Soft Drinks,114.9518,OUT017,2007,,Tier 2,Supermarket Type1 +FDT60,12.0,low fat,0.075665767,Baking Goods,125.8388,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP38,10.1,Low Fat,0.032167198,Canned,48.7008,OUT045,2002,,Tier 2,Supermarket Type1 +FDA31,,Low Fat,0.10947895,Fruits and Vegetables,172.608,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY52,6.365,Low Fat,0.012299525,Frozen Foods,62.5536,OUT010,1998,,Tier 3,Grocery Store +FDD03,,Low Fat,0.079419801,Dairy,231.93,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN52,9.395,Regular,0.132105843,Frozen Foods,85.3198,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU20,19.35,Regular,0.035915541,Fruits and Vegetables,119.6098,OUT010,1998,,Tier 3,Grocery Store +FDD22,10.0,Low Fat,0.099630851,Snack Foods,110.0544,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCB55,,Low Fat,0.281300211,Household,58.4562,OUT019,1985,Small,Tier 1,Grocery Store +FDN27,20.85,Low Fat,0.03964273,Meat,118.9808,OUT045,2002,,Tier 2,Supermarket Type1 +FDD16,20.5,Low Fat,0.036322846,Frozen Foods,76.5696,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW48,18.0,Low Fat,0.008540823,Baking Goods,78.9618,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRN35,8.01,Low Fat,0.070390053,Hard Drinks,35.0532,OUT045,2002,,Tier 2,Supermarket Type1 +FDX25,16.7,Low Fat,0.102214447,Canned,180.7292,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRD49,9.895,Low Fat,0.168091997,Soft Drinks,236.4564,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE21,,Low Fat,0.040173186,Fruits and Vegetables,114.2492,OUT019,1985,Small,Tier 1,Grocery Store +FDN44,13.15,Low Fat,0.022791301,Fruits and Vegetables,158.692,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRC01,5.92,Regular,0.019229854,Soft Drinks,47.5692,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK30,14.85,Low Fat,0.060978568,Household,252.3698,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDU39,18.85,Low Fat,0.036007962,Meat,58.7562,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB49,8.3,Regular,0.03012626,Baking Goods,98.7384,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS12,9.1,Low Fat,0.174471667,Baking Goods,125.8362,OUT045,2002,,Tier 2,Supermarket Type1 +FDR57,5.675,Regular,0.023592684,Snack Foods,156.8288,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX22,,Regular,0.022863556,Snack Foods,208.9928,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC60,5.425,Regular,0.114377142,Baking Goods,90.3514,OUT013,1987,High,Tier 3,Supermarket Type1 +NCE42,21.1,Low Fat,0.010618776,Household,232.5958,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK42,7.475,Low Fat,0.013140426,Household,216.2192,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRE01,10.1,Low Fat,0.168100696,Soft Drinks,242.8512,OUT017,2007,,Tier 2,Supermarket Type1 +FDE57,9.6,Low Fat,0.036432936,Fruits and Vegetables,141.2154,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRK59,,Low Fat,0.0,Hard Drinks,234.1616,OUT019,1985,Small,Tier 1,Grocery Store +FDB10,,Low Fat,0.066882664,Snack Foods,235.559,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ25,8.63,Regular,0.028276692,Canned,173.6422,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY26,20.6,Regular,0.030683106,Dairy,210.3244,OUT017,2007,,Tier 2,Supermarket Type1 +FDG28,9.285,Regular,0.04935691,Frozen Foods,243.6144,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM14,13.8,Low Fat,0.01328459,Canned,108.4254,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH29,5.51,LF,0.034527402,Health and Hygiene,98.7726,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD48,10.395,Low Fat,0.030205578,Baking Goods,114.9176,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC17,12.15,Low Fat,0.015492081,Frozen Foods,210.3928,OUT045,2002,,Tier 2,Supermarket Type1 +DRH49,,Low Fat,0.0,Soft Drinks,82.3592,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN44,13.15,Low Fat,0.022888471,Fruits and Vegetables,160.292,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC29,8.39,Regular,0.02425475,Frozen Foods,114.0176,OUT045,2002,,Tier 2,Supermarket Type1 +DRK01,,Low Fat,0.106915719,Soft Drinks,93.4436,OUT019,1985,Small,Tier 1,Grocery Store +FDD48,10.395,LF,0.030329279,Baking Goods,114.2176,OUT017,2007,,Tier 2,Supermarket Type1 +FDB59,18.25,LF,0.0,Snack Foods,198.9084,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY45,17.5,Low Fat,0.043756539,Snack Foods,252.9356,OUT010,1998,,Tier 3,Grocery Store +FDX60,14.35,Low Fat,0.080578893,Baking Goods,77.996,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT09,15.15,Regular,0.020526251,Snack Foods,131.5284,OUT010,1998,,Tier 3,Grocery Store +DRB24,8.785,Low Fat,0.020661048,Soft Drinks,153.5656,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL13,13.85,Regular,0.056307919,Breakfast,231.83,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN16,12.6,Regular,0.062688433,Frozen Foods,102.599,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK57,10.195,Low Fat,0.080226072,Snack Foods,121.244,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO22,,Regular,0.017772986,Snack Foods,80.296,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC57,20.1,Regular,0.091380052,Fruits and Vegetables,194.482,OUT010,1998,,Tier 3,Grocery Store +FDZ13,,Regular,0.152751673,Canned,49.535,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW27,5.86,Regular,0.150727772,Meat,154.9314,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX10,6.385,Regular,0.0,Snack Foods,36.3874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY08,9.395,Regular,0.171772109,Fruits and Vegetables,140.4838,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA49,19.7,LF,0.065288988,Canned,86.1198,OUT017,2007,,Tier 2,Supermarket Type1 +FDC32,18.35,Low Fat,0.099512729,Fruits and Vegetables,94.4462,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO04,16.6,LF,0.026532188,Frozen Foods,53.5614,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCZ54,14.65,Low Fat,0.083290021,Household,160.4552,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY40,15.5,Regular,0.0,Frozen Foods,47.7692,OUT045,2002,,Tier 2,Supermarket Type1 +FDW36,11.15,Low Fat,0.057048102,Baking Goods,107.4622,OUT045,2002,,Tier 2,Supermarket Type1 +FDE11,17.7,Regular,0.135860131,Starchy Foods,183.4924,OUT017,2007,,Tier 2,Supermarket Type1 +DRE37,13.5,Low Fat,0.094410673,Soft Drinks,189.0872,OUT045,2002,,Tier 2,Supermarket Type1 +NCK19,9.8,Low Fat,0.09097735,Others,193.1478,OUT017,2007,,Tier 2,Supermarket Type1 +FDT19,7.59,Regular,0.145013434,Fruits and Vegetables,174.908,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE56,17.25,Regular,0.159518279,Fruits and Vegetables,61.5194,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ57,10.0,Regular,0.063209707,Snack Foods,126.6994,OUT010,1998,,Tier 3,Grocery Store +FDB35,12.3,Regular,0.064606757,Starchy Foods,93.0804,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF09,6.215,Low Fat,0.020334777,Fruits and Vegetables,35.3848,OUT010,1998,,Tier 3,Grocery Store +FDO34,17.7,Low Fat,0.029938936,Snack Foods,168.7816,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA55,17.2,Regular,0.056989027,Fruits and Vegetables,225.3088,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCM18,13.0,Low Fat,0.082826206,Household,60.8194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ20,,Regular,0.175393386,Fruits and Vegetables,122.9388,OUT019,1985,Small,Tier 1,Grocery Store +DRQ35,,Low Fat,0.074046871,Hard Drinks,125.8388,OUT019,1985,Small,Tier 1,Grocery Store +FDG02,7.855,low fat,0.011251793,Canned,190.3188,OUT013,1987,High,Tier 3,Supermarket Type1 +NCU29,7.685,Low Fat,0.025581232,Health and Hygiene,144.676,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL27,,Low Fat,0.010579468,Meat,63.4826,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA54,16.5,Low Fat,0.036634668,Household,179.0318,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ32,10.695,Low Fat,0.057781415,Fruits and Vegetables,62.5536,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB21,,Low Fat,0.260040407,Fruits and Vegetables,241.9854,OUT019,1985,Small,Tier 1,Grocery Store +FDR46,16.85,Low Fat,0.139391292,Snack Foods,145.976,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ32,7.785,reg,0.03813275,Fruits and Vegetables,105.4964,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRF36,16.1,Low Fat,0.023710661,Soft Drinks,189.4846,OUT017,2007,,Tier 2,Supermarket Type1 +NCU54,8.88,Low Fat,0.099180226,Household,209.827,OUT017,2007,,Tier 2,Supermarket Type1 +NCI31,20.0,Low Fat,0.081787178,Others,34.819,OUT017,2007,,Tier 2,Supermarket Type1 +DRA59,8.27,reg,0.127903741,Soft Drinks,183.9924,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCC55,10.695,LF,0.0,Household,37.4848,OUT045,2002,,Tier 2,Supermarket Type1 +FDE44,14.65,Low Fat,0.172086213,Fruits and Vegetables,49.4692,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCN26,10.85,Low Fat,0.028796724,Household,115.4808,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDC11,20.5,Low Fat,0.142013291,Starchy Foods,88.2172,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV24,5.635,Low Fat,0.0,Baking Goods,149.405,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR40,,reg,0.014067174,Frozen Foods,80.0618,OUT019,1985,Small,Tier 1,Grocery Store +NCQ17,10.3,Low Fat,0.117114354,Health and Hygiene,157.763,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC46,17.7,Low Fat,0.116778835,Snack Foods,185.0266,OUT045,2002,,Tier 2,Supermarket Type1 +NCM18,13.0,Low Fat,0.08284187,Household,63.0194,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK16,9.065,Low Fat,0.115329787,Frozen Foods,97.1094,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI28,14.3,Low Fat,0.026470587,Frozen Foods,80.8302,OUT017,2007,,Tier 2,Supermarket Type1 +FDS11,7.05,Regular,0.055784831,Breads,224.5088,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRD13,15.0,Low Fat,0.049079463,Soft Drinks,65.2168,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL36,15.1,Low Fat,0.0760611,Baking Goods,88.783,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI27,8.71,Regular,0.045948045,Dairy,47.2744,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ53,,LF,0.124763406,Frozen Foods,119.0098,OUT019,1985,Small,Tier 1,Grocery Store +FDS44,12.65,Regular,0.0,Fruits and Vegetables,240.7538,OUT045,2002,,Tier 2,Supermarket Type1 +FDE28,9.5,reg,0.132546993,Frozen Foods,230.3668,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ33,13.35,Low Fat,0.091578701,Snack Foods,151.5708,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB37,20.25,Regular,0.023070588,Baking Goods,238.6538,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ31,5.785,Regular,0.053956419,Fruits and Vegetables,86.0856,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ05,11.395,Low Fat,0.021606087,Health and Hygiene,150.0708,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE10,6.67,Regular,0.089873267,Snack Foods,130.4626,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF38,11.8,Regular,0.026507096,Canned,39.8138,OUT017,2007,,Tier 2,Supermarket Type1 +FDE50,,Regular,0.028373995,Canned,187.0556,OUT019,1985,Small,Tier 1,Grocery Store +DRG37,16.2,Low Fat,0.032435523,Soft Drinks,154.9972,OUT010,1998,,Tier 3,Grocery Store +NCH06,12.3,Low Fat,0.076673407,Household,248.346,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY14,10.3,Low Fat,0.070182238,Dairy,264.6226,OUT045,2002,,Tier 2,Supermarket Type1 +FDO27,6.175,Regular,0.180090411,Meat,95.2752,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ19,7.35,Regular,0.014387462,Fruits and Vegetables,241.4512,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ26,,Regular,0.252155886,Dairy,237.6222,OUT019,1985,Small,Tier 1,Grocery Store +FDN51,17.85,Regular,0.020929396,Meat,260.5936,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK20,12.6,Regular,0.0,Fruits and Vegetables,121.9072,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD40,20.25,Regular,0.014853619,Dairy,192.8162,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRI25,19.6,Low Fat,0.034039542,Soft Drinks,57.0614,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH56,9.8,Regular,0.064178182,Fruits and Vegetables,115.7492,OUT017,2007,,Tier 2,Supermarket Type1 +FDI36,,Regular,0.062041531,Baking Goods,196.8426,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH11,5.98,Low Fat,0.075865756,Hard Drinks,56.6614,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV18,6.775,LF,0.105841179,Household,83.325,OUT017,2007,,Tier 2,Supermarket Type1 +DRI01,7.97,Low Fat,0.034506514,Soft Drinks,172.6422,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRE48,8.43,LF,0.017352667,Soft Drinks,198.7768,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS51,13.35,Low Fat,0.032174409,Meat,60.4194,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM38,5.885,Regular,0.093296061,Canned,50.5982,OUT017,2007,,Tier 2,Supermarket Type1 +FDB60,,Low Fat,0.02838397,Baking Goods,193.3136,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY58,11.65,Low Fat,0.039911033,Snack Foods,228.9694,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY22,16.5,Regular,0.160044589,Snack Foods,143.4128,OUT045,2002,,Tier 2,Supermarket Type1 +FDF11,,Regular,0.0,Starchy Foods,238.3538,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ51,11.3,Regular,0.054542505,Meat,97.2094,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ45,9.5,Regular,0.010978804,Snack Foods,182.1608,OUT017,2007,,Tier 2,Supermarket Type1 +FDF17,5.19,Low Fat,0.042612828,Frozen Foods,196.411,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCF31,,Low Fat,0.051596351,Household,152.1024,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA37,7.81,Regular,0.055180797,Canned,125.2046,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO51,6.785,Regular,0.0,Meat,43.4112,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF34,9.3,Regular,0.014007727,Snack Foods,198.1084,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD57,18.1,Low Fat,0.022490839,Fruits and Vegetables,96.0094,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO37,8.06,Low Fat,0.021376678,Breakfast,229.3326,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR49,8.71,Low Fat,0.139444875,Canned,49.8376,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS39,6.895,Low Fat,0.022495495,Meat,142.0812,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI48,,Regular,0.05544858,Baking Goods,52.3666,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRM35,9.695,Low Fat,0.070554078,Hard Drinks,178.9344,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV57,15.25,Regular,0.065884096,Snack Foods,181.566,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ55,6.055,Low Fat,0.025387558,Fruits and Vegetables,161.592,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI28,14.3,Low Fat,0.026316724,Frozen Foods,78.1302,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS21,19.85,Regular,0.020918489,Snack Foods,63.3194,OUT045,2002,,Tier 2,Supermarket Type1 +FDT34,9.3,Low Fat,0.0,Snack Foods,106.3964,OUT013,1987,High,Tier 3,Supermarket Type1 +DRI25,19.6,Low Fat,0.033895032,Soft Drinks,54.7614,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT47,5.26,Regular,0.041022765,Breads,95.2068,OUT010,1998,,Tier 3,Grocery Store +DRH39,20.7,Low Fat,0.092878183,Dairy,75.167,OUT045,2002,,Tier 2,Supermarket Type1 +NCD54,21.1,Low Fat,0.029067775,Household,144.7786,OUT045,2002,,Tier 2,Supermarket Type1 +FDU16,,Regular,0.057992904,Frozen Foods,84.8908,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW29,14.0,Low Fat,0.028921492,Health and Hygiene,129.631,OUT045,2002,,Tier 2,Supermarket Type1 +FDV25,,Low Fat,0.04543117,Canned,221.1456,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM56,16.7,Low Fat,0.070178316,Fruits and Vegetables,109.6912,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ04,,Low Fat,0.037771295,Frozen Foods,64.951,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG59,,Low Fat,0.075698157,Starchy Foods,37.2164,OUT019,1985,Small,Tier 1,Grocery Store +FDI56,7.325,Low Fat,0.093574769,Fruits and Vegetables,90.3146,OUT045,2002,,Tier 2,Supermarket Type1 +FDS33,6.67,Regular,0.123405255,Snack Foods,88.4514,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC23,18.0,Low Fat,0.017934042,Starchy Foods,175.7686,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT11,5.94,Regular,0.029418033,Breads,185.8556,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG17,6.865,Regular,0.035912897,Frozen Foods,244.8486,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ44,8.185,Low Fat,0.038807601,Fruits and Vegetables,117.7808,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ52,7.145,Low Fat,0.017772062,Frozen Foods,160.9578,OUT013,1987,High,Tier 3,Supermarket Type1 +DRI23,18.85,Low Fat,0.137196951,Hard Drinks,159.4578,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRE15,13.35,Low Fat,0.029769107,Dairy,77.6012,OUT010,1998,,Tier 3,Grocery Store +NCF07,9.0,Low Fat,0.031995886,Household,101.6016,OUT013,1987,High,Tier 3,Supermarket Type1 +NCR29,7.565,Low Fat,0.054725828,Health and Hygiene,56.293,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE44,,Low Fat,0.300078353,Fruits and Vegetables,48.1692,OUT019,1985,Small,Tier 1,Grocery Store +FDT23,7.72,Regular,0.074717347,Breads,79.6986,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCG06,16.35,Low Fat,0.029611916,Household,259.0646,OUT017,2007,,Tier 2,Supermarket Type1 +NCU41,18.85,Low Fat,0.087129095,Health and Hygiene,191.7846,OUT010,1998,,Tier 3,Grocery Store +FDH46,6.935,Regular,0.041515796,Snack Foods,102.8332,OUT017,2007,,Tier 2,Supermarket Type1 +FDV31,9.8,Low Fat,0.106628515,Fruits and Vegetables,177.737,OUT013,1987,High,Tier 3,Supermarket Type1 +NCT41,,Low Fat,0.0,Health and Hygiene,153.7024,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE22,,Low Fat,0.029429602,Snack Foods,160.392,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC26,10.195,Low Fat,0.126639402,Canned,109.5886,OUT045,2002,,Tier 2,Supermarket Type1 +DRF51,15.75,LF,0.166776273,Dairy,36.5506,OUT017,2007,,Tier 2,Supermarket Type1 +NCY53,,Low Fat,0.102393277,Health and Hygiene,113.1544,OUT019,1985,Small,Tier 1,Grocery Store +FDY21,15.1,Low Fat,0.174462585,Snack Foods,197.711,OUT017,2007,,Tier 2,Supermarket Type1 +FDL27,6.17,LF,0.010622102,Meat,64.5826,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ34,6.695,Low Fat,0.07599649,Starchy Foods,194.182,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCF43,8.51,Low Fat,0.0869468,Household,144.347,OUT010,1998,,Tier 3,Grocery Store +FDC21,14.6,Regular,0.042950697,Fruits and Vegetables,108.4254,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDL26,18.0,Low Fat,0.073131911,Canned,156.0972,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT25,7.5,Low Fat,0.08494673,Canned,120.5072,OUT010,1998,,Tier 3,Grocery Store +NCR30,20.6,Low Fat,0.0,Household,74.9696,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRL23,,Low Fat,0.026795874,Hard Drinks,105.8938,OUT019,1985,Small,Tier 1,Grocery Store +NCR05,10.1,Low Fat,0.054715771,Health and Hygiene,197.8084,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCE19,8.97,Low Fat,0.093393523,Household,54.0956,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY07,11.8,Low Fat,0.0,Fruits and Vegetables,44.1402,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB10,10.0,Low Fat,0.0,Snack Foods,235.559,OUT017,2007,,Tier 2,Supermarket Type1 +FDP57,17.5,Low Fat,0.052400475,Snack Foods,105.099,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU48,,Low Fat,0.096925504,Baking Goods,131.3284,OUT019,1985,Small,Tier 1,Grocery Store +FDH48,13.5,Low Fat,0.060468922,Baking Goods,85.254,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO33,14.75,Low Fat,0.089305571,Snack Foods,115.5518,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCU29,7.685,Low Fat,0.025529117,Health and Hygiene,147.876,OUT045,2002,,Tier 2,Supermarket Type1 +FDW35,10.6,Low Fat,0.011089224,Breads,41.8454,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH05,14.35,Regular,0.152170799,Frozen Foods,231.9984,OUT010,1998,,Tier 3,Grocery Store +FDP26,7.785,Low Fat,0.0,Dairy,104.4306,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRG27,8.895,Low Fat,0.105090817,Dairy,41.5138,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ33,13.35,Low Fat,0.091207161,Snack Foods,151.8708,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH20,16.1,Regular,0.041759701,Fruits and Vegetables,98.041,OUT010,1998,,Tier 3,Grocery Store +FDV14,19.85,Low Fat,0.044497478,Dairy,89.7856,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD01,12.1,Regular,0.061175535,Soft Drinks,54.8614,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCI17,8.645,Low Fat,0.0,Health and Hygiene,96.441,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF39,14.85,Regular,0.032657896,Dairy,263.191,OUT010,1998,,Tier 3,Grocery Store +FDX37,16.2,Low Fat,0.063029339,Canned,100.47,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCX17,21.25,Low Fat,0.113581951,Health and Hygiene,234.93,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN03,9.8,Regular,0.015077408,Meat,250.9408,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS41,12.85,Low Fat,0.089454322,Health and Hygiene,183.2608,OUT010,1998,,Tier 3,Grocery Store +FDH34,8.63,Low Fat,0.031158308,Snack Foods,184.2582,OUT045,2002,,Tier 2,Supermarket Type1 +NCX53,20.1,LF,0.014998688,Health and Hygiene,142.6154,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY31,5.98,Low Fat,0.043562851,Fruits and Vegetables,147.9418,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD20,14.15,Low Fat,0.020831693,Fruits and Vegetables,126.4046,OUT017,2007,,Tier 2,Supermarket Type1 +FDE51,5.925,Regular,0.096662969,Dairy,45.3086,OUT045,2002,,Tier 2,Supermarket Type1 +FDV27,7.97,Regular,0.03999003,Meat,86.8514,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF16,7.3,Low Fat,0.086116086,Frozen Foods,148.4076,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDZ02,6.905,Regular,0.038206735,Dairy,96.1726,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK05,20.1,Low Fat,0.077611332,Health and Hygiene,63.0536,OUT045,2002,,Tier 2,Supermarket Type1 +FDM12,,Regular,0.069578418,Baking Goods,190.2214,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCA05,20.75,Low Fat,0.025233003,Health and Hygiene,150.1734,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX33,9.195,Regular,0.117723097,Snack Foods,159.5578,OUT045,2002,,Tier 2,Supermarket Type1 +FDM25,10.695,Regular,0.0,Breakfast,176.1712,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE41,9.195,Regular,0.064274939,Frozen Foods,85.8566,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW14,8.3,reg,0.038289031,Dairy,88.4198,OUT045,2002,,Tier 2,Supermarket Type1 +NCD30,19.7,Low Fat,0.026849263,Household,95.8726,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB23,19.2,Regular,0.009354173,Starchy Foods,226.0062,OUT010,1998,,Tier 3,Grocery Store +FDF45,18.2,Regular,0.012204712,Fruits and Vegetables,60.1904,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW20,20.75,Low Fat,0.024286028,Fruits and Vegetables,124.873,OUT017,2007,,Tier 2,Supermarket Type1 +FDF47,20.85,Low Fat,0.097816206,Starchy Foods,222.7746,OUT045,2002,,Tier 2,Supermarket Type1 +NCR05,,low fat,0.095651539,Health and Hygiene,200.4084,OUT019,1985,Small,Tier 1,Grocery Store +DRB01,7.39,Low Fat,0.082239384,Soft Drinks,187.753,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE36,5.26,Regular,0.041737624,Baking Goods,164.4868,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU56,16.85,Low Fat,0.044483108,Fruits and Vegetables,184.2266,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB23,19.2,Regular,0.00559729,Starchy Foods,224.8062,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN48,13.35,Low Fat,0.065051711,Baking Goods,91.1804,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS43,11.65,Low Fat,0.040481173,Fruits and Vegetables,188.024,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN05,8.235,Low Fat,0.014447639,Health and Hygiene,183.895,OUT013,1987,High,Tier 3,Supermarket Type1 +NCL53,7.5,Low Fat,0.036291254,Health and Hygiene,176.2028,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL56,14.1,Low Fat,0.125780608,Fruits and Vegetables,86.9198,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH17,16.2,Regular,0.016721179,Frozen Foods,96.1726,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP37,15.6,Low Fat,0.143105952,Breakfast,126.7994,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG09,,Regular,0.083930246,Fruits and Vegetables,188.9556,OUT019,1985,Small,Tier 1,Grocery Store +FDA55,17.2,Regular,0.057104603,Fruits and Vegetables,223.1088,OUT045,2002,,Tier 2,Supermarket Type1 +FDX31,20.35,Regular,0.014848655,Fruits and Vegetables,234.3958,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ41,6.85,LF,0.022929688,Frozen Foods,261.4594,OUT045,2002,,Tier 2,Supermarket Type1 +DRC24,17.85,Low Fat,0.024871616,Soft Drinks,155.7998,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ21,21.25,Low Fat,0.01941956,Snack Foods,122.5756,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT54,8.695,Low Fat,0.119778027,Household,93.9094,OUT045,2002,,Tier 2,Supermarket Type1 +FDH08,7.51,Low Fat,0.017456177,Fruits and Vegetables,230.101,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY38,13.6,Regular,0.119661905,Dairy,233.63,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRM11,6.57,Low Fat,0.110586928,Hard Drinks,261.0278,OUT010,1998,,Tier 3,Grocery Store +FDG32,19.85,Low Fat,0.176269152,Fruits and Vegetables,221.6772,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH18,9.3,LF,0.04466123,Household,245.2802,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI20,19.1,Low Fat,0.038556468,Fruits and Vegetables,211.2586,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA33,6.48,Low Fat,0.034037991,Snack Foods,147.2076,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDN45,19.35,Low Fat,0.118004487,Snack Foods,223.3088,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT45,15.85,Low Fat,0.095930954,Snack Foods,56.0956,OUT010,1998,,Tier 3,Grocery Store +FDR32,6.78,Regular,0.085791732,Fruits and Vegetables,228.9694,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA48,12.1,Low Fat,0.115523835,Baking Goods,220.8114,OUT017,2007,,Tier 2,Supermarket Type1 +FDN23,6.575,Regular,0.075934861,Breads,144.8444,OUT017,2007,,Tier 2,Supermarket Type1 +NCR18,15.85,Low Fat,0.020483751,Household,43.2112,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD45,8.615,Low Fat,0.116248965,Fruits and Vegetables,94.1436,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI22,12.6,Low Fat,0.096604361,Snack Foods,207.0612,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT09,15.15,Regular,0.0,Snack Foods,132.9284,OUT013,1987,High,Tier 3,Supermarket Type1 +DRC24,,Low Fat,0.02470108,Soft Drinks,154.0998,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT39,6.26,Regular,0.009867915,Meat,149.1366,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX28,6.325,Low Fat,0.125431986,Frozen Foods,98.4042,OUT045,2002,,Tier 2,Supermarket Type1 +FDA50,16.25,Low Fat,0.087530252,Dairy,95.141,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT33,,Regular,0.033826055,Snack Foods,168.4158,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ60,6.195,Regular,0.10954449,Baking Goods,120.4098,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM19,12.65,Low Fat,0.04742967,Others,112.0202,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF40,20.25,Regular,0.022512133,Dairy,248.4092,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCI30,20.25,Low Fat,0.058924378,Household,245.046,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK34,13.35,Low Fat,0.038586582,Snack Foods,238.0564,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA38,,Low Fat,0.025356532,Dairy,239.4538,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT02,12.6,LF,0.024243799,Dairy,36.9874,OUT045,2002,,Tier 2,Supermarket Type1 +FDC11,20.5,Low Fat,0.142594879,Starchy Foods,87.7172,OUT017,2007,,Tier 2,Supermarket Type1 +FDD08,8.3,Low Fat,0.035354361,Fruits and Vegetables,39.9506,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCS29,9.0,Low Fat,0.069545461,Health and Hygiene,262.9884,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRI03,6.03,Low Fat,0.038001328,Dairy,176.6028,OUT010,1998,,Tier 3,Grocery Store +FDK48,7.445,Low Fat,0.037625107,Baking Goods,73.2354,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM52,15.1,Low Fat,0.026033836,Frozen Foods,149.5076,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP49,9.0,Regular,0.069075897,Breakfast,57.0614,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRA24,19.35,Regular,0.039928237,Soft Drinks,164.5868,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCJ43,6.635,Low Fat,0.027111488,Household,172.5396,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE11,17.7,Regular,0.135369952,Starchy Foods,183.6924,OUT045,2002,,Tier 2,Supermarket Type1 +FDP01,20.75,Regular,0.063424403,Breakfast,154.3682,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ59,9.8,reg,0.056616236,Breads,84.6908,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA43,,Low Fat,0.113238888,Fruits and Vegetables,194.5794,OUT019,1985,Small,Tier 1,Grocery Store +FDL14,8.115,Regular,0.03234077,Canned,154.3972,OUT017,2007,,Tier 2,Supermarket Type1 +FDV50,14.3,Low Fat,0.0,Dairy,124.173,OUT010,1998,,Tier 3,Grocery Store +FDT01,,Regular,0.183275872,Canned,210.4902,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCC42,15.0,Low Fat,0.044899912,Health and Hygiene,139.9838,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO28,5.765,Low Fat,0.07229836,Frozen Foods,118.8098,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD32,,Regular,0.071666638,Fruits and Vegetables,80.6276,OUT019,1985,Small,Tier 1,Grocery Store +FDV45,16.75,Low Fat,0.045038921,Snack Foods,185.8556,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCW17,,Low Fat,0.033942792,Health and Hygiene,126.5994,OUT019,1985,Small,Tier 1,Grocery Store +NCJ17,,Low Fat,0.151817729,Health and Hygiene,86.0224,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCF18,18.35,Low Fat,0.089120941,Household,190.5504,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP01,20.75,Regular,0.063454375,Breakfast,153.2682,OUT045,2002,,Tier 2,Supermarket Type1 +FDH24,20.7,Low Fat,0.021474597,Baking Goods,156.9288,OUT045,2002,,Tier 2,Supermarket Type1 +FDI38,,Regular,0.014556069,Canned,208.7638,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX03,15.85,Regular,0.061084423,Meat,44.7744,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY28,7.47,Regular,0.152150971,Frozen Foods,213.5218,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN34,15.6,Regular,0.045950668,Snack Foods,170.8132,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ02,17.2,Regular,0.02521782,Canned,148.5418,OUT045,2002,,Tier 2,Supermarket Type1 +FDW40,,Regular,0.184096112,Frozen Foods,140.7812,OUT019,1985,Small,Tier 1,Grocery Store +FDX03,15.85,Regular,0.06144156,Meat,43.4744,OUT017,2007,,Tier 2,Supermarket Type1 +FDE17,,Regular,0.054191792,Frozen Foods,152.1366,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT58,9.0,Low Fat,0.085954716,Snack Foods,167.4816,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDI38,13.35,Regular,0.014614728,Canned,207.9638,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW22,9.695,Regular,0.030284659,Snack Foods,223.3114,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS15,,Regular,0.077682589,Meat,109.2596,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCX06,17.6,Low Fat,0.01567399,Household,181.9976,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK47,7.905,Low Fat,0.064052266,Hard Drinks,229.9694,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC23,,Low Fat,0.017819491,Starchy Foods,178.0686,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM56,16.7,Low Fat,0.117486329,Fruits and Vegetables,107.4912,OUT010,1998,,Tier 3,Grocery Store +FDP21,7.42,Regular,0.025740842,Snack Foods,190.0872,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP58,11.1,Low Fat,0.135142318,Snack Foods,218.8482,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA27,,Regular,0.054150291,Dairy,254.7672,OUT019,1985,Small,Tier 1,Grocery Store +FDK41,,Low Fat,0.223309091,Frozen Foods,85.5224,OUT019,1985,Small,Tier 1,Grocery Store +NCH42,6.86,Low Fat,0.03653732,Household,230.601,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG29,17.6,Low Fat,0.056406081,Frozen Foods,42.5454,OUT045,2002,,Tier 2,Supermarket Type1 +FDW15,15.35,Regular,0.055338105,Meat,150.4734,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD28,10.695,Low Fat,0.053513977,Frozen Foods,59.1904,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ37,20.75,Low Fat,0.089399444,Breakfast,193.9478,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC23,18.0,Low Fat,0.017902817,Starchy Foods,178.2686,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV13,17.35,Regular,0.027605646,Canned,88.9856,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK33,17.85,Low Fat,0.01123525,Snack Foods,211.856,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO33,14.75,Low Fat,0.089248129,Snack Foods,113.1518,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN21,18.6,Low Fat,0.077290355,Snack Foods,161.9236,OUT017,2007,,Tier 2,Supermarket Type1 +NCW06,,Low Fat,0.050096661,Household,192.4162,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI38,13.35,Regular,0.014624135,Canned,207.2638,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC21,,Regular,0.04275079,Fruits and Vegetables,107.7254,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCS05,11.5,LF,0.020978072,Health and Hygiene,132.8942,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN53,5.175,Low Fat,0.030402657,Health and Hygiene,37.0874,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV40,17.35,Low Fat,0.024591034,Frozen Foods,74.8038,OUT010,1998,,Tier 3,Grocery Store +FDG60,20.35,Low Fat,0.061043068,Baking Goods,233.0616,OUT017,2007,,Tier 2,Supermarket Type1 +NCY30,,Low Fat,0.025827578,Household,182.7976,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM40,10.195,Low Fat,0.160261305,Frozen Foods,141.0154,OUT045,2002,,Tier 2,Supermarket Type1 +NCO30,19.5,Low Fat,0.0,Household,183.3608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK10,5.785,Regular,0.04035886,Snack Foods,181.366,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM36,11.65,Regular,0.058849939,Baking Goods,172.7422,OUT045,2002,,Tier 2,Supermarket Type1 +FDN10,11.5,Low Fat,0.046085421,Snack Foods,117.6124,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM46,7.365,Low Fat,0.160619486,Snack Foods,93.612,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDX50,20.1,LF,0.074743226,Dairy,111.5228,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP33,18.7,Low Fat,0.0894533,Snack Foods,254.3672,OUT045,2002,,Tier 2,Supermarket Type1 +FDO12,15.75,Low Fat,0.0,Baking Goods,194.8452,OUT045,2002,,Tier 2,Supermarket Type1 +FDC28,7.905,Low Fat,0.05494116,Frozen Foods,110.4254,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO31,6.76,Regular,0.02904146,Fruits and Vegetables,80.796,OUT045,2002,,Tier 2,Supermarket Type1 +FDX45,16.75,Low Fat,0.104835967,Snack Foods,154.863,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV21,11.5,Low Fat,0.171348934,Snack Foods,125.7704,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH04,6.115,Regular,0.011390654,Frozen Foods,91.0488,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG54,12.1,Low Fat,0.079739853,Household,169.4106,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO13,7.865,Low Fat,0.061059672,Breakfast,162.7526,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDA09,,Regular,0.148643089,Snack Foods,179.766,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC38,15.7,Low Fat,0.123186843,Canned,133.5942,OUT017,2007,,Tier 2,Supermarket Type1 +NCO42,21.25,Low Fat,0.024655594,Household,144.0102,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL45,15.6,Low Fat,0.037746432,Snack Foods,123.8704,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK31,10.895,Low Fat,0.027025266,Others,52.2666,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM39,6.42,Low Fat,0.053773114,Dairy,179.0002,OUT017,2007,,Tier 2,Supermarket Type1 +FDC22,6.89,reg,0.228353164,Snack Foods,192.482,OUT010,1998,,Tier 3,Grocery Store +FDF46,7.07,LF,0.093671176,Snack Foods,115.3834,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ37,20.75,Low Fat,0.08944169,Breakfast,192.0478,OUT045,2002,,Tier 2,Supermarket Type1 +FDH41,9.0,Low Fat,0.137270472,Frozen Foods,213.4534,OUT010,1998,,Tier 3,Grocery Store +FDQ04,6.4,Low Fat,0.084753606,Frozen Foods,40.2796,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ02,,Low Fat,0.0,Household,189.2556,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDJ57,,Regular,0.021469174,Seafood,187.6582,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCE07,8.18,Low Fat,0.013150445,Household,140.6154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE56,17.25,Regular,0.159062948,Fruits and Vegetables,60.2194,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI20,19.1,Low Fat,0.038623716,Fruits and Vegetables,209.6586,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK36,7.09,Low Fat,0.0,Baking Goods,49.1034,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP08,,Regular,0.111865695,Fruits and Vegetables,191.8478,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF44,7.17,Regular,0.060065869,Fruits and Vegetables,130.9968,OUT017,2007,,Tier 2,Supermarket Type1 +NCU53,5.485,Low Fat,0.042993634,Health and Hygiene,167.3842,OUT017,2007,,Tier 2,Supermarket Type1 +FDF47,20.85,Low Fat,0.097599775,Starchy Foods,224.8746,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS55,7.02,Low Fat,0.135852194,Fruits and Vegetables,149.7734,OUT010,1998,,Tier 3,Grocery Store +FDZ52,19.2,LF,0.167504237,Frozen Foods,110.5886,OUT010,1998,,Tier 3,Grocery Store +FDL04,19.0,Low Fat,0.112379351,Frozen Foods,105.3622,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM26,20.5,Low Fat,0.023138823,Others,152.734,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX43,5.655,Low Fat,0.0,Fruits and Vegetables,168.05,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP52,18.7,Regular,0.070801636,Frozen Foods,227.801,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRK49,14.15,LF,0.036016611,Soft Drinks,41.4138,OUT045,2002,,Tier 2,Supermarket Type1 +FDE38,6.52,Low Fat,0.04457004,Canned,165.3842,OUT013,1987,High,Tier 3,Supermarket Type1 +DRF13,12.1,Low Fat,0.029775731,Soft Drinks,145.2444,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK41,14.3,Low Fat,0.213478694,Frozen Foods,84.9224,OUT010,1998,,Tier 3,Grocery Store +FDJ04,,Low Fat,0.123849384,Frozen Foods,120.0124,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ44,8.185,Low Fat,0.038886823,Fruits and Vegetables,118.5808,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS11,7.05,Regular,0.055512274,Breads,225.7088,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA55,17.2,Regular,0.05707763,Fruits and Vegetables,224.8088,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW53,18.35,LF,0.030495077,Health and Hygiene,194.0162,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB49,,Regular,0.0,Baking Goods,99.8384,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD23,9.5,Regular,0.048960915,Starchy Foods,188.1898,OUT017,2007,,Tier 2,Supermarket Type1 +NCV42,6.26,Low Fat,0.031485704,Household,110.0228,OUT045,2002,,Tier 2,Supermarket Type1 +NCZ29,15.0,Low Fat,0.071662195,Health and Hygiene,127.7362,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ26,13.5,Regular,0.067815921,Dairy,58.0562,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV08,7.35,LF,0.028756673,Fruits and Vegetables,40.5454,OUT017,2007,,Tier 2,Supermarket Type1 +FDC53,8.68,Low Fat,0.008849431,Frozen Foods,99.9384,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV58,20.85,LF,0.202948268,Snack Foods,197.4452,OUT010,1998,,Tier 3,Grocery Store +NCP02,,Low Fat,0.078454358,Household,58.3562,OUT019,1985,Small,Tier 1,Grocery Store +DRI37,15.85,Low Fat,0.107816091,Soft Drinks,56.8904,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ12,12.65,Low Fat,0.035465802,Baking Goods,229.601,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE33,19.35,Regular,0.049635605,Fruits and Vegetables,76.5644,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX27,20.7,Regular,0.114348523,Dairy,95.0436,OUT045,2002,,Tier 2,Supermarket Type1 +FDM22,14.0,Regular,0.042195096,Snack Foods,51.564,OUT017,2007,,Tier 2,Supermarket Type1 +NCH30,,Low Fat,0.117578079,Household,113.886,OUT019,1985,Small,Tier 1,Grocery Store +FDC04,15.6,Low Fat,0.045240103,Dairy,241.7854,OUT017,2007,,Tier 2,Supermarket Type1 +FDO38,17.25,low fat,0.072839052,Canned,79.7986,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV52,,Regular,0.120932251,Frozen Foods,117.0466,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB32,20.6,Low Fat,0.023433422,Fruits and Vegetables,94.5778,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV43,16.0,Low Fat,0.077168705,Fruits and Vegetables,46.5086,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI24,10.3,Low Fat,0.079064574,Baking Goods,178.237,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR40,9.1,Regular,0.008079833,Frozen Foods,81.7618,OUT017,2007,,Tier 2,Supermarket Type1 +FDW02,4.805,Regular,0.037758036,Dairy,124.5704,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE44,14.65,LF,0.171654513,Fruits and Vegetables,48.4692,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL38,13.8,Regular,0.014733108,Canned,89.4172,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT54,8.695,Low Fat,0.0,Household,96.0094,OUT010,1998,,Tier 3,Grocery Store +DRJ39,20.25,Low Fat,0.060802383,Dairy,219.7482,OUT010,1998,,Tier 3,Grocery Store +FDW55,12.6,Regular,0.022004053,Fruits and Vegetables,248.6092,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF13,,Low Fat,0.052143322,Soft Drinks,144.5444,OUT019,1985,Small,Tier 1,Grocery Store +NCW17,18.0,Low Fat,0.019416374,Health and Hygiene,129.5994,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP13,8.1,Regular,0.134298156,Canned,40.448,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS08,5.735,Low Fat,0.057193256,Fruits and Vegetables,174.437,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP17,19.35,Low Fat,0.0,Health and Hygiene,62.6168,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCO53,16.2,low fat,0.175151361,Health and Hygiene,182.1608,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH19,19.35,low fat,0.033155576,Meat,173.9738,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ04,18.0,Low Fat,0.125156,Frozen Foods,119.8124,OUT017,2007,,Tier 2,Supermarket Type1 +FDG10,6.63,Regular,0.010956306,Snack Foods,56.9588,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDA40,16.0,Regular,0.166159652,Frozen Foods,87.5856,OUT010,1998,,Tier 3,Grocery Store +FDI53,8.895,Regular,0.137924102,Frozen Foods,161.9236,OUT045,2002,,Tier 2,Supermarket Type1 +FDU09,7.71,Regular,0.111469959,Snack Foods,56.0956,OUT010,1998,,Tier 3,Grocery Store +FDK60,16.5,Regular,0.09405464,Baking Goods,98.3068,OUT045,2002,,Tier 2,Supermarket Type1 +FDR43,18.2,Low Fat,0.16240296,Fruits and Vegetables,34.819,OUT017,2007,,Tier 2,Supermarket Type1 +FDW22,9.695,Regular,0.030461721,Snack Foods,220.0114,OUT017,2007,,Tier 2,Supermarket Type1 +DRP47,15.75,Low Fat,0.235341126,Hard Drinks,252.1382,OUT010,1998,,Tier 3,Grocery Store +DRG48,5.78,Low Fat,0.024362196,Soft Drinks,145.8102,OUT010,1998,,Tier 3,Grocery Store +FDA14,16.1,Low Fat,0.065170902,Dairy,146.176,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU49,19.5,reg,0.030668818,Canned,87.954,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK28,5.695,Low Fat,0.065722924,Frozen Foods,256.9646,OUT045,2002,,Tier 2,Supermarket Type1 +FDT19,7.59,Regular,0.14504086,Fruits and Vegetables,173.608,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ42,20.35,Low Fat,0.039347842,Household,125.2678,OUT045,2002,,Tier 2,Supermarket Type1 +FDD03,13.3,Low Fat,0.079968115,Dairy,234.43,OUT045,2002,,Tier 2,Supermarket Type1 +NCM53,18.75,Low Fat,0.051997608,Health and Hygiene,108.328,OUT013,1987,High,Tier 3,Supermarket Type1 +NCX53,20.1,Low Fat,0.014968132,Health and Hygiene,140.8154,OUT045,2002,,Tier 2,Supermarket Type1 +FDV14,,Low Fat,0.044281997,Dairy,85.8856,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCZ54,14.65,Low Fat,0.083830905,Household,161.4552,OUT017,2007,,Tier 2,Supermarket Type1 +FDB39,11.6,Low Fat,0.038486905,Dairy,55.4272,OUT013,1987,High,Tier 3,Supermarket Type1 +DRC24,17.85,Low Fat,0.024821278,Soft Drinks,153.4998,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY36,12.3,Low Fat,0.009402696,Baking Goods,74.138,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN01,8.895,Low Fat,0.0,Breakfast,176.637,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH25,18.7,Low Fat,0.01459303,Soft Drinks,52.7324,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV08,7.35,Low Fat,0.0,Fruits and Vegetables,43.8454,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCP53,14.75,Low Fat,0.032941482,Health and Hygiene,238.8906,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU52,7.56,Low Fat,0.0,Frozen Foods,156.563,OUT010,1998,,Tier 3,Grocery Store +NCI42,18.75,Low Fat,0.010386567,Household,206.9954,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ14,7.71,Regular,0.047579697,Dairy,120.3756,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF11,10.195,Regular,0.017631222,Starchy Foods,240.6538,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ13,11.1,Low Fat,0.010684957,Canned,85.7908,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO32,6.36,Low Fat,0.201765292,Fruits and Vegetables,46.606,OUT010,1998,,Tier 3,Grocery Store +DRJ37,10.8,Low Fat,0.061350284,Soft Drinks,153.3024,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY43,14.85,Low Fat,0.098402239,Fruits and Vegetables,168.1474,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT41,15.7,Low Fat,0.056306994,Health and Hygiene,153.2024,OUT017,2007,,Tier 2,Supermarket Type1 +NCV17,18.85,Low Fat,0.0,Health and Hygiene,132.5626,OUT045,2002,,Tier 2,Supermarket Type1 +FDM04,,Regular,0.046892427,Frozen Foods,53.2666,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRB48,16.75,Regular,0.024954731,Soft Drinks,38.3822,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM24,6.135,Regular,0.079261353,Baking Goods,152.8366,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT37,14.15,Low Fat,0.035325003,Canned,254.1014,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCO05,7.27,Low Fat,0.077930971,Health and Hygiene,97.3384,OUT010,1998,,Tier 3,Grocery Store +FDL13,13.85,Regular,0.056318568,Breakfast,234.03,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL15,17.85,Low Fat,0.046898544,Meat,152.8682,OUT017,2007,,Tier 2,Supermarket Type1 +FDB11,16.0,Low Fat,0.061095899,Starchy Foods,223.4404,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL14,,reg,0.056306024,Canned,156.1972,OUT019,1985,Small,Tier 1,Grocery Store +FDY10,,Low Fat,0.085911519,Snack Foods,114.5176,OUT019,1985,Small,Tier 1,Grocery Store +FDJ40,13.6,Regular,0.049666358,Frozen Foods,110.7912,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCW18,15.1,LF,0.059324821,Household,237.2248,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCY06,15.25,Low Fat,0.061133888,Household,129.0968,OUT013,1987,High,Tier 3,Supermarket Type1 +DRE13,6.28,Low Fat,0.027817961,Soft Drinks,85.8198,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA26,7.855,Regular,0.074070351,Dairy,217.2482,OUT045,2002,,Tier 2,Supermarket Type1 +NCE19,8.97,Low Fat,0.155687405,Household,52.8956,OUT010,1998,,Tier 3,Grocery Store +FDE33,19.35,Regular,0.049626219,Fruits and Vegetables,80.2644,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRL59,,Low Fat,0.021121347,Hard Drinks,53.0298,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY07,11.8,Low Fat,0.0,Fruits and Vegetables,45.5402,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF57,14.5,Regular,0.059067021,Fruits and Vegetables,170.9448,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM58,16.85,Regular,0.079675335,Snack Foods,110.1544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP26,,Low Fat,0.0,Dairy,103.6306,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY32,7.605,Low Fat,0.129241042,Fruits and Vegetables,165.021,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD51,11.15,Low Fat,0.0,Dairy,47.2744,OUT010,1998,,Tier 3,Grocery Store +FDU22,12.35,Low Fat,0.093676604,Snack Foods,119.4124,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ49,11.0,Regular,0.133687996,Canned,222.0798,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCI42,18.75,Low Fat,0.010424177,Household,208.0954,OUT017,2007,,Tier 2,Supermarket Type1 +FDT04,,Low Fat,0.106523384,Frozen Foods,38.1822,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU41,18.85,Low Fat,0.052160388,Health and Hygiene,190.4846,OUT045,2002,,Tier 2,Supermarket Type1 +FDS56,5.785,Regular,0.038835464,Fruits and Vegetables,263.1252,OUT045,2002,,Tier 2,Supermarket Type1 +NCN42,20.25,Low Fat,0.014303066,Household,147.6418,OUT017,2007,,Tier 2,Supermarket Type1 +FDK34,13.35,Low Fat,0.038526684,Snack Foods,238.3564,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB03,17.75,Regular,0.157718931,Dairy,240.2538,OUT017,2007,,Tier 2,Supermarket Type1 +DRJ25,14.6,Low Fat,0.150539043,Soft Drinks,49.2692,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT25,,Low Fat,0.050505213,Canned,123.7072,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN20,19.35,LF,0.026160105,Fruits and Vegetables,168.3474,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP09,19.75,Low Fat,0.033861654,Snack Foods,213.2902,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM20,,Low Fat,0.067733845,Fruits and Vegetables,243.3144,OUT019,1985,Small,Tier 1,Grocery Store +NCG55,16.25,Low Fat,0.039146163,Household,114.3176,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCP14,8.275,Low Fat,0.110513428,Household,104.4306,OUT045,2002,,Tier 2,Supermarket Type1 +NCH06,12.3,Low Fat,0.076554385,Household,245.746,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV52,20.7,Regular,0.121419594,Frozen Foods,117.5466,OUT013,1987,High,Tier 3,Supermarket Type1 +NCL07,13.85,Low Fat,0.031332632,Others,40.548,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ11,,Low Fat,0.084679095,Hard Drinks,190.6872,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRO59,11.8,Low Fat,0.054109186,Hard Drinks,74.7012,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW15,15.35,Regular,0.09224886,Meat,147.6734,OUT010,1998,,Tier 3,Grocery Store +NCQ30,7.725,LF,0.029066785,Household,121.0414,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN54,,Low Fat,0.037339898,Household,75.2328,OUT019,1985,Small,Tier 1,Grocery Store +FDY01,,Regular,0.169458887,Canned,116.2834,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX39,14.3,Regular,0.049666763,Meat,212.9586,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH53,,Regular,0.019106758,Frozen Foods,82.6592,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA57,18.85,Low Fat,0.039636104,Snack Foods,41.648,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCC07,19.6,Low Fat,0.040089313,Household,106.7964,OUT010,1998,,Tier 3,Grocery Store +FDU28,19.2,Regular,0.093840193,Frozen Foods,188.0214,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK36,7.09,Low Fat,0.012076957,Baking Goods,48.6034,OUT010,1998,,Tier 3,Grocery Store +FDR36,6.715,Regular,0.122081667,Baking Goods,43.8454,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCQ17,10.3,Low Fat,0.116910445,Health and Hygiene,154.563,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS28,,Regular,0.144274551,Frozen Foods,55.2588,OUT019,1985,Small,Tier 1,Grocery Store +FDE08,18.2,Low Fat,0.049419707,Fruits and Vegetables,148.2734,OUT045,2002,,Tier 2,Supermarket Type1 +FDU22,12.35,Low Fat,0.093296553,Snack Foods,120.0124,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG41,8.84,Regular,0.076717379,Frozen Foods,109.7228,OUT045,2002,,Tier 2,Supermarket Type1 +FDO31,6.76,Regular,0.048511068,Fruits and Vegetables,77.996,OUT010,1998,,Tier 3,Grocery Store +FDM21,,Low Fat,0.112693192,Snack Foods,256.2646,OUT019,1985,Small,Tier 1,Grocery Store +FDU40,20.85,Low Fat,0.037615546,Frozen Foods,192.4478,OUT017,2007,,Tier 2,Supermarket Type1 +FDV36,18.7,Low Fat,0.026409147,Baking Goods,126.102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT10,,Regular,0.061744052,Snack Foods,59.2562,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX38,10.5,Regular,0.048304782,Dairy,47.8376,OUT045,2002,,Tier 2,Supermarket Type1 +NCU30,,low fat,0.034705807,Household,163.721,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCV06,11.3,Low Fat,0.0,Household,192.8478,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT16,9.895,Regular,0.0,Frozen Foods,261.8278,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP41,,Low Fat,0.016132205,Health and Hygiene,108.2596,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ56,16.25,Low Fat,0.025882559,Fruits and Vegetables,168.7474,OUT017,2007,,Tier 2,Supermarket Type1 +FDC22,6.89,Regular,0.136402598,Snack Foods,191.882,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU10,10.1,Regular,0.045683383,Snack Foods,38.2848,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS46,17.6,Regular,0.047353168,Snack Foods,117.2782,OUT045,2002,,Tier 2,Supermarket Type1 +FDO08,11.1,Regular,0.053858987,Fruits and Vegetables,166.0526,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCV42,6.26,Low Fat,0.031549979,Household,109.8228,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP33,18.7,Low Fat,0.089255373,Snack Foods,253.9672,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ12,8.895,Regular,0.039041114,Baking Goods,206.5296,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH04,6.115,Regular,0.011396037,Frozen Foods,89.0488,OUT045,2002,,Tier 2,Supermarket Type1 +NCU54,8.88,LF,0.098540307,Household,211.127,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO36,19.7,Low Fat,0.130411797,Baking Goods,180.566,OUT010,1998,,Tier 3,Grocery Store +FDT37,,Low Fat,0.03509937,Canned,255.6014,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDD14,20.7,Low Fat,0.284224541,Canned,186.1266,OUT010,1998,,Tier 3,Grocery Store +FDA16,6.695,Low Fat,0.033913749,Frozen Foods,220.3456,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS42,,Low Fat,0.121539272,Household,92.4146,OUT019,1985,Small,Tier 1,Grocery Store +FDP10,,Low Fat,0.224269298,Snack Foods,104.4622,OUT019,1985,Small,Tier 1,Grocery Store +FDQ28,14.0,Regular,0.06052101,Frozen Foods,152.9656,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK57,10.195,Low Fat,0.0,Snack Foods,119.744,OUT010,1998,,Tier 3,Grocery Store +FDK02,12.5,Low Fat,0.112131275,Canned,118.244,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW47,15.0,Low Fat,0.04656414,Breads,121.0414,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC42,15.0,Low Fat,0.045091342,Health and Hygiene,139.4838,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ37,20.75,Low Fat,0.089624277,Breakfast,193.9478,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDL40,17.7,Low Fat,0.011613156,Frozen Foods,95.041,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRE13,6.28,Low Fat,0.046372661,Soft Drinks,88.5198,OUT010,1998,,Tier 3,Grocery Store +FDQ34,,Low Fat,0.16145695,Snack Foods,104.4622,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCB54,8.76,Low Fat,0.050052711,Health and Hygiene,128.4336,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS48,15.15,Low Fat,0.0,Baking Goods,149.3708,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO15,16.75,Regular,0.008583918,Meat,72.1038,OUT045,2002,,Tier 2,Supermarket Type1 +NCT30,9.1,Low Fat,0.080226072,Household,45.7718,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU49,,Regular,0.030545722,Canned,85.454,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDE21,12.8,Low Fat,0.022944688,Fruits and Vegetables,115.0492,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDS49,,Low Fat,0.138923761,Canned,78.4644,OUT019,1985,Small,Tier 1,Grocery Store +FDT38,,Low Fat,0.057258817,Dairy,85.3566,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ01,8.975,Regular,0.009077217,Canned,102.099,OUT045,2002,,Tier 2,Supermarket Type1 +FDC41,15.6,Low Fat,0.116891138,Frozen Foods,75.767,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRG13,17.25,LF,0.062241994,Soft Drinks,162.7526,OUT010,1998,,Tier 3,Grocery Store +NCZ42,10.5,Low Fat,0.011333911,Household,236.8248,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM07,9.395,Low Fat,0.040042881,Others,84.9908,OUT045,2002,,Tier 2,Supermarket Type1 +NCV17,18.85,Low Fat,0.016173165,Health and Hygiene,131.1626,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRK39,7.02,Low Fat,0.0,Dairy,82.325,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS37,7.655,Low Fat,0.032074998,Canned,114.5492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV12,,Regular,0.106583703,Baking Goods,96.7384,OUT019,1985,Small,Tier 1,Grocery Store +NCG19,20.25,Low Fat,0.148536185,Household,235.9616,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS51,13.35,Low Fat,0.032153714,Meat,62.6194,OUT013,1987,High,Tier 3,Supermarket Type1 +NCO14,9.6,Low Fat,0.029643872,Household,43.2086,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC38,15.7,Low Fat,0.122493968,Canned,133.9942,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN15,17.5,Low Fat,0.0,Meat,140.418,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCH42,6.86,Low Fat,0.036506915,Household,228.201,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ22,16.75,Low Fat,0.029739652,Snack Foods,37.7822,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC05,13.1,Regular,0.09870238,Frozen Foods,195.2768,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ31,15.35,Regular,0.113123006,Fruits and Vegetables,191.9504,OUT013,1987,High,Tier 3,Supermarket Type1 +DRJ23,18.35,Low Fat,0.041733666,Hard Drinks,190.1872,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDC52,11.15,Regular,0.0,Dairy,151.2708,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRD12,6.96,Low Fat,0.129206196,Soft Drinks,89.5146,OUT010,1998,,Tier 3,Grocery Store +FDV55,17.75,Low Fat,0.055384948,Fruits and Vegetables,145.7444,OUT017,2007,,Tier 2,Supermarket Type1 +FDD32,17.7,Regular,0.040931994,Fruits and Vegetables,81.6276,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR01,5.405,reg,0.05370465,Canned,201.0742,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY08,,Regular,0.299530629,Fruits and Vegetables,139.9838,OUT019,1985,Small,Tier 1,Grocery Store +FDQ45,9.5,Regular,0.0,Snack Foods,184.9608,OUT045,2002,,Tier 2,Supermarket Type1 +DRN11,,Low Fat,0.162191037,Hard Drinks,144.7444,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCS05,11.5,Low Fat,0.021063528,Health and Hygiene,134.4942,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY32,7.605,Low Fat,0.129216604,Fruits and Vegetables,162.921,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCD31,12.1,Low Fat,0.015465765,Household,165.0526,OUT045,2002,,Tier 2,Supermarket Type1 +NCE06,5.825,Low Fat,0.091627467,Household,161.6894,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCP14,8.275,Low Fat,0.110289757,Household,102.8306,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCF18,,Low Fat,0.15579704,Household,191.3504,OUT019,1985,Small,Tier 1,Grocery Store +FDF14,7.55,Low Fat,0.027280495,Canned,151.234,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB22,8.02,Low Fat,0.112071014,Snack Foods,154.9998,OUT017,2007,,Tier 2,Supermarket Type1 +NCH54,13.5,Low Fat,0.072782102,Household,159.492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU27,18.6,Regular,0.171444454,Meat,49.5376,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS58,,Regular,0.020904887,Snack Foods,158.9578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCU29,7.685,Low Fat,0.02547263,Health and Hygiene,144.576,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ57,7.42,Regular,0.021555692,Seafood,186.0582,OUT013,1987,High,Tier 3,Supermarket Type1 +FDL56,14.1,Low Fat,0.125976163,Fruits and Vegetables,86.5198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH60,19.7,Regular,0.080721764,Baking Goods,195.611,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN24,14.1,Low Fat,0.113728834,Baking Goods,53.7956,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD02,16.6,Low Fat,0.0,Canned,120.3124,OUT017,2007,,Tier 2,Supermarket Type1 +FDP15,15.2,Low Fat,0.08441738,Meat,258.233,OUT017,2007,,Tier 2,Supermarket Type1 +FDB28,,LF,0.092933158,Dairy,197.6426,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRC49,8.67,Low Fat,0.065569288,Soft Drinks,144.6128,OUT045,2002,,Tier 2,Supermarket Type1 +NCG30,20.2,Low Fat,0.112778767,Household,123.5046,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDJ14,10.3,reg,0.050148322,Canned,79.396,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL52,6.635,Regular,0.046183676,Frozen Foods,37.0506,OUT045,2002,,Tier 2,Supermarket Type1 +NCG19,,Low Fat,0.147217192,Household,234.1616,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCN41,17.0,Low Fat,0.05219943,Health and Hygiene,123.673,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW22,9.695,Regular,0.03026518,Snack Foods,223.4114,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI02,15.7,Regular,0.114469755,Canned,112.1202,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV51,16.35,Low Fat,0.032604886,Meat,165.0842,OUT045,2002,,Tier 2,Supermarket Type1 +FDV48,9.195,Regular,0.051616858,Baking Goods,79.6644,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL17,,Low Fat,0.118673527,Health and Hygiene,141.2812,OUT019,1985,Small,Tier 1,Grocery Store +FDP46,15.35,LF,0.0,Snack Foods,89.383,OUT045,2002,,Tier 2,Supermarket Type1 +FDU10,10.1,Regular,0.045784687,Snack Foods,35.7848,OUT045,2002,,Tier 2,Supermarket Type1 +FDT37,14.15,Low Fat,0.05903503,Canned,256.4014,OUT010,1998,,Tier 3,Grocery Store +FDI27,8.71,Regular,0.045977618,Dairy,46.7744,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN51,17.85,Regular,0.020946828,Meat,261.3936,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW07,18.0,Regular,0.142661865,Fruits and Vegetables,87.3514,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN45,19.35,Low Fat,0.118286387,Snack Foods,223.7088,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRN37,,Low Fat,0.0,Soft Drinks,166.0158,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRF48,5.73,Low Fat,0.051882003,Soft Drinks,188.1898,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP38,,Low Fat,0.056206622,Canned,51.3008,OUT019,1985,Small,Tier 1,Grocery Store +NCX18,,Low Fat,0.008751398,Household,196.111,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK45,11.65,Low Fat,0.033996111,Seafood,114.786,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ37,8.1,Regular,0.019799238,Canned,86.5198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS50,17.0,Low Fat,0.055659189,Dairy,223.7114,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCR54,16.35,Low Fat,0.090931104,Household,195.711,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCS17,18.6,Low Fat,0.080486221,Health and Hygiene,94.5436,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV31,9.8,Low Fat,0.106717322,Fruits and Vegetables,178.337,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRE27,11.85,Low Fat,0.133421019,Dairy,96.0726,OUT017,2007,,Tier 2,Supermarket Type1 +FDN60,15.1,Low Fat,0.095078893,Baking Goods,159.6604,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK26,5.46,Regular,0.032150627,Canned,185.124,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX37,16.2,LF,0.063286094,Canned,100.37,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW31,11.35,Regular,0.043158104,Fruits and Vegetables,197.6742,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX26,17.7,Low Fat,0.088166215,Dairy,183.8292,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL49,,Low Fat,0.098799937,Soft Drinks,142.2812,OUT019,1985,Small,Tier 1,Grocery Store +FDU49,19.5,Regular,0.030867981,Canned,86.454,OUT017,2007,,Tier 2,Supermarket Type1 +FDY58,11.65,Low Fat,0.039918581,Snack Foods,228.7694,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN03,9.8,Regular,0.015120568,Meat,248.6408,OUT045,2002,,Tier 2,Supermarket Type1 +NCV06,11.3,Low Fat,0.0,Household,192.2478,OUT010,1998,,Tier 3,Grocery Store +FDH53,20.5,Regular,0.019238671,Frozen Foods,82.7592,OUT045,2002,,Tier 2,Supermarket Type1 +FDG31,12.15,Low Fat,0.038050764,Meat,65.9826,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCC06,19.0,Low Fat,0.027041096,Household,129.1336,OUT045,2002,,Tier 2,Supermarket Type1 +FDS13,6.465,Low Fat,0.124699691,Canned,266.0884,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP16,18.6,Low Fat,0.039287423,Frozen Foods,246.8802,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDA35,14.85,Regular,0.053792758,Baking Goods,121.0072,OUT013,1987,High,Tier 3,Supermarket Type1 +DRP47,15.75,Low Fat,0.141176075,Hard Drinks,253.8382,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY28,7.47,Regular,0.0,Frozen Foods,214.8218,OUT010,1998,,Tier 3,Grocery Store +FDY20,12.5,Regular,0.081737302,Fruits and Vegetables,90.9488,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCH30,17.1,Low Fat,0.067533904,Household,111.486,OUT017,2007,,Tier 2,Supermarket Type1 +NCR29,,Low Fat,0.09566912,Health and Hygiene,56.793,OUT019,1985,Small,Tier 1,Grocery Store +NCP05,19.6,Low Fat,0.0,Health and Hygiene,149.8024,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF30,,Low Fat,0.22103705,Household,124.8362,OUT019,1985,Small,Tier 1,Grocery Store +FDA08,11.85,Regular,0.0,Fruits and Vegetables,165.6526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN51,,reg,0.020845392,Meat,260.5936,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH12,9.6,Low Fat,0.084953662,Baking Goods,107.028,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY39,5.305,Regular,0.047294706,Meat,182.1608,OUT017,2007,,Tier 2,Supermarket Type1 +NCO53,16.2,Low Fat,0.175539766,Health and Hygiene,183.6608,OUT045,2002,,Tier 2,Supermarket Type1 +FDB40,17.5,Regular,0.007539885,Dairy,145.7102,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH02,7.27,Regular,0.020813453,Canned,89.6488,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY11,,Regular,0.029417303,Baking Goods,64.1142,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ09,,Low Fat,0.10178199,Snack Foods,113.6834,OUT019,1985,Small,Tier 1,Grocery Store +FDP16,18.6,Low Fat,0.039262153,Frozen Foods,247.2802,OUT013,1987,High,Tier 3,Supermarket Type1 +NCF55,6.675,Low Fat,0.021754595,Household,34.1874,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY09,,Low Fat,0.025078117,Snack Foods,176.7054,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY39,5.305,Regular,0.047124068,Meat,182.0608,OUT045,2002,,Tier 2,Supermarket Type1 +NCU53,5.485,Low Fat,0.04281828,Health and Hygiene,163.9842,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT41,15.7,Low Fat,0.056077341,Health and Hygiene,152.1024,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ45,17.75,Low Fat,0.073410642,Seafood,35.9216,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR28,13.85,Regular,0.025874934,Frozen Foods,163.421,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN08,7.72,Regular,0.088291127,Fruits and Vegetables,118.7466,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ07,7.26,Low Fat,0.0,Meat,114.515,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ09,,Low Fat,0.104371086,Snack Foods,164.4868,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ14,9.27,Low Fat,0.062136785,Dairy,150.605,OUT017,2007,,Tier 2,Supermarket Type1 +FDY12,,reg,0.139930125,Baking Goods,50.5008,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK57,10.195,Low Fat,0.08029289,Snack Foods,120.844,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD20,14.15,Low Fat,0.0,Fruits and Vegetables,123.3046,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS36,8.38,Regular,0.047078339,Baking Goods,111.357,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI40,11.5,Regular,0.125798231,Frozen Foods,102.5358,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ40,13.6,Regular,0.049689828,Frozen Foods,110.3912,OUT045,2002,,Tier 2,Supermarket Type1 +FDE08,18.2,Low Fat,0.049278643,Fruits and Vegetables,147.1734,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK01,7.63,Low Fat,0.061013491,Soft Drinks,96.0436,OUT013,1987,High,Tier 3,Supermarket Type1 +FDC58,10.195,Low Fat,0.042007527,Snack Foods,43.2428,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE50,19.7,Regular,0.016205646,Canned,188.8556,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX48,17.75,Regular,0.037880729,Baking Goods,152.7656,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRM35,9.695,Low Fat,0.070731517,Hard Drinks,178.0344,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG41,8.84,Regular,0.076498396,Frozen Foods,108.9228,OUT013,1987,High,Tier 3,Supermarket Type1 +FDB52,17.75,Low Fat,0.030435601,Dairy,255.9672,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV19,14.85,Regular,0.035328539,Fruits and Vegetables,158.5578,OUT045,2002,,Tier 2,Supermarket Type1 +DRG48,5.78,Low Fat,0.014637395,Soft Drinks,144.7102,OUT017,2007,,Tier 2,Supermarket Type1 +FDI26,5.94,Low Fat,0.034857707,Canned,180.4344,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU11,,Low Fat,0.162119533,Breads,121.2098,OUT019,1985,Small,Tier 1,Grocery Store +FDF59,,Low Fat,0.124739062,Starchy Foods,128.102,OUT019,1985,Small,Tier 1,Grocery Store +FDR07,21.35,Low Fat,0.07786478,Fruits and Vegetables,97.0094,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCE06,5.825,Low Fat,0.09200271,Household,161.8894,OUT017,2007,,Tier 2,Supermarket Type1 +FDE10,6.67,Regular,0.089948119,Snack Foods,132.6626,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCO55,12.8,Low Fat,0.091037229,Others,108.9938,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ13,7.84,Regular,0.0,Canned,51.035,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT50,6.75,reg,0.10885123,Dairy,96.8752,OUT017,2007,,Tier 2,Supermarket Type1 +FDH12,9.6,Low Fat,0.142195014,Baking Goods,105.728,OUT010,1998,,Tier 3,Grocery Store +FDD21,10.3,Regular,0.030631225,Fruits and Vegetables,116.4176,OUT045,2002,,Tier 2,Supermarket Type1 +NCM05,6.825,Low Fat,0.059797172,Health and Hygiene,263.2226,OUT013,1987,High,Tier 3,Supermarket Type1 +FDK04,7.36,Low Fat,0.0,Frozen Foods,59.2588,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN33,6.305,reg,0.123812157,Snack Foods,96.3436,OUT017,2007,,Tier 2,Supermarket Type1 +NCM18,13.0,Low Fat,0.138660307,Household,62.9194,OUT010,1998,,Tier 3,Grocery Store +DRC25,5.73,Low Fat,0.045442396,Soft Drinks,85.4882,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT47,5.26,Regular,0.024647467,Breads,96.4068,OUT017,2007,,Tier 2,Supermarket Type1 +FDD45,,Low Fat,0.115686024,Fruits and Vegetables,96.0436,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCD07,9.1,Low Fat,0.055654536,Household,114.1518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCY54,8.43,Low Fat,0.297424743,Household,174.2422,OUT010,1998,,Tier 3,Grocery Store +FDL12,15.85,Regular,0.121821828,Baking Goods,60.722,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL02,20.0,Regular,0.104672114,Canned,105.2622,OUT017,2007,,Tier 2,Supermarket Type1 +FDC60,5.425,Regular,0.114450757,Baking Goods,90.3514,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDR37,16.5,Regular,0.066624286,Breakfast,180.9292,OUT017,2007,,Tier 2,Supermarket Type1 +FDY16,18.35,Regular,0.0,Frozen Foods,184.6266,OUT017,2007,,Tier 2,Supermarket Type1 +FDU26,16.7,Regular,0.042705388,Dairy,120.2782,OUT045,2002,,Tier 2,Supermarket Type1 +FDN24,14.1,LF,0.113173172,Baking Goods,52.9956,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH44,19.1,Regular,0.025850623,Fruits and Vegetables,149.0418,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE23,17.6,Regular,0.089014099,Starchy Foods,46.506,OUT010,1998,,Tier 3,Grocery Store +FDW60,5.44,Regular,0.017158459,Baking Goods,176.037,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ55,13.65,Regular,0.013058345,Fruits and Vegetables,116.3834,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV32,,Low Fat,0.088278814,Fruits and Vegetables,62.051,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV03,17.6,Low Fat,0.097232874,Meat,156.0314,OUT010,1998,,Tier 3,Grocery Store +FDY14,10.3,Low Fat,0.117232927,Dairy,266.2226,OUT010,1998,,Tier 3,Grocery Store +NCL55,,Low Fat,0.064347565,Others,253.504,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRF25,9.0,Low Fat,0.039145429,Soft Drinks,38.619,OUT017,2007,,Tier 2,Supermarket Type1 +FDX03,15.85,Regular,0.061095976,Meat,44.6744,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF40,20.25,Regular,0.022557789,Dairy,247.7092,OUT045,2002,,Tier 2,Supermarket Type1 +FDX24,8.355,low fat,0.023314389,Baking Goods,91.2462,OUT010,1998,,Tier 3,Grocery Store +FDA25,16.5,Regular,0.068231673,Canned,102.899,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH21,10.395,Low Fat,0.03135221,Seafood,158.6604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB47,8.8,Low Fat,0.119558153,Snack Foods,210.5612,OUT010,1998,,Tier 3,Grocery Store +FDT34,,Low Fat,0.305264825,Snack Foods,105.5964,OUT019,1985,Small,Tier 1,Grocery Store +FDS39,6.895,low fat,0.037594397,Meat,140.8812,OUT010,1998,,Tier 3,Grocery Store +NCU05,11.8,Low Fat,0.058736238,Health and Hygiene,78.5618,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE02,8.71,Low Fat,0.121438886,Canned,93.6778,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL25,6.92,Regular,0.130900158,Breakfast,91.2804,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC50,15.85,Low Fat,0.136710131,Canned,94.1094,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ32,7.785,Regular,0.038192036,Fruits and Vegetables,106.5964,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV14,19.85,Low Fat,0.04458772,Dairy,86.9856,OUT045,2002,,Tier 2,Supermarket Type1 +FDR07,21.35,Low Fat,0.077901576,Fruits and Vegetables,96.9094,OUT045,2002,,Tier 2,Supermarket Type1 +FDB26,14.0,Regular,0.031316108,Canned,52.564,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCR50,20.2,Low Fat,0.011844058,Household,152.534,OUT045,2002,,Tier 2,Supermarket Type1 +FDP01,20.75,Regular,0.063583911,Breakfast,153.7682,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH57,10.895,Low Fat,0.035820019,Fruits and Vegetables,130.5284,OUT045,2002,,Tier 2,Supermarket Type1 +FDM60,,Regular,0.047910156,Baking Goods,39.8138,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDA45,21.25,Low Fat,0.0,Snack Foods,174.537,OUT017,2007,,Tier 2,Supermarket Type1 +FDU55,16.2,Low Fat,0.036114404,Fruits and Vegetables,258.8278,OUT017,2007,,Tier 2,Supermarket Type1 +FDH40,11.6,Regular,0.078914647,Frozen Foods,83.1276,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG40,,Low Fat,0.06972729,Frozen Foods,33.2558,OUT019,1985,Small,Tier 1,Grocery Store +FDT12,6.215,Regular,0.04969885,Baking Goods,223.9062,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL59,16.75,Low Fat,0.021267169,Hard Drinks,53.2298,OUT045,2002,,Tier 2,Supermarket Type1 +FDT47,5.26,Regular,0.024608674,Breads,98.8068,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI60,7.22,Regular,0.038537981,Baking Goods,64.951,OUT017,2007,,Tier 2,Supermarket Type1 +DRF51,,Low Fat,0.165035146,Dairy,37.6506,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCK31,10.895,LF,0.027089826,Others,50.6666,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB08,6.055,Low Fat,0.031166435,Fruits and Vegetables,160.1578,OUT045,2002,,Tier 2,Supermarket Type1 +FDM44,12.5,Low Fat,0.031043803,Fruits and Vegetables,101.799,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD46,6.035,Low Fat,0.141831427,Snack Foods,152.4998,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDR27,,Regular,0.168259451,Meat,130.4942,OUT019,1985,Small,Tier 1,Grocery Store +FDV56,16.1,Regular,0.022756451,Fruits and Vegetables,108.8596,OUT010,1998,,Tier 3,Grocery Store +FDM02,12.5,Regular,0.073849696,Canned,86.3198,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU45,15.6,Regular,0.035650779,Snack Foods,112.9518,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ10,17.85,Low Fat,0.044714995,Snack Foods,125.402,OUT017,2007,,Tier 2,Supermarket Type1 +NCK31,10.895,Low Fat,0.045272429,Others,50.2666,OUT010,1998,,Tier 3,Grocery Store +FDR27,15.1,Regular,0.09608226,Meat,134.2942,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF33,7.97,Low Fat,0.021517566,Seafood,108.2596,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ36,14.5,Regular,0.128260071,Baking Goods,104.1332,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP33,18.7,Low Fat,0.089411048,Snack Foods,254.8672,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG17,6.865,Regular,0.035840212,Frozen Foods,245.0486,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDG47,,Low Fat,0.069281708,Starchy Foods,263.5252,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW29,14.0,Low Fat,0.028862957,Health and Hygiene,128.431,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRH59,10.8,Low Fat,0.058763973,Hard Drinks,72.238,OUT017,2007,,Tier 2,Supermarket Type1 +FDR32,6.78,Regular,0.086293322,Fruits and Vegetables,229.3694,OUT017,2007,,Tier 2,Supermarket Type1 +FDP48,7.52,Regular,0.044014888,Baking Goods,181.795,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG17,6.865,Regular,0.035833435,Frozen Foods,244.7486,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ59,11.65,Low Fat,0.01948183,Hard Drinks,40.1164,OUT017,2007,,Tier 2,Supermarket Type1 +FDY48,,Low Fat,0.023619935,Baking Goods,103.3332,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDB02,9.695,Regular,0.029164278,Canned,175.237,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN10,,Low Fat,0.080756828,Snack Foods,118.0124,OUT019,1985,Small,Tier 1,Grocery Store +NCD55,14.0,Low Fat,0.024326578,Household,41.9454,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDX34,6.195,Low Fat,0.071925626,Snack Foods,121.9098,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ38,17.6,Low Fat,0.008017245,Dairy,170.8422,OUT045,2002,,Tier 2,Supermarket Type1 +DRF37,17.25,Low Fat,0.084463753,Soft Drinks,262.291,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRL47,,Low Fat,0.067823104,Hard Drinks,124.6362,OUT019,1985,Small,Tier 1,Grocery Store +FDL27,6.17,Low Fat,0.0,Meat,64.0826,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP53,14.75,Low Fat,0.032884127,Health and Hygiene,236.5906,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT03,,Low Fat,0.017506543,Meat,184.0608,OUT019,1985,Small,Tier 1,Grocery Store +FDJ28,12.3,LF,0.021856851,Frozen Foods,191.8162,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF40,20.25,Regular,0.022603838,Dairy,248.1092,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA32,14.0,Low Fat,0.030088502,Fruits and Vegetables,216.6192,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCP02,7.105,Low Fat,0.045062219,Household,58.4562,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ31,15.35,Regular,0.11344683,Fruits and Vegetables,193.7504,OUT045,2002,,Tier 2,Supermarket Type1 +NCQ29,12.0,Low Fat,0.104143397,Health and Hygiene,262.2278,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP57,17.5,Low Fat,0.087780702,Snack Foods,105.099,OUT010,1998,,Tier 3,Grocery Store +FDL32,,Regular,0.121873881,Fruits and Vegetables,113.1544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRB01,7.39,Low Fat,0.0,Soft Drinks,191.753,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDJ40,13.6,Regular,0.049589259,Frozen Foods,109.7912,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO24,11.1,Low Fat,0.176933493,Baking Goods,159.1604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO11,8.0,Regular,0.030388183,Breads,247.8092,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA56,9.21,Low Fat,0.008763128,Fruits and Vegetables,120.2414,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF02,16.2,Low Fat,0.103683012,Canned,105.099,OUT045,2002,,Tier 2,Supermarket Type1 +FDA10,20.35,Low Fat,0.141697997,Snack Foods,122.5072,OUT013,1987,High,Tier 3,Supermarket Type1 +NCI55,18.6,Low Fat,0.012725138,Household,121.8414,OUT017,2007,,Tier 2,Supermarket Type1 +FDZ40,8.935,Low Fat,0.067257683,Frozen Foods,53.3298,OUT010,1998,,Tier 3,Grocery Store +FDV08,7.35,Low Fat,0.028639386,Fruits and Vegetables,41.7454,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN48,13.35,Low Fat,0.064896679,Baking Goods,90.0804,OUT013,1987,High,Tier 3,Supermarket Type1 +FDU57,8.27,Regular,0.090060741,Snack Foods,150.3708,OUT017,2007,,Tier 2,Supermarket Type1 +DRF49,7.27,Low Fat,0.071018789,Soft Drinks,114.4518,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS02,10.195,Regular,0.145839766,Dairy,194.9794,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS43,11.65,Low Fat,0.040514888,Fruits and Vegetables,186.524,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT16,9.895,Regular,0.048621862,Frozen Foods,259.1278,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX19,,Low Fat,0.096265377,Fruits and Vegetables,233.7958,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK15,10.8,Low Fat,0.098413825,Meat,98.8042,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRA12,11.6,LF,0.041009558,Soft Drinks,141.0154,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY35,17.6,Regular,0.01611834,Breads,45.2402,OUT017,2007,,Tier 2,Supermarket Type1 +NCU42,9.0,Low Fat,0.019490421,Household,169.3474,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD26,8.71,Regular,0.072095416,Canned,184.7924,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR11,10.5,Regular,0.143118865,Breads,160.8578,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCP53,14.75,Low Fat,0.032957049,Health and Hygiene,239.1906,OUT045,2002,,Tier 2,Supermarket Type1 +FDP34,12.85,Low Fat,0.13750615,Snack Foods,156.863,OUT045,2002,,Tier 2,Supermarket Type1 +NCV41,,Low Fat,0.029832699,Health and Hygiene,109.7228,OUT019,1985,Small,Tier 1,Grocery Store +FDN20,19.35,Low Fat,0.026288547,Fruits and Vegetables,167.0474,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ16,16.85,Regular,0.0,Frozen Foods,193.2478,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ28,20.0,Regular,0.051572555,Frozen Foods,126.9678,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCL55,12.15,LF,0.064606878,Others,253.604,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ17,7.68,LF,0.152556491,Health and Hygiene,85.1224,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT37,14.15,Low Fat,0.0,Canned,255.8014,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV51,16.35,Low Fat,0.032589486,Meat,167.7842,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ28,20.0,Regular,0.051482762,Frozen Foods,128.8678,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN27,20.85,Low Fat,0.039529574,Meat,117.7808,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS14,,LF,0.087480308,Dairy,158.3288,OUT019,1985,Small,Tier 1,Grocery Store +FDZ58,17.85,Low Fat,0.052282677,Snack Foods,122.5072,OUT045,2002,,Tier 2,Supermarket Type1 +FDD46,6.035,Low Fat,0.14125601,Snack Foods,155.3998,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ03,12.35,Regular,0.072381223,Dairy,48.4692,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU03,18.7,Regular,0.153282667,Meat,180.4292,OUT010,1998,,Tier 3,Grocery Store +FDA33,,Low Fat,0.033735736,Snack Foods,148.5076,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCW53,18.35,Low Fat,0.030489311,Health and Hygiene,191.1162,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCC55,10.695,Low Fat,0.064123807,Household,36.9848,OUT017,2007,,Tier 2,Supermarket Type1 +FDP52,,Regular,0.123772093,Frozen Foods,229.801,OUT019,1985,Small,Tier 1,Grocery Store +FDE39,7.89,Low Fat,0.036190683,Dairy,120.4782,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB44,6.655,Low Fat,0.016955625,Fruits and Vegetables,210.4586,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG59,15.85,Low Fat,0.0,Starchy Foods,37.5164,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI05,8.35,Regular,0.12676414,Frozen Foods,74.2354,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF59,12.5,Low Fat,0.071388493,Starchy Foods,128.302,OUT045,2002,,Tier 2,Supermarket Type1 +FDM39,,Low Fat,0.093620227,Dairy,180.3002,OUT019,1985,Small,Tier 1,Grocery Store +FDB14,20.25,Regular,0.102638435,Canned,91.212,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS05,,Low Fat,0.036729896,Health and Hygiene,134.3942,OUT019,1985,Small,Tier 1,Grocery Store +DRJ35,10.1,Low Fat,0.046679027,Hard Drinks,61.9878,OUT045,2002,,Tier 2,Supermarket Type1 +FDO31,,Regular,0.050744935,Fruits and Vegetables,79.496,OUT019,1985,Small,Tier 1,Grocery Store +FDA31,7.1,Low Fat,0.110011687,Fruits and Vegetables,173.608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX40,12.85,Low Fat,0.099147047,Frozen Foods,38.4164,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW56,7.68,Low Fat,0.07104407,Fruits and Vegetables,191.9162,OUT045,2002,,Tier 2,Supermarket Type1 +FDH09,12.6,Low Fat,0.05630601,Seafood,51.3982,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA52,,Regular,0.224850832,Frozen Foods,176.437,OUT019,1985,Small,Tier 1,Grocery Store +FDF20,,Low Fat,0.058164228,Fruits and Vegetables,197.8768,OUT019,1985,Small,Tier 1,Grocery Store +FDE40,15.6,Regular,0.09914376,Dairy,61.3194,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCU17,5.32,LF,0.092883309,Health and Hygiene,100.1674,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCP14,8.275,LF,0.110268903,Household,106.3306,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN25,,Regular,0.06087929,Breakfast,56.1588,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU39,18.85,Low Fat,0.036093981,Meat,59.2562,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCM05,6.825,Low Fat,0.060185494,Health and Hygiene,264.9226,OUT017,2007,,Tier 2,Supermarket Type1 +FDU07,11.1,Low Fat,0.060185494,Fruits and Vegetables,149.6366,OUT017,2007,,Tier 2,Supermarket Type1 +FDF28,15.7,Regular,0.037923591,Frozen Foods,126.2046,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR57,5.675,Regular,0.023533498,Snack Foods,158.7288,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ33,8.895,reg,0.088248679,Snack Foods,123.273,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH23,14.65,Low Fat,0.170286046,Hard Drinks,55.6614,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ52,17.0,Low Fat,0.119384984,Frozen Foods,249.1434,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRK13,11.8,LF,0.115145802,Soft Drinks,197.4084,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP09,19.75,Low Fat,0.033889856,Snack Foods,211.8902,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR08,,Low Fat,0.0,Fruits and Vegetables,109.4886,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDV50,14.3,Low Fat,0.122819787,Dairy,122.473,OUT045,2002,,Tier 2,Supermarket Type1 +FDT13,14.85,Low Fat,0.018600515,Canned,189.8214,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ27,,Regular,0.121285843,Meat,100.8674,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH21,10.395,Low Fat,0.031225013,Seafood,156.9604,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW14,,Regular,0.038026496,Dairy,87.8198,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL52,6.635,Regular,0.046161862,Frozen Foods,39.4506,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW28,18.25,Low Fat,0.089326677,Frozen Foods,196.7452,OUT017,2007,,Tier 2,Supermarket Type1 +FDL40,17.7,Low Fat,0.011631211,Frozen Foods,97.241,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE24,14.85,Low Fat,0.093462623,Baking Goods,141.9812,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX35,5.035,Regular,0.080034782,Breads,227.9036,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP46,15.35,LF,0.075037671,Snack Foods,88.383,OUT017,2007,,Tier 2,Supermarket Type1 +FDX56,17.1,Regular,0.074209668,Fruits and Vegetables,206.3638,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ45,9.5,Regular,0.010934025,Snack Foods,185.3608,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK50,,Low Fat,0.028225853,Canned,161.0894,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY26,20.6,Regular,0.030572402,Dairy,211.2244,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ09,7.235,Low Fat,0.058461026,Snack Foods,114.2834,OUT017,2007,,Tier 2,Supermarket Type1 +FDN39,19.35,reg,0.0,Meat,168.8816,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDP13,8.1,Regular,0.135083344,Canned,40.848,OUT017,2007,,Tier 2,Supermarket Type1 +FDR51,9.035,Regular,0.0,Meat,149.9708,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ49,11.0,Regular,0.222858466,Canned,218.9798,OUT010,1998,,Tier 3,Grocery Store +FDL28,10.0,Regular,0.0634319,Frozen Foods,230.1668,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ10,17.85,Low Fat,0.044455084,Snack Foods,125.602,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK38,6.65,Low Fat,0.053245569,Canned,148.0734,OUT013,1987,High,Tier 3,Supermarket Type1 +DRL49,,Low Fat,0.056155764,Soft Drinks,143.0812,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR15,9.3,Regular,0.033410165,Meat,153.3314,OUT013,1987,High,Tier 3,Supermarket Type1 +FDQ24,15.7,Low Fat,0.073652769,Baking Goods,251.7724,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD56,15.2,Regular,0.103691909,Fruits and Vegetables,176.7054,OUT013,1987,High,Tier 3,Supermarket Type1 +NCR42,9.105,Low Fat,0.0,Household,32.59,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH52,9.42,Regular,0.043992138,Frozen Foods,63.3194,OUT045,2002,,Tier 2,Supermarket Type1 +FDH57,,Low Fat,0.062589297,Fruits and Vegetables,130.5284,OUT019,1985,Small,Tier 1,Grocery Store +FDR15,9.3,reg,0.055968342,Meat,156.7314,OUT010,1998,,Tier 3,Grocery Store +FDJ34,11.8,Regular,0.093638018,Snack Foods,125.2704,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW37,19.2,Low Fat,0.124026934,Canned,92.4488,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ23,6.55,Low Fat,0.024625736,Breads,101.3332,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP34,12.85,Low Fat,0.13711365,Snack Foods,158.263,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE04,,Regular,0.017935792,Frozen Foods,180.966,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC48,9.195,Low Fat,0.015891457,Baking Goods,80.7592,OUT045,2002,,Tier 2,Supermarket Type1 +FDA47,,Regular,0.204280754,Baking Goods,162.221,OUT019,1985,Small,Tier 1,Grocery Store +FDI35,14.0,Low Fat,0.041459372,Starchy Foods,179.9634,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV05,10.1,Low Fat,0.030183371,Health and Hygiene,156.1656,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR28,13.85,Regular,0.025949003,Frozen Foods,161.921,OUT045,2002,,Tier 2,Supermarket Type1 +FDH31,12.0,Regular,0.0,Meat,98.4042,OUT017,2007,,Tier 2,Supermarket Type1 +FDP59,,Regular,0.098864176,Breads,104.0648,OUT019,1985,Small,Tier 1,Grocery Store +FDS19,13.8,Regular,0.06446883,Fruits and Vegetables,76.5012,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM60,10.8,Regular,0.048240928,Baking Goods,41.0138,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ44,12.3,Regular,0.106760383,Fruits and Vegetables,173.2396,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRH51,17.6,Low Fat,0.097766473,Dairy,86.6856,OUT017,2007,,Tier 2,Supermarket Type1 +DRC25,5.73,Low Fat,0.045628497,Soft Drinks,85.1882,OUT017,2007,,Tier 2,Supermarket Type1 +DRE25,15.35,Low Fat,0.073222209,Soft Drinks,93.312,OUT013,1987,High,Tier 3,Supermarket Type1 +NCX05,15.2,Low Fat,0.097212998,Health and Hygiene,114.9492,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR11,10.5,Regular,0.143344479,Breads,158.4578,OUT017,2007,,Tier 2,Supermarket Type1 +DRP47,15.75,Low Fat,0.140888464,Hard Drinks,250.7382,OUT045,2002,,Tier 2,Supermarket Type1 +DRC49,,Low Fat,0.114571006,Soft Drinks,143.6128,OUT019,1985,Small,Tier 1,Grocery Store +FDQ47,,Regular,0.167371926,Breads,36.4874,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL20,17.1,Low Fat,0.128307691,Fruits and Vegetables,111.3886,OUT013,1987,High,Tier 3,Supermarket Type1 +FDM34,19.0,Low Fat,0.0,Snack Foods,130.9626,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCN55,14.6,Low Fat,0.059440998,Others,239.4538,OUT013,1987,High,Tier 3,Supermarket Type1 +FDD41,6.765,Regular,0.087243604,Frozen Foods,104.4306,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDE52,10.395,Regular,0.029933264,Dairy,90.1514,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT18,,Low Fat,0.104010753,Household,179.1976,OUT019,1985,Small,Tier 1,Grocery Store +FDJ32,10.695,Low Fat,0.058027764,Fruits and Vegetables,59.6536,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE16,8.895,Low Fat,0.026343715,Frozen Foods,210.1954,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ09,17.6,Low Fat,0.105091664,Snack Foods,163.0868,OUT045,2002,,Tier 2,Supermarket Type1 +DRZ11,8.85,Regular,0.112664944,Soft Drinks,123.5388,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDK41,14.3,Low Fat,0.127740015,Frozen Foods,86.5224,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE56,17.25,Regular,0.159442933,Fruits and Vegetables,61.3194,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH34,8.63,Low Fat,0.03106937,Snack Foods,186.0582,OUT013,1987,High,Tier 3,Supermarket Type1 +DRI49,14.15,Low Fat,0.183354585,Soft Drinks,80.9276,OUT013,1987,High,Tier 3,Supermarket Type1 +DRI59,9.5,Low Fat,0.04083467,Hard Drinks,224.7088,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC36,13.0,Regular,0.045054813,Soft Drinks,173.8054,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDS15,,Regular,0.136674035,Meat,105.8596,OUT019,1985,Small,Tier 1,Grocery Store +FDI07,12.35,Regular,0.03389839,Meat,196.0426,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDZ15,13.1,Low Fat,0.020955763,Dairy,118.6782,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCX41,,Low Fat,0.017633471,Health and Hygiene,211.3244,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCO29,,Low Fat,0.056476427,Health and Hygiene,166.2526,OUT019,1985,Small,Tier 1,Grocery Store +FDF57,14.5,Regular,0.058778429,Fruits and Vegetables,168.4448,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI33,16.5,Low Fat,0.028413443,Snack Foods,90.9146,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ47,18.25,Low Fat,0.044319101,Hard Drinks,172.008,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB34,15.25,LF,0.026609813,Snack Foods,86.3198,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY22,,Regular,0.158947217,Snack Foods,143.3128,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRL11,10.5,Low Fat,0.048289771,Hard Drinks,158.3946,OUT017,2007,,Tier 2,Supermarket Type1 +FDY46,18.6,Low Fat,0.047880884,Snack Foods,188.7898,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDG17,6.865,Regular,0.035810387,Frozen Foods,243.1486,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE52,10.395,Regular,0.0,Dairy,88.5514,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRP47,,Low Fat,0.139922439,Hard Drinks,251.5382,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO01,21.1,Regular,0.034678781,Breakfast,127.7994,OUT010,1998,,Tier 3,Grocery Store +FDL09,19.6,Regular,0.128036069,Snack Foods,169.6816,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDR57,5.675,Regular,0.023477413,Snack Foods,157.7288,OUT013,1987,High,Tier 3,Supermarket Type1 +DRD37,9.8,Low Fat,0.0,Soft Drinks,48.006,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ36,,Regular,0.16076514,Baking Goods,39.0848,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL33,7.235,Low Fat,0.100117939,Snack Foods,196.7452,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDL48,19.35,Regular,0.082433257,Baking Goods,49.7034,OUT045,2002,,Tier 2,Supermarket Type1 +FDL28,10.0,Regular,0.063272773,Frozen Foods,230.9668,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCN29,15.2,Low Fat,0.0,Health and Hygiene,47.5034,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDO13,7.865,Low Fat,0.061048127,Breakfast,165.9526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB38,19.5,Regular,0.02740216,Canned,161.792,OUT045,2002,,Tier 2,Supermarket Type1 +FDI36,12.5,Regular,0.062331643,Baking Goods,196.3426,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI58,7.64,Regular,0.070691105,Snack Foods,91.412,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH22,6.405,Low Fat,0.136856178,Snack Foods,128.9678,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDQ27,5.19,Regular,0.044215795,Meat,104.999,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT33,7.81,Regular,0.033990657,Snack Foods,166.1158,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC56,7.72,Low Fat,0.121767168,Fruits and Vegetables,119.144,OUT045,2002,,Tier 2,Supermarket Type1 +FDF14,7.55,low fat,0.027169816,Canned,154.834,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ39,14.8,Low Fat,0.081500543,Meat,192.2846,OUT017,2007,,Tier 2,Supermarket Type1 +NCM43,14.5,Low Fat,0.019585531,Others,164.621,OUT017,2007,,Tier 2,Supermarket Type1 +FDS46,17.6,Regular,0.047248393,Snack Foods,120.0782,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDI22,12.6,Low Fat,0.096362017,Snack Foods,207.4612,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCE43,12.5,Low Fat,0.103652052,Household,170.4448,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ36,6.035,Regular,0.110108566,Baking Goods,186.124,OUT010,1998,,Tier 3,Grocery Store +FDR13,,Regular,0.05028647,Canned,115.8492,OUT019,1985,Small,Tier 1,Grocery Store +FDP46,15.35,Low Fat,0.074919567,Snack Foods,89.383,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW56,,Low Fat,0.124137242,Fruits and Vegetables,191.8162,OUT019,1985,Small,Tier 1,Grocery Store +FDB40,17.5,Regular,0.007582533,Dairy,145.5102,OUT017,2007,,Tier 2,Supermarket Type1 +FDM28,15.7,Low Fat,0.045387996,Frozen Foods,178.866,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDV49,10.0,Low Fat,0.025805706,Canned,264.6226,OUT013,1987,High,Tier 3,Supermarket Type1 +NCS53,14.5,Low Fat,0.090143906,Health and Hygiene,156.8604,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO03,10.395,Regular,0.03694032,Meat,228.8352,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT15,12.15,Regular,0.042673451,Meat,183.595,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD33,12.85,Low Fat,0.108360852,Fruits and Vegetables,230.6642,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX13,7.725,Low Fat,0.0,Canned,250.9092,OUT017,2007,,Tier 2,Supermarket Type1 +FDH60,19.7,Regular,0.080669843,Baking Goods,197.311,OUT013,1987,High,Tier 3,Supermarket Type1 +DRH51,17.6,Low Fat,0.097216576,Dairy,86.1856,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCL07,13.85,Low Fat,0.0,Others,41.948,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDW51,6.155,Regular,0.094851844,Meat,213.856,OUT045,2002,,Tier 2,Supermarket Type1 +FDF21,,Regular,0.102999154,Fruits and Vegetables,187.953,OUT019,1985,Small,Tier 1,Grocery Store +FDH26,,Regular,0.06075476,Canned,140.1496,OUT019,1985,Small,Tier 1,Grocery Store +FDJ03,12.35,Regular,0.072507467,Dairy,50.2692,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU35,6.44,Low Fat,0.079663441,Breads,97.97,OUT017,2007,,Tier 2,Supermarket Type1 +DRL01,19.5,Regular,0.077486687,Soft Drinks,231.8958,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE59,12.15,Low Fat,0.062414139,Starchy Foods,36.7532,OUT045,2002,,Tier 2,Supermarket Type1 +FDI60,7.22,Regular,0.038313974,Baking Goods,63.951,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRH39,20.7,LF,0.092672678,Dairy,77.267,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDK36,7.09,Low Fat,0.007226532,Baking Goods,49.3034,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDN52,9.395,Regular,0.131836711,Frozen Foods,85.2198,OUT045,2002,,Tier 2,Supermarket Type1 +FDU12,15.5,Regular,0.076179549,Baking Goods,263.1568,OUT017,2007,,Tier 2,Supermarket Type1 +NCT05,,Low Fat,0.020850388,Health and Hygiene,255.8672,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS37,,Low Fat,0.031790174,Canned,117.2492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK24,9.195,Low Fat,0.101867911,Baking Goods,46.4744,OUT017,2007,,Tier 2,Supermarket Type1 +DRF36,16.1,Low Fat,0.023557678,Soft Drinks,191.5846,OUT013,1987,High,Tier 3,Supermarket Type1 +FDN46,7.21,Regular,0.242083443,Snack Foods,101.2332,OUT010,1998,,Tier 3,Grocery Store +NCN06,8.39,Low Fat,0.120741638,Household,162.3868,OUT045,2002,,Tier 2,Supermarket Type1 +FDD59,10.5,Regular,0.066168292,Starchy Foods,80.696,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDM14,13.8,LF,0.013290868,Canned,109.5254,OUT045,2002,,Tier 2,Supermarket Type1 +FDO10,13.65,Regular,0.0,Snack Foods,56.3588,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU35,6.44,Low Fat,0.079149445,Breads,98.17,OUT013,1987,High,Tier 3,Supermarket Type1 +NCA30,19.0,Low Fat,0.129860583,Household,188.7872,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO41,12.5,Low Fat,0.018878167,Health and Hygiene,97.3384,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDI24,10.3,Low Fat,0.078743805,Baking Goods,175.837,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ16,16.85,Regular,0.159855844,Frozen Foods,192.7478,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV47,17.1,Low Fat,0.054207549,Breads,82.7566,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDV16,7.75,Regular,0.0,Frozen Foods,34.5558,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ22,9.395,Low Fat,0.045261336,Snack Foods,81.925,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO20,12.85,Regular,0.254630746,Fruits and Vegetables,254.0382,OUT010,1998,,Tier 3,Grocery Store +FDW38,5.325,Regular,0.0,Dairy,55.6298,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW52,14.0,Regular,0.037598636,Frozen Foods,164.0526,OUT045,2002,,Tier 2,Supermarket Type1 +FDT43,,Low Fat,0.035976809,Fruits and Vegetables,51.2324,OUT019,1985,Small,Tier 1,Grocery Store +NCS29,9.0,Low Fat,0.069686501,Health and Hygiene,264.6884,OUT045,2002,,Tier 2,Supermarket Type1 +NCC31,8.02,Low Fat,0.019982858,Household,154.5972,OUT017,2007,,Tier 2,Supermarket Type1 +FDA21,13.65,LF,0.0,Snack Foods,186.6924,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ55,13.65,Regular,0.013038075,Fruits and Vegetables,116.1834,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCE54,20.7,Low Fat,0.026941678,Household,75.9354,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD45,8.615,Low Fat,0.0,Fruits and Vegetables,93.8436,OUT017,2007,,Tier 2,Supermarket Type1 +NCP17,19.35,Low Fat,0.027871135,Health and Hygiene,63.8168,OUT017,2007,,Tier 2,Supermarket Type1 +FDR47,17.85,LF,0.087452117,Breads,193.1794,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRM35,9.695,Low Fat,0.070385933,Hard Drinks,177.3344,OUT013,1987,High,Tier 3,Supermarket Type1 +FDR47,,LF,0.153146326,Breads,194.2794,OUT019,1985,Small,Tier 1,Grocery Store +FDX19,19.1,Low Fat,0.161912574,Fruits and Vegetables,233.9958,OUT010,1998,,Tier 3,Grocery Store +FDV22,,Regular,0.009890655,Snack Foods,156.263,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDQ46,,low fat,0.10331031,Snack Foods,111.2544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRO47,10.195,low fat,0.11245226,Hard Drinks,112.286,OUT045,2002,,Tier 2,Supermarket Type1 +FDB44,6.655,Low Fat,0.028385607,Fruits and Vegetables,210.6586,OUT010,1998,,Tier 3,Grocery Store +FDN02,16.5,Low Fat,0.123572515,Canned,205.1638,OUT010,1998,,Tier 3,Grocery Store +FDW10,21.2,Low Fat,0.070819614,Snack Foods,174.537,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ41,,Low Fat,0.04006567,Frozen Foods,262.5594,OUT019,1985,Small,Tier 1,Grocery Store +FDM50,13.0,Regular,0.030089171,Canned,58.322,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW10,21.2,Low Fat,0.070662917,Snack Foods,177.037,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY48,14.0,Low Fat,0.023771773,Baking Goods,102.2332,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCE30,,Low Fat,0.098655965,Household,212.9902,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO04,16.6,Low Fat,0.026591024,Frozen Foods,56.7614,OUT045,2002,,Tier 2,Supermarket Type1 +FDQ26,13.5,Regular,0.113604487,Dairy,57.9562,OUT010,1998,,Tier 3,Grocery Store +NCX29,10.0,Low Fat,0.089515698,Health and Hygiene,146.1102,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE39,7.89,Low Fat,0.036134504,Dairy,117.7782,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCR54,,Low Fat,0.090123641,Household,194.811,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCP55,,Low Fat,0.011135837,Others,56.8614,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX22,6.785,Regular,0.023104767,Snack Foods,211.2928,OUT017,2007,,Tier 2,Supermarket Type1 +FDI05,8.35,reg,0.126845728,Frozen Foods,74.0354,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC51,,Regular,0.0,Dairy,124.873,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC10,9.8,Regular,0.072817026,Snack Foods,119.2098,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ46,11.1,Low Fat,0.0,Snack Foods,174.3054,OUT045,2002,,Tier 2,Supermarket Type1 +FDV10,7.645,Regular,0.111652253,Snack Foods,44.2112,OUT010,1998,,Tier 3,Grocery Store +FDX12,,reg,0.025938267,Baking Goods,242.5196,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL43,,Low Fat,0.047386238,Meat,77.867,OUT019,1985,Small,Tier 1,Grocery Store +DRB13,6.115,Regular,0.00704434,Soft Drinks,189.053,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF59,,Low Fat,0.070899006,Starchy Foods,128.002,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT35,19.85,Regular,0.081582021,Breads,167.8816,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCJ19,18.6,Low Fat,0.118157664,Others,58.3588,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT35,19.85,Regular,0.0,Breads,169.6816,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI48,11.85,Regular,0.055718399,Baking Goods,49.6666,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRC24,,Low Fat,0.043458854,Soft Drinks,152.2998,OUT019,1985,Small,Tier 1,Grocery Store +NCZ05,8.485,Low Fat,0.058461026,Health and Hygiene,102.899,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ57,7.42,Regular,0.021607186,Seafood,185.3582,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX11,16.0,Regular,0.107355914,Baking Goods,182.5634,OUT017,2007,,Tier 2,Supermarket Type1 +FDE09,8.775,Low Fat,0.021599298,Fruits and Vegetables,110.8228,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCK06,5.03,Low Fat,0.008659972,Household,120.2756,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRE37,13.5,Low Fat,0.094752537,Soft Drinks,189.9872,OUT017,2007,,Tier 2,Supermarket Type1 +FDV56,16.1,Regular,0.013595722,Fruits and Vegetables,106.0596,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDY43,14.85,Low Fat,0.098958842,Fruits and Vegetables,167.2474,OUT017,2007,,Tier 2,Supermarket Type1 +FDV35,19.5,Low Fat,0.128099312,Breads,153.6314,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF05,,Low Fat,0.04704746,Frozen Foods,261.691,OUT019,1985,Small,Tier 1,Grocery Store +FDA36,5.985,Low Fat,0.005665312,Baking Goods,183.4924,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDS13,,Low Fat,0.123903191,Canned,263.0884,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU47,12.8,Regular,0.113759721,Breads,141.9838,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI36,12.5,Regular,0.104350123,Baking Goods,195.8426,OUT010,1998,,Tier 3,Grocery Store +FDH48,13.5,Low Fat,0.060480359,Baking Goods,86.454,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ14,7.71,Regular,0.047549094,Dairy,121.5756,OUT013,1987,High,Tier 3,Supermarket Type1 +FDS46,17.6,Regular,0.047218002,Snack Foods,121.0782,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE21,12.8,Low Fat,0.023074472,Fruits and Vegetables,117.8492,OUT017,2007,,Tier 2,Supermarket Type1 +FDA26,7.855,Regular,0.074035365,Dairy,220.5482,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDV12,16.7,Regular,0.060874678,Baking Goods,99.9384,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL46,,Low Fat,0.094646702,Snack Foods,115.9466,OUT019,1985,Small,Tier 1,Grocery Store +FDN57,18.25,Low Fat,0.054189065,Snack Foods,143.0154,OUT013,1987,High,Tier 3,Supermarket Type1 +NCJ18,12.35,Low Fat,0.16486926,Household,117.6124,OUT017,2007,,Tier 2,Supermarket Type1 +FDO36,19.7,Low Fat,0.078071853,Baking Goods,179.666,OUT045,2002,,Tier 2,Supermarket Type1 +FDX55,15.1,Low Fat,0.055430785,Fruits and Vegetables,215.8166,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT25,,LF,0.088858409,Canned,123.3072,OUT019,1985,Small,Tier 1,Grocery Store +FDD16,20.5,Low Fat,0.036409618,Frozen Foods,74.7696,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCX18,14.15,Low Fat,0.008786665,Household,196.111,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG55,16.25,Low Fat,0.039305628,Household,114.6176,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCV18,6.775,Low Fat,0.105409495,Household,83.225,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCS18,12.65,Low Fat,0.042203138,Household,107.6938,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDC37,15.5,Low Fat,0.032940022,Baking Goods,107.0938,OUT045,2002,,Tier 2,Supermarket Type1 +FDE47,14.15,Low Fat,0.037908749,Starchy Foods,124.0046,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRG49,,Low Fat,0.118105517,Soft Drinks,245.6486,OUT019,1985,Small,Tier 1,Grocery Store +FDC39,7.405,Low Fat,0.0,Dairy,206.9296,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH24,,Low Fat,0.037523149,Baking Goods,159.1288,OUT019,1985,Small,Tier 1,Grocery Store +FDV39,,Low Fat,0.007244635,Meat,198.3426,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCL17,7.39,Low Fat,0.067917171,Health and Hygiene,143.0812,OUT045,2002,,Tier 2,Supermarket Type1 +NCY53,20.0,Low Fat,0.058470282,Health and Hygiene,113.3544,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDH52,9.42,Regular,0.043866567,Frozen Foods,63.4194,OUT013,1987,High,Tier 3,Supermarket Type1 +NCD19,8.93,Low Fat,0.013233076,Household,53.7614,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDI44,16.1,Low Fat,0.10023287,Fruits and Vegetables,76.3328,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRD49,,Low Fat,0.167018335,Soft Drinks,237.9564,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDN08,7.72,Regular,0.088347953,Fruits and Vegetables,119.0466,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDO20,,Regular,0.151391113,Fruits and Vegetables,253.0382,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY02,8.945,Regular,0.087645926,Dairy,261.791,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX23,6.445,Low Fat,0.029751978,Baking Goods,93.4436,OUT045,2002,,Tier 2,Supermarket Type1 +FDX01,10.1,Low Fat,0.02430102,Canned,115.915,OUT017,2007,,Tier 2,Supermarket Type1 +FDH20,,Regular,0.024828296,Fruits and Vegetables,96.641,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCX41,19.0,Low Fat,0.017819505,Health and Hygiene,211.7244,OUT017,2007,,Tier 2,Supermarket Type1 +FDD21,,Regular,0.030421197,Fruits and Vegetables,115.2176,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH11,,Low Fat,0.132292244,Hard Drinks,54.4614,OUT019,1985,Small,Tier 1,Grocery Store +DRE60,9.395,Low Fat,0.159983523,Soft Drinks,225.472,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB10,10.0,Low Fat,0.067152194,Snack Foods,237.259,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH38,6.425,Low Fat,0.010429544,Canned,117.7808,OUT013,1987,High,Tier 3,Supermarket Type1 +NCL07,13.85,Low Fat,0.031466218,Others,38.648,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD48,10.395,Low Fat,0.030158689,Baking Goods,113.5176,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCT54,,Low Fat,0.118956749,Household,93.4094,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF32,,Low Fat,0.06775127,Fruits and Vegetables,198.6426,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH51,17.6,Low Fat,0.097413734,Dairy,88.0856,OUT045,2002,,Tier 2,Supermarket Type1 +DRG03,14.5,Low Fat,0.061974853,Dairy,155.4998,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCY42,,Low Fat,0.026547707,Household,142.947,OUT019,1985,Small,Tier 1,Grocery Store +FDH32,12.8,Low Fat,0.076490264,Fruits and Vegetables,94.941,OUT017,2007,,Tier 2,Supermarket Type1 +NCJ06,,Low Fat,0.034484812,Household,120.6782,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDH47,,Regular,0.128192414,Starchy Foods,96.8068,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDZ08,12.5,Regular,0.110440439,Fruits and Vegetables,81.9592,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK16,9.065,LF,0.115982139,Frozen Foods,95.6094,OUT017,2007,,Tier 2,Supermarket Type1 +DRG01,14.8,Low Fat,0.045061095,Soft Drinks,75.867,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM53,,Low Fat,0.051788905,Health and Hygiene,105.128,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCB07,19.2,Low Fat,0.077492893,Household,197.011,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCZ06,19.6,Low Fat,0.094143857,Household,253.2698,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDU48,18.85,Low Fat,0.05544452,Baking Goods,130.6284,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCB55,,Low Fat,0.159885004,Household,59.2562,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP15,15.2,Low Fat,0.0,Meat,258.233,OUT013,1987,High,Tier 3,Supermarket Type1 +FDF17,5.19,Low Fat,0.042620887,Frozen Foods,196.011,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN06,8.39,Low Fat,0.120684607,Household,164.9868,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRM48,15.2,Low Fat,0.113356563,Soft Drinks,38.1848,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDH10,21.0,low fat,0.04930501,Snack Foods,191.7478,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC60,5.425,Regular,0.114938715,Baking Goods,88.1514,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDE35,7.06,Regular,0.0,Starchy Foods,58.2904,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRI23,18.85,Low Fat,0.137082779,Hard Drinks,162.3578,OUT013,1987,High,Tier 3,Supermarket Type1 +NCR38,17.25,Low Fat,0.113423999,Household,253.5724,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP04,15.35,Low Fat,0.01381016,Frozen Foods,62.4168,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCW17,18.0,Low Fat,0.019425549,Health and Hygiene,130.2994,OUT045,2002,,Tier 2,Supermarket Type1 +FDX34,6.195,Low Fat,0.07239271,Snack Foods,122.2098,OUT017,2007,,Tier 2,Supermarket Type1 +NCK53,11.6,Low Fat,0.037657459,Health and Hygiene,98.1042,OUT045,2002,,Tier 2,Supermarket Type1 +NCO54,19.5,Low Fat,0.023892238,Household,55.7614,OUT010,1998,,Tier 3,Grocery Store +NCH55,16.35,Low Fat,0.034672316,Household,127.202,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDT44,,Low Fat,0.102487825,Fruits and Vegetables,117.1466,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG49,7.81,Low Fat,0.067455296,Soft Drinks,242.8486,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDX46,12.3,Regular,0.097275539,Snack Foods,57.6562,OUT010,1998,,Tier 3,Grocery Store +DRG36,14.15,Low Fat,0.095526508,Soft Drinks,170.6106,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU37,9.5,reg,0.104670688,Canned,80.996,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK10,5.785,Regular,0.040421607,Snack Foods,181.666,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRF37,,Low Fat,0.083924253,Soft Drinks,261.391,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC44,15.6,Low Fat,0.172564249,Fruits and Vegetables,112.6518,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP15,15.2,Low Fat,0.083942567,Meat,257.433,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ27,,Low Fat,0.017073182,Dairy,49.535,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDY22,,Regular,0.279650277,Snack Foods,143.4128,OUT019,1985,Small,Tier 1,Grocery Store +DRG51,12.1,Low Fat,0.011537439,Dairy,165.9526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN58,13.8,Regular,0.056987731,Snack Foods,233.5984,OUT045,2002,,Tier 2,Supermarket Type1 +FDW01,14.5,Low Fat,0.064160115,Canned,154.0682,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDX24,8.355,Low Fat,0.0139858,Baking Goods,93.5462,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO51,6.785,Regular,0.042219953,Meat,42.6112,OUT017,2007,,Tier 2,Supermarket Type1 +FDJ52,,Low Fat,0.01770073,Frozen Foods,161.5578,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCY06,15.25,Low Fat,0.102410818,Household,129.4968,OUT010,1998,,Tier 3,Grocery Store +FDE20,11.35,Regular,0.005553045,Fruits and Vegetables,168.179,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT23,7.72,Regular,0.125085172,Breads,76.2986,OUT010,1998,,Tier 3,Grocery Store +FDQ51,16.0,Regular,0.017551276,Meat,49.1718,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDE35,7.06,Regular,0.043900398,Starchy Foods,59.9904,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB46,10.5,reg,0.093685838,Snack Foods,212.4244,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG19,20.25,Low Fat,0.147905594,Household,233.1616,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCL06,14.65,Low Fat,0.072360203,Household,260.4594,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDT36,,Low Fat,0.0,Baking Goods,34.3874,OUT019,1985,Small,Tier 1,Grocery Store +FDC56,7.72,Low Fat,0.121709653,Fruits and Vegetables,121.344,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ26,15.3,Regular,0.084896979,Canned,214.7218,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDZ59,6.63,Regular,0.104609971,Baking Goods,168.35,OUT017,2007,,Tier 2,Supermarket Type1 +FDV11,,Regular,0.081272315,Breads,176.3054,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR13,9.895,Regular,0.048072785,Canned,115.3492,OUT010,1998,,Tier 3,Grocery Store +FDI15,13.8,low fat,0.141928373,Dairy,263.6884,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF47,20.85,Low Fat,0.098015889,Starchy Foods,223.6746,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCB54,,Low Fat,0.087635835,Health and Hygiene,129.4336,OUT019,1985,Small,Tier 1,Grocery Store +NCK19,,Low Fat,0.090027556,Others,192.5478,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDX16,17.85,Low Fat,0.066182294,Frozen Foods,151.305,OUT017,2007,,Tier 2,Supermarket Type1 +FDL50,12.15,Regular,0.04239889,Canned,126.1046,OUT045,2002,,Tier 2,Supermarket Type1 +NCE31,7.67,Low Fat,0.184808627,Household,35.2216,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRJ01,6.135,Low Fat,0.115211251,Soft Drinks,161.6236,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE22,9.695,Low Fat,0.0295482,Snack Foods,160.392,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY20,,Regular,0.14313853,Fruits and Vegetables,89.0488,OUT019,1985,Small,Tier 1,Grocery Store +NCO14,9.6,Low Fat,0.029703991,Household,44.6086,OUT045,2002,,Tier 2,Supermarket Type1 +NCR50,20.2,Low Fat,0.011886946,Household,151.434,OUT017,2007,,Tier 2,Supermarket Type1 +DRM47,9.3,Low Fat,0.044033364,Hard Drinks,191.1846,OUT017,2007,,Tier 2,Supermarket Type1 +FDO27,6.175,Regular,0.299738981,Meat,96.1752,OUT010,1998,,Tier 3,Grocery Store +FDJ20,,Regular,0.099689837,Fruits and Vegetables,124.8388,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCX17,21.25,Low Fat,0.113508894,Health and Hygiene,234.73,OUT013,1987,High,Tier 3,Supermarket Type1 +FDG59,15.85,Low Fat,0.043301792,Starchy Foods,36.9164,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD52,18.25,Regular,0.183666607,Dairy,108.657,OUT045,2002,,Tier 2,Supermarket Type1 +FDO48,15.0,Regular,0.026992588,Baking Goods,221.9456,OUT017,2007,,Tier 2,Supermarket Type1 +FDC59,,Regular,0.095648158,Starchy Foods,63.7168,OUT019,1985,Small,Tier 1,Grocery Store +FDS15,9.195,Regular,0.078378587,Meat,108.0596,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDB47,8.8,Low Fat,0.071415882,Snack Foods,210.5612,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDV14,,Low Fat,0.077909339,Dairy,87.1856,OUT019,1985,Small,Tier 1,Grocery Store +FDB27,7.575,LF,0.055344027,Dairy,195.3768,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA35,14.85,Regular,0.05382738,Baking Goods,124.1072,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDN51,17.85,Regular,0.021032156,Meat,261.4936,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDO39,,Regular,0.24051168,Meat,181.9608,OUT019,1985,Small,Tier 1,Grocery Store +FDB28,6.615,Low Fat,0.093530571,Dairy,197.7426,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRJ25,14.6,Low Fat,0.150567513,Soft Drinks,49.5692,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDH46,,Regular,0.041082375,Snack Foods,100.5332,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI10,8.51,Regular,0.078563333,Snack Foods,172.4422,OUT045,2002,,Tier 2,Supermarket Type1 +FDU21,11.8,Regular,0.077032981,Snack Foods,32.7558,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD09,13.5,Low Fat,0.021529824,Fruits and Vegetables,180.1976,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDD10,20.6,Regular,0.046020687,Snack Foods,179.3344,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN31,11.5,Low Fat,0.121988749,Fruits and Vegetables,191.453,OUT010,1998,,Tier 3,Grocery Store +FDA46,13.6,Low Fat,0.118114653,Snack Foods,196.4136,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM56,16.7,LF,0.070191589,Fruits and Vegetables,107.9912,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDF11,10.195,Regular,0.029511051,Starchy Foods,239.6538,OUT010,1998,,Tier 3,Grocery Store +FDS32,17.75,Regular,0.029774711,Fruits and Vegetables,140.0838,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCM06,7.475,Low Fat,0.075664878,Household,152.7656,OUT013,1987,High,Tier 3,Supermarket Type1 +FDZ26,11.6,Regular,0.144309477,Dairy,239.5222,OUT045,2002,,Tier 2,Supermarket Type1 +FDO01,21.1,Regular,0.020701414,Breakfast,130.1994,OUT013,1987,High,Tier 3,Supermarket Type1 +FDJ46,11.1,Low Fat,0.044893127,Snack Foods,174.6054,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG26,,Low Fat,0.074674387,Canned,257.833,OUT019,1985,Small,Tier 1,Grocery Store +FDZ38,17.6,Low Fat,0.007999506,Dairy,174.0422,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCO55,12.8,Low Fat,0.09096147,Others,105.2938,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT60,12.0,Low Fat,0.075534025,Baking Goods,123.9388,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDW37,19.2,Low Fat,0.124243256,Canned,91.6488,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCK42,7.475,LF,0.013173474,Household,214.6192,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA45,21.25,Low Fat,0.15537968,Snack Foods,175.437,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW55,12.6,Regular,0.0,Fruits and Vegetables,250.8092,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY44,14.15,Regular,0.024542601,Fruits and Vegetables,196.011,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ31,5.785,Regular,0.054151798,Fruits and Vegetables,85.8856,OUT017,2007,,Tier 2,Supermarket Type1 +FDM09,11.15,Regular,0.086065145,Snack Foods,171.179,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDH12,9.6,Low Fat,0.085299728,Baking Goods,105.228,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCQ43,17.75,Low Fat,0.0,Others,109.8912,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT33,7.81,Regular,0.033984229,Snack Foods,166.8158,OUT035,2004,Small,Tier 2,Supermarket Type1 +NCT41,15.7,Low Fat,0.056218371,Health and Hygiene,150.3024,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRJ25,14.6,Low Fat,0.252019149,Soft Drinks,50.3692,OUT010,1998,,Tier 3,Grocery Store +NCQ41,14.8,Low Fat,0.019480391,Health and Hygiene,196.5794,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN17,11.0,Low Fat,0.055024445,Health and Hygiene,100.8358,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRO35,,Low Fat,0.034402948,Hard Drinks,117.7492,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU27,18.6,Regular,0.0,Meat,48.5376,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY43,,Low Fat,0.0,Fruits and Vegetables,169.2474,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDG46,8.63,Regular,0.032903434,Snack Foods,115.7518,OUT035,2004,Small,Tier 2,Supermarket Type1 +DRL49,13.15,Low Fat,0.056658892,Soft Drinks,143.9812,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCB55,15.7,Low Fat,0.16091281,Household,58.0562,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK28,5.695,Low Fat,0.065691881,Frozen Foods,259.4646,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDO49,10.6,Regular,0.0,Breakfast,49.4008,OUT045,2002,,Tier 2,Supermarket Type1 +FDT03,21.25,Low Fat,0.009990442,Meat,182.2608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDW33,,Low Fat,0.098640592,Snack Foods,104.728,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDR02,16.7,Low Fat,0.022061503,Dairy,110.2886,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF50,4.905,Low Fat,0.117232711,Canned,198.2768,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA40,16.0,Regular,0.099675598,Frozen Foods,88.6856,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCT53,5.4,Low Fat,0.0,Health and Hygiene,164.9526,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDY60,10.5,Regular,0.026365956,Baking Goods,141.9128,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDP44,,Regular,0.079327559,Fruits and Vegetables,102.7332,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCQ50,18.75,Low Fat,0.034376924,Household,213.8218,OUT045,2002,,Tier 2,Supermarket Type1 +NCC30,16.6,Low Fat,0.027735197,Household,177.9344,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ60,6.195,Regular,0.109819987,Baking Goods,120.6098,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG41,8.84,Regular,0.076562109,Frozen Foods,109.1228,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDQ03,15.0,Regular,0.0,Meat,237.0248,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDM03,12.65,Low Fat,0.123280308,Meat,106.7938,OUT045,2002,,Tier 2,Supermarket Type1 +FDZ51,11.3,Regular,0.054775045,Meat,93.3094,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRF51,15.75,Low Fat,0.165806866,Dairy,38.7506,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF39,14.85,Regular,0.019621652,Dairy,261.491,OUT017,2007,,Tier 2,Supermarket Type1 +FDW52,14.0,reg,0.037515445,Frozen Foods,163.2526,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDY22,16.5,Regular,0.0,Snack Foods,145.5128,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDG14,9.0,Regular,0.050458688,Canned,150.1024,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA57,18.85,Low Fat,0.039867841,Snack Foods,39.748,OUT017,2007,,Tier 2,Supermarket Type1 +FDL45,,Low Fat,0.065986538,Snack Foods,126.6704,OUT019,1985,Small,Tier 1,Grocery Store +FDX28,6.325,Low Fat,0.125178121,Frozen Foods,97.5042,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCQ54,17.7,Low Fat,0.012531938,Household,169.8474,OUT013,1987,High,Tier 3,Supermarket Type1 +FDH40,11.6,Regular,0.079089643,Frozen Foods,80.3276,OUT045,2002,,Tier 2,Supermarket Type1 +FDU52,7.56,Low Fat,0.063758802,Frozen Foods,157.363,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDT60,12.0,Low Fat,0.126452383,Baking Goods,123.6388,OUT010,1998,,Tier 3,Grocery Store +FDK08,9.195,Regular,0.122552762,Fruits and Vegetables,99.9016,OUT045,2002,,Tier 2,Supermarket Type1 +FDN04,11.8,Regular,0.014108959,Frozen Foods,179.4344,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDE50,19.7,Regular,0.01619216,Canned,187.4556,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI16,14.0,Regular,0.135986797,Frozen Foods,51.364,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDM50,13.0,Regular,0.0,Canned,60.522,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCV30,20.2,Low Fat,0.066034594,Household,62.351,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDT44,16.6,Low Fat,0.102900839,Fruits and Vegetables,116.0466,OUT013,1987,High,Tier 3,Supermarket Type1 +FDY60,10.5,Regular,0.026348997,Baking Goods,145.3128,OUT013,1987,High,Tier 3,Supermarket Type1 +FDT56,16.0,Regular,0.116246247,Fruits and Vegetables,58.9246,OUT017,2007,,Tier 2,Supermarket Type1 +FDV58,20.85,Low Fat,0.121744297,Snack Foods,194.9452,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU04,7.93,Low Fat,0.005543818,Frozen Foods,123.2414,OUT013,1987,High,Tier 3,Supermarket Type1 +NCN05,,LF,0.01438965,Health and Hygiene,184.795,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDI53,8.895,Regular,0.138205661,Frozen Foods,161.6236,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDD34,7.945,Low Fat,0.015876287,Snack Foods,164.121,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW47,,LF,0.046150653,Breads,123.8414,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDT51,,Regular,0.010865916,Meat,111.4544,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO27,6.175,Regular,0.178928452,Meat,96.2752,OUT013,1987,High,Tier 3,Supermarket Type1 +NCQ18,15.75,Low Fat,0.13562303,Household,101.47,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCW05,20.25,Low Fat,0.14794938,Health and Hygiene,109.1938,OUT013,1987,High,Tier 3,Supermarket Type1 +FDI15,13.8,Low Fat,0.23659521,Dairy,265.0884,OUT010,1998,,Tier 3,Grocery Store +NCH43,8.42,Low Fat,0.118117896,Household,216.9192,OUT010,1998,,Tier 3,Grocery Store +FDT40,5.985,Low Fat,0.095944263,Frozen Foods,125.8678,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCG19,20.25,Low Fat,0.148770339,Household,232.3616,OUT017,2007,,Tier 2,Supermarket Type1 +NCM30,19.1,Low Fat,0.067282681,Household,40.6796,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDB38,19.5,Regular,0.027501384,Canned,157.992,OUT017,2007,,Tier 2,Supermarket Type1 +FDB22,8.02,Low Fat,0.111440661,Snack Foods,153.8998,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC58,10.195,Low Fat,0.041942318,Snack Foods,43.8428,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCI29,8.6,Low Fat,0.032594398,Health and Hygiene,140.6154,OUT013,1987,High,Tier 3,Supermarket Type1 +FDA23,9.8,Low Fat,0.078981428,Baking Goods,100.1016,OUT010,1998,,Tier 3,Grocery Store +DRG48,5.78,Low Fat,0.014542953,Soft Drinks,143.9102,OUT013,1987,High,Tier 3,Supermarket Type1 +FDV21,11.5,Low Fat,0.170940574,Snack Foods,125.2704,OUT013,1987,High,Tier 3,Supermarket Type1 +NCG18,,Low Fat,0.04023134,Household,101.2332,OUT019,1985,Small,Tier 1,Grocery Store +FDG40,13.65,Low Fat,0.039905111,Frozen Foods,34.4558,OUT045,2002,,Tier 2,Supermarket Type1 +FDU24,6.78,Regular,0.140734003,Baking Goods,94.512,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA22,7.435,Low Fat,0.084583664,Starchy Foods,166.2158,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDY35,17.6,Regular,0.016027681,Breads,46.2402,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ15,11.35,Regular,0.023369776,Dairy,182.4608,OUT045,2002,,Tier 2,Supermarket Type1 +NCW18,15.1,Low Fat,0.0,Household,236.6248,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDK56,9.695,Low Fat,0.130527569,Fruits and Vegetables,188.9898,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDF44,7.17,Regular,0.059728023,Fruits and Vegetables,132.2968,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDP51,13.85,Regular,0.085407568,Meat,119.9124,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDU22,,Low Fat,0.09284476,Snack Foods,116.8124,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDM28,15.7,Low Fat,0.045459546,Frozen Foods,178.266,OUT017,2007,,Tier 2,Supermarket Type1 +NCL42,18.85,Low Fat,0.040371605,Household,244.1144,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDJ15,,Regular,0.040834648,Dairy,185.0608,OUT019,1985,Small,Tier 1,Grocery Store +FDI32,17.7,Low Fat,0.0,Fruits and Vegetables,113.4834,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL11,10.5,Low Fat,0.048018161,Hard Drinks,159.1946,OUT046,1997,Small,Tier 1,Supermarket Type1 +DRO59,11.8,Low Fat,0.054374854,Hard Drinks,75.5012,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA07,,Regular,0.054180044,Fruits and Vegetables,123.5072,OUT019,1985,Small,Tier 1,Grocery Store +NCO53,16.2,Low Fat,0.175038703,Health and Hygiene,182.1608,OUT013,1987,High,Tier 3,Supermarket Type1 +FDO21,11.6,Regular,0.00978282,Snack Foods,224.8404,OUT045,2002,,Tier 2,Supermarket Type1 +FDW39,6.69,Regular,0.0,Meat,178.037,OUT045,2002,,Tier 2,Supermarket Type1 +NCV17,18.85,Low Fat,0.016094145,Health and Hygiene,130.7626,OUT013,1987,High,Tier 3,Supermarket Type1 +FDE22,9.695,LF,0.02957281,Snack Foods,158.192,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCB06,17.6,Low Fat,0.08266746,Health and Hygiene,158.492,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRF48,5.73,Low Fat,0.052094476,Soft Drinks,185.4898,OUT017,2007,,Tier 2,Supermarket Type1 +FDB05,5.155,Low Fat,0.083129106,Frozen Foods,248.1776,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP28,,Regular,0.080249973,Frozen Foods,259.4936,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDP23,6.71,Low Fat,0.035586859,Breads,219.5166,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCS41,12.85,Low Fat,0.0,Health and Hygiene,182.6608,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDS40,15.35,Low Fat,0.014076503,Frozen Foods,38.419,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA16,6.695,Low Fat,0.034133984,Frozen Foods,219.5456,OUT017,2007,,Tier 2,Supermarket Type1 +FDN20,19.35,Low Fat,0.0,Fruits and Vegetables,167.1474,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDF04,,Low Fat,0.013571008,Frozen Foods,258.5304,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRG36,14.15,LF,0.095766751,Soft Drinks,170.2106,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDW16,17.35,Regular,0.041643181,Frozen Foods,93.2804,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDU09,7.71,Regular,0.06697384,Snack Foods,54.1956,OUT017,2007,,Tier 2,Supermarket Type1 +FDW01,14.5,Low Fat,0.064060518,Canned,154.0682,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDB15,10.895,Low Fat,0.137088198,Dairy,265.0568,OUT045,2002,,Tier 2,Supermarket Type1 +NCJ17,7.68,Low Fat,0.152793675,Health and Hygiene,86.2224,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCT18,14.6,Low Fat,0.059647144,Household,183.0976,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDG16,15.25,LF,0.090182684,Frozen Foods,214.4192,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDP27,8.155,Low Fat,0.120126301,Meat,191.653,OUT017,2007,,Tier 2,Supermarket Type1 +FDQ44,,Low Fat,0.035965286,Fruits and Vegetables,121.1756,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDL50,,Regular,0.042108175,Canned,125.5046,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDW57,,Regular,0.115117203,Snack Foods,178.6028,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDS34,19.35,Regular,0.076695199,Snack Foods,114.5518,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV30,20.2,Low Fat,0.06591962,Household,61.251,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDD26,8.71,Regular,0.072449393,Canned,185.2924,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDA03,18.5,Regular,0.045555975,Dairy,147.1102,OUT045,2002,,Tier 2,Supermarket Type1 +FDS27,10.195,Regular,0.012508892,Meat,195.611,OUT018,2009,Medium,Tier 3,Supermarket Type2 +FDM12,16.7,Regular,0.069858811,Baking Goods,187.8214,OUT013,1987,High,Tier 3,Supermarket Type1 +NCV42,,Low Fat,0.031269817,Household,110.1228,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCS41,12.85,Low Fat,0.0,Health and Hygiene,184.2608,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDN56,5.46,Regular,0.107493292,Fruits and Vegetables,142.5786,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRK59,8.895,Low Fat,0.075449827,Hard Drinks,233.2616,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCG18,15.3,Low Fat,0.022977902,Household,103.1332,OUT046,1997,Small,Tier 1,Supermarket Type1 +NCN26,10.85,Low Fat,0.028842119,Household,116.9808,OUT017,2007,,Tier 2,Supermarket Type1 +FDI60,,Regular,0.038135648,Baking Goods,62.851,OUT027,1985,Medium,Tier 3,Supermarket Type3 +NCI43,19.85,Low Fat,0.02600908,Household,49.8376,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCL17,7.39,Low Fat,0.067885092,Health and Hygiene,143.0812,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDQ19,,Regular,0.0,Fruits and Vegetables,244.3512,OUT019,1985,Small,Tier 1,Grocery Store +FDY43,14.85,Low Fat,0.098555228,Fruits and Vegetables,166.9474,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDR36,6.715,Regular,0.12177541,Baking Goods,43.0454,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDJ58,15.6,Regular,0.10545978,Snack Foods,172.4764,OUT049,1999,Medium,Tier 1,Supermarket Type1 +DRY23,9.395,Regular,0.109317621,Soft Drinks,43.8112,OUT045,2002,,Tier 2,Supermarket Type1 +FDK26,,Regular,0.0,Canned,187.524,OUT027,1985,Medium,Tier 3,Supermarket Type3 +DRH03,17.25,Low Fat,0.03513543,Dairy,94.712,OUT045,2002,,Tier 2,Supermarket Type1 +FDC10,9.8,Regular,0.121982284,Snack Foods,119.7098,OUT010,1998,,Tier 3,Grocery Store +FDD23,9.5,Regular,0.048645015,Starchy Foods,186.1898,OUT013,1987,High,Tier 3,Supermarket Type1 +FDP32,6.65,Low Fat,0.087847281,Fruits and Vegetables,126.7678,OUT045,2002,,Tier 2,Supermarket Type1 +FDO31,6.76,Regular,0.028977202,Fruits and Vegetables,80.296,OUT035,2004,Small,Tier 2,Supermarket Type1 +FDQ57,7.275,Low Fat,0.0,Snack Foods,144.576,OUT013,1987,High,Tier 3,Supermarket Type1 +FDX32,,Regular,0.099374679,Fruits and Vegetables,143.6786,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDC39,,Low Fat,0.158424516,Dairy,207.8296,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDU55,16.2,Low Fat,0.035911275,Fruits and Vegetables,261.3278,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDL45,15.6,Low Fat,0.037656474,Snack Foods,123.4704,OUT013,1987,High,Tier 3,Supermarket Type1 +DRK37,5.0,Low Fat,0.04407309,Soft Drinks,188.853,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDK22,9.8,Low Fat,0.026064791,Snack Foods,215.385,OUT013,1987,High,Tier 3,Supermarket Type1 +DRG37,,Low Fat,0.0,Soft Drinks,155.7972,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDK22,9.8,Low Fat,0.026234055,Snack Foods,214.385,OUT017,2007,,Tier 2,Supermarket Type1 +DRH36,16.2,Low Fat,0.033516036,Soft Drinks,72.8696,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRC36,13.0,Regular,0.045168123,Soft Drinks,173.4054,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRE03,,Low Fat,0.024109582,Dairy,46.0718,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDF34,9.3,Regular,0.014019393,Snack Foods,196.9084,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDZ22,9.395,Low Fat,0.045269896,Snack Foods,82.125,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDC44,15.6,Low Fat,0.288891801,Fruits and Vegetables,115.1518,OUT010,1998,,Tier 3,Grocery Store +FDN31,,Low Fat,0.072528603,Fruits and Vegetables,188.053,OUT027,1985,Medium,Tier 3,Supermarket Type3 +FDO03,10.395,Regular,0.037091602,Meat,229.4352,OUT017,2007,,Tier 2,Supermarket Type1 +FDA01,15.0,reg,0.054462797,Canned,59.5904,OUT049,1999,Medium,Tier 1,Supermarket Type1 +NCH42,6.86,Low Fat,0.036594126,Household,231.101,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDF46,7.07,Low Fat,0.094052753,Snack Foods,116.0834,OUT018,2009,Medium,Tier 3,Supermarket Type2 +DRL35,15.7,Low Fat,0.03070363,Hard Drinks,43.277,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDW46,13.0,Regular,0.070410959,Snack Foods,63.4484,OUT049,1999,Medium,Tier 1,Supermarket Type1 +FDB58,10.5,Regular,0.013496466,Snack Foods,141.3154,OUT046,1997,Small,Tier 1,Supermarket Type1 +FDD47,7.6,Regular,0.142990896,Starchy Foods,169.1448,OUT018,2009,Medium,Tier 3,Supermarket Type2 +NCO17,10.0,Low Fat,0.073528561,Health and Hygiene,118.744,OUT045,2002,,Tier 2,Supermarket Type1 +FDJ26,15.3,Regular,0.0,Canned,214.6218,OUT017,2007,,Tier 2,Supermarket Type1 +FDU37,9.5,Regular,0.104720151,Canned,79.796,OUT045,2002,,Tier 2,Supermarket Type1 diff --git a/R/BigMartSales/Train_UWu5bXk.csv b/R/BigMartSales/Train_UWu5bXk.csv new file mode 100644 index 000000000..9f02ca50d --- /dev/null +++ b/R/BigMartSales/Train_UWu5bXk.csv @@ -0,0 +1,8524 @@ +Item_Identifier,Item_Weight,Item_Fat_Content,Item_Visibility,Item_Type,Item_MRP,Outlet_Identifier,Outlet_Establishment_Year,Outlet_Size,Outlet_Location_Type,Outlet_Type,Item_Outlet_Sales +FDA15,9.3,Low Fat,0.016047301,Dairy,249.8092,OUT049,1999,Medium,Tier 1,Supermarket Type1,3735.138 +DRC01,5.92,Regular,0.019278216,Soft Drinks,48.2692,OUT018,2009,Medium,Tier 3,Supermarket Type2,443.4228 +FDN15,17.5,Low Fat,0.016760075,Meat,141.618,OUT049,1999,Medium,Tier 1,Supermarket Type1,2097.27 +FDX07,19.2,Regular,0,Fruits and Vegetables,182.095,OUT010,1998,,Tier 3,Grocery Store,732.38 +NCD19,8.93,Low Fat,0,Household,53.8614,OUT013,1987,High,Tier 3,Supermarket Type1,994.7052 +FDP36,10.395,Regular,0,Baking Goods,51.4008,OUT018,2009,Medium,Tier 3,Supermarket Type2,556.6088 +FDO10,13.65,Regular,0.012741089,Snack Foods,57.6588,OUT013,1987,High,Tier 3,Supermarket Type1,343.5528 +FDP10,,Low Fat,0.127469857,Snack Foods,107.7622,OUT027,1985,Medium,Tier 3,Supermarket Type3,4022.7636 +FDH17,16.2,Regular,0.016687114,Frozen Foods,96.9726,OUT045,2002,,Tier 2,Supermarket Type1,1076.5986 +FDU28,19.2,Regular,0.09444959,Frozen Foods,187.8214,OUT017,2007,,Tier 2,Supermarket Type1,4710.535 +FDY07,11.8,Low Fat,0,Fruits and Vegetables,45.5402,OUT049,1999,Medium,Tier 1,Supermarket Type1,1516.0266 +FDA03,18.5,Regular,0.045463773,Dairy,144.1102,OUT046,1997,Small,Tier 1,Supermarket Type1,2187.153 +FDX32,15.1,Regular,0.1000135,Fruits and Vegetables,145.4786,OUT049,1999,Medium,Tier 1,Supermarket Type1,1589.2646 +FDS46,17.6,Regular,0.047257328,Snack Foods,119.6782,OUT046,1997,Small,Tier 1,Supermarket Type1,2145.2076 +FDF32,16.35,Low Fat,0.0680243,Fruits and Vegetables,196.4426,OUT013,1987,High,Tier 3,Supermarket Type1,1977.426 +FDP49,9,Regular,0.069088961,Breakfast,56.3614,OUT046,1997,Small,Tier 1,Supermarket Type1,1547.3192 +NCB42,11.8,Low Fat,0.008596051,Health and Hygiene,115.3492,OUT018,2009,Medium,Tier 3,Supermarket Type2,1621.8888 +FDP49,9,Regular,0.069196376,Breakfast,54.3614,OUT049,1999,Medium,Tier 1,Supermarket Type1,718.3982 +DRI11,,Low Fat,0.034237682,Hard Drinks,113.2834,OUT027,1985,Medium,Tier 3,Supermarket Type3,2303.668 +FDU02,13.35,Low Fat,0.10249212,Dairy,230.5352,OUT035,2004,Small,Tier 2,Supermarket Type1,2748.4224 +FDN22,18.85,Regular,0.138190277,Snack Foods,250.8724,OUT013,1987,High,Tier 3,Supermarket Type1,3775.086 +FDW12,,Regular,0.035399923,Baking Goods,144.5444,OUT027,1985,Medium,Tier 3,Supermarket Type3,4064.0432 +NCB30,14.6,Low Fat,0.025698134,Household,196.5084,OUT035,2004,Small,Tier 2,Supermarket Type1,1587.2672 +FDC37,,Low Fat,0.057556998,Baking Goods,107.6938,OUT019,1985,Small,Tier 1,Grocery Store,214.3876 +FDR28,13.85,Regular,0.025896485,Frozen Foods,165.021,OUT046,1997,Small,Tier 1,Supermarket Type1,4078.025 +NCD06,13,Low Fat,0.099887103,Household,45.906,OUT017,2007,,Tier 2,Supermarket Type1,838.908 +FDV10,7.645,Regular,0.066693437,Snack Foods,42.3112,OUT035,2004,Small,Tier 2,Supermarket Type1,1065.28 +DRJ59,11.65,low fat,0.019356132,Hard Drinks,39.1164,OUT013,1987,High,Tier 3,Supermarket Type1,308.9312 +FDE51,5.925,Regular,0.161466534,Dairy,45.5086,OUT010,1998,,Tier 3,Grocery Store,178.4344 +FDC14,,Regular,0.072221801,Canned,43.6454,OUT019,1985,Small,Tier 1,Grocery Store,125.8362 +FDV38,19.25,Low Fat,0.170348551,Dairy,55.7956,OUT010,1998,,Tier 3,Grocery Store,163.7868 +NCS17,18.6,Low Fat,0.080829372,Health and Hygiene,96.4436,OUT018,2009,Medium,Tier 3,Supermarket Type2,2741.7644 +FDP33,18.7,Low Fat,0,Snack Foods,256.6672,OUT018,2009,Medium,Tier 3,Supermarket Type2,3068.0064 +FDO23,17.85,Low Fat,0,Breads,93.1436,OUT045,2002,,Tier 2,Supermarket Type1,2174.5028 +DRH01,17.5,Low Fat,0.097904029,Soft Drinks,174.8738,OUT046,1997,Small,Tier 1,Supermarket Type1,2085.2856 +NCX29,10,Low Fat,0.089291137,Health and Hygiene,146.7102,OUT049,1999,Medium,Tier 1,Supermarket Type1,3791.0652 +FDV20,,Regular,0.059511812,Fruits and Vegetables,128.0678,OUT027,1985,Medium,Tier 3,Supermarket Type3,2797.6916 +DRZ11,8.85,Regular,0.113123893,Soft Drinks,122.5388,OUT018,2009,Medium,Tier 3,Supermarket Type2,1609.9044 +FDX10,,Regular,0.123111453,Snack Foods,36.9874,OUT027,1985,Medium,Tier 3,Supermarket Type3,388.1614 +FDB34,,Low Fat,0.026480954,Snack Foods,87.6198,OUT027,1985,Medium,Tier 3,Supermarket Type3,2180.495 +FDU02,13.35,Low Fat,0.102511504,Dairy,230.6352,OUT046,1997,Small,Tier 1,Supermarket Type1,3435.528 +FDK43,9.8,Low Fat,0.02681843,Meat,126.002,OUT013,1987,High,Tier 3,Supermarket Type1,2150.534 +FDA46,13.6,Low Fat,0.117818348,Snack Foods,192.9136,OUT049,1999,Medium,Tier 1,Supermarket Type1,2527.3768 +FDC02,21.35,Low Fat,0.069102831,Canned,259.9278,OUT018,2009,Medium,Tier 3,Supermarket Type2,6768.5228 +FDL50,12.15,Regular,0.042277867,Canned,126.5046,OUT013,1987,High,Tier 3,Supermarket Type1,373.5138 +FDM39,6.42,LF,0.089498926,Dairy,178.1002,OUT010,1998,,Tier 3,Grocery Store,358.2004 +NCP05,19.6,Low Fat,0,Health and Hygiene,153.3024,OUT045,2002,,Tier 2,Supermarket Type1,2428.8384 +FDV49,10,Low Fat,0.025879577,Canned,265.2226,OUT045,2002,,Tier 2,Supermarket Type1,5815.0972 +FDL12,15.85,Regular,0.121632721,Baking Goods,60.622,OUT046,1997,Small,Tier 1,Supermarket Type1,2576.646 +FDS02,,Regular,0.255394896,Dairy,196.8794,OUT019,1985,Small,Tier 1,Grocery Store,780.3176 +NCL17,7.39,Low Fat,0.067779712,Health and Hygiene,143.8812,OUT046,1997,Small,Tier 1,Supermarket Type1,3134.5864 +FDM40,10.195,Low Fat,0.159803853,Frozen Foods,141.5154,OUT013,1987,High,Tier 3,Supermarket Type1,850.8924 +FDR13,9.895,Regular,0.028696932,Canned,117.0492,OUT013,1987,High,Tier 3,Supermarket Type1,810.9444 +FDA43,10.895,Low Fat,0.065041581,Fruits and Vegetables,196.3794,OUT017,2007,,Tier 2,Supermarket Type1,3121.2704 +NCP18,12.15,Low Fat,0.028760013,Household,151.4708,OUT017,2007,,Tier 2,Supermarket Type1,4815.0656 +FDK21,7.905,Low Fat,0.010053105,Snack Foods,249.0408,OUT018,2009,Medium,Tier 3,Supermarket Type2,6258.52 +NCX54,9.195,Low Fat,0.048157338,Household,106.1622,OUT045,2002,,Tier 2,Supermarket Type1,2117.244 +DRK35,8.365,Low Fat,0.071958197,Hard Drinks,38.0506,OUT049,1999,Medium,Tier 1,Supermarket Type1,796.9626 +FDY21,15.1,Low Fat,0.173481304,Snack Foods,194.511,OUT046,1997,Small,Tier 1,Supermarket Type1,4910.275 +FDI26,,Low Fat,0.061082177,Canned,180.0344,OUT019,1985,Small,Tier 1,Grocery Store,892.172 +FDM20,10,Low Fat,0,Fruits and Vegetables,246.9144,OUT018,2009,Medium,Tier 3,Supermarket Type2,3185.1872 +FDV27,7.97,Regular,0.040071131,Meat,87.3514,OUT045,2002,,Tier 2,Supermarket Type1,1062.6168 +FDF09,,Low Fat,0.012090074,Fruits and Vegetables,38.2848,OUT027,1985,Medium,Tier 3,Supermarket Type3,484.7024 +FDY40,,Regular,0.15028599,Frozen Foods,51.0692,OUT019,1985,Small,Tier 1,Grocery Store,147.8076 +FDY45,,Low Fat,0.026015519,Snack Foods,255.8356,OUT027,1985,Medium,Tier 3,Supermarket Type3,2543.356 +FDC46,17.7,LF,0.195068226,Snack Foods,185.4266,OUT010,1998,,Tier 3,Grocery Store,184.4266 +FDH19,19.35,Low Fat,0.033082215,Meat,172.5738,OUT035,2004,Small,Tier 2,Supermarket Type1,4865.6664 +FDZ03,13.65,Regular,0.078946455,Dairy,186.024,OUT045,2002,,Tier 2,Supermarket Type1,1118.544 +DRH37,17.6,Low Fat,0.041700756,Soft Drinks,164.8526,OUT045,2002,,Tier 2,Supermarket Type1,2302.3364 +NCI17,8.645,Low Fat,0.143422643,Health and Hygiene,95.841,OUT046,1997,Small,Tier 1,Supermarket Type1,2027.361 +FDJ58,15.6,Regular,0.105296072,Snack Foods,170.1764,OUT046,1997,Small,Tier 1,Supermarket Type1,3435.528 +FDL12,15.85,Regular,0.121531501,Baking Goods,59.222,OUT013,1987,High,Tier 3,Supermarket Type1,599.22 +FDH35,18.25,Low Fat,0,Starchy Foods,164.7526,OUT045,2002,,Tier 2,Supermarket Type1,4604.6728 +FDG02,7.855,Low Fat,0.011324862,Canned,189.6188,OUT017,2007,,Tier 2,Supermarket Type1,2285.0256 +NCZ18,7.825,low fat,0.186357148,Household,254.3698,OUT049,1999,Medium,Tier 1,Supermarket Type1,5580.7356 +FDC29,8.39,Regular,0.024205661,Frozen Foods,114.0176,OUT046,1997,Small,Tier 1,Supermarket Type1,2290.352 +FDQ10,12.85,Low Fat,0.033230816,Snack Foods,172.3422,OUT049,1999,Medium,Tier 1,Supermarket Type1,1207.0954 +FDN48,,Low Fat,0.113720344,Baking Goods,89.9804,OUT019,1985,Small,Tier 1,Grocery Store,643.1628 +FDL04,19,Low Fat,0.112556507,Frozen Foods,104.9622,OUT017,2007,,Tier 2,Supermarket Type1,1587.933 +FDV25,5.905,Low Fat,0,Canned,222.5456,OUT045,2002,,Tier 2,Supermarket Type1,5305.0944 +FDD58,7.76,Low Fat,0.059352241,Snack Foods,101.87,OUT046,1997,Small,Tier 1,Supermarket Type1,1697.79 +FDN04,11.8,reg,0.014087057,Frozen Foods,180.3344,OUT046,1997,Small,Tier 1,Supermarket Type1,1427.4752 +FDV45,16.75,low fat,0.045230944,Snack Foods,187.9556,OUT018,2009,Medium,Tier 3,Supermarket Type2,4693.89 +NCL18,,Low Fat,0.293417759,Household,194.6136,OUT019,1985,Small,Tier 1,Grocery Store,583.2408 +FDR12,,Regular,0.031382044,Baking Goods,171.3764,OUT027,1985,Medium,Tier 3,Supermarket Type3,3091.9752 +FDG20,15.5,Regular,0.12639886,Fruits and Vegetables,177.0028,OUT017,2007,,Tier 2,Supermarket Type1,2479.4392 +FDZ55,6.055,Low Fat,0.025403898,Fruits and Vegetables,160.992,OUT035,2004,Small,Tier 2,Supermarket Type1,2716.464 +FDQ49,,Regular,0.039057677,Breakfast,155.963,OUT027,1985,Medium,Tier 3,Supermarket Type3,3285.723 +FDN33,6.305,Regular,0.123115764,Snack Foods,95.6436,OUT046,1997,Small,Tier 1,Supermarket Type1,661.8052 +FDN27,20.85,Low Fat,0.039624006,Meat,117.2808,OUT049,1999,Medium,Tier 1,Supermarket Type1,1523.3504 +FDW20,20.75,Low Fat,0.040421193,Fruits and Vegetables,122.173,OUT010,1998,,Tier 3,Grocery Store,369.519 +DRG27,8.895,Low Fat,0.105274111,Dairy,39.9138,OUT049,1999,Medium,Tier 1,Supermarket Type1,690.4346 +DRI25,19.6,Low Fat,0.033970195,Soft Drinks,55.1614,OUT045,2002,,Tier 2,Supermarket Type1,1381.535 +FDA44,19.7,Low Fat,0.053212652,Fruits and Vegetables,57.893,OUT035,2004,Small,Tier 2,Supermarket Type1,622.523 +NCR17,9.8,Low Fat,0.024378706,Health and Hygiene,114.5492,OUT035,2004,Small,Tier 2,Supermarket Type1,1274.3412 +FDU04,,Low Fat,0.009714595,Frozen Foods,120.0414,OUT019,1985,Small,Tier 1,Grocery Store,487.3656 +FDF41,12.15,Low Fat,0.131383762,Frozen Foods,246.046,OUT049,1999,Medium,Tier 1,Supermarket Type1,1231.73 +FDB56,8.75,Regular,0.07461309,Fruits and Vegetables,187.4556,OUT035,2004,Small,Tier 2,Supermarket Type1,3755.112 +NCP18,,Low Fat,0.028459761,Household,149.9708,OUT027,1985,Medium,Tier 3,Supermarket Type3,4363.6532 +FDB56,8.75,Regular,0.074627201,Fruits and Vegetables,187.8556,OUT046,1997,Small,Tier 1,Supermarket Type1,1314.2892 +FDT28,13.3,Low Fat,0.063695084,Frozen Foods,151.0708,OUT045,2002,,Tier 2,Supermarket Type1,1805.6496 +FDD10,,Regular,0.045797829,Snack Foods,178.5344,OUT027,1985,Medium,Tier 3,Supermarket Type3,2854.9504 +FDW57,8.31,Regular,0.115857223,Snack Foods,179.1028,OUT049,1999,Medium,Tier 1,Supermarket Type1,3896.2616 +DRB48,16.75,Regular,0.024832806,Soft Drinks,38.7822,OUT013,1987,High,Tier 3,Supermarket Type1,667.7974 +FDP09,19.75,Low Fat,0.034027909,Snack Foods,212.0902,OUT018,2009,Medium,Tier 3,Supermarket Type2,3185.853 +FDH14,17.1,Regular,0.0467696,Canned,141.1838,OUT013,1987,High,Tier 3,Supermarket Type1,2247.7408 +FDA47,10.5,Regular,0.116576702,Baking Goods,163.121,OUT013,1987,High,Tier 3,Supermarket Type1,1794.331 +FDG12,6.635,Regular,0,Baking Goods,121.3098,OUT045,2002,,Tier 2,Supermarket Type1,2530.7058 +DRE60,,low fat,0.278974075,Soft Drinks,225.372,OUT019,1985,Small,Tier 1,Grocery Store,679.116 +DRK49,14.15,Low Fat,0.035913805,Soft Drinks,41.4138,OUT013,1987,High,Tier 3,Supermarket Type1,812.276 +FDD03,13.3,Low Fat,0.079806266,Dairy,232.53,OUT046,1997,Small,Tier 1,Supermarket Type1,699.09 +FDS52,8.89,low fat,0.005505481,Frozen Foods,102.4016,OUT017,2007,,Tier 2,Supermarket Type1,2732.4432 +FDW39,,Regular,0.064625342,Meat,176.937,OUT019,1985,Small,Tier 1,Grocery Store,176.437 +FDX34,,Low Fat,0.071636937,Snack Foods,121.7098,OUT027,1985,Medium,Tier 3,Supermarket Type3,4097.3332 +FDV11,9.1,Regular,0,Breads,173.2054,OUT045,2002,,Tier 2,Supermarket Type1,3151.8972 +FDD17,7.5,Low Fat,0.032677678,Frozen Foods,239.0906,OUT049,1999,Medium,Tier 1,Supermarket Type1,5942.265 +FDZ16,16.85,Regular,0.160760054,Frozen Foods,192.4478,OUT017,2007,,Tier 2,Supermarket Type1,4843.695 +FDZ46,7.485,Low Fat,0.06911065,Snack Foods,109.0228,OUT035,2004,Small,Tier 2,Supermarket Type1,2542.0244 +DRA12,11.6,Low Fat,0.041177505,Soft Drinks,140.3154,OUT017,2007,,Tier 2,Supermarket Type1,2552.6772 +FDY58,11.65,Low Fat,0.040081193,Snack Foods,227.0694,OUT018,2009,Medium,Tier 3,Supermarket Type2,1141.847 +NCF19,13,Low Fat,0.035307322,Household,47.5034,OUT017,2007,,Tier 2,Supermarket Type1,680.4476 +DRJ13,12.65,LF,0.063017847,Soft Drinks,159.0578,OUT045,2002,,Tier 2,Supermarket Type1,2085.9514 +FDB14,20.25,Regular,0.171938781,Canned,92.512,OUT010,1998,,Tier 3,Grocery Store,186.424 +FDJ38,8.6,Regular,0.040197932,Canned,190.153,OUT035,2004,Small,Tier 2,Supermarket Type1,3036.048 +FDW11,12.6,Low Fat,0.049058014,Breads,62.7194,OUT017,2007,,Tier 2,Supermarket Type1,866.8716 +FDL40,17.7,Low Fat,0.01161096,Frozen Foods,95.041,OUT035,2004,Small,Tier 2,Supermarket Type1,868.869 +DRI49,14.15,Low Fat,0.183507295,Soft Drinks,82.4276,OUT046,1997,Small,Tier 1,Supermarket Type1,1137.1864 +FDV38,19.25,Low Fat,0.102349519,Dairy,52.7956,OUT017,2007,,Tier 2,Supermarket Type1,928.1252 +DRG23,8.88,Low Fat,0.086708987,Hard Drinks,151.7682,OUT013,1987,High,Tier 3,Supermarket Type1,762.341 +NCP30,20.5,Low Fat,0.032835147,Household,40.2822,OUT045,2002,,Tier 2,Supermarket Type1,707.0796 +FDY25,,Low Fat,0.033809913,Canned,180.5976,OUT027,1985,Medium,Tier 3,Supermarket Type3,7968.2944 +NCH54,13.5,Low Fat,0.07266912,Household,160.292,OUT046,1997,Small,Tier 1,Supermarket Type1,1438.128 +NCR53,,Low Fat,0.144338493,Health and Hygiene,224.4404,OUT027,1985,Medium,Tier 3,Supermarket Type3,6976.2524 +FDS52,8.89,Low Fat,0.009163216,Frozen Foods,101.7016,OUT010,1998,,Tier 3,Grocery Store,101.2016 +FDG02,7.855,Low Fat,0.011307038,Canned,188.5188,OUT018,2009,Medium,Tier 3,Supermarket Type2,952.094 +NCO26,7.235,Low Fat,0.076855628,Household,116.0492,OUT046,1997,Small,Tier 1,Supermarket Type1,1969.4364 +FDH35,,Low Fat,0.059956876,Starchy Foods,165.4526,OUT027,1985,Medium,Tier 3,Supermarket Type3,5262.4832 +FDB51,6.92,Low Fat,0.038532062,Dairy,60.5852,OUT045,2002,,Tier 2,Supermarket Type1,1314.2892 +FDX44,9.3,Low Fat,0.043209581,Fruits and Vegetables,90.8172,OUT017,2007,,Tier 2,Supermarket Type1,535.3032 +NCN07,18.5,Low Fat,0.056816465,Others,132.1284,OUT010,1998,,Tier 3,Grocery Store,263.6568 +NCC31,8.02,Low Fat,0.019866705,Household,154.5972,OUT035,2004,Small,Tier 2,Supermarket Type1,1402.1748 +NCX54,9.195,Low Fat,0.048331717,Household,105.1622,OUT017,2007,,Tier 2,Supermarket Type1,1693.7952 +NCO55,12.8,Low Fat,0.091221855,Others,105.5938,OUT045,2002,,Tier 2,Supermarket Type1,2143.876 +NCC30,16.6,Low Fat,0.027622076,Household,177.6344,OUT049,1999,Medium,Tier 1,Supermarket Type1,2676.516 +FDI16,14,Regular,0,Frozen Foods,53.064,OUT035,2004,Small,Tier 2,Supermarket Type1,905.488 +FDP16,18.6,Low Fat,0.039355947,Frozen Foods,246.3802,OUT049,1999,Medium,Tier 1,Supermarket Type1,7370.406 +FDB11,16,Low Fat,0.060836524,Starchy Foods,226.8404,OUT035,2004,Small,Tier 2,Supermarket Type1,6301.1312 +NCB06,17.6,Low Fat,0.082316506,Health and Hygiene,160.692,OUT035,2004,Small,Tier 2,Supermarket Type1,1597.92 +FDA45,21.25,Low Fat,0.155350299,Snack Foods,178.237,OUT035,2004,Small,Tier 2,Supermarket Type1,529.311 +NCO26,7.235,Low Fat,0.076841095,Household,117.5492,OUT035,2004,Small,Tier 2,Supermarket Type1,1969.4364 +DRJ25,14.6,Low Fat,0.151419185,Soft Drinks,50.3692,OUT017,2007,,Tier 2,Supermarket Type1,1034.6532 +FDR28,13.85,reg,0.026001976,Frozen Foods,161.521,OUT018,2009,Medium,Tier 3,Supermarket Type2,1794.331 +FDI04,13.65,Regular,0.073209447,Frozen Foods,197.6426,OUT018,2009,Medium,Tier 3,Supermarket Type2,2768.3964 +DRK12,,Low Fat,0.041683481,Soft Drinks,31.29,OUT027,1985,Medium,Tier 3,Supermarket Type3,898.83 +FDX20,7.365,Low Fat,0.042560252,Fruits and Vegetables,226.172,OUT046,1997,Small,Tier 1,Supermarket Type1,3169.208 +NCI18,18.35,Low Fat,0.014081156,Household,223.5746,OUT018,2009,Medium,Tier 3,Supermarket Type2,3589.9936 +FDB36,5.465,Regular,0,Baking Goods,132.5626,OUT018,2009,Medium,Tier 3,Supermarket Type2,262.3252 +FDN13,18.6,Low Fat,0.152918384,Breakfast,99.8358,OUT017,2007,,Tier 2,Supermarket Type1,1910.1802 +DRD24,13.85,Low Fat,0.030969274,Soft Drinks,140.9154,OUT017,2007,,Tier 2,Supermarket Type1,1701.7848 +FDQ28,14,Regular,0.060376776,Frozen Foods,154.5656,OUT013,1987,High,Tier 3,Supermarket Type1,2471.4496 +FDM22,14,Regular,0.04192285,Snack Foods,54.764,OUT013,1987,High,Tier 3,Supermarket Type1,1331.6 +FDR07,,Low Fat,0.077367431,Fruits and Vegetables,97.0094,OUT027,1985,Medium,Tier 3,Supermarket Type3,1808.9786 +FDV25,5.905,Low Fat,0.045838211,Canned,222.5456,OUT018,2009,Medium,Tier 3,Supermarket Type2,3315.684 +DRF49,7.27,Low Fat,0.071077939,Soft Drinks,114.2518,OUT046,1997,Small,Tier 1,Supermarket Type1,2618.5914 +FDW51,6.155,Regular,0.094659871,Meat,214.556,OUT046,1997,Small,Tier 1,Supermarket Type1,2769.728 +DRL01,19.5,Regular,0.077608838,Soft Drinks,233.4958,OUT017,2007,,Tier 2,Supermarket Type1,5375.0034 +FDP25,15.2,Low Fat,0.021327477,Canned,216.8824,OUT017,2007,,Tier 2,Supermarket Type1,2838.9712 +FDL50,12.15,Regular,0.042485444,Canned,125.0046,OUT018,2009,Medium,Tier 3,Supermarket Type2,1743.0644 +NCB30,,Low Fat,0.025578526,Household,198.8084,OUT027,1985,Medium,Tier 3,Supermarket Type3,5555.4352 +FDW11,12.6,Low Fat,0.0489808,Breads,61.9194,OUT018,2009,Medium,Tier 3,Supermarket Type2,619.194 +NCM43,14.5,Low Fat,0.019471688,Others,164.821,OUT035,2004,Small,Tier 2,Supermarket Type1,2120.573 +FDK44,16.6,Low Fat,0.122918852,Fruits and Vegetables,173.0738,OUT017,2007,,Tier 2,Supermarket Type1,3823.0236 +FDM15,11.8,Regular,0.057373797,Meat,151.4366,OUT013,1987,High,Tier 3,Supermarket Type1,1360.2294 +FDS31,13.1,Regular,0.044155597,Fruits and Vegetables,178.8318,OUT013,1987,High,Tier 3,Supermarket Type1,3969.4996 +FDI32,17.7,Low Fat,0.291865402,Fruits and Vegetables,115.1834,OUT010,1998,,Tier 3,Grocery Store,345.5502 +FDR47,17.85,LF,0,Breads,196.5794,OUT010,1998,,Tier 3,Grocery Store,585.2382 +FDB35,12.3,Regular,0.064750025,Starchy Foods,92.6804,OUT045,2002,,Tier 2,Supermarket Type1,1010.6844 +NCU05,11.8,Low Fat,0.098312421,Health and Hygiene,81.4618,OUT010,1998,,Tier 3,Grocery Store,161.1236 +DRY23,,Regular,0.191013663,Soft Drinks,42.1112,OUT019,1985,Small,Tier 1,Grocery Store,42.6112 +FDO24,11.1,Low Fat,0.176573035,Baking Goods,157.4604,OUT045,2002,,Tier 2,Supermarket Type1,3010.7476 +FDQ28,,Regular,0.060134441,Frozen Foods,153.0656,OUT027,1985,Medium,Tier 3,Supermarket Type3,6024.1584 +FDV39,11.3,Low Fat,0.007294652,Meat,198.1426,OUT045,2002,,Tier 2,Supermarket Type1,988.713 +NCO17,,Low Fat,0.128478462,Health and Hygiene,117.944,OUT019,1985,Small,Tier 1,Grocery Store,239.688 +FDU50,5.75,Regular,0.075107656,Dairy,112.8176,OUT013,1987,High,Tier 3,Supermarket Type1,1374.2112 +FDT12,,Regular,0.049381406,Baking Goods,226.8062,OUT027,1985,Medium,Tier 3,Supermarket Type3,4739.8302 +FDK58,11.35,Regular,0.045165796,Snack Foods,100.0016,OUT018,2009,Medium,Tier 3,Supermarket Type2,1012.016 +FDO08,,Regular,0.09415375,Fruits and Vegetables,165.7526,OUT019,1985,Small,Tier 1,Grocery Store,657.8104 +NCW29,14,Low Fat,0.028907832,Health and Hygiene,130.431,OUT049,1999,Medium,Tier 1,Supermarket Type1,778.986 +FDE04,19.75,Regular,0.018059621,Frozen Foods,179.766,OUT045,2002,,Tier 2,Supermarket Type1,2336.958 +NCB19,6.525,Low Fat,0.090436094,Household,85.0882,OUT049,1999,Medium,Tier 1,Supermarket Type1,2233.0932 +FDV15,10.3,Low Fat,0.146399712,Meat,103.9648,OUT049,1999,Medium,Tier 1,Supermarket Type1,1661.8368 +FDL58,5.78,Regular,0.074264356,Snack Foods,264.7568,OUT049,1999,Medium,Tier 1,Supermarket Type1,4745.8224 +FDA08,11.85,Regular,0.050186726,Fruits and Vegetables,164.1526,OUT045,2002,,Tier 2,Supermarket Type1,3124.5994 +FDT43,16.35,Low Fat,0.020631654,Fruits and Vegetables,50.1324,OUT018,2009,Medium,Tier 3,Supermarket Type2,467.3916 +NCX06,,Low Fat,0.01561108,Household,182.5976,OUT027,1985,Medium,Tier 3,Supermarket Type3,5070.7328 +FDT20,10.5,Low Fat,0.041395445,Fruits and Vegetables,37.6164,OUT046,1997,Small,Tier 1,Supermarket Type1,540.6296 +FDB41,19,Regular,0.097313129,Frozen Foods,48.0718,OUT046,1997,Small,Tier 1,Supermarket Type1,992.7078 +NCN55,14.6,Low Fat,0.059582996,Others,238.8538,OUT049,1999,Medium,Tier 1,Supermarket Type1,6008.845 +FDE40,,Regular,0.098663652,Dairy,62.9194,OUT027,1985,Medium,Tier 3,Supermarket Type3,2105.2596 +FDX49,,reg,0.101338651,Canned,232.63,OUT027,1985,Medium,Tier 3,Supermarket Type3,5359.69 +NCM53,18.75,Low Fat,0.052146456,Health and Hygiene,104.628,OUT045,2002,,Tier 2,Supermarket Type1,745.696 +FDE36,5.26,Regular,0.041764487,Baking Goods,161.8868,OUT035,2004,Small,Tier 2,Supermarket Type1,3275.736 +FDN57,18.25,Low Fat,0.054344186,Snack Foods,140.2154,OUT045,2002,,Tier 2,Supermarket Type1,1701.7848 +FDI24,,Low Fat,0.078362484,Baking Goods,177.937,OUT027,1985,Medium,Tier 3,Supermarket Type3,6704.606 +FDI19,15.1,Low Fat,0.052339069,Meat,242.7512,OUT046,1997,Small,Tier 1,Supermarket Type1,4119.9704 +FDF24,15.5,Regular,0.042464962,Baking Goods,81.5934,OUT010,1998,,Tier 3,Grocery Store,327.5736 +FDG52,13.65,Low Fat,0.065732883,Frozen Foods,45.7402,OUT049,1999,Medium,Tier 1,Supermarket Type1,780.9834 +DRF36,16.1,LF,0.023625114,Soft Drinks,189.3846,OUT045,2002,,Tier 2,Supermarket Type1,3630.6074 +FDS45,,Regular,0.051643608,Snack Foods,107.3622,OUT019,1985,Small,Tier 1,Grocery Store,317.5866 +FDX40,12.85,Low Fat,0.165694219,Frozen Foods,39.7164,OUT010,1998,,Tier 3,Grocery Store,231.6984 +DRK12,9.5,LF,0.041878397,Soft Drinks,32.99,OUT035,2004,Small,Tier 2,Supermarket Type1,133.16 +DRC27,13.8,Low Fat,0.058091482,Dairy,245.1802,OUT035,2004,Small,Tier 2,Supermarket Type1,5650.6446 +FDL58,5.78,Regular,0,Snack Foods,263.7568,OUT017,2007,,Tier 2,Supermarket Type1,2636.568 +NCD30,19.7,Low Fat,0.026903714,Household,96.0726,OUT045,2002,,Tier 2,Supermarket Type1,1272.3438 +NCZ54,14.65,Low Fat,0,Household,161.5552,OUT010,1998,,Tier 3,Grocery Store,324.9104 +FDE10,6.67,Regular,0.150554711,Snack Foods,130.0626,OUT010,1998,,Tier 3,Grocery Store,131.1626 +FDR44,6.11,Regular,0,Fruits and Vegetables,131.2968,OUT010,1998,,Tier 3,Grocery Store,260.9936 +FDP28,13.65,Regular,0.134975628,Frozen Foods,260.0936,OUT010,1998,,Tier 3,Grocery Store,260.9936 +FDX15,17.2,Low Fat,0.15616879,Meat,160.6578,OUT013,1987,High,Tier 3,Supermarket Type1,3690.5294 +FDA39,6.32,LF,0,Meat,40.2822,OUT035,2004,Small,Tier 2,Supermarket Type1,1139.1838 +FDY24,4.88,Regular,0.133700752,Baking Goods,52.9298,OUT049,1999,Medium,Tier 1,Supermarket Type1,1995.4026 +FDC60,5.425,Regular,0.115119905,Baking Goods,88.3514,OUT017,2007,,Tier 2,Supermarket Type1,1416.8224 +FDH28,15.85,Regular,0.110030997,Frozen Foods,37.2506,OUT046,1997,Small,Tier 1,Supermarket Type1,265.6542 +FDT25,7.5,Low Fat,0.051038045,Canned,121.7072,OUT017,2007,,Tier 2,Supermarket Type1,3552.7088 +DRJ13,12.65,Low Fat,0.062837968,Soft Drinks,161.5578,OUT013,1987,High,Tier 3,Supermarket Type1,2406.867 +NCO07,,Low Fat,0.017116983,Others,211.956,OUT019,1985,Small,Tier 1,Grocery Store,213.056 +FDW20,20.75,Low Fat,0.024129332,Fruits and Vegetables,124.173,OUT013,1987,High,Tier 3,Supermarket Type1,2956.152 +DRF27,,Low Fat,0.049754975,Dairy,152.134,OUT019,1985,Small,Tier 1,Grocery Store,153.134 +FDS49,9,Low Fat,0,Canned,79.7644,OUT035,2004,Small,Tier 2,Supermarket Type1,1649.8524 +FDX25,,Low Fat,0.101561568,Canned,181.9292,OUT027,1985,Medium,Tier 3,Supermarket Type3,3101.2964 +NCX42,,Low Fat,0.005949644,Household,165.6526,OUT027,1985,Medium,Tier 3,Supermarket Type3,4769.1254 +FDG33,,Regular,0.13956116,Seafood,170.4764,OUT027,1985,Medium,Tier 3,Supermarket Type3,3435.528 +FDL56,14.1,Low Fat,0.126035694,Fruits and Vegetables,86.4198,OUT045,2002,,Tier 2,Supermarket Type1,1133.8574 +FDF14,7.55,Low Fat,0.027164679,Canned,152.334,OUT035,2004,Small,Tier 2,Supermarket Type1,2603.278 +NCD06,13,Low Fat,0.099325278,Household,45.406,OUT046,1997,Small,Tier 1,Supermarket Type1,605.878 +DRM47,,Low Fat,0.04357366,Hard Drinks,192.8846,OUT027,1985,Medium,Tier 3,Supermarket Type3,2293.0152 +FDS46,,Regular,0.082741482,Snack Foods,118.7782,OUT019,1985,Small,Tier 1,Grocery Store,119.1782 +FDB35,12.3,Regular,0.064565202,Starchy Foods,92.9804,OUT013,1987,High,Tier 3,Supermarket Type1,1929.4884 +FDX21,,LF,0.084554569,Snack Foods,109.8912,OUT027,1985,Medium,Tier 3,Supermarket Type3,2074.6328 +NCU05,,Low Fat,0.058451805,Health and Hygiene,79.9618,OUT027,1985,Medium,Tier 3,Supermarket Type3,241.6854 +NCR38,17.25,Low Fat,0.113748685,Household,251.3724,OUT045,2002,,Tier 2,Supermarket Type1,6795.1548 +NCR18,15.85,Low Fat,0.020603511,Household,42.7112,OUT017,2007,,Tier 2,Supermarket Type1,639.168 +NCU41,18.85,Low Fat,0.052044976,Health and Hygiene,192.1846,OUT035,2004,Small,Tier 2,Supermarket Type1,3248.4382 +FDY56,16.35,Regular,0.062764429,Fruits and Vegetables,227.6062,OUT017,2007,,Tier 2,Supermarket Type1,7222.5984 +DRJ51,14.1,Low Fat,0.087977262,Dairy,229.0668,OUT035,2004,Small,Tier 2,Supermarket Type1,3225.1352 +FDK21,7.905,Low Fat,0.010010425,Snack Foods,249.0408,OUT035,2004,Small,Tier 2,Supermarket Type1,3755.112 +FDY25,12,Low Fat,0.033946163,Canned,179.3976,OUT013,1987,High,Tier 3,Supermarket Type1,3440.8544 +FDU44,12.15,Regular,0.058414678,Fruits and Vegetables,163.4552,OUT035,2004,Small,Tier 2,Supermarket Type1,974.7312 +FDL43,10.1,Low Fat,0.027106459,Meat,75.367,OUT049,1999,Medium,Tier 1,Supermarket Type1,535.969 +FDF05,17.5,Low Fat,0.027022883,Frozen Foods,262.491,OUT017,2007,,Tier 2,Supermarket Type1,5259.82 +DRF15,,Low Fat,0.058153409,Dairy,152.034,OUT019,1985,Small,Tier 1,Grocery Store,306.268 +FDL20,17.1,Low Fat,0.128937661,Fruits and Vegetables,112.3886,OUT018,2009,Medium,Tier 3,Supermarket Type2,1779.0176 +FDV32,7.785,Low Fat,0.088846306,Fruits and Vegetables,61.451,OUT049,1999,Medium,Tier 1,Supermarket Type1,759.012 +FDJ34,11.8,Regular,0.09357779,Snack Foods,125.9704,OUT013,1987,High,Tier 3,Supermarket Type1,1877.556 +FDG08,13.15,Regular,0.165694678,Fruits and Vegetables,171.8764,OUT045,2002,,Tier 2,Supermarket Type1,3779.0808 +FDQ04,,Low Fat,0.148392623,Frozen Foods,41.5796,OUT019,1985,Small,Tier 1,Grocery Store,41.2796 +FDW13,8.5,Low Fat,0.098438394,Canned,51.1324,OUT017,2007,,Tier 2,Supermarket Type1,259.662 +NCI17,8.645,Low Fat,0.143303291,Health and Hygiene,96.341,OUT013,1987,High,Tier 3,Supermarket Type1,193.082 +FDY03,17.6,Regular,0.076276208,Meat,110.9202,OUT045,2002,,Tier 2,Supermarket Type1,1687.803 +FDS12,9.1,Low Fat,0.175103435,Baking Goods,127.5362,OUT017,2007,,Tier 2,Supermarket Type1,4655.9394 +FDJ55,12.8,Regular,0.023511371,Meat,225.9404,OUT013,1987,High,Tier 3,Supermarket Type1,4950.8888 +DRK01,7.63,Low Fat,0.06105276,Soft Drinks,95.4436,OUT035,2004,Small,Tier 2,Supermarket Type1,1418.154 +FDG28,9.285,Regular,0.049559042,Frozen Foods,246.4144,OUT017,2007,,Tier 2,Supermarket Type1,1225.072 +FDY38,13.6,Regular,0.119418124,Dairy,231.03,OUT045,2002,,Tier 2,Supermarket Type1,5359.69 +FDN01,8.895,Low Fat,0.072545601,Breakfast,176.237,OUT045,2002,,Tier 2,Supermarket Type1,1764.37 +NCR54,16.35,Low Fat,0.090486828,Household,195.211,OUT013,1987,High,Tier 3,Supermarket Type1,2553.343 +FDG29,17.6,Low Fat,0.056245075,Frozen Foods,43.3454,OUT013,1987,High,Tier 3,Supermarket Type1,1006.6896 +FDG24,7.975,Low Fat,0.014618973,Baking Goods,85.225,OUT013,1987,High,Tier 3,Supermarket Type1,1081.925 +FDG59,15.85,Low Fat,0.043479126,Starchy Foods,36.7164,OUT017,2007,,Tier 2,Supermarket Type1,308.9312 +FDM28,15.7,Low Fat,0.045166237,Frozen Foods,178.666,OUT013,1987,High,Tier 3,Supermarket Type1,2516.724 +FDW04,8.985,Regular,0.057827101,Frozen Foods,128.831,OUT046,1997,Small,Tier 1,Supermarket Type1,1428.141 +FDS26,20.35,Low Fat,0.089394766,Dairy,260.1594,OUT013,1987,High,Tier 3,Supermarket Type1,2093.2752 +FDQ56,6.59,Low Fat,0.10550944,Fruits and Vegetables,85.6908,OUT013,1987,High,Tier 3,Supermarket Type1,1929.4884 +FDK51,19.85,Low Fat,0.005234153,Dairy,264.0884,OUT035,2004,Small,Tier 2,Supermarket Type1,5829.7448 +FDL22,16.85,Low Fat,0.036390174,Snack Foods,91.4488,OUT046,1997,Small,Tier 1,Supermarket Type1,2082.6224 +FDH19,,Low Fat,0.03292824,Meat,173.1738,OUT027,1985,Medium,Tier 3,Supermarket Type3,7298.4996 +FDY55,16.75,Low Fat,0.081252534,Fruits and Vegetables,256.4988,OUT013,1987,High,Tier 3,Supermarket Type1,7452.9652 +FDY03,17.6,Regular,0.076552407,Meat,110.5202,OUT017,2007,,Tier 2,Supermarket Type1,450.0808 +FDK21,7.905,Low Fat,0.016758569,Snack Foods,250.4408,OUT010,1998,,Tier 3,Grocery Store,500.6816 +FDZ10,,Low Fat,0.044248175,Snack Foods,126.202,OUT027,1985,Medium,Tier 3,Supermarket Type3,3668.558 +FDZ32,7.785,Regular,0.038288087,Fruits and Vegetables,103.1964,OUT018,2009,Medium,Tier 3,Supermarket Type2,736.3748 +NCZ18,7.825,Low Fat,0.186032678,Household,253.0698,OUT035,2004,Small,Tier 2,Supermarket Type1,6088.0752 +NCF07,,Low Fat,0.031867464,Household,101.0016,OUT027,1985,Medium,Tier 3,Supermarket Type3,2125.2336 +DRE49,20.75,Low Fat,0.021370201,Soft Drinks,153.0024,OUT017,2007,,Tier 2,Supermarket Type1,2277.036 +FDJ08,,Low Fat,0.193772568,Fruits and Vegetables,190.3846,OUT019,1985,Small,Tier 1,Grocery Store,573.2538 +FDT39,6.26,Regular,0.009866049,Meat,151.1366,OUT035,2004,Small,Tier 2,Supermarket Type1,2267.049 +FDE08,18.2,Low Fat,0.082551042,Fruits and Vegetables,147.3734,OUT010,1998,,Tier 3,Grocery Store,296.9468 +NCD06,13,Low Fat,0.099729888,Household,46.306,OUT018,2009,Medium,Tier 3,Supermarket Type2,559.272 +FDB57,20.25,Regular,0.018801549,Fruits and Vegetables,222.1772,OUT035,2004,Small,Tier 2,Supermarket Type1,5559.43 +NCT54,8.695,Low Fat,0.119721451,Household,95.5094,OUT049,1999,Medium,Tier 1,Supermarket Type1,1237.7222 +DRF49,7.27,Low Fat,0.071222087,Soft Drinks,113.5518,OUT045,2002,,Tier 2,Supermarket Type1,569.259 +FDM25,,Regular,0.060371962,Breakfast,174.0712,OUT027,1985,Medium,Tier 3,Supermarket Type3,3866.9664 +FDF20,12.85,low fat,0.033287541,Fruits and Vegetables,198.4768,OUT045,2002,,Tier 2,Supermarket Type1,1379.5376 +FDH27,7.075,Low Fat,0.05858462,Dairy,142.7128,OUT018,2009,Medium,Tier 3,Supermarket Type2,1869.5664 +FDV60,,Regular,0.11679292,Baking Goods,196.211,OUT027,1985,Medium,Tier 3,Supermarket Type3,5499.508 +FDY59,8.195,Low Fat,0.031452265,Baking Goods,94.3462,OUT049,1999,Medium,Tier 1,Supermarket Type1,925.462 +FDK36,7.09,Low Fat,0.00721395,Baking Goods,47.9034,OUT035,2004,Small,Tier 2,Supermarket Type1,583.2408 +NCM31,6.095,Low Fat,0.081196619,Others,141.4154,OUT046,1997,Small,Tier 1,Supermarket Type1,1418.154 +FDE33,19.35,Regular,0.049916364,Fruits and Vegetables,80.2644,OUT017,2007,,Tier 2,Supermarket Type1,942.7728 +FDU36,6.15,Low Fat,0.04627095,Baking Goods,99.3384,OUT046,1997,Small,Tier 1,Supermarket Type1,2364.9216 +FDV13,,Regular,0.02747716,Canned,87.9856,OUT027,1985,Medium,Tier 3,Supermarket Type3,3251.7672 +FDV20,,Regular,0.104704537,Fruits and Vegetables,125.2678,OUT019,1985,Small,Tier 1,Grocery Store,254.3356 +NCQ54,17.7,Low Fat,0.012540003,Household,167.0474,OUT035,2004,Small,Tier 2,Supermarket Type1,5895.659 +FDO23,17.85,Low Fat,0.147023834,Breads,93.7436,OUT018,2009,Medium,Tier 3,Supermarket Type2,1134.5232 +DRE60,9.395,Low Fat,0.159657596,Soft Drinks,224.972,OUT045,2002,,Tier 2,Supermarket Type1,7696.648 +DRP47,15.75,Low Fat,0.141398626,Hard Drinks,250.5382,OUT017,2007,,Tier 2,Supermarket Type1,2775.7202 +FDB21,7.475,Low Fat,0.148821808,Fruits and Vegetables,241.2854,OUT045,2002,,Tier 2,Supermarket Type1,5317.0788 +FDR04,7.075,Low Fat,0,Frozen Foods,98.0068,OUT018,2009,Medium,Tier 3,Supermarket Type2,874.8612 +FDX23,6.445,Low Fat,0.029691762,Baking Goods,92.6436,OUT046,1997,Small,Tier 1,Supermarket Type1,1039.9796 +FDX19,19.1,Low Fat,0.096715523,Fruits and Vegetables,235.0958,OUT035,2004,Small,Tier 2,Supermarket Type1,3038.0454 +FDD40,20.25,Regular,0.014790559,Dairy,193.6162,OUT035,2004,Small,Tier 2,Supermarket Type1,3848.324 +FDA01,15,Regular,0.054378253,Canned,59.1904,OUT046,1997,Small,Tier 1,Supermarket Type1,527.3136 +FDS33,6.67,Regular,0.123428594,Snack Foods,89.1514,OUT046,1997,Small,Tier 1,Supermarket Type1,2390.8878 +FDM50,,Regular,0.029943463,Canned,60.222,OUT027,1985,Medium,Tier 3,Supermarket Type3,1677.816 +FDB29,16.7,Regular,0.052368061,Frozen Foods,112.7176,OUT013,1987,High,Tier 3,Supermarket Type1,801.6232 +FDF46,7.07,Low Fat,0.093861144,Snack Foods,115.5834,OUT045,2002,,Tier 2,Supermarket Type1,1267.0174 +FDA33,6.48,Low Fat,0.033968647,Snack Foods,148.0076,OUT045,2002,,Tier 2,Supermarket Type1,886.8456 +FDC08,19,Regular,0.173154079,Fruits and Vegetables,228.272,OUT010,1998,,Tier 3,Grocery Store,452.744 +FDB53,13.35,Low Fat,0.139735226,Frozen Foods,147.5392,OUT045,2002,,Tier 2,Supermarket Type1,3877.6192 +FDY31,,Low Fat,0.043351896,Fruits and Vegetables,146.6418,OUT027,1985,Medium,Tier 3,Supermarket Type3,4414.254 +DRQ35,,Low Fat,0.042086652,Hard Drinks,122.4388,OUT027,1985,Medium,Tier 3,Supermarket Type3,5448.9072 +FDX36,9.695,Regular,0.12848269,Baking Goods,223.9404,OUT049,1999,Medium,Tier 1,Supermarket Type1,4950.8888 +DRD13,15,Low Fat,0.049357077,Soft Drinks,62.6168,OUT017,2007,,Tier 2,Supermarket Type1,958.752 +FDC52,11.15,Regular,0.008326735,Dairy,149.9708,OUT017,2007,,Tier 2,Supermarket Type1,1956.1204 +FDB45,20.85,Low Fat,0.021362955,Fruits and Vegetables,103.2306,OUT049,1999,Medium,Tier 1,Supermarket Type1,2404.2038 +NCK19,9.8,Low Fat,0.151420934,Others,194.3478,OUT010,1998,,Tier 3,Grocery Store,387.4956 +FDV51,16.35,Low Fat,0.032511818,Meat,165.0842,OUT013,1987,High,Tier 3,Supermarket Type1,994.7052 +FDZ35,9.6,Regular,0.022323658,Breads,101.299,OUT045,2002,,Tier 2,Supermarket Type1,1754.383 +NCW17,,Low Fat,0.019292355,Health and Hygiene,129.9994,OUT027,1985,Medium,Tier 3,Supermarket Type3,3340.9844 +FDV59,13.35,Low Fat,0.048124443,Breads,216.7166,OUT045,2002,,Tier 2,Supermarket Type1,3918.8988 +DRH39,20.7,Low Fat,0.09261307,Dairy,76.367,OUT013,1987,High,Tier 3,Supermarket Type1,306.268 +FDN60,,Low Fat,0.094697274,Baking Goods,158.4604,OUT027,1985,Medium,Tier 3,Supermarket Type3,4278.4308 +FDU55,16.2,Low Fat,0.035984104,Fruits and Vegetables,260.6278,OUT045,2002,,Tier 2,Supermarket Type1,4425.5726 +FDN58,,Regular,0.056596985,Snack Foods,230.9984,OUT027,1985,Medium,Tier 3,Supermarket Type3,9267.936 +FDC41,,Low Fat,0.2047,Frozen Foods,76.867,OUT019,1985,Small,Tier 1,Grocery Store,229.701 +FDO01,,Regular,0.020618324,Breakfast,129.3994,OUT027,1985,Medium,Tier 3,Supermarket Type3,2055.9904 +NCO43,5.5,Low Fat,0.04709821,Others,101.3016,OUT046,1997,Small,Tier 1,Supermarket Type1,3339.6528 +FDQ07,15.1,Regular,0.087584126,Fruits and Vegetables,221.7456,OUT045,2002,,Tier 2,Supermarket Type1,6410.3224 +FDF28,15.7,Regular,0.038078899,Frozen Foods,122.9046,OUT017,2007,,Tier 2,Supermarket Type1,1992.0736 +FDM01,7.895,reg,0.095102092,Breakfast,104.4332,OUT017,2007,,Tier 2,Supermarket Type1,2870.9296 +FDY49,,Regular,0.011953902,Canned,164.5184,OUT027,1985,Medium,Tier 3,Supermarket Type3,2807.0128 +FDR24,17.35,Regular,0.062799379,Baking Goods,88.183,OUT013,1987,High,Tier 3,Supermarket Type1,539.298 +NCY18,7.285,Low Fat,0.031125709,Household,174.3054,OUT013,1987,High,Tier 3,Supermarket Type1,4377.635 +NCY30,20.25,Low Fat,0.026005891,Household,180.9976,OUT045,2002,,Tier 2,Supermarket Type1,2716.464 +FDJ22,,Low Fat,0.09246392,Snack Foods,190.9504,OUT019,1985,Small,Tier 1,Grocery Store,383.5008 +DRI37,15.85,Low Fat,0.107765165,Soft Drinks,59.5904,OUT049,1999,Medium,Tier 1,Supermarket Type1,703.0848 +FDL27,6.17,Low Fat,0.010647477,Meat,66.3826,OUT049,1999,Medium,Tier 1,Supermarket Type1,1937.478 +NCO30,19.5,Low Fat,0.015749341,Household,182.2608,OUT049,1999,Medium,Tier 1,Supermarket Type1,3307.6944 +NCB07,19.2,Low Fat,0.077628053,Household,197.611,OUT049,1999,Medium,Tier 1,Supermarket Type1,3142.576 +FDX25,16.7,Low Fat,0,Canned,181.2292,OUT018,2009,Medium,Tier 3,Supermarket Type2,2554.0088 +FDP59,20.85,Regular,0.056695731,Breads,104.0648,OUT018,2009,Medium,Tier 3,Supermarket Type2,1869.5664 +FDR59,14.5,Regular,0.063993068,Breads,260.4594,OUT045,2002,,Tier 2,Supermarket Type1,5494.8474 +FDT27,11.395,Regular,0.069529262,Meat,233.1616,OUT013,1987,High,Tier 3,Supermarket Type1,6093.4016 +DRI01,7.97,Low Fat,0.034452949,Soft Drinks,174.0422,OUT046,1997,Small,Tier 1,Supermarket Type1,2586.633 +FDU09,7.71,Regular,0.06670068,Snack Foods,55.2956,OUT049,1999,Medium,Tier 1,Supermarket Type1,1255.6988 +FDH26,19.25,Regular,0.034699737,Canned,141.7496,OUT046,1997,Small,Tier 1,Supermarket Type1,4093.3384 +FDH27,7.075,Low Fat,0.058346939,Dairy,142.2128,OUT046,1997,Small,Tier 1,Supermarket Type1,3163.8816 +FDN39,,Regular,0.065203103,Meat,166.0816,OUT027,1985,Medium,Tier 3,Supermarket Type3,5033.448 +FDH40,11.6,Regular,0.078929571,Frozen Foods,79.9276,OUT046,1997,Small,Tier 1,Supermarket Type1,1137.1864 +FDJ56,,Low Fat,0.182514881,Fruits and Vegetables,98.77,OUT027,1985,Medium,Tier 3,Supermarket Type3,2696.49 +DRN47,12.1,Low Fat,0.016895293,Hard Drinks,178.566,OUT018,2009,Medium,Tier 3,Supermarket Type2,898.83 +NCO17,10,Low Fat,0.073379745,Health and Hygiene,118.244,OUT046,1997,Small,Tier 1,Supermarket Type1,2756.412 +FDX60,14.35,Low Fat,0.08075758,Baking Goods,81.896,OUT045,2002,,Tier 2,Supermarket Type1,878.856 +FDT22,10.395,Low Fat,0.112271498,Snack Foods,58.222,OUT049,1999,Medium,Tier 1,Supermarket Type1,659.142 +FDX26,,Low Fat,0.153741385,Dairy,182.6292,OUT019,1985,Small,Tier 1,Grocery Store,182.4292 +FDG45,8.1,Low Fat,0.127929521,Fruits and Vegetables,211.4902,OUT013,1987,High,Tier 3,Supermarket Type1,3610.6334 +FDD44,8.05,Regular,0.07838564,Fruits and Vegetables,256.4646,OUT035,2004,Small,Tier 2,Supermarket Type1,5153.292 +FDS15,9.195,Regular,0.078502143,Meat,108.7596,OUT017,2007,,Tier 2,Supermarket Type1,2588.6304 +FDL51,20.7,Regular,0.047684831,Dairy,212.5876,OUT018,2009,Medium,Tier 3,Supermarket Type2,1286.3256 +FDL32,15.7,Regular,0.123159656,Fruits and Vegetables,110.1544,OUT017,2007,,Tier 2,Supermarket Type1,1230.3984 +FDZ07,,Regular,0,Fruits and Vegetables,60.2194,OUT027,1985,Medium,Tier 3,Supermarket Type3,1733.7432 +NCW53,,Low Fat,0.053392944,Health and Hygiene,193.8162,OUT019,1985,Small,Tier 1,Grocery Store,384.8324 +NCA54,16.5,Low Fat,0.036715907,Household,180.0318,OUT045,2002,,Tier 2,Supermarket Type1,3969.4996 +FDX09,9,Low Fat,0.065236932,Snack Foods,176.437,OUT035,2004,Small,Tier 2,Supermarket Type1,7763.228 +FDO51,6.785,Regular,0.041947547,Meat,41.2112,OUT013,1987,High,Tier 3,Supermarket Type1,809.6128 +FDW49,19.5,Low Fat,0.082888496,Canned,178.6002,OUT018,2009,Medium,Tier 3,Supermarket Type2,1253.7014 +FDB27,7.575,Low Fat,0.055390121,Dairy,195.2768,OUT046,1997,Small,Tier 1,Supermarket Type1,5715.2272 +FDF45,18.2,Regular,0.012194556,Fruits and Vegetables,57.7904,OUT013,1987,High,Tier 3,Supermarket Type1,1464.76 +FDV02,16.75,Low Fat,0.060495243,Dairy,169.8106,OUT013,1987,High,Tier 3,Supermarket Type1,3251.1014 +FDY28,7.47,Regular,0,Frozen Foods,214.3218,OUT035,2004,Small,Tier 2,Supermarket Type1,4274.436 +FDX31,,Regular,0.014753811,Fruits and Vegetables,231.7958,OUT027,1985,Medium,Tier 3,Supermarket Type3,5375.0034 +FDR43,,Low Fat,0.160707489,Fruits and Vegetables,38.019,OUT027,1985,Medium,Tier 3,Supermarket Type3,1318.284 +FDP51,13.85,Regular,0.085622362,Meat,119.4124,OUT018,2009,Medium,Tier 3,Supermarket Type2,2251.7356 +FDL52,6.635,Regular,0.046350909,Frozen Foods,37.4506,OUT017,2007,,Tier 2,Supermarket Type1,1176.4686 +FDR44,6.11,Regular,0.102920886,Fruits and Vegetables,130.4968,OUT046,1997,Small,Tier 1,Supermarket Type1,3523.4136 +FDB34,15.25,Low Fat,0.026604781,Snack Foods,86.2198,OUT035,2004,Small,Tier 2,Supermarket Type1,610.5386 +FDC50,15.85,Low Fat,0,Canned,96.4094,OUT035,2004,Small,Tier 2,Supermarket Type1,1237.7222 +FDT57,15.2,Low Fat,0.031860325,Snack Foods,235.1248,OUT010,1998,,Tier 3,Grocery Store,474.0496 +FDP22,,Regular,0,Snack Foods,52.6666,OUT027,1985,Medium,Tier 3,Supermarket Type3,717.7324 +DRE49,20.75,LF,0.021250002,Soft Drinks,150.5024,OUT046,1997,Small,Tier 1,Supermarket Type1,2580.6408 +FDM40,10.195,Low Fat,0.159936948,Frozen Foods,143.2154,OUT046,1997,Small,Tier 1,Supermarket Type1,2552.6772 +FDY32,7.605,Low Fat,0.129503146,Fruits and Vegetables,164.021,OUT045,2002,,Tier 2,Supermarket Type1,3914.904 +FDW07,18,Regular,0.142688846,Fruits and Vegetables,88.5514,OUT046,1997,Small,Tier 1,Supermarket Type1,796.9626 +FDU02,,Low Fat,0.179484411,Dairy,228.9352,OUT019,1985,Small,Tier 1,Grocery Store,916.1408 +NCF18,18.35,Low Fat,0.089163056,Household,191.3504,OUT045,2002,,Tier 2,Supermarket Type1,3259.7568 +FDQ56,6.59,Low Fat,0.105761491,Fruits and Vegetables,84.8908,OUT049,1999,Medium,Tier 1,Supermarket Type1,1677.816 +FDN58,13.8,reg,0.056960814,Snack Foods,230.0984,OUT049,1999,Medium,Tier 1,Supermarket Type1,3707.1744 +FDG35,21.2,Regular,0.00704098,Starchy Foods,173.5738,OUT046,1997,Small,Tier 1,Supermarket Type1,2954.1546 +FDY34,10.5,Regular,0.011026594,Snack Foods,166.4842,OUT018,2009,Medium,Tier 3,Supermarket Type2,2652.5472 +NCE19,8.97,Low Fat,0.093203257,Household,52.7956,OUT045,2002,,Tier 2,Supermarket Type1,1037.3164 +NCK31,,Low Fat,0.026916794,Others,50.9666,OUT027,1985,Medium,Tier 3,Supermarket Type3,717.7324 +NCJ29,10.6,Low Fat,0.035264298,Health and Hygiene,86.1224,OUT045,2002,,Tier 2,Supermarket Type1,426.112 +FDT59,13.65,Low Fat,0.015908424,Breads,231.1668,OUT035,2004,Small,Tier 2,Supermarket Type1,6911.004 +NCX41,19,Low Fat,0.017719277,Health and Hygiene,211.0244,OUT046,1997,Small,Tier 1,Supermarket Type1,3811.0392 +FDU45,,Regular,0.035334201,Snack Foods,115.3518,OUT027,1985,Medium,Tier 3,Supermarket Type3,2277.036 +FDW24,,Low Fat,0.065652494,Baking Goods,48.9034,OUT019,1985,Small,Tier 1,Grocery Store,48.6034 +FDF22,6.865,Low Fat,0.056919038,Snack Foods,212.8218,OUT049,1999,Medium,Tier 1,Supermarket Type1,5770.4886 +FDM60,10.8,Regular,0.048143292,Baking Goods,40.2138,OUT046,1997,Small,Tier 1,Supermarket Type1,690.4346 +FDR02,16.7,Low Fat,0.022047313,Dairy,110.2886,OUT013,1987,High,Tier 3,Supermarket Type1,1890.2062 +DRP35,,Low Fat,0.090427268,Hard Drinks,126.2336,OUT027,1985,Medium,Tier 3,Supermarket Type3,3195.84 +FDS48,15.15,Low Fat,0.027779254,Baking Goods,150.1708,OUT046,1997,Small,Tier 1,Supermarket Type1,1504.708 +NCZ42,10.5,Low Fat,0,Household,238.3248,OUT010,1998,,Tier 3,Grocery Store,711.0744 +FDZ38,17.6,Low Fat,0.008033611,Dairy,174.2422,OUT018,2009,Medium,Tier 3,Supermarket Type2,4311.055 +FDH19,19.35,Low Fat,0.033088472,Meat,175.4738,OUT046,1997,Small,Tier 1,Supermarket Type1,521.3214 +NCB55,15.7,Low Fat,0.160663021,Household,59.4562,OUT046,1997,Small,Tier 1,Supermarket Type1,829.5868 +FDC15,18.1,LF,0.178975721,Dairy,155.5288,OUT017,2007,,Tier 2,Supermarket Type1,1571.288 +FDF11,10.195,Regular,0.017627888,Starchy Foods,239.6538,OUT035,2004,Small,Tier 2,Supermarket Type1,2403.538 +FDW35,,low fat,0.0194158,Breads,41.6454,OUT019,1985,Small,Tier 1,Grocery Store,83.8908 +FDB44,6.655,Low Fat,0.016993225,Fruits and Vegetables,211.0586,OUT045,2002,,Tier 2,Supermarket Type1,844.2344 +NCC06,19,Low Fat,0.027139013,Household,127.3336,OUT017,2007,,Tier 2,Supermarket Type1,2940.1728 +FDR04,7.075,Low Fat,0.03777249,Frozen Foods,98.0068,OUT010,1998,,Tier 3,Grocery Store,291.6204 +FDB17,13.15,Low Fat,0.036746479,Frozen Foods,181.2976,OUT045,2002,,Tier 2,Supermarket Type1,3259.7568 +FDW43,20.1,Regular,0.022460102,Fruits and Vegetables,226.8036,OUT049,1999,Medium,Tier 1,Supermarket Type1,3415.554 +FDA27,20.35,Regular,0,Dairy,256.7672,OUT018,2009,Medium,Tier 3,Supermarket Type2,5624.6784 +NCU41,18.85,Low Fat,0.05213575,Health and Hygiene,190.1846,OUT049,1999,Medium,Tier 1,Supermarket Type1,6687.961 +FDY56,16.35,Regular,0.062508438,Fruits and Vegetables,227.1062,OUT049,1999,Medium,Tier 1,Supermarket Type1,5642.655 +FDV39,11.3,Low Fat,0.007309544,Meat,196.2426,OUT018,2009,Medium,Tier 3,Supermarket Type2,4943.565 +FDN32,17.5,Low Fat,0.015623754,Fruits and Vegetables,182.6266,OUT018,2009,Medium,Tier 3,Supermarket Type2,3135.2522 +FDW07,18,Regular,0.142978223,Fruits and Vegetables,87.4514,OUT045,2002,,Tier 2,Supermarket Type1,796.9626 +FDZ27,7.935,Low Fat,0.017191055,Dairy,51.535,OUT045,2002,,Tier 2,Supermarket Type1,848.895 +FDW23,,Low Fat,0.143592939,Baking Goods,37.3164,OUT019,1985,Small,Tier 1,Grocery Store,38.6164 +FDU01,20.25,Regular,0.011995271,Canned,184.5924,OUT046,1997,Small,Tier 1,Supermarket Type1,4997.4948 +FDF10,15.5,Regular,0.15717236,Snack Foods,149.1418,OUT049,1999,Medium,Tier 1,Supermarket Type1,588.5672 +DRH03,,Low Fat,0.061393095,Dairy,91.812,OUT019,1985,Small,Tier 1,Grocery Store,372.848 +FDW27,,Regular,0.264124669,Meat,155.7314,OUT019,1985,Small,Tier 1,Grocery Store,155.1314 +DRI13,15.35,Low Fat,0.020310046,Soft Drinks,218.0508,OUT013,1987,High,Tier 3,Supermarket Type1,3038.7112 +NCR05,10.1,Low Fat,0.054630834,Health and Hygiene,200.2084,OUT046,1997,Small,Tier 1,Supermarket Type1,1587.2672 +FDB29,16.7,Regular,0.052517969,Frozen Foods,115.4176,OUT045,2002,,Tier 2,Supermarket Type1,687.1056 +FDL51,20.7,Regular,0.047565208,Dairy,213.4876,OUT049,1999,Medium,Tier 1,Supermarket Type1,1929.4884 +FDB11,16,LF,0.060797393,Starchy Foods,223.8404,OUT013,1987,High,Tier 3,Supermarket Type1,3600.6464 +FDI35,14,Low Fat,0.041291169,Starchy Foods,180.7634,OUT046,1997,Small,Tier 1,Supermarket Type1,2181.1608 +FDX08,12.85,Low Fat,0.022604051,Fruits and Vegetables,181.4318,OUT046,1997,Small,Tier 1,Supermarket Type1,3428.2042 +FDP59,20.85,Regular,0.056580228,Breads,105.6648,OUT045,2002,,Tier 2,Supermarket Type1,623.1888 +NCJ18,12.35,Low Fat,0.164196823,Household,120.5124,OUT049,1999,Medium,Tier 1,Supermarket Type1,2133.2232 +FDJ41,6.85,Low Fat,0.022976497,Frozen Foods,261.6594,OUT018,2009,Medium,Tier 3,Supermarket Type2,3401.5722 +FDU08,10.3,Low Fat,0.027310252,Fruits and Vegetables,101.0042,OUT035,2004,Small,Tier 2,Supermarket Type1,1289.6546 +FDS09,,Regular,0.141975462,Snack Foods,49.6008,OUT019,1985,Small,Tier 1,Grocery Store,50.6008 +DRH15,8.775,Low Fat,0,Dairy,45.9428,OUT013,1987,High,Tier 3,Supermarket Type1,790.9704 +NCV17,18.85,Low Fat,0.01619866,Health and Hygiene,129.2626,OUT017,2007,,Tier 2,Supermarket Type1,3147.9024 +NCO54,,Low Fat,0.014205168,Household,56.7614,OUT027,1985,Medium,Tier 3,Supermarket Type3,2486.763 +FDE24,14.85,Low Fat,0.09344495,Baking Goods,141.0812,OUT035,2004,Small,Tier 2,Supermarket Type1,1139.8496 +FDH53,20.5,Regular,0.019199733,Frozen Foods,84.3592,OUT046,1997,Small,Tier 1,Supermarket Type1,1816.3024 +FDZ13,7.84,Regular,0.154120252,Canned,51.935,OUT018,2009,Medium,Tier 3,Supermarket Type2,199.74 +FDW28,18.25,Low Fat,0.089004389,Frozen Foods,196.7452,OUT045,2002,,Tier 2,Supermarket Type1,978.726 +FDU46,10.3,Regular,0.011117041,Snack Foods,85.854,OUT013,1987,High,Tier 3,Supermarket Type1,2683.174 +NCE43,12.5,LF,0.103422709,Household,169.9448,OUT035,2004,Small,Tier 2,Supermarket Type1,2897.5616 +FDS26,,Low Fat,0.089035961,Dairy,260.5594,OUT027,1985,Medium,Tier 3,Supermarket Type3,9158.079 +FDB14,20.25,Regular,0.102723919,Canned,93.212,OUT046,1997,Small,Tier 1,Supermarket Type1,1957.452 +DRB48,,Regular,0.024733134,Soft Drinks,40.2822,OUT027,1985,Medium,Tier 3,Supermarket Type3,1296.3126 +NCC42,15,Low Fat,0.044871033,Health and Hygiene,140.3838,OUT013,1987,High,Tier 3,Supermarket Type1,2528.7084 +FDQ20,8.325,Low Fat,0.029760052,Fruits and Vegetables,38.7138,OUT013,1987,High,Tier 3,Supermarket Type1,284.2966 +FDA13,15.85,Low Fat,0.078999287,Canned,38.6506,OUT017,2007,,Tier 2,Supermarket Type1,759.012 +FDZ15,13.1,Low Fat,0.020870744,Dairy,117.3782,OUT046,1997,Small,Tier 1,Supermarket Type1,1787.673 +NCV42,6.26,Low Fat,0.031599715,Household,111.3228,OUT017,2007,,Tier 2,Supermarket Type1,2431.5016 +DRI51,17.25,Low Fat,0.042413704,Dairy,173.1764,OUT018,2009,Medium,Tier 3,Supermarket Type2,4466.1864 +FDO28,5.765,Low Fat,0.072284689,Frozen Foods,119.9098,OUT035,2004,Small,Tier 2,Supermarket Type1,2048.6666 +NCS54,13.6,Low Fat,0.009984847,Household,175.437,OUT013,1987,High,Tier 3,Supermarket Type1,1940.807 +FDH16,10.5,Low Fat,0.052852621,Frozen Foods,88.783,OUT017,2007,,Tier 2,Supermarket Type1,2067.309 +FDG24,7.975,Low Fat,0.014660821,Baking Goods,85.125,OUT045,2002,,Tier 2,Supermarket Type1,2663.2 +FDR52,12.65,Regular,0.076354362,Frozen Foods,192.1846,OUT018,2009,Medium,Tier 3,Supermarket Type2,1146.5076 +NCH06,12.3,Low Fat,0.076709639,Household,247.846,OUT045,2002,,Tier 2,Supermarket Type1,3448.844 +FDA36,5.985,Low Fat,0.005677876,Baking Goods,184.8924,OUT045,2002,,Tier 2,Supermarket Type1,1665.8316 +FDU56,,Low Fat,0,Fruits and Vegetables,184.7266,OUT027,1985,Medium,Tier 3,Supermarket Type3,8114.7704 +FDT09,15.15,Regular,0.012282366,Snack Foods,132.5284,OUT049,1999,Medium,Tier 1,Supermarket Type1,1713.7692 +FDU25,12.35,Low Fat,0.026681262,Canned,56.4246,OUT046,1997,Small,Tier 1,Supermarket Type1,810.9444 +FDK41,14.3,Low Fat,0.127541722,Frozen Foods,84.9224,OUT046,1997,Small,Tier 1,Supermarket Type1,1193.1136 +NCT54,8.695,Low Fat,0.119513002,Household,93.4094,OUT035,2004,Small,Tier 2,Supermarket Type1,856.8846 +FDV51,16.35,Low Fat,0.054463442,Meat,163.8842,OUT010,1998,,Tier 3,Grocery Store,165.7842 +FDM24,6.135,Regular,0,Baking Goods,151.3366,OUT045,2002,,Tier 2,Supermarket Type1,1057.9562 +NCO30,19.5,Low Fat,0.015756784,Household,185.0608,OUT045,2002,,Tier 2,Supermarket Type1,2205.1296 +FDQ45,9.5,Regular,0.010907967,Snack Foods,182.3608,OUT013,1987,High,Tier 3,Supermarket Type1,2940.1728 +DRK59,8.895,LF,0.07543556,Hard Drinks,235.8616,OUT035,2004,Small,Tier 2,Supermarket Type1,3046.7008 +FDW28,18.25,Low Fat,0,Frozen Foods,196.8452,OUT046,1997,Small,Tier 1,Supermarket Type1,3327.6684 +FDC02,21.35,Low Fat,0.115194717,Canned,258.3278,OUT010,1998,,Tier 3,Grocery Store,520.6556 +FDR21,19.7,Low Fat,0.066922802,Snack Foods,174.837,OUT035,2004,Small,Tier 2,Supermarket Type1,2999.429 +FDN48,,Low Fat,0.064636203,Baking Goods,90.0804,OUT027,1985,Medium,Tier 3,Supermarket Type3,2113.2492 +FDT44,16.6,Low Fat,0.103195401,Fruits and Vegetables,117.8466,OUT045,2002,,Tier 2,Supermarket Type1,942.7728 +FDX14,,Low Fat,0.13121032,Dairy,74.0354,OUT019,1985,Small,Tier 1,Grocery Store,75.2354 +FDH57,10.895,Low Fat,0.035747522,Fruits and Vegetables,133.6284,OUT046,1997,Small,Tier 1,Supermarket Type1,1581.9408 +FDH28,,reg,0.192650072,Frozen Foods,37.4506,OUT019,1985,Small,Tier 1,Grocery Store,37.9506 +NCT41,,Low Fat,0.098031771,Health and Hygiene,151.3024,OUT019,1985,Small,Tier 1,Grocery Store,151.8024 +FDO11,,Regular,0.030118338,Breads,248.8092,OUT027,1985,Medium,Tier 3,Supermarket Type3,3486.1288 +NCP42,8.51,Low Fat,0.016201845,Household,195.2478,OUT017,2007,,Tier 2,Supermarket Type1,4262.4516 +FDN09,14.15,Low Fat,0.05837308,Snack Foods,243.9828,OUT010,1998,,Tier 3,Grocery Store,731.0484 +FDP32,6.65,Low Fat,0.087652908,Fruits and Vegetables,128.8678,OUT035,2004,Small,Tier 2,Supermarket Type1,1398.8458 +FDV57,15.25,Regular,0.065999008,Snack Foods,177.966,OUT049,1999,Medium,Tier 1,Supermarket Type1,2336.958 +FDW28,18.25,low fat,0.088750333,Frozen Foods,196.5452,OUT013,1987,High,Tier 3,Supermarket Type1,2348.9424 +FDR56,,Regular,0.100277876,Fruits and Vegetables,196.8768,OUT027,1985,Medium,Tier 3,Supermarket Type3,7094.7648 +FDA40,16,Regular,0.099252438,Frozen Foods,87.4856,OUT035,2004,Small,Tier 2,Supermarket Type1,1054.6272 +NCG42,19.2,Low Fat,0,Household,127.831,OUT045,2002,,Tier 2,Supermarket Type1,1298.31 +NCK54,12.15,Low Fat,0,Household,117.815,OUT017,2007,,Tier 2,Supermarket Type1,2330.3 +FDE16,8.895,Low Fat,0.026384672,Frozen Foods,208.9954,OUT049,1999,Medium,Tier 1,Supermarket Type1,4584.6988 +FDB15,10.895,Low Fat,0.228993134,Dairy,263.4568,OUT010,1998,,Tier 3,Grocery Store,527.3136 +FDC40,16,Regular,0.065431917,Dairy,76.1986,OUT017,2007,,Tier 2,Supermarket Type1,1869.5664 +FDE53,,LF,0.026749991,Frozen Foods,106.928,OUT027,1985,Medium,Tier 3,Supermarket Type3,2876.256 +FDK24,9.195,Low Fat,0,Baking Goods,43.6744,OUT018,2009,Medium,Tier 3,Supermarket Type2,407.4696 +FDW31,11.35,Regular,0.043333912,Fruits and Vegetables,201.0742,OUT018,2009,Medium,Tier 3,Supermarket Type2,2189.8162 +NCX29,10,LF,0.089656812,Health and Hygiene,144.0102,OUT017,2007,,Tier 2,Supermarket Type1,1603.9122 +NCM07,9.395,Low Fat,0.039954281,Others,82.4908,OUT035,2004,Small,Tier 2,Supermarket Type1,2013.3792 +DRN36,,Low Fat,0.087854925,Soft Drinks,95.9752,OUT019,1985,Small,Tier 1,Grocery Store,95.8752 +FDQ37,20.75,Low Fat,0.149404057,Breakfast,192.8478,OUT010,1998,,Tier 3,Grocery Store,774.9912 +FDK43,9.8,Low Fat,0.0268952,Meat,128.402,OUT045,2002,,Tier 2,Supermarket Type1,2403.538 +FDK28,5.695,Low Fat,0.065857092,Frozen Foods,258.5646,OUT018,2009,Medium,Tier 3,Supermarket Type2,4380.2982 +FDR43,18.2,Low Fat,0.161817014,Fruits and Vegetables,37.819,OUT045,2002,,Tier 2,Supermarket Type1,219.714 +FDL48,19.35,Regular,0.082197959,Baking Goods,49.2034,OUT013,1987,High,Tier 3,Supermarket Type1,729.051 +DRL23,18.35,Low Fat,0.015335349,Hard Drinks,106.6938,OUT045,2002,,Tier 2,Supermarket Type1,1393.5194 +NCX42,6.36,Low Fat,0.00599072,Household,163.6526,OUT045,2002,,Tier 2,Supermarket Type1,5262.4832 +DRD37,9.8,Low Fat,0.013898123,Soft Drinks,46.506,OUT018,2009,Medium,Tier 3,Supermarket Type2,372.848 +FDZ47,,Regular,0.078912473,Baking Goods,99.9042,OUT027,1985,Medium,Tier 3,Supermarket Type3,3273.7386 +NCJ54,,Low Fat,0.059776237,Household,231.7642,OUT027,1985,Medium,Tier 3,Supermarket Type3,5344.3766 +FDL52,6.635,Regular,0,Frozen Foods,39.7506,OUT013,1987,High,Tier 3,Supermarket Type1,303.6048 +FDC15,18.1,Low Fat,0.297883712,Dairy,156.7288,OUT010,1998,,Tier 3,Grocery Store,314.2576 +NCD19,8.93,Low Fat,0.022059594,Household,56.0614,OUT010,1998,,Tier 3,Grocery Store,276.307 +FDD08,8.3,Low Fat,0.03532494,Fruits and Vegetables,38.9506,OUT013,1987,High,Tier 3,Supermarket Type1,721.0614 +NCN18,8.895,LF,0.124967595,Household,112.7544,OUT045,2002,,Tier 2,Supermarket Type1,3467.4864 +FDY56,16.35,Regular,0.062411404,Fruits and Vegetables,225.9062,OUT046,1997,Small,Tier 1,Supermarket Type1,5416.9488 +NCI29,8.6,Low Fat,0.032754431,Health and Hygiene,140.5154,OUT018,2009,Medium,Tier 3,Supermarket Type2,283.6308 +NCE06,,Low Fat,0.160178832,Household,160.2894,OUT019,1985,Small,Tier 1,Grocery Store,323.5788 +FDC08,19,Regular,0.104035148,Fruits and Vegetables,227.772,OUT017,2007,,Tier 2,Supermarket Type1,5206.556 +FDU52,7.56,Low Fat,0.06390019,Frozen Foods,157.263,OUT045,2002,,Tier 2,Supermarket Type1,2503.408 +FDN16,12.6,Regular,0.062648111,Frozen Foods,104.899,OUT013,1987,High,Tier 3,Supermarket Type1,1960.781 +NCM55,15.6,Low Fat,0.111685868,Others,184.7924,OUT010,1998,,Tier 3,Grocery Store,370.1848 +FDR49,8.71,Low Fat,0.233039817,Canned,49.5376,OUT010,1998,,Tier 3,Grocery Store,95.8752 +FDC15,18.1,Low Fat,0.17824575,Dairy,158.1288,OUT049,1999,Medium,Tier 1,Supermarket Type1,3299.7048 +FDB53,13.35,Low Fat,0.140241213,Frozen Foods,150.2392,OUT017,2007,,Tier 2,Supermarket Type1,2684.5056 +FDK44,16.6,Low Fat,0,Fruits and Vegetables,173.3738,OUT046,1997,Small,Tier 1,Supermarket Type1,2085.2856 +FDA16,6.695,Low Fat,0.033935576,Frozen Foods,221.9456,OUT035,2004,Small,Tier 2,Supermarket Type1,2210.456 +FDO19,,Regular,0.016516275,Fruits and Vegetables,47.4034,OUT027,1985,Medium,Tier 3,Supermarket Type3,2187.153 +FDO04,16.6,Low Fat,0.026537206,Frozen Foods,57.2614,OUT046,1997,Small,Tier 1,Supermarket Type1,1049.9666 +NCL19,15.35,Low Fat,0.015673267,Others,145.047,OUT035,2004,Small,Tier 2,Supermarket Type1,2719.793 +FDA44,19.7,Low Fat,0.089083914,Fruits and Vegetables,54.593,OUT010,1998,,Tier 3,Grocery Store,56.593 +FDR60,14.3,Low Fat,0.131152799,Baking Goods,78.6328,OUT017,2007,,Tier 2,Supermarket Type1,231.6984 +FDV37,,Regular,0.083109455,Canned,195.8426,OUT027,1985,Medium,Tier 3,Supermarket Type3,5734.5354 +FDG53,10,Low Fat,0.045818773,Frozen Foods,138.718,OUT013,1987,High,Tier 3,Supermarket Type1,1398.18 +DRG01,14.8,Low Fat,0.044869794,Soft Drinks,76.467,OUT035,2004,Small,Tier 2,Supermarket Type1,1531.34 +FDB38,,Regular,0,Canned,160.692,OUT019,1985,Small,Tier 1,Grocery Store,319.584 +FDI27,8.71,Regular,0.04605781,Dairy,43.8744,OUT049,1999,Medium,Tier 1,Supermarket Type1,633.8416 +FDD29,12.15,Low Fat,0.030815427,Frozen Foods,252.0698,OUT010,1998,,Tier 3,Grocery Store,1014.6792 +NCR41,17.85,Low Fat,0.01806055,Health and Hygiene,97.0094,OUT045,2002,,Tier 2,Supermarket Type1,2094.6068 +FDW44,9.5,Regular,0.035205866,Fruits and Vegetables,171.3448,OUT049,1999,Medium,Tier 1,Supermarket Type1,2386.2272 +FDU21,11.8,Regular,0.076705948,Snack Foods,34.7558,OUT035,2004,Small,Tier 2,Supermarket Type1,780.9834 +FDI14,14.1,LF,0.089677773,Canned,139.8496,OUT046,1997,Small,Tier 1,Supermarket Type1,1693.7952 +FDW50,,Low Fat,0.132327406,Dairy,168.4158,OUT019,1985,Small,Tier 1,Grocery Store,334.2316 +FDN39,19.35,Regular,0.065520388,Meat,168.3816,OUT046,1997,Small,Tier 1,Supermarket Type1,1342.2528 +FDT31,19.75,Low Fat,0.012518707,Fruits and Vegetables,190.6872,OUT017,2007,,Tier 2,Supermarket Type1,4916.2672 +FDJ14,10.3,Regular,0.050353695,Canned,78.696,OUT017,2007,,Tier 2,Supermarket Type1,1757.712 +NCQ43,,Low Fat,0.110762642,Others,108.5912,OUT027,1985,Medium,Tier 3,Supermarket Type3,1637.868 +FDZ22,,Low Fat,0.045050674,Snack Foods,84.925,OUT027,1985,Medium,Tier 3,Supermarket Type3,1747.725 +FDU38,10.8,Low Fat,0.083016832,Dairy,193.4504,OUT017,2007,,Tier 2,Supermarket Type1,2876.256 +FDS32,17.75,Regular,0,Fruits and Vegetables,139.9838,OUT045,2002,,Tier 2,Supermarket Type1,1966.7732 +DRH13,8.575,Low Fat,0.023983258,Soft Drinks,106.328,OUT018,2009,Medium,Tier 3,Supermarket Type2,958.752 +DRF03,19.1,Low Fat,0.075836522,Dairy,40.2138,OUT010,1998,,Tier 3,Grocery Store,81.2276 +FDJ20,20.7,Regular,0.100330684,Fruits and Vegetables,123.4388,OUT049,1999,Medium,Tier 1,Supermarket Type1,1238.388 +FDE22,,Low Fat,0.051778173,Snack Foods,157.892,OUT019,1985,Small,Tier 1,Grocery Store,319.584 +FDX22,6.785,Regular,0.022970468,Snack Foods,211.0928,OUT035,2004,Small,Tier 2,Supermarket Type1,4418.2488 +DRM11,6.57,Low Fat,0.066014596,Hard Drinks,259.7278,OUT013,1987,High,Tier 3,Supermarket Type1,2863.6058 +FDL58,5.78,Regular,0.07429945,Snack Foods,264.9568,OUT045,2002,,Tier 2,Supermarket Type1,1845.5976 +FDL25,6.92,Regular,0.131128467,Breakfast,93.1804,OUT049,1999,Medium,Tier 1,Supermarket Type1,1561.9668 +FDD40,20.25,Regular,0.014816356,Dairy,194.1162,OUT049,1999,Medium,Tier 1,Supermarket Type1,3848.324 +FDT08,13.65,Low Fat,0.049318315,Fruits and Vegetables,149.005,OUT045,2002,,Tier 2,Supermarket Type1,2097.27 +FDO22,13.5,Regular,0.017960492,Snack Foods,81.596,OUT017,2007,,Tier 2,Supermarket Type1,639.168 +NCM41,16.5,Low Fat,0.035801238,Health and Hygiene,92.612,OUT018,2009,Medium,Tier 3,Supermarket Type2,559.272 +FDJ21,16.7,Regular,0.038606365,Snack Foods,146.5102,OUT045,2002,,Tier 2,Supermarket Type1,2770.3938 +FDC53,8.68,Low Fat,0.008871687,Frozen Foods,99.7384,OUT018,2009,Medium,Tier 3,Supermarket Type2,295.6152 +DRK35,,Low Fat,0.125793938,Hard Drinks,36.2506,OUT019,1985,Small,Tier 1,Grocery Store,37.9506 +FDQ09,7.235,Low Fat,0.058369013,Snack Foods,115.2834,OUT018,2009,Medium,Tier 3,Supermarket Type2,1267.0174 +DRB48,16.75,Regular,0,Soft Drinks,39.3822,OUT046,1997,Small,Tier 1,Supermarket Type1,353.5398 +DRE25,15.35,Low Fat,0.073269336,Soft Drinks,92.112,OUT035,2004,Small,Tier 2,Supermarket Type1,1118.544 +FDL08,10.8,Low Fat,0.049677651,Fruits and Vegetables,245.9144,OUT013,1987,High,Tier 3,Supermarket Type1,4655.2736 +NCV42,6.26,Low Fat,0.031470832,Household,110.2228,OUT049,1999,Medium,Tier 1,Supermarket Type1,1547.3192 +FDW03,5.63,Regular,0.024579432,Meat,105.3306,OUT049,1999,Medium,Tier 1,Supermarket Type1,1045.306 +FDL25,6.92,Regular,0.131665479,Breakfast,91.8804,OUT017,2007,,Tier 2,Supermarket Type1,275.6412 +FDC17,12.15,Low Fat,0.015523707,Frozen Foods,212.0928,OUT018,2009,Medium,Tier 3,Supermarket Type2,2735.1064 +FDK44,16.6,Low Fat,0.122475364,Fruits and Vegetables,175.5738,OUT045,2002,,Tier 2,Supermarket Type1,347.5476 +FDE34,9.195,Low Fat,0.107891398,Snack Foods,182.7634,OUT046,1997,Small,Tier 1,Supermarket Type1,3817.0314 +FDP10,19,Low Fat,0.128065918,Snack Foods,104.3622,OUT035,2004,Small,Tier 2,Supermarket Type1,1905.5196 +FDZ22,9.395,Low Fat,0.045361705,Snack Foods,83.825,OUT045,2002,,Tier 2,Supermarket Type1,665.8 +NCK19,9.8,Low Fat,0.090390357,Others,192.1478,OUT013,1987,High,Tier 3,Supermarket Type1,2324.9736 +FDO44,,Low Fat,0.087029712,Fruits and Vegetables,109.2228,OUT027,1985,Medium,Tier 3,Supermarket Type3,3205.1612 +NCU41,18.85,LF,0.052054819,Health and Hygiene,189.1846,OUT046,1997,Small,Tier 1,Supermarket Type1,2101.9306 +NCF31,9.13,Low Fat,0.051952573,Household,152.3024,OUT045,2002,,Tier 2,Supermarket Type1,1821.6288 +FDG14,9,Regular,0.050786366,Canned,152.2024,OUT017,2007,,Tier 2,Supermarket Type1,3643.2576 +NCH30,17.1,Low Fat,0.067141355,Household,114.586,OUT035,2004,Small,Tier 2,Supermarket Type1,2942.836 +FDR36,6.715,Regular,0.121485195,Baking Goods,40.2454,OUT013,1987,High,Tier 3,Supermarket Type1,587.2356 +NCJ30,5.82,Low Fat,0.080640478,Household,167.779,OUT046,1997,Small,Tier 1,Supermarket Type1,2886.243 +FDR08,18.7,Low Fat,0.037699254,Fruits and Vegetables,110.2886,OUT045,2002,,Tier 2,Supermarket Type1,2223.772 +FDU04,7.93,Low Fat,0,Frozen Foods,123.2414,OUT018,2009,Medium,Tier 3,Supermarket Type2,487.3656 +NCQ50,18.75,Low Fat,0.034501405,Household,211.7218,OUT017,2007,,Tier 2,Supermarket Type1,5770.4886 +FDL46,,Low Fat,0.053795154,Snack Foods,117.7466,OUT027,1985,Medium,Tier 3,Supermarket Type3,1414.1592 +DRK37,5,Low Fat,0.044004675,Soft Drinks,188.853,OUT046,1997,Small,Tier 1,Supermarket Type1,5502.837 +FDK48,7.445,low fat,0,Baking Goods,76.8354,OUT046,1997,Small,Tier 1,Supermarket Type1,2181.8266 +FDV58,20.85,Low Fat,0.121250374,Snack Foods,193.9452,OUT046,1997,Small,Tier 1,Supermarket Type1,1565.9616 +FDN27,20.85,Low Fat,0,Meat,115.1808,OUT018,2009,Medium,Tier 3,Supermarket Type2,1054.6272 +FDZ52,19.2,Low Fat,0.100230114,Frozen Foods,112.9886,OUT049,1999,Medium,Tier 1,Supermarket Type1,1667.829 +NCF42,17.35,Low Fat,0.167383061,Household,175.6712,OUT046,1997,Small,Tier 1,Supermarket Type1,2812.3392 +FDQ48,14.3,Regular,0.034404732,Baking Goods,98.1726,OUT035,2004,Small,Tier 2,Supermarket Type1,489.363 +FDW49,19.5,Low Fat,0.082719632,Canned,179.3002,OUT045,2002,,Tier 2,Supermarket Type1,2865.6032 +FDR58,6.675,Low Fat,0.041913535,Snack Foods,90.7462,OUT035,2004,Small,Tier 2,Supermarket Type1,1665.8316 +NCE07,8.18,Low Fat,0.0132043,Household,143.8154,OUT017,2007,,Tier 2,Supermarket Type1,2694.4926 +FDK14,6.98,Low Fat,0.041105789,Canned,83.4934,OUT046,1997,Small,Tier 1,Supermarket Type1,1555.9746 +FDC11,,LF,0.141106202,Starchy Foods,87.9172,OUT027,1985,Medium,Tier 3,Supermarket Type3,3836.3396 +FDL22,16.85,Low Fat,0.036463975,Snack Foods,90.7488,OUT045,2002,,Tier 2,Supermarket Type1,543.2928 +NCQ41,14.8,Low Fat,0.01946418,Health and Hygiene,196.3794,OUT013,1987,High,Tier 3,Supermarket Type1,1950.794 +FDX46,12.3,Regular,0,Snack Foods,57.3562,OUT013,1987,High,Tier 3,Supermarket Type1,177.7686 +FDC35,7.435,Low Fat,0.123086812,Starchy Foods,206.9638,OUT045,2002,,Tier 2,Supermarket Type1,1035.319 +FDH45,15.1,reg,0.105646853,Fruits and Vegetables,42.8796,OUT035,2004,Small,Tier 2,Supermarket Type1,949.4308 +FDX33,9.195,Regular,0.118149377,Snack Foods,160.5578,OUT017,2007,,Tier 2,Supermarket Type1,1283.6624 +DRJ35,10.1,Low Fat,0.046545786,Hard Drinks,59.9878,OUT013,1987,High,Tier 3,Supermarket Type1,484.7024 +FDC40,16,Regular,0.065009745,Dairy,79.5986,OUT013,1987,High,Tier 3,Supermarket Type1,934.7832 +FDO19,17.7,Regular,0.016630303,Fruits and Vegetables,48.1034,OUT045,2002,,Tier 2,Supermarket Type1,534.6374 +FDP13,8.1,Regular,0.134532392,Canned,39.448,OUT049,1999,Medium,Tier 1,Supermarket Type1,878.856 +FDP24,20.6,LF,0.083133128,Baking Goods,120.1756,OUT049,1999,Medium,Tier 1,Supermarket Type1,1332.9316 +NCQ42,20.35,Low Fat,0.039428167,Household,127.9678,OUT018,2009,Medium,Tier 3,Supermarket Type2,3560.6984 +FDY59,8.195,Low Fat,0,Baking Goods,93.1462,OUT018,2009,Medium,Tier 3,Supermarket Type2,647.8234 +FDU14,17.75,Low Fat,0.034823127,Dairy,248.675,OUT045,2002,,Tier 2,Supermarket Type1,4993.5 +FDB21,7.475,Low Fat,0.148492521,Fruits and Vegetables,240.6854,OUT035,2004,Small,Tier 2,Supermarket Type1,1691.7978 +FDT32,19,Regular,0.065901299,Fruits and Vegetables,188.7214,OUT018,2009,Medium,Tier 3,Supermarket Type2,1695.7926 +FDK20,12.6,Regular,0.041622264,Fruits and Vegetables,124.0072,OUT049,1999,Medium,Tier 1,Supermarket Type1,4042.7376 +FDX09,,Low Fat,0.064933297,Snack Foods,174.837,OUT027,1985,Medium,Tier 3,Supermarket Type3,4763.799 +FDM01,7.895,Regular,0.0945493,Breakfast,102.6332,OUT035,2004,Small,Tier 2,Supermarket Type1,1640.5312 +DRI37,,Low Fat,0.107076832,Soft Drinks,58.7904,OUT027,1985,Medium,Tier 3,Supermarket Type3,1288.9888 +FDL20,17.1,Low Fat,0.128674983,Fruits and Vegetables,112.3886,OUT045,2002,,Tier 2,Supermarket Type1,2334.9606 +FDU13,8.355,Low Fat,0.188322664,Canned,148.5418,OUT018,2009,Medium,Tier 3,Supermarket Type2,2207.127 +FDE05,,Regular,0,Frozen Foods,145.2102,OUT019,1985,Small,Tier 1,Grocery Store,437.4306 +FDE58,18.5,Low Fat,0.052025392,Snack Foods,118.4124,OUT013,1987,High,Tier 3,Supermarket Type1,2370.248 +FDT32,,Regular,0.065316099,Fruits and Vegetables,189.9214,OUT027,1985,Medium,Tier 3,Supermarket Type3,5087.3778 +FDZ01,8.975,Regular,0.01516265,Canned,101.899,OUT010,1998,,Tier 3,Grocery Store,103.199 +FDM08,10.1,Regular,0.053584207,Fruits and Vegetables,224.4088,OUT046,1997,Small,Tier 1,Supermarket Type1,4697.8848 +FDS58,9.285,Regular,0.020989132,Snack Foods,158.6578,OUT013,1987,High,Tier 3,Supermarket Type1,2406.867 +FDZ26,11.6,Regular,0.144017405,Dairy,238.3222,OUT046,1997,Small,Tier 1,Supermarket Type1,5736.5328 +FDC46,,Low Fat,0.115978122,Snack Foods,183.4266,OUT027,1985,Medium,Tier 3,Supermarket Type3,7192.6374 +FDY51,12.5,Low Fat,0.081465335,Meat,220.7798,OUT018,2009,Medium,Tier 3,Supermarket Type2,6611.394 +FDL34,16,Low Fat,0.041177505,Snack Foods,142.3496,OUT017,2007,,Tier 2,Supermarket Type1,3246.4408 +DRG39,14.15,Low Fat,0.042352822,Dairy,51.6982,OUT018,2009,Medium,Tier 3,Supermarket Type2,1262.3568 +NCG43,20.2,Low Fat,0.074541867,Household,94.1462,OUT018,2009,Medium,Tier 3,Supermarket Type2,1758.3778 +FDT01,13.65,Regular,0.18454121,Canned,211.5902,OUT045,2002,,Tier 2,Supermarket Type1,4672.5844 +NCR38,17.25,Low Fat,0.114160573,Household,253.1724,OUT017,2007,,Tier 2,Supermarket Type1,3775.086 +DRF01,5.655,Low Fat,0.175352413,Soft Drinks,147.4102,OUT049,1999,Medium,Tier 1,Supermarket Type1,2478.7734 +FDF53,20.75,Regular,0.083590755,Frozen Foods,182.2318,OUT035,2004,Small,Tier 2,Supermarket Type1,3067.3406 +FDS45,5.175,Regular,0.029471408,Snack Foods,105.4622,OUT013,1987,High,Tier 3,Supermarket Type1,3281.7282 +FDR20,20,Regular,0.028282832,Fruits and Vegetables,46.2744,OUT017,2007,,Tier 2,Supermarket Type1,1086.5856 +FDY07,11.8,Low Fat,0,Fruits and Vegetables,46.5402,OUT010,1998,,Tier 3,Grocery Store,229.701 +FDD38,16.75,Regular,0.008208342,Canned,102.8674,OUT045,2002,,Tier 2,Supermarket Type1,1528.011 +DRF15,18.35,Low Fat,0.03334929,Dairy,155.034,OUT018,2009,Medium,Tier 3,Supermarket Type2,1990.742 +FDH32,12.8,Low Fat,0.076060037,Fruits and Vegetables,95.141,OUT046,1997,Small,Tier 1,Supermarket Type1,868.869 +NCJ42,19.75,Low Fat,0.014301326,Household,103.0332,OUT046,1997,Small,Tier 1,Supermarket Type1,1230.3984 +FDB56,8.75,Regular,0.074931201,Fruits and Vegetables,187.6556,OUT018,2009,Medium,Tier 3,Supermarket Type2,938.778 +FDD03,13.3,Low Fat,0.080131363,Dairy,234.03,OUT018,2009,Medium,Tier 3,Supermarket Type2,4194.54 +NCL18,18.85,Low Fat,0.167444431,Household,194.6136,OUT013,1987,High,Tier 3,Supermarket Type1,1166.4816 +FDW22,9.695,Regular,0.03033748,Snack Foods,222.9114,OUT049,1999,Medium,Tier 1,Supermarket Type1,5764.4964 +FDE32,20.7,Low Fat,0.04874969,Fruits and Vegetables,37.5506,OUT035,2004,Small,Tier 2,Supermarket Type1,113.8518 +FDA34,,Low Fat,0.014788594,Starchy Foods,174.408,OUT027,1985,Medium,Tier 3,Supermarket Type3,7443.644 +FDJ08,11.1,Low Fat,0.111298111,Fruits and Vegetables,191.7846,OUT017,2007,,Tier 2,Supermarket Type1,3057.3536 +FDG38,8.975,Regular,0.05268526,Canned,83.3224,OUT013,1987,High,Tier 3,Supermarket Type1,3579.3408 +FDD29,12.15,Low Fat,0.018485511,Frozen Foods,253.1698,OUT018,2009,Medium,Tier 3,Supermarket Type2,1522.0188 +NCE31,7.67,Low Fat,0.184689756,Household,35.4216,OUT013,1987,High,Tier 3,Supermarket Type1,450.0808 +FDS19,13.8,Regular,0.064153845,Fruits and Vegetables,76.9012,OUT013,1987,High,Tier 3,Supermarket Type1,607.2096 +FDU11,4.785,Low Fat,0.092516598,Breads,120.1098,OUT013,1987,High,Tier 3,Supermarket Type1,1325.6078 +FDL02,20,Regular,0.104245198,Canned,105.3622,OUT049,1999,Medium,Tier 1,Supermarket Type1,1270.3464 +FDO51,,Regular,0.041779181,Meat,43.4112,OUT027,1985,Medium,Tier 3,Supermarket Type3,1107.8912 +DRK23,8.395,Low Fat,0.07226985,Hard Drinks,254.104,OUT018,2009,Medium,Tier 3,Supermarket Type2,3542.056 +FDO27,6.175,Regular,0.179806961,Meat,95.2752,OUT018,2009,Medium,Tier 3,Supermarket Type2,1534.0032 +FDB16,8.21,Low Fat,0.044995631,Dairy,89.2198,OUT049,1999,Medium,Tier 1,Supermarket Type1,1308.297 +FDA44,19.7,Low Fat,0.053523765,Fruits and Vegetables,55.393,OUT017,2007,,Tier 2,Supermarket Type1,1471.418 +NCB18,19.6,Low Fat,0.041459372,Household,89.6514,OUT018,2009,Medium,Tier 3,Supermarket Type2,1239.7196 +NCL53,7.5,Low Fat,0.036234918,Health and Hygiene,175.3028,OUT046,1997,Small,Tier 1,Supermarket Type1,3896.2616 +FDR16,5.845,Regular,0.105445801,Frozen Foods,214.4218,OUT018,2009,Medium,Tier 3,Supermarket Type2,1496.0526 +NCQ05,11.395,LF,0,Health and Hygiene,151.6708,OUT013,1987,High,Tier 3,Supermarket Type1,3460.8284 +FDF44,7.17,Regular,0.05997133,Fruits and Vegetables,132.1968,OUT018,2009,Medium,Tier 3,Supermarket Type2,2870.9296 +FDU50,5.75,Regular,0.075595405,Dairy,114.7176,OUT017,2007,,Tier 2,Supermarket Type1,1259.6936 +FDG20,15.5,Regular,0.210375806,Fruits and Vegetables,178.2028,OUT010,1998,,Tier 3,Grocery Store,177.1028 +FDD58,7.76,Low Fat,0.059341019,Snack Foods,99.77,OUT035,2004,Small,Tier 2,Supermarket Type1,798.96 +FDT01,13.65,Regular,0.18520944,Canned,212.9902,OUT017,2007,,Tier 2,Supermarket Type1,3185.853 +FDK15,10.8,Low Fat,0.098566832,Meat,98.3042,OUT049,1999,Medium,Tier 1,Supermarket Type1,1488.063 +FDJ08,11.1,Low Fat,0.11084417,Fruits and Vegetables,189.2846,OUT049,1999,Medium,Tier 1,Supermarket Type1,5159.2842 +FDS10,,Low Fat,0.0350152,Snack Foods,182.0318,OUT027,1985,Medium,Tier 3,Supermarket Type3,5954.2494 +FDJ55,12.8,Regular,0.023567538,Meat,226.8404,OUT049,1999,Medium,Tier 1,Supermarket Type1,4500.808 +FDU32,8.785,Low Fat,0,Fruits and Vegetables,123.0414,OUT010,1998,,Tier 3,Grocery Store,121.8414 +FDG09,20.6,Regular,0.04792722,Fruits and Vegetables,185.9556,OUT035,2004,Small,Tier 2,Supermarket Type1,4318.3788 +FDE39,7.89,Low Fat,0.036207786,Dairy,121.0782,OUT045,2002,,Tier 2,Supermarket Type1,3456.1678 +FDU56,16.85,Low Fat,0.044377096,Fruits and Vegetables,185.8266,OUT013,1987,High,Tier 3,Supermarket Type1,1659.8394 +NCH55,16.35,Low Fat,0.034742632,Household,127.402,OUT045,2002,,Tier 2,Supermarket Type1,759.012 +FDX33,,Regular,0.116915909,Snack Foods,159.4578,OUT027,1985,Medium,Tier 3,Supermarket Type3,4974.1918 +FDR24,17.35,Regular,0.062979148,Baking Goods,87.983,OUT045,2002,,Tier 2,Supermarket Type1,1707.777 +FDC33,,Regular,0.068604503,Fruits and Vegetables,197.3768,OUT027,1985,Medium,Tier 3,Supermarket Type3,7488.9184 +NCV54,,Low Fat,0.03294861,Household,116.8124,OUT027,1985,Medium,Tier 3,Supermarket Type3,2488.7604 +NCQ02,12.6,Low Fat,0.007450258,Household,186.7556,OUT013,1987,High,Tier 3,Supermarket Type1,2816.334 +NCU17,5.32,Low Fat,0.093027718,Health and Hygiene,101.4674,OUT049,1999,Medium,Tier 1,Supermarket Type1,2954.1546 +NCZ06,,Low Fat,0.164864915,Household,255.2698,OUT019,1985,Small,Tier 1,Grocery Store,761.0094 +FDV37,13,Regular,0.083498083,Canned,199.4426,OUT035,2004,Small,Tier 2,Supermarket Type1,593.2278 +DRH25,,Low Fat,0.014522363,Soft Drinks,50.2324,OUT027,1985,Medium,Tier 3,Supermarket Type3,1298.31 +NCI43,19.85,Low Fat,0.025963795,Household,46.3376,OUT035,2004,Small,Tier 2,Supermarket Type1,1150.5024 +NCQ53,17.6,Low Fat,0.019012262,Health and Hygiene,237.159,OUT017,2007,,Tier 2,Supermarket Type1,3072.667 +NCT18,14.6,Low Fat,0.059393919,Household,181.7976,OUT035,2004,Small,Tier 2,Supermarket Type1,3259.7568 +FDF14,7.55,Low Fat,0.027212058,Canned,152.734,OUT049,1999,Medium,Tier 1,Supermarket Type1,2756.412 +FDM14,13.8,Low Fat,0.013263968,Canned,106.9254,OUT046,1997,Small,Tier 1,Supermarket Type1,2930.1858 +FDX57,17.25,Regular,0.079113947,Snack Foods,99.2068,OUT010,1998,,Tier 3,Grocery Store,97.2068 +NCV05,10.1,Low Fat,0.03020851,Health and Hygiene,153.1656,OUT046,1997,Small,Tier 1,Supermarket Type1,1544.656 +FDX39,14.3,Regular,0.049634817,Meat,212.5586,OUT013,1987,High,Tier 3,Supermarket Type1,3165.879 +FDA23,9.8,Low Fat,0.047187038,Baking Goods,100.6016,OUT046,1997,Small,Tier 1,Supermarket Type1,1619.2256 +NCV06,11.3,Low Fat,0.066681333,Household,194.4478,OUT046,1997,Small,Tier 1,Supermarket Type1,387.4956 +NCE31,7.67,Low Fat,0.185218446,Household,36.3216,OUT045,2002,,Tier 2,Supermarket Type1,415.4592 +DRI39,13.8,Low Fat,0.162462044,Dairy,55.893,OUT010,1998,,Tier 3,Grocery Store,226.372 +FDH21,10.395,Low Fat,0.031273559,Seafood,160.0604,OUT049,1999,Medium,Tier 1,Supermarket Type1,1267.6832 +FDR26,20.7,Low Fat,0.042836778,Dairy,175.8028,OUT046,1997,Small,Tier 1,Supermarket Type1,1593.9252 +FDA14,,Low Fat,0.114127418,Dairy,147.176,OUT019,1985,Small,Tier 1,Grocery Store,585.904 +FDG21,17.35,Regular,0.146895866,Seafood,149.605,OUT018,2009,Medium,Tier 3,Supermarket Type2,3745.125 +NCQ38,16.35,Low Fat,0.013420879,Others,104.828,OUT018,2009,Medium,Tier 3,Supermarket Type2,1810.976 +FDN20,19.35,Low Fat,0.026181893,Fruits and Vegetables,167.0474,OUT046,1997,Small,Tier 1,Supermarket Type1,2358.2636 +NCN29,15.2,Low Fat,0.012184999,Health and Hygiene,50.3034,OUT017,2007,,Tier 2,Supermarket Type1,145.8102 +FDI28,14.3,Low Fat,0.026428924,Frozen Foods,78.2302,OUT018,2009,Medium,Tier 3,Supermarket Type2,554.6114 +FDA03,,Regular,0.045243613,Dairy,146.8102,OUT027,1985,Medium,Tier 3,Supermarket Type3,3499.4448 +FDZ28,20,Regular,0,Frozen Foods,127.3678,OUT046,1997,Small,Tier 1,Supermarket Type1,1780.3492 +FDO52,,Regular,0.076790922,Frozen Foods,172.1106,OUT027,1985,Medium,Tier 3,Supermarket Type3,2566.659 +FDU10,10.1,Regular,0.045950475,Snack Foods,38.2848,OUT017,2007,,Tier 2,Supermarket Type1,1230.3984 +FDP13,,Regular,0.133673087,Canned,41.548,OUT027,1985,Medium,Tier 3,Supermarket Type3,918.804 +FDV02,,Low Fat,0.060252433,Dairy,170.7106,OUT027,1985,Medium,Tier 3,Supermarket Type3,3079.9908 +FDS28,8.18,reg,0.082529704,Frozen Foods,56.9588,OUT049,1999,Medium,Tier 1,Supermarket Type1,744.3644 +FDW49,19.5,Low Fat,0.082552214,Canned,179.8002,OUT046,1997,Small,Tier 1,Supermarket Type1,716.4008 +FDP33,18.7,Low Fat,0.089272253,Snack Foods,254.7672,OUT046,1997,Small,Tier 1,Supermarket Type1,5113.344 +FDJ03,12.35,Regular,0.072541731,Dairy,48.5692,OUT045,2002,,Tier 2,Supermarket Type1,886.8456 +FDQ51,16,Regular,0.017536671,Meat,45.5718,OUT013,1987,High,Tier 3,Supermarket Type1,1039.9796 +DRK23,8.395,Low Fat,0.072088552,Hard Drinks,253.704,OUT049,1999,Medium,Tier 1,Supermarket Type1,4554.072 +FDU11,4.785,Low Fat,0.092781435,Breads,119.7098,OUT045,2002,,Tier 2,Supermarket Type1,1807.647 +NCK06,5.03,Low Fat,0.008644894,Household,122.6756,OUT035,2004,Small,Tier 2,Supermarket Type1,2665.8632 +FDY09,15.6,Low Fat,0.025342692,Snack Foods,174.3054,OUT017,2007,,Tier 2,Supermarket Type1,1751.054 +NCY18,7.285,Low Fat,0.031145743,Household,173.6054,OUT035,2004,Small,Tier 2,Supermarket Type1,2626.581 +FDA10,20.35,Low Fat,0,Snack Foods,120.9072,OUT049,1999,Medium,Tier 1,Supermarket Type1,1470.0864 +FDO34,17.7,Low Fat,0.030108283,Snack Foods,165.9816,OUT017,2007,,Tier 2,Supermarket Type1,4362.3216 +FDE38,,Low Fat,0.044391149,Canned,164.3842,OUT027,1985,Medium,Tier 3,Supermarket Type3,4476.1734 +FDF40,20.25,Regular,0.022639471,Dairy,248.4092,OUT017,2007,,Tier 2,Supermarket Type1,2241.0828 +FDY02,8.945,Regular,0,Dairy,264.791,OUT017,2007,,Tier 2,Supermarket Type1,4733.838 +FDS03,,Low Fat,0.139419417,Meat,66.0826,OUT019,1985,Small,Tier 1,Grocery Store,258.3304 +FDB59,18.25,Low Fat,0.015278899,Snack Foods,199.0084,OUT046,1997,Small,Tier 1,Supermarket Type1,3174.5344 +NCQ42,20.35,Low Fat,0.039329257,Household,127.6678,OUT049,1999,Medium,Tier 1,Supermarket Type1,2924.8594 +FDO15,16.75,Regular,0.008579863,Meat,72.3038,OUT049,1999,Medium,Tier 1,Supermarket Type1,960.7494 +DRN47,12.1,Low Fat,0.028164527,Hard Drinks,178.166,OUT010,1998,,Tier 3,Grocery Store,539.298 +FDA03,18.5,Regular,0,Dairy,144.2102,OUT035,2004,Small,Tier 2,Supermarket Type1,2041.3428 +FDA01,15,Regular,0.054367971,Canned,58.5904,OUT035,2004,Small,Tier 2,Supermarket Type1,996.0368 +FDB38,19.5,Regular,0.0273467,Canned,158.992,OUT046,1997,Small,Tier 1,Supermarket Type1,1757.712 +FDT59,13.65,Low Fat,0.016001434,Breads,230.6668,OUT017,2007,,Tier 2,Supermarket Type1,1842.9344 +FDG08,13.15,Regular,0.165328057,Fruits and Vegetables,170.6764,OUT035,2004,Small,Tier 2,Supermarket Type1,3435.528 +FDV56,,Regular,0.013529884,Fruits and Vegetables,106.2596,OUT027,1985,Medium,Tier 3,Supermarket Type3,1402.1748 +FDY26,20.6,reg,0.030510526,Dairy,211.4244,OUT046,1997,Small,Tier 1,Supermarket Type1,7833.8028 +DRE13,6.28,Low Fat,0.027699863,Soft Drinks,87.9198,OUT035,2004,Small,Tier 2,Supermarket Type1,1221.0772 +FDE51,5.925,Regular,0.09646733,Dairy,42.8086,OUT046,1997,Small,Tier 1,Supermarket Type1,669.129 +FDL40,17.7,Low Fat,0.011636708,Frozen Foods,94.541,OUT045,2002,,Tier 2,Supermarket Type1,1061.951 +FDD50,18.85,Low Fat,0.141642219,Canned,168.1132,OUT046,1997,Small,Tier 1,Supermarket Type1,2874.9244 +FDC04,,Low Fat,0.044767801,Dairy,241.8854,OUT027,1985,Medium,Tier 3,Supermarket Type3,4592.0226 +FDN15,17.5,Low Fat,0.028009382,Meat,141.718,OUT010,1998,,Tier 3,Grocery Store,419.454 +FDC46,17.7,Low Fat,0.1164455,Snack Foods,182.8266,OUT013,1987,High,Tier 3,Supermarket Type1,5163.9448 +FDV56,16.1,Regular,0.013584408,Fruits and Vegetables,107.7596,OUT013,1987,High,Tier 3,Supermarket Type1,323.5788 +FDK43,9.8,Low Fat,0.026950104,Meat,128.402,OUT018,2009,Medium,Tier 3,Supermarket Type2,1265.02 +NCR29,7.565,Low Fat,0.054751689,Health and Hygiene,54.793,OUT045,2002,,Tier 2,Supermarket Type1,622.523 +FDY03,17.6,Regular,0.076121831,Meat,111.7202,OUT046,1997,Small,Tier 1,Supermarket Type1,1125.202 +FDU44,12.15,Regular,0.058516562,Fruits and Vegetables,164.1552,OUT049,1999,Medium,Tier 1,Supermarket Type1,5198.5664 +FDZ04,9.31,low fat,0.037923509,Frozen Foods,61.651,OUT013,1987,High,Tier 3,Supermarket Type1,379.506 +FDU16,19.25,Regular,0.058365706,Frozen Foods,82.1908,OUT049,1999,Medium,Tier 1,Supermarket Type1,2432.8332 +FDV07,9.5,Low Fat,0.031346387,Fruits and Vegetables,110.7228,OUT045,2002,,Tier 2,Supermarket Type1,1657.842 +NCL19,15.35,Low Fat,0.015663185,Others,143.947,OUT013,1987,High,Tier 3,Supermarket Type1,3006.087 +FDW01,,Low Fat,0.063750302,Canned,153.4682,OUT027,1985,Medium,Tier 3,Supermarket Type3,2287.023 +FDC10,,Regular,0.07252476,Snack Foods,120.3098,OUT027,1985,Medium,Tier 3,Supermarket Type3,1687.1372 +DRC12,17.85,Low Fat,0.038040837,Soft Drinks,189.1188,OUT017,2007,,Tier 2,Supermarket Type1,3237.1196 +DRK39,7.02,Low Fat,0.049823902,Dairy,82.225,OUT013,1987,High,Tier 3,Supermarket Type1,2746.425 +FDG24,,Low Fat,0.014560297,Baking Goods,81.425,OUT027,1985,Medium,Tier 3,Supermarket Type3,1331.6 +FDO04,,Low Fat,0.026408698,Frozen Foods,53.2614,OUT027,1985,Medium,Tier 3,Supermarket Type3,607.8754 +DRB25,12.3,Low Fat,0.069446588,Soft Drinks,106.3938,OUT035,2004,Small,Tier 2,Supermarket Type1,857.5504 +FDK26,5.46,Regular,0.03217132,Canned,184.824,OUT035,2004,Small,Tier 2,Supermarket Type1,4287.752 +FDM52,15.1,Low Fat,0.026046138,Frozen Foods,147.2076,OUT045,2002,,Tier 2,Supermarket Type1,1773.6912 +FDY07,11.8,Low Fat,0.121848436,Fruits and Vegetables,46.8402,OUT045,2002,,Tier 2,Supermarket Type1,597.2226 +NCO06,19.25,Low Fat,0.108470504,Household,33.4558,OUT018,2009,Medium,Tier 3,Supermarket Type2,441.4254 +FDO10,13.65,Regular,0,Snack Foods,55.8588,OUT045,2002,,Tier 2,Supermarket Type1,1431.47 +FDK34,13.35,Low Fat,0.038494623,Snack Foods,240.2564,OUT013,1987,High,Tier 3,Supermarket Type1,2860.2768 +FDS33,,Regular,0.122830885,Snack Foods,86.9514,OUT027,1985,Medium,Tier 3,Supermarket Type3,3364.9532 +FDO45,13.15,Regular,0.038029746,Snack Foods,88.6856,OUT045,2002,,Tier 2,Supermarket Type1,1757.712 +FDF08,14.3,Regular,0.065207559,Fruits and Vegetables,89.8856,OUT046,1997,Small,Tier 1,Supermarket Type1,966.7416 +FDH58,12.3,Low Fat,0.037014587,Snack Foods,115.1834,OUT045,2002,,Tier 2,Supermarket Type1,1958.1178 +FDS03,7.825,Low Fat,0.133281968,Meat,63.2826,OUT010,1998,,Tier 3,Grocery Store,129.1652 +DRF03,19.1,Low Fat,0.045299563,Dairy,38.8138,OUT035,2004,Small,Tier 2,Supermarket Type1,365.5242 +FDE02,8.71,low fat,0.121149472,Canned,93.7778,OUT013,1987,High,Tier 3,Supermarket Type1,1783.6782 +NCZ06,19.6,Low Fat,0.094083303,Household,252.2698,OUT013,1987,High,Tier 3,Supermarket Type1,2790.3678 +FDW49,19.5,Low Fat,0,Canned,179.3002,OUT049,1999,Medium,Tier 1,Supermarket Type1,2328.3026 +FDR23,15.85,Low Fat,0,Breads,174.737,OUT017,2007,,Tier 2,Supermarket Type1,2822.992 +NCJ29,,Low Fat,0.035022503,Health and Hygiene,85.1224,OUT027,1985,Medium,Tier 3,Supermarket Type3,2045.3376 +FDY35,17.6,Regular,0.016060186,Breads,47.2402,OUT045,2002,,Tier 2,Supermarket Type1,505.3422 +FDZ01,,Regular,0.009014978,Canned,102.699,OUT027,1985,Medium,Tier 3,Supermarket Type3,3095.97 +FDX19,19.1,Low Fat,0.096733815,Fruits and Vegetables,233.1958,OUT046,1997,Small,Tier 1,Supermarket Type1,5141.3076 +FDG44,6.13,Low Fat,0.102607233,Fruits and Vegetables,54.0298,OUT018,2009,Medium,Tier 3,Supermarket Type2,808.947 +FDQ23,6.55,Low Fat,0.024521191,Breads,100.6332,OUT035,2004,Small,Tier 2,Supermarket Type1,2665.8632 +FDY22,16.5,Regular,0.160624116,Snack Foods,143.8128,OUT017,2007,,Tier 2,Supermarket Type1,2588.6304 +NCN41,17,Low Fat,0.052165855,Health and Hygiene,125.073,OUT013,1987,High,Tier 3,Supermarket Type1,1108.557 +FDA47,10.5,Regular,0,Baking Goods,162.421,OUT045,2002,,Tier 2,Supermarket Type1,1304.968 +NCD19,8.93,Low Fat,0,Household,55.4614,OUT045,2002,,Tier 2,Supermarket Type1,331.5684 +FDO36,,Low Fat,0.07753654,Baking Goods,180.866,OUT027,1985,Medium,Tier 3,Supermarket Type3,3235.788 +FDH20,16.1,Regular,0.024928351,Fruits and Vegetables,95.141,OUT013,1987,High,Tier 3,Supermarket Type1,3089.312 +FDN12,,LF,0.08071118,Baking Goods,113.1544,OUT027,1985,Medium,Tier 3,Supermarket Type3,3355.632 +NCJ30,5.82,Low Fat,0.080968973,Household,171.379,OUT018,2009,Medium,Tier 3,Supermarket Type2,2037.348 +FDB09,16.25,Low Fat,0.057485328,Fruits and Vegetables,126.2046,OUT049,1999,Medium,Tier 1,Supermarket Type1,1867.569 +FDA09,13.35,Regular,0.149669322,Snack Foods,180.266,OUT045,2002,,Tier 2,Supermarket Type1,898.83 +FDL24,,Regular,0.024776026,Baking Goods,172.3422,OUT027,1985,Medium,Tier 3,Supermarket Type3,7759.899 +FDP03,5.15,Regular,0.061165512,Meat,125.6388,OUT035,2004,Small,Tier 2,Supermarket Type1,2848.2924 +FDR58,,Low Fat,0.041718456,Snack Foods,94.5462,OUT027,1985,Medium,Tier 3,Supermarket Type3,2868.9322 +FDO13,7.865,Low Fat,0.06100886,Breakfast,166.0526,OUT013,1987,High,Tier 3,Supermarket Type1,3617.9572 +DRD49,9.895,Low Fat,0.167799329,Soft Drinks,239.4564,OUT035,2004,Small,Tier 2,Supermarket Type1,5243.8408 +NCF42,17.35,Low Fat,0.167351411,Household,176.0712,OUT035,2004,Small,Tier 2,Supermarket Type1,2109.2544 +DRK35,8.365,Low Fat,0.071832909,Hard Drinks,36.1506,OUT035,2004,Small,Tier 2,Supermarket Type1,721.0614 +FDR58,6.675,Low Fat,0.041886576,Snack Foods,92.1462,OUT013,1987,High,Tier 3,Supermarket Type1,1203.1006 +FDQ15,,Regular,0.150341867,Meat,83.1276,OUT027,1985,Medium,Tier 3,Supermarket Type3,1868.2348 +NCP50,17.35,Low Fat,0.020542737,Others,80.5618,OUT013,1987,High,Tier 3,Supermarket Type1,322.2472 +FDV45,16.75,Low Fat,0.045047439,Snack Foods,186.4556,OUT046,1997,Small,Tier 1,Supermarket Type1,3942.8676 +DRP35,18.85,Low Fat,0.091008572,Hard Drinks,129.6336,OUT049,1999,Medium,Tier 1,Supermarket Type1,3195.84 +FDN23,6.575,Regular,0.07549348,Breads,143.5444,OUT035,2004,Small,Tier 2,Supermarket Type1,3338.3212 +FDS44,12.65,Regular,0.156286566,Fruits and Vegetables,238.9538,OUT049,1999,Medium,Tier 1,Supermarket Type1,4086.0146 +NCI54,15.2,Low Fat,0.033735909,Household,110.9912,OUT018,2009,Medium,Tier 3,Supermarket Type2,1856.2504 +FDH40,,Regular,0.078547351,Frozen Foods,79.3276,OUT027,1985,Medium,Tier 3,Supermarket Type3,1380.8692 +FDF46,7.07,Low Fat,0.093653464,Snack Foods,113.3834,OUT035,2004,Small,Tier 2,Supermarket Type1,1267.0174 +FDA21,13.65,Low Fat,0.036107198,Snack Foods,184.4924,OUT018,2009,Medium,Tier 3,Supermarket Type2,5182.5872 +FDI41,,Regular,0.109003832,Frozen Foods,145.2418,OUT019,1985,Small,Tier 1,Grocery Store,147.1418 +FDE35,7.06,Regular,0.073480266,Starchy Foods,58.8904,OUT010,1998,,Tier 3,Grocery Store,58.5904 +DRJ24,11.8,Low Fat,0.113234914,Soft Drinks,186.3924,OUT013,1987,High,Tier 3,Supermarket Type1,5367.6796 +NCK17,,Low Fat,0.037711338,Health and Hygiene,41.548,OUT027,1985,Medium,Tier 3,Supermarket Type3,1358.232 +FDA15,9.3,Low Fat,0.016054884,Dairy,250.2092,OUT045,2002,,Tier 2,Supermarket Type1,5976.2208 +FDD36,,Low Fat,0.021170542,Baking Goods,117.6124,OUT027,1985,Medium,Tier 3,Supermarket Type3,2251.7356 +DRD60,,Low Fat,0.065188619,Soft Drinks,181.1634,OUT019,1985,Small,Tier 1,Grocery Store,181.7634 +FDA46,13.6,Low Fat,0.117537563,Snack Foods,195.4136,OUT013,1987,High,Tier 3,Supermarket Type1,5443.5808 +NCO54,19.5,Low Fat,0.01430324,Household,57.2614,OUT045,2002,,Tier 2,Supermarket Type1,1547.3192 +FDL48,19.35,Regular,0.137697119,Baking Goods,47.1034,OUT010,1998,,Tier 3,Grocery Store,145.8102 +NCM19,,Low Fat,0.047008497,Others,112.0202,OUT027,1985,Medium,Tier 3,Supermarket Type3,5063.409 +FDS31,13.1,reg,0,Fruits and Vegetables,178.9318,OUT049,1999,Medium,Tier 1,Supermarket Type1,3067.3406 +FDV12,16.7,Regular,0.060863167,Baking Goods,97.6384,OUT035,2004,Small,Tier 2,Supermarket Type1,2857.6136 +FDQ31,5.785,Regular,0,Fruits and Vegetables,87.1856,OUT035,2004,Small,Tier 2,Supermarket Type1,1406.1696 +FDK55,,Low Fat,0.045105407,Meat,89.4172,OUT019,1985,Small,Tier 1,Grocery Store,178.4344 +DRG15,6.13,Low Fat,0.076855207,Dairy,59.3536,OUT049,1999,Medium,Tier 1,Supermarket Type1,1470.0864 +NCR17,9.8,Low Fat,0.024482644,Health and Hygiene,116.2492,OUT018,2009,Medium,Tier 3,Supermarket Type2,2896.23 +FDV01,,Regular,0,Canned,154.6314,OUT027,1985,Medium,Tier 3,Supermarket Type3,6515.5188 +FDT21,7.42,Low Fat,0.020474913,Snack Foods,248.4092,OUT018,2009,Medium,Tier 3,Supermarket Type2,996.0368 +FDT10,16.7,Regular,0.062044506,Snack Foods,57.4562,OUT046,1997,Small,Tier 1,Supermarket Type1,948.0992 +FDL56,,Low Fat,0.220225608,Fruits and Vegetables,85.6198,OUT019,1985,Small,Tier 1,Grocery Store,87.2198 +FDS49,9,Low Fat,0.079794329,Canned,80.1644,OUT017,2007,,Tier 2,Supermarket Type1,1178.466 +FDT32,,Regular,0.114916546,Fruits and Vegetables,188.4214,OUT019,1985,Small,Tier 1,Grocery Store,565.2642 +NCX42,6.36,Low Fat,0.00597362,Household,164.5526,OUT013,1987,High,Tier 3,Supermarket Type1,2137.8838 +FDX26,17.7,LF,0.146973462,Dairy,184.1292,OUT010,1998,,Tier 3,Grocery Store,547.2876 +FDN02,16.5,Low Fat,0.07376631,Canned,208.5638,OUT013,1987,High,Tier 3,Supermarket Type1,2691.8294 +FDJ40,,Regular,0.049349121,Frozen Foods,108.6912,OUT027,1985,Medium,Tier 3,Supermarket Type3,3057.3536 +FDU13,,low fat,0.328390948,Canned,146.0418,OUT019,1985,Small,Tier 1,Grocery Store,588.5672 +DRE27,11.85,Low Fat,0.13267058,Dairy,96.4726,OUT046,1997,Small,Tier 1,Supermarket Type1,978.726 +FDS27,10.195,Regular,0.012455787,Meat,197.511,OUT035,2004,Small,Tier 2,Supermarket Type1,2356.932 +FDU44,,Regular,0.058142797,Fruits and Vegetables,162.1552,OUT027,1985,Medium,Tier 3,Supermarket Type3,3086.6488 +DRM59,,Low Fat,0.006289291,Hard Drinks,153.2998,OUT019,1985,Small,Tier 1,Grocery Store,461.3994 +FDT08,13.65,Low Fat,0.04929502,Fruits and Vegetables,150.505,OUT049,1999,Medium,Tier 1,Supermarket Type1,2696.49 +FDL46,20.35,low fat,0.054362695,Snack Foods,117.9466,OUT017,2007,,Tier 2,Supermarket Type1,1649.8524 +NCV30,20.2,Low Fat,0.110356797,Household,62.051,OUT010,1998,,Tier 3,Grocery Store,126.502 +FDP51,13.85,Regular,0.085274988,Meat,119.6124,OUT046,1997,Small,Tier 1,Supermarket Type1,2014.7108 +FDA51,8.05,Regular,0.164542555,Dairy,112.2518,OUT013,1987,High,Tier 3,Supermarket Type1,1707.777 +FDM46,7.365,Low Fat,0.160292264,Snack Foods,94.712,OUT045,2002,,Tier 2,Supermarket Type1,932.12 +FDK02,12.5,Low Fat,0.112859454,Canned,118.344,OUT017,2007,,Tier 2,Supermarket Type1,2157.192 +FDJ57,7.42,Regular,0.021569566,Seafood,184.8582,OUT035,2004,Small,Tier 2,Supermarket Type1,4643.955 +FDJ45,,Low Fat,0.073055148,Seafood,33.7216,OUT027,1985,Medium,Tier 3,Supermarket Type3,1280.9992 +NCB31,6.235,Low Fat,0.119345629,Household,261.991,OUT017,2007,,Tier 2,Supermarket Type1,2366.919 +FDJ03,12.35,Regular,0.072334667,Dairy,49.1692,OUT013,1987,High,Tier 3,Supermarket Type1,886.8456 +FDT50,6.75,Regular,0.108148913,Dairy,95.6752,OUT013,1987,High,Tier 3,Supermarket Type1,958.752 +NCY41,16.75,Low Fat,0.07585337,Health and Hygiene,36.8532,OUT049,1999,Medium,Tier 1,Supermarket Type1,1150.5024 +FDJ60,19.35,Regular,0.062655235,Baking Goods,163.3184,OUT045,2002,,Tier 2,Supermarket Type1,2641.8944 +FDZ35,9.6,Regular,0.022278477,Breads,102.499,OUT046,1997,Small,Tier 1,Supermarket Type1,1547.985 +FDS21,19.85,Regular,0.020961192,Snack Foods,62.0194,OUT018,2009,Medium,Tier 3,Supermarket Type2,619.194 +FDM52,15.1,Low Fat,0.025993423,Frozen Foods,147.4076,OUT046,1997,Small,Tier 1,Supermarket Type1,2808.3444 +FDQ08,,Regular,0.018838681,Fruits and Vegetables,62.9536,OUT027,1985,Medium,Tier 3,Supermarket Type3,2266.3832 +FDQ56,6.59,Low Fat,0.105577348,Fruits and Vegetables,85.6908,OUT035,2004,Small,Tier 2,Supermarket Type1,1929.4884 +FDS47,16.75,Low Fat,0.129086113,Breads,89.4856,OUT049,1999,Medium,Tier 1,Supermarket Type1,1054.6272 +DRM48,15.2,Low Fat,0.113125627,Soft Drinks,38.6848,OUT045,2002,,Tier 2,Supermarket Type1,1155.8288 +FDW46,13,Regular,0.070699313,Snack Foods,65.7484,OUT017,2007,,Tier 2,Supermarket Type1,1174.4712 +FDW27,5.86,Regular,0.151467821,Meat,154.1314,OUT018,2009,Medium,Tier 3,Supermarket Type2,3412.8908 +NCQ05,11.395,Low Fat,0.03616416,Health and Hygiene,150.1708,OUT010,1998,,Tier 3,Grocery Store,300.9416 +FDU40,20.85,Low Fat,0.062606583,Frozen Foods,192.2478,OUT010,1998,,Tier 3,Grocery Store,387.4956 +DRE12,,Low Fat,0.0704378,Soft Drinks,112.886,OUT027,1985,Medium,Tier 3,Supermarket Type3,2942.836 +FDX35,5.035,Regular,0.079844043,Breads,226.3036,OUT013,1987,High,Tier 3,Supermarket Type1,4098.6648 +FDD51,11.15,Low Fat,0.120139206,Dairy,45.0744,OUT049,1999,Medium,Tier 1,Supermarket Type1,452.744 +FDY27,6.38,Low Fat,0.032028115,Dairy,178.3344,OUT018,2009,Medium,Tier 3,Supermarket Type2,3211.8192 +NCN06,8.39,Low Fat,0.120497266,Household,162.2868,OUT046,1997,Small,Tier 1,Supermarket Type1,2620.5888 +FDR57,5.675,Regular,0.023492524,Snack Foods,155.5288,OUT035,2004,Small,Tier 2,Supermarket Type1,1414.1592 +FDL32,15.7,Regular,0.122657336,Fruits and Vegetables,110.1544,OUT049,1999,Medium,Tier 1,Supermarket Type1,1565.9616 +FDW46,13,reg,0.070588037,Snack Foods,65.9484,OUT018,2009,Medium,Tier 3,Supermarket Type2,1043.9744 +NCO17,,Low Fat,0.073024401,Health and Hygiene,121.844,OUT027,1985,Medium,Tier 3,Supermarket Type3,3115.944 +FDR19,13.5,Regular,0.159587755,Fruits and Vegetables,145.3102,OUT013,1987,High,Tier 3,Supermarket Type1,729.051 +FDJ33,8.895,Regular,0.088821765,Snack Foods,125.173,OUT017,2007,,Tier 2,Supermarket Type1,2956.152 +FDB15,10.895,Low Fat,0.136810742,Dairy,263.0568,OUT046,1997,Small,Tier 1,Supermarket Type1,527.3136 +FDA52,16.2,Regular,0.128682722,Frozen Foods,178.437,OUT045,2002,,Tier 2,Supermarket Type1,1058.622 +FDZ08,,Regular,0.109459733,Fruits and Vegetables,84.1592,OUT027,1985,Medium,Tier 3,Supermarket Type3,1320.9472 +FDR27,15.1,Regular,0.096644015,Meat,131.9942,OUT017,2007,,Tier 2,Supermarket Type1,3047.3666 +NCK42,7.475,Low Fat,0.013120028,Household,217.6192,OUT046,1997,Small,Tier 1,Supermarket Type1,1725.7536 +FDZ12,,Low Fat,0,Baking Goods,144.847,OUT019,1985,Small,Tier 1,Grocery Store,143.147 +FDM60,10.8,Regular,0.048339408,Baking Goods,41.5138,OUT018,2009,Medium,Tier 3,Supermarket Type2,446.7518 +NCI31,20,Low Fat,0.08165845,Others,35.019,OUT018,2009,Medium,Tier 3,Supermarket Type2,585.904 +FDX39,14.3,Regular,0.04975339,Meat,210.3586,OUT049,1999,Medium,Tier 1,Supermarket Type1,6331.758 +NCV05,10.1,Low Fat,0.030379382,Health and Hygiene,153.4656,OUT017,2007,,Tier 2,Supermarket Type1,1853.5872 +FDX16,17.85,LF,0.065810045,Frozen Foods,149.105,OUT046,1997,Small,Tier 1,Supermarket Type1,2247.075 +DRK12,9.5,Low Fat,0,Soft Drinks,32.89,OUT010,1998,,Tier 3,Grocery Store,33.29 +NCA05,20.75,Low Fat,0.025272781,Health and Hygiene,146.6734,OUT017,2007,,Tier 2,Supermarket Type1,445.4202 +DRG51,12.1,Low Fat,0.019314961,Dairy,164.6526,OUT010,1998,,Tier 3,Grocery Store,657.8104 +NCR30,20.6,Low Fat,0.071282168,Household,74.4696,OUT018,2009,Medium,Tier 3,Supermarket Type2,223.7088 +NCE31,7.67,Low Fat,0.184843579,Household,33.1216,OUT046,1997,Small,Tier 1,Supermarket Type1,727.0536 +FDM56,,Low Fat,0.122896411,Fruits and Vegetables,111.1912,OUT019,1985,Small,Tier 1,Grocery Store,218.3824 +FDP24,20.6,Low Fat,0.082935004,Baking Goods,119.5756,OUT013,1987,High,Tier 3,Supermarket Type1,2665.8632 +DRM37,15.35,Low Fat,0.161350176,Soft Drinks,196.6768,OUT010,1998,,Tier 3,Grocery Store,591.2304 +FDN56,5.46,Regular,0.106968096,Fruits and Vegetables,142.6786,OUT013,1987,High,Tier 3,Supermarket Type1,2311.6576 +DRE60,9.395,Low Fat,0.159582185,Soft Drinks,224.772,OUT049,1999,Medium,Tier 1,Supermarket Type1,7017.532 +FDW49,,Low Fat,0.14453827,Canned,180.6002,OUT019,1985,Small,Tier 1,Grocery Store,895.501 +FDM20,10,Low Fat,0.038685802,Fruits and Vegetables,243.8144,OUT046,1997,Small,Tier 1,Supermarket Type1,4655.2736 +FDK15,,Low Fat,0.172309903,Meat,98.2042,OUT019,1985,Small,Tier 1,Grocery Store,198.4084 +FDK48,7.445,Low Fat,0.037690731,Baking Goods,73.3354,OUT049,1999,Medium,Tier 1,Supermarket Type1,451.4124 +FDO49,,Regular,0.05787008,Breakfast,49.7008,OUT019,1985,Small,Tier 1,Grocery Store,50.6008 +FDC09,15.5,Regular,0.026409147,Fruits and Vegetables,102.1332,OUT018,2009,Medium,Tier 3,Supermarket Type2,615.1992 +NCZ41,19.85,Low Fat,0.064367627,Health and Hygiene,126.1704,OUT013,1987,High,Tier 3,Supermarket Type1,876.1928 +FDP19,11.5,Low Fat,0.173516063,Fruits and Vegetables,128.1652,OUT046,1997,Small,Tier 1,Supermarket Type1,2454.1388 +FDQ24,,Low Fat,0.12898088,Baking Goods,250.4724,OUT019,1985,Small,Tier 1,Grocery Store,251.6724 +DRL11,10.5,Low Fat,0.048115543,Hard Drinks,159.0946,OUT045,2002,,Tier 2,Supermarket Type1,4102.6596 +FDO36,19.7,Low Fat,0.077899109,Baking Goods,177.766,OUT035,2004,Small,Tier 2,Supermarket Type1,2696.49 +FDN52,,Regular,0.13093275,Frozen Foods,86.9198,OUT027,1985,Medium,Tier 3,Supermarket Type3,1569.9564 +FDF21,10.3,Regular,0.098464979,Fruits and Vegetables,188.653,OUT010,1998,,Tier 3,Grocery Store,189.753 +FDU40,20.85,Low Fat,0.037372847,Frozen Foods,192.7478,OUT013,1987,High,Tier 3,Supermarket Type1,3099.9648 +FDS51,13.35,Low Fat,0.032230526,Meat,61.4194,OUT049,1999,Medium,Tier 1,Supermarket Type1,743.0328 +FDE45,12.1,Low Fat,0.040357315,Fruits and Vegetables,177.8002,OUT046,1997,Small,Tier 1,Supermarket Type1,1611.9018 +FDX50,20.1,Low Fat,0.07461309,Dairy,108.7228,OUT035,2004,Small,Tier 2,Supermarket Type1,1215.7508 +NCN14,,Low Fat,0.160936178,Others,184.2608,OUT019,1985,Small,Tier 1,Grocery Store,367.5216 +FDQ21,21.25,Low Fat,0.019502354,Snack Foods,120.8756,OUT018,2009,Medium,Tier 3,Supermarket Type2,3150.5656 +FDV57,,Regular,0.065577449,Snack Foods,181.766,OUT027,1985,Medium,Tier 3,Supermarket Type3,7370.406 +FDB44,6.655,Low Fat,0.016944719,Fruits and Vegetables,209.2586,OUT013,1987,High,Tier 3,Supermarket Type1,2954.8204 +FDG52,13.65,Low Fat,0.065576228,Frozen Foods,47.7402,OUT013,1987,High,Tier 3,Supermarket Type1,643.1628 +FDL38,,Regular,0.02579577,Canned,88.4172,OUT019,1985,Small,Tier 1,Grocery Store,89.2172 +NCS54,13.6,Low Fat,0.010008699,Household,176.737,OUT049,1999,Medium,Tier 1,Supermarket Type1,4940.236 +DRL37,15.5,Low Fat,0.053362086,Soft Drinks,41.577,OUT035,2004,Small,Tier 2,Supermarket Type1,735.709 +FDA43,10.895,Low Fat,0.064621927,Fruits and Vegetables,196.6794,OUT013,1987,High,Tier 3,Supermarket Type1,1170.4764 +FDZ39,19.7,Regular,0.018126724,Meat,101.799,OUT017,2007,,Tier 2,Supermarket Type1,1135.189 +FDG45,8.1,Low Fat,0,Fruits and Vegetables,211.8902,OUT018,2009,Medium,Tier 3,Supermarket Type2,3823.0236 +FDH10,21,Low Fat,0.049263979,Snack Foods,195.0478,OUT013,1987,High,Tier 3,Supermarket Type1,1549.9824 +FDO10,13.65,Regular,0.021343732,Snack Foods,58.3588,OUT010,1998,,Tier 3,Grocery Store,114.5176 +FDS35,,LF,0.110681931,Breads,63.2826,OUT027,1985,Medium,Tier 3,Supermarket Type3,1033.3216 +FDI41,,Regular,0.061955439,Frozen Foods,145.1418,OUT027,1985,Medium,Tier 3,Supermarket Type3,4561.3958 +FDN21,,LF,0.076483451,Snack Foods,163.1236,OUT027,1985,Medium,Tier 3,Supermarket Type3,2416.854 +NCO18,13.15,Low Fat,0.024701262,Household,176.8686,OUT045,2002,,Tier 2,Supermarket Type1,2133.2232 +FDB34,15.25,Low Fat,0.02671821,Snack Foods,85.2198,OUT018,2009,Medium,Tier 3,Supermarket Type2,1482.7366 +FDD05,19.35,Low Fat,0.016597651,Frozen Foods,121.5098,OUT013,1987,High,Tier 3,Supermarket Type1,2892.2352 +FDX59,,Low Fat,0.0514111,Breads,33.0558,OUT027,1985,Medium,Tier 3,Supermarket Type3,984.7182 +FDZ23,17.75,Regular,0.112985849,Baking Goods,185.424,OUT010,1998,,Tier 3,Grocery Store,745.696 +FDX27,20.7,Regular,0.11411709,Dairy,92.7436,OUT046,1997,Small,Tier 1,Supermarket Type1,1323.6104 +FDV07,9.5,Low Fat,0,Fruits and Vegetables,110.4228,OUT017,2007,,Tier 2,Supermarket Type1,1547.3192 +FDR14,11.65,Low Fat,0.175033524,Dairy,55.5298,OUT017,2007,,Tier 2,Supermarket Type1,647.1576 +FDO01,21.1,Regular,0.020760673,Breakfast,128.7994,OUT045,2002,,Tier 2,Supermarket Type1,1798.9916 +FDO13,7.865,Low Fat,0.061405051,Breakfast,166.3526,OUT017,2007,,Tier 2,Supermarket Type1,1973.4312 +FDU25,12.35,Low Fat,0.026676216,Canned,57.0246,OUT035,2004,Small,Tier 2,Supermarket Type1,1737.738 +NCK54,,Low Fat,0.029380407,Household,114.715,OUT027,1985,Medium,Tier 3,Supermarket Type3,1864.24 +FDZ56,16.25,Low Fat,0.025715562,Fruits and Vegetables,168.1474,OUT013,1987,High,Tier 3,Supermarket Type1,1516.0266 +NCL55,12.15,Low Fat,0.065026434,Others,253.704,OUT017,2007,,Tier 2,Supermarket Type1,5060.08 +FDD59,10.5,Regular,0.066315023,Starchy Foods,78.296,OUT045,2002,,Tier 2,Supermarket Type1,2157.192 +FDJ55,12.8,Regular,0.023664054,Meat,226.0404,OUT017,2007,,Tier 2,Supermarket Type1,5400.9696 +FDA45,,Low Fat,0.154627247,Snack Foods,177.637,OUT027,1985,Medium,Tier 3,Supermarket Type3,5469.547 +DRF23,4.61,Low Fat,0.205294827,Hard Drinks,172.8396,OUT010,1998,,Tier 3,Grocery Store,174.4396 +FDT49,7,Low Fat,0.152261999,Canned,105.728,OUT017,2007,,Tier 2,Supermarket Type1,1278.336 +NCO17,10,Low Fat,0,Health and Hygiene,120.644,OUT035,2004,Small,Tier 2,Supermarket Type1,1917.504 +FDH22,6.405,Low Fat,0.136275173,Snack Foods,128.1678,OUT035,2004,Small,Tier 2,Supermarket Type1,1017.3424 +FDT34,9.3,Low Fat,0.174621343,Snack Foods,104.2964,OUT049,1999,Medium,Tier 1,Supermarket Type1,1998.7316 +FDB39,11.6,Low Fat,0.038597077,Dairy,57.9272,OUT045,2002,,Tier 2,Supermarket Type1,615.1992 +FDQ22,16.75,Low Fat,0.029799965,Snack Foods,39.1822,OUT045,2002,,Tier 2,Supermarket Type1,314.2576 +NCN43,12.15,Low Fat,0.011314423,Others,122.973,OUT010,1998,,Tier 3,Grocery Store,123.173 +FDG57,14.7,Low Fat,0.072410764,Fruits and Vegetables,48.2034,OUT049,1999,Medium,Tier 1,Supermarket Type1,1020.6714 +FDR20,20,Regular,0.028118435,Fruits and Vegetables,46.7744,OUT035,2004,Small,Tier 2,Supermarket Type1,1222.4088 +FDU22,,Low Fat,0.163350221,Snack Foods,120.2124,OUT019,1985,Small,Tier 1,Grocery Store,474.0496 +NCC43,7.39,Low Fat,0.093307713,Household,250.9066,OUT017,2007,,Tier 2,Supermarket Type1,1506.0396 +FDP01,20.75,Regular,0.105994654,Breakfast,150.5682,OUT010,1998,,Tier 3,Grocery Store,762.341 +FDF52,9.3,Low Fat,0.067055339,Frozen Foods,184.2292,OUT018,2009,Medium,Tier 3,Supermarket Type2,1277.0044 +FDZ33,10.195,Low Fat,0.107376743,Snack Foods,147.6076,OUT035,2004,Small,Tier 2,Supermarket Type1,3547.3824 +FDP48,,Regular,0.043810028,Baking Goods,181.395,OUT027,1985,Medium,Tier 3,Supermarket Type3,6042.135 +FDW56,7.68,Low Fat,0.118672537,Fruits and Vegetables,192.2162,OUT010,1998,,Tier 3,Grocery Store,384.8324 +FDC26,10.195,Low Fat,0.126897925,Canned,110.6886,OUT018,2009,Medium,Tier 3,Supermarket Type2,1223.0746 +FDF34,9.3,Regular,0.014076503,Snack Foods,200.0084,OUT018,2009,Medium,Tier 3,Supermarket Type2,2182.4924 +FDJ33,8.895,Regular,0.088305478,Snack Foods,123.473,OUT035,2004,Small,Tier 2,Supermarket Type1,1478.076 +FDD04,16,Low Fat,0.090153756,Dairy,143.2154,OUT045,2002,,Tier 2,Supermarket Type1,1418.154 +NCJ31,19.2,Low Fat,0.182501773,Others,239.2196,OUT013,1987,High,Tier 3,Supermarket Type1,5061.4116 +FDO57,20.75,Low Fat,0.108710162,Snack Foods,161.7578,OUT046,1997,Small,Tier 1,Supermarket Type1,2888.2404 +FDM36,,Regular,0.058446424,Baking Goods,172.1422,OUT027,1985,Medium,Tier 3,Supermarket Type3,5518.1504 +NCY05,13.5,Low Fat,0.054990009,Health and Hygiene,35.2874,OUT046,1997,Small,Tier 1,Supermarket Type1,741.0354 +FDS44,,Regular,0.15528831,Fruits and Vegetables,241.7538,OUT027,1985,Medium,Tier 3,Supermarket Type3,9133.4444 +FDZ39,19.7,Regular,0.018021361,Meat,101.199,OUT035,2004,Small,Tier 2,Supermarket Type1,1857.582 +NCM31,6.095,Low Fat,0.0816559,Others,143.3154,OUT017,2007,,Tier 2,Supermarket Type1,2836.308 +DRK11,8.21,Low Fat,0.010755465,Hard Drinks,150.8392,OUT013,1987,High,Tier 3,Supermarket Type1,2982.784 +FDO34,17.7,Low Fat,0.050111641,Snack Foods,165.9816,OUT010,1998,,Tier 3,Grocery Store,167.7816 +NCL30,18.1,Low Fat,0.048931174,Household,127.3336,OUT035,2004,Small,Tier 2,Supermarket Type1,1150.5024 +FDK28,5.695,Low Fat,0.065960909,Frozen Foods,259.2646,OUT017,2007,,Tier 2,Supermarket Type1,9275.9256 +DRJ39,20.25,Low Fat,0.036319195,Dairy,219.3482,OUT035,2004,Small,Tier 2,Supermarket Type1,5038.1086 +NCP06,,Low Fat,0.039055756,Household,152.3366,OUT027,1985,Medium,Tier 3,Supermarket Type3,2115.9124 +FDE33,,Regular,0.049395242,Fruits and Vegetables,80.3644,OUT027,1985,Medium,Tier 3,Supermarket Type3,1885.5456 +FDZ44,8.185,Low Fat,0.038789271,Fruits and Vegetables,115.6808,OUT049,1999,Medium,Tier 1,Supermarket Type1,703.0848 +FDV46,18.2,Low Fat,0.012659235,Snack Foods,140.718,OUT018,2009,Medium,Tier 3,Supermarket Type2,2656.542 +NCO06,19.25,LF,0.108010006,Household,33.3558,OUT035,2004,Small,Tier 2,Supermarket Type1,713.0718 +DRG03,14.5,Low Fat,0.061934991,Dairy,154.4998,OUT013,1987,High,Tier 3,Supermarket Type1,1691.7978 +FDU37,9.5,Regular,0.104421237,Canned,80.196,OUT013,1987,High,Tier 3,Supermarket Type1,2157.192 +FDI57,19.85,Low Fat,0.053980686,Seafood,196.8768,OUT013,1987,High,Tier 3,Supermarket Type1,2561.9984 +FDM45,8.655,Regular,0.088121336,Snack Foods,119.7756,OUT013,1987,High,Tier 3,Supermarket Type1,2059.9852 +FDC26,10.195,Low Fat,0.126359196,Canned,109.2886,OUT035,2004,Small,Tier 2,Supermarket Type1,1334.2632 +FDU14,,Low Fat,0.034584356,Dairy,248.375,OUT027,1985,Medium,Tier 3,Supermarket Type3,10236.675 +FDB26,14,reg,0.031267496,Canned,51.464,OUT046,1997,Small,Tier 1,Supermarket Type1,692.432 +FDC29,8.39,Regular,0.024304264,Frozen Foods,114.0176,OUT018,2009,Medium,Tier 3,Supermarket Type2,1488.7288 +FDY58,11.65,Low Fat,0.040144377,Snack Foods,228.9694,OUT017,2007,,Tier 2,Supermarket Type1,6622.7126 +FDR59,14.5,Regular,0.063851475,Breads,260.4594,OUT035,2004,Small,Tier 2,Supermarket Type1,3139.9128 +FDS03,,Low Fat,0.079243005,Meat,65.8826,OUT027,1985,Medium,Tier 3,Supermarket Type3,1614.565 +FDR43,18.2,Low Fat,0.161355122,Fruits and Vegetables,38.319,OUT013,1987,High,Tier 3,Supermarket Type1,585.904 +FDZ25,,Regular,0.02748331,Canned,169.379,OUT027,1985,Medium,Tier 3,Supermarket Type3,5602.707 +NCN26,10.85,Low Fat,0.028738058,Household,117.1808,OUT045,2002,,Tier 2,Supermarket Type1,703.0848 +FDO38,17.25,Low Fat,0.073135768,Canned,77.2986,OUT018,2009,Medium,Tier 3,Supermarket Type2,1012.6818 +FDP28,13.65,Regular,0.081096613,Frozen Foods,261.2936,OUT017,2007,,Tier 2,Supermarket Type1,3131.9232 +FDG31,12.15,Low Fat,0.063430788,Meat,65.4826,OUT010,1998,,Tier 3,Grocery Store,258.3304 +FDI45,13.1,LF,0.037549969,Fruits and Vegetables,176.1054,OUT013,1987,High,Tier 3,Supermarket Type1,4027.4242 +NCS54,13.6,Low Fat,0.016726506,Household,176.037,OUT010,1998,,Tier 3,Grocery Store,352.874 +FDE17,20.1,Regular,0.054565932,Frozen Foods,152.2366,OUT045,2002,,Tier 2,Supermarket Type1,2418.1856 +NCG06,16.35,Low Fat,0.029445361,Household,257.6646,OUT046,1997,Small,Tier 1,Supermarket Type1,2061.3168 +FDQ57,,Low Fat,0.048932713,Snack Foods,144.476,OUT019,1985,Small,Tier 1,Grocery Store,146.476 +NCB31,6.235,Low Fat,0.118651919,Household,263.991,OUT035,2004,Small,Tier 2,Supermarket Type1,4207.856 +NCP29,8.42,Low Fat,0.112728355,Health and Hygiene,65.8168,OUT018,2009,Medium,Tier 3,Supermarket Type2,830.9184 +NCX29,,Low Fat,0.156094569,Health and Hygiene,144.3102,OUT019,1985,Small,Tier 1,Grocery Store,145.8102 +FDU37,9.5,Regular,0.104933928,Canned,78.796,OUT018,2009,Medium,Tier 3,Supermarket Type2,1198.44 +FDM02,12.5,Regular,0.12341737,Canned,86.0198,OUT010,1998,,Tier 3,Grocery Store,87.2198 +FDN16,12.6,Regular,0.062700289,Frozen Foods,102.199,OUT046,1997,Small,Tier 1,Supermarket Type1,1960.781 +FDR46,16.85,Low Fat,0.139417654,Snack Foods,147.476,OUT046,1997,Small,Tier 1,Supermarket Type1,2929.52 +FDE50,,Regular,0.01612717,Canned,189.3556,OUT027,1985,Medium,Tier 3,Supermarket Type3,2253.0672 +FDL52,6.635,reg,0.077145553,Frozen Foods,39.8506,OUT010,1998,,Tier 3,Grocery Store,75.9012 +FDQ49,20.2,Regular,0.039215075,Breakfast,157.663,OUT013,1987,High,Tier 3,Supermarket Type1,2190.482 +FDI14,14.1,Low Fat,0.089859642,Canned,140.2496,OUT045,2002,,Tier 2,Supermarket Type1,1693.7952 +FDS16,15.15,Regular,0.066121873,Frozen Foods,145.676,OUT013,1987,High,Tier 3,Supermarket Type1,3661.9 +FDU15,13.65,Regular,0.026643448,Meat,37.9532,OUT049,1999,Medium,Tier 1,Supermarket Type1,862.8768 +NCG43,,Low Fat,0.073879939,Household,94.0462,OUT027,1985,Medium,Tier 3,Supermarket Type3,1850.924 +FDR23,,Low Fat,0.08139146,Breads,177.837,OUT027,1985,Medium,Tier 3,Supermarket Type3,6351.732 +FDS52,,Low Fat,0.005448005,Frozen Foods,102.1016,OUT027,1985,Medium,Tier 3,Supermarket Type3,3542.056 +NCP18,12.15,Low Fat,0.028714747,Household,151.9708,OUT018,2009,Medium,Tier 3,Supermarket Type2,3611.2992 +DRF23,,Low Fat,0.122058364,Hard Drinks,172.8396,OUT027,1985,Medium,Tier 3,Supermarket Type3,7152.0236 +FDO09,13.5,Regular,0.125528734,Snack Foods,262.191,OUT045,2002,,Tier 2,Supermarket Type1,6048.793 +FDB40,17.5,Regular,0.007555176,Dairy,145.9102,OUT045,2002,,Tier 2,Supermarket Type1,2187.153 +DRK37,,Low Fat,0.077046505,Soft Drinks,189.453,OUT019,1985,Small,Tier 1,Grocery Store,759.012 +DRN11,7.85,Low Fat,0.162980276,Hard Drinks,145.2444,OUT046,1997,Small,Tier 1,Supermarket Type1,1451.444 +FDE22,9.695,Low Fat,0.029632784,Snack Foods,159.692,OUT045,2002,,Tier 2,Supermarket Type1,958.752 +FDF04,17.5,Low Fat,0.013634468,Frozen Foods,256.4304,OUT035,2004,Small,Tier 2,Supermarket Type1,1808.3128 +FDE41,9.195,Regular,0.064376263,Frozen Foods,83.1566,OUT017,2007,,Tier 2,Supermarket Type1,1099.2358 +FDW08,,LF,0.147663025,Fruits and Vegetables,106.028,OUT027,1985,Medium,Tier 3,Supermarket Type3,1810.976 +NCD54,21.1,Low Fat,0.029003459,Household,143.4786,OUT035,2004,Small,Tier 2,Supermarket Type1,2311.6576 +FDZ33,10.195,low fat,0.107834541,Snack Foods,146.5076,OUT018,2009,Medium,Tier 3,Supermarket Type2,1330.2684 +FDO23,17.85,Low Fat,0.146399663,Breads,93.8436,OUT035,2004,Small,Tier 2,Supermarket Type1,1418.154 +FDN34,15.6,Regular,0.04575559,Snack Foods,167.1132,OUT035,2004,Small,Tier 2,Supermarket Type1,2874.9244 +FDL39,16.1,Regular,0.063278652,Dairy,182.1318,OUT013,1987,High,Tier 3,Supermarket Type1,2345.6134 +FDT28,13.3,Low Fat,0.063664998,Frozen Foods,151.6708,OUT049,1999,Medium,Tier 1,Supermarket Type1,3912.2408 +FDH33,12.85,Low Fat,0.122221269,Snack Foods,45.9428,OUT018,2009,Medium,Tier 3,Supermarket Type2,1274.3412 +FDA34,11.5,Low Fat,0.014944614,Starchy Foods,171.808,OUT017,2007,,Tier 2,Supermarket Type1,5712.564 +FDZ56,16.25,Low Fat,0.025732114,Fruits and Vegetables,166.4474,OUT035,2004,Small,Tier 2,Supermarket Type1,5390.3168 +DRH23,14.65,Low Fat,0.171281641,Hard Drinks,54.0614,OUT017,2007,,Tier 2,Supermarket Type1,1160.4894 +NCO18,13.15,Low Fat,0.024646608,Household,177.4686,OUT035,2004,Small,Tier 2,Supermarket Type1,5510.8266 +DRG27,8.895,Low Fat,0,Dairy,42.0138,OUT018,2009,Medium,Tier 3,Supermarket Type2,568.5932 +FDM28,15.7,Low Fat,0.075661985,Frozen Foods,181.366,OUT010,1998,,Tier 3,Grocery Store,179.766 +NCY41,16.75,Low Fat,0.126765903,Health and Hygiene,35.7532,OUT010,1998,,Tier 3,Grocery Store,143.8128 +FDD21,10.3,Regular,0.030563449,Fruits and Vegetables,114.4176,OUT035,2004,Small,Tier 2,Supermarket Type1,2633.9048 +FDD44,8.05,Regular,0.078522357,Fruits and Vegetables,257.1646,OUT049,1999,Medium,Tier 1,Supermarket Type1,6183.9504 +FDP16,18.6,Low Fat,0.039294854,Frozen Foods,246.6802,OUT046,1997,Small,Tier 1,Supermarket Type1,2702.4822 +FDQ37,20.75,Low Fat,0.089260667,Breakfast,193.4478,OUT046,1997,Small,Tier 1,Supermarket Type1,4843.695 +NCY05,13.5,Low Fat,0.05510153,Health and Hygiene,37.0874,OUT045,2002,,Tier 2,Supermarket Type1,952.7598 +NCE07,8.18,low fat,0.013127548,Household,142.0154,OUT035,2004,Small,Tier 2,Supermarket Type1,1985.4156 +DRI51,17.25,Low Fat,0.042233642,Dairy,173.3764,OUT035,2004,Small,Tier 2,Supermarket Type1,2061.3168 +NCI31,20,Low Fat,0.081492092,Others,35.519,OUT045,2002,,Tier 2,Supermarket Type1,1025.332 +FDK60,16.5,Regular,0,Baking Goods,96.2068,OUT046,1997,Small,Tier 1,Supermarket Type1,3013.4108 +FDY12,9.8,Regular,0.14061104,Baking Goods,49.8008,OUT046,1997,Small,Tier 1,Supermarket Type1,809.6128 +FDO38,17.25,Low Fat,0.072952298,Canned,76.0986,OUT049,1999,Medium,Tier 1,Supermarket Type1,623.1888 +FDP11,15.85,Low Fat,0.069087481,Breads,218.7166,OUT035,2004,Small,Tier 2,Supermarket Type1,1088.583 +FDC21,,Regular,0.075215349,Fruits and Vegetables,108.4254,OUT019,1985,Small,Tier 1,Grocery Store,217.0508 +NCF54,18,Low Fat,0.047645037,Household,172.6422,OUT017,2007,,Tier 2,Supermarket Type1,2931.5174 +FDC35,,Low Fat,0.122242847,Starchy Foods,207.5638,OUT027,1985,Medium,Tier 3,Supermarket Type3,4555.4036 +FDV43,16,Low Fat,0.076975118,Fruits and Vegetables,46.2086,OUT049,1999,Medium,Tier 1,Supermarket Type1,490.6946 +DRE12,4.59,Low Fat,0.070890602,Soft Drinks,111.686,OUT049,1999,Medium,Tier 1,Supermarket Type1,1584.604 +DRE27,11.85,Low Fat,0.132560174,Dairy,97.2726,OUT013,1987,High,Tier 3,Supermarket Type1,782.9808 +DRC36,,Regular,0.044767032,Soft Drinks,173.7054,OUT027,1985,Medium,Tier 3,Supermarket Type3,5778.4782 +FDZ38,,Low Fat,0.007962273,Dairy,174.0422,OUT027,1985,Medium,Tier 3,Supermarket Type3,5173.266 +NCW42,18.2,LF,0.058799705,Household,220.7456,OUT017,2007,,Tier 2,Supermarket Type1,4420.912 +NCZ18,7.825,low fat,0.186445212,Household,255.5698,OUT045,2002,,Tier 2,Supermarket Type1,1522.0188 +FDL13,,Regular,0.098606543,Breakfast,232.73,OUT019,1985,Small,Tier 1,Grocery Store,932.12 +NCN18,8.895,Low Fat,0.125222705,Household,113.3544,OUT018,2009,Medium,Tier 3,Supermarket Type2,1006.6896 +FDI41,18.5,reg,0.062609071,Frozen Foods,148.6418,OUT017,2007,,Tier 2,Supermarket Type1,1765.7016 +FDV22,14.85,Regular,0.009930514,Snack Foods,157.463,OUT013,1987,High,Tier 3,Supermarket Type1,2503.408 +NCB43,,Low Fat,0.099428487,Household,187.8898,OUT027,1985,Medium,Tier 3,Supermarket Type3,7296.5022 +FDQ46,7.51,Low Fat,0.103793399,Snack Foods,110.1544,OUT035,2004,Small,Tier 2,Supermarket Type1,2684.5056 +FDC44,15.6,Low Fat,0,Fruits and Vegetables,111.9518,OUT049,1999,Medium,Tier 1,Supermarket Type1,2163.1842 +FDB22,8.02,Low Fat,0.111419588,Snack Foods,154.3998,OUT035,2004,Small,Tier 2,Supermarket Type1,3383.5956 +FDV23,11,Low Fat,0.106051405,Breads,124.4046,OUT045,2002,,Tier 2,Supermarket Type1,2241.0828 +FDK10,,Regular,0.04016342,Snack Foods,181.166,OUT027,1985,Medium,Tier 3,Supermarket Type3,3415.554 +FDF05,17.5,Low Fat,0.026925385,Frozen Foods,264.391,OUT045,2002,,Tier 2,Supermarket Type1,5259.82 +FDL33,7.235,Low Fat,0.099962524,Snack Foods,193.8452,OUT046,1997,Small,Tier 1,Supermarket Type1,1957.452 +FDD20,,Low Fat,0.020614212,Fruits and Vegetables,126.4046,OUT027,1985,Medium,Tier 3,Supermarket Type3,5353.6978 +NCM54,,Low Fat,0.050692386,Household,125.6678,OUT027,1985,Medium,Tier 3,Supermarket Type3,4832.3764 +FDW48,18,Low Fat,0.008589133,Baking Goods,81.0618,OUT017,2007,,Tier 2,Supermarket Type1,1450.1124 +DRF36,16.1,Low Fat,0.023673342,Soft Drinks,189.0846,OUT018,2009,Medium,Tier 3,Supermarket Type2,5350.3688 +NCM06,7.475,LF,0.075881475,Household,155.2656,OUT045,2002,,Tier 2,Supermarket Type1,2934.8464 +NCA54,16.5,Low Fat,0.061330521,Household,178.7318,OUT010,1998,,Tier 3,Grocery Store,360.8636 +FDT46,11.35,Low Fat,0.030869612,Snack Foods,49.8008,OUT045,2002,,Tier 2,Supermarket Type1,708.4112 +FDH20,16.1,Regular,0.024944396,Fruits and Vegetables,95.441,OUT035,2004,Small,Tier 2,Supermarket Type1,2220.443 +FDT38,18.7,Low Fat,0.057654132,Dairy,83.1566,OUT045,2002,,Tier 2,Supermarket Type1,1606.5754 +NCI17,8.645,Low Fat,0.143713508,Health and Hygiene,96.641,OUT045,2002,,Tier 2,Supermarket Type1,868.869 +FDO40,17.1,Low Fat,0.032812669,Frozen Foods,147.1392,OUT017,2007,,Tier 2,Supermarket Type1,2237.088 +FDP12,9.8,Regular,0.045266806,Baking Goods,36.9874,OUT046,1997,Small,Tier 1,Supermarket Type1,705.748 +FDI44,,Low Fat,0.099747488,Fruits and Vegetables,75.2328,OUT027,1985,Medium,Tier 3,Supermarket Type3,1544.656 +FDB21,,Low Fat,0,Fruits and Vegetables,242.9854,OUT027,1985,Medium,Tier 3,Supermarket Type3,6767.1912 +FDG16,15.25,Low Fat,0.089742065,Frozen Foods,213.7192,OUT013,1987,High,Tier 3,Supermarket Type1,1078.596 +NCZ42,10.5,Low Fat,0.011351778,Household,236.5248,OUT017,2007,,Tier 2,Supermarket Type1,4029.4216 +NCJ30,5.82,LF,0.081096613,Household,170.379,OUT017,2007,,Tier 2,Supermarket Type1,1018.674 +FDV49,10,Low Fat,0.025827199,Canned,263.2226,OUT046,1997,Small,Tier 1,Supermarket Type1,3700.5164 +NCO43,5.5,LF,0,Others,103.1016,OUT045,2002,,Tier 2,Supermarket Type1,2024.032 +NCF18,18.35,Low Fat,0.148938624,Household,191.9504,OUT010,1998,,Tier 3,Grocery Store,767.0016 +NCX41,19,Low Fat,0,Health and Hygiene,211.0244,OUT010,1998,,Tier 3,Grocery Store,1482.0708 +FDY11,6.71,Regular,0.029535852,Baking Goods,67.5142,OUT013,1987,High,Tier 3,Supermarket Type1,593.2278 +FDU46,10.3,Regular,0.011143599,Snack Foods,88.254,OUT049,1999,Medium,Tier 1,Supermarket Type1,1125.202 +NCI18,18.35,Low Fat,0.014045832,Household,222.7746,OUT049,1999,Medium,Tier 1,Supermarket Type1,1570.6222 +FDL38,13.8,reg,0.014730322,Canned,90.9172,OUT035,2004,Small,Tier 2,Supermarket Type1,2141.2128 +FDY60,10.5,Regular,0.026520107,Baking Goods,144.8128,OUT017,2007,,Tier 2,Supermarket Type1,2157.192 +FDF53,20.75,Regular,0.083736551,Frozen Foods,178.7318,OUT049,1999,Medium,Tier 1,Supermarket Type1,3428.2042 +NCM05,,Low Fat,0.059557164,Health and Hygiene,263.7226,OUT027,1985,Medium,Tier 3,Supermarket Type3,6872.3876 +FDR13,9.895,Regular,0.028837829,Canned,117.8492,OUT018,2009,Medium,Tier 3,Supermarket Type2,1506.0396 +FDA49,,Low Fat,0.113669629,Canned,89.0198,OUT019,1985,Small,Tier 1,Grocery Store,174.4396 +FDY52,,Low Fat,0.012865901,Frozen Foods,59.3536,OUT019,1985,Small,Tier 1,Grocery Store,122.5072 +FDL02,,Regular,0.182236555,Canned,107.1622,OUT019,1985,Small,Tier 1,Grocery Store,211.7244 +FDO24,11.1,Low Fat,0.176069023,Baking Goods,156.7604,OUT013,1987,High,Tier 3,Supermarket Type1,1901.5248 +FDM08,10.1,reg,0.053574075,Fruits and Vegetables,223.7088,OUT035,2004,Small,Tier 2,Supermarket Type1,2684.5056 +FDJ02,,Regular,0.044063785,Canned,147.2418,OUT019,1985,Small,Tier 1,Grocery Store,294.2836 +FDW40,14,Regular,0.105573769,Frozen Foods,143.9812,OUT018,2009,Medium,Tier 3,Supermarket Type2,1139.8496 +FDT46,,Low Fat,0.030657949,Snack Foods,50.5008,OUT027,1985,Medium,Tier 3,Supermarket Type3,1012.016 +FDY08,9.395,Regular,0.172042892,Fruits and Vegetables,139.9838,OUT017,2007,,Tier 2,Supermarket Type1,1966.7732 +FDM21,,Low Fat,0.064052392,Snack Foods,256.1646,OUT027,1985,Medium,Tier 3,Supermarket Type3,7472.2734 +FDH26,,Regular,0.034531702,Canned,142.2496,OUT027,1985,Medium,Tier 3,Supermarket Type3,2399.5432 +NCM42,6.13,Low Fat,0.028365524,Household,110.0912,OUT049,1999,Medium,Tier 1,Supermarket Type1,1637.868 +FDW13,8.5,Low Fat,0.097866209,Canned,51.1324,OUT035,2004,Small,Tier 2,Supermarket Type1,1350.2424 +FDN04,,Regular,0.01401884,Frozen Foods,178.1344,OUT027,1985,Medium,Tier 3,Supermarket Type3,3747.1224 +NCD07,9.1,Low Fat,0,Household,114.4518,OUT046,1997,Small,Tier 1,Supermarket Type1,1593.9252 +FDB34,15.25,Low Fat,0.044539371,Snack Foods,85.3198,OUT010,1998,,Tier 3,Grocery Store,261.6594 +FDD09,13.5,Low Fat,0,Fruits and Vegetables,179.9976,OUT013,1987,High,Tier 3,Supermarket Type1,4889.6352 +DRH59,10.8,low fat,0,Hard Drinks,72.338,OUT049,1999,Medium,Tier 1,Supermarket Type1,805.618 +DRN36,15.2,Low Fat,0.050168354,Soft Drinks,95.3752,OUT035,2004,Small,Tier 2,Supermarket Type1,1438.128 +DRA24,19.35,Regular,0.040154087,Soft Drinks,164.6868,OUT017,2007,,Tier 2,Supermarket Type1,1146.5076 +FDY36,,Low Fat,0.009364957,Baking Goods,74.238,OUT027,1985,Medium,Tier 3,Supermarket Type3,1171.808 +FDG34,11.5,Regular,0.037539164,Snack Foods,106.9254,OUT013,1987,High,Tier 3,Supermarket Type1,3038.7112 +FDK43,9.8,Low Fat,0.026992588,Meat,127.302,OUT017,2007,,Tier 2,Supermarket Type1,2277.036 +NCM06,7.475,Low Fat,0.076156245,Household,156.4656,OUT017,2007,,Tier 2,Supermarket Type1,2008.0528 +FDK22,9.8,Low Fat,0.026192765,Snack Foods,215.685,OUT018,2009,Medium,Tier 3,Supermarket Type2,649.155 +FDF21,,Regular,0.058542509,Fruits and Vegetables,188.353,OUT027,1985,Medium,Tier 3,Supermarket Type3,4364.319 +FDO33,14.75,Low Fat,0.089686322,Snack Foods,115.3518,OUT018,2009,Medium,Tier 3,Supermarket Type2,1821.6288 +NCO43,5.5,Low Fat,0.047364617,Others,100.0016,OUT017,2007,,Tier 2,Supermarket Type1,708.4112 +FDX15,17.2,Low Fat,0.156269303,Meat,159.6578,OUT035,2004,Small,Tier 2,Supermarket Type1,3048.6982 +FDS10,19.2,Low Fat,0.035185588,Snack Foods,181.3318,OUT046,1997,Small,Tier 1,Supermarket Type1,1443.4544 +FDD46,,Low Fat,0.247321039,Snack Foods,152.3998,OUT019,1985,Small,Tier 1,Grocery Store,153.7998 +FDV22,14.85,Regular,0.009979271,Snack Foods,155.763,OUT018,2009,Medium,Tier 3,Supermarket Type2,3129.26 +NCR29,7.565,Low Fat,0.054863459,Health and Hygiene,58.393,OUT018,2009,Medium,Tier 3,Supermarket Type2,509.337 +FDU34,18.25,Low Fat,0.075620262,Snack Foods,123.8046,OUT017,2007,,Tier 2,Supermarket Type1,3486.1288 +FDZ35,9.6,Regular,0.02236923,Breads,104.799,OUT018,2009,Medium,Tier 3,Supermarket Type2,1341.587 +FDA26,7.855,Regular,0.073906461,Dairy,218.4482,OUT035,2004,Small,Tier 2,Supermarket Type1,4819.0604 +FDP38,10.1,Low Fat,0.032283676,Canned,52.2008,OUT017,2007,,Tier 2,Supermarket Type1,759.012 +FDT22,10.395,Low Fat,0.11207602,Snack Foods,58.022,OUT035,2004,Small,Tier 2,Supermarket Type1,659.142 +FDA50,16.25,Low Fat,0.087668236,Dairy,94.941,OUT017,2007,,Tier 2,Supermarket Type1,1737.738 +FDY10,17.6,Low Fat,0.049067877,Snack Foods,115.6176,OUT046,1997,Small,Tier 1,Supermarket Type1,2519.3872 +FDC09,15.5,Regular,0.026355345,Fruits and Vegetables,100.8332,OUT045,2002,,Tier 2,Supermarket Type1,1537.998 +FDT19,7.59,Regular,0.145631695,Fruits and Vegetables,172.808,OUT018,2009,Medium,Tier 3,Supermarket Type2,2250.404 +FDO34,,Low Fat,0.029793955,Snack Foods,167.2816,OUT027,1985,Medium,Tier 3,Supermarket Type3,5704.5744 +NCV54,11.1,Low Fat,0.033160417,Household,119.6124,OUT049,1999,Medium,Tier 1,Supermarket Type1,2251.7356 +FDH57,,Low Fat,0.035574413,Fruits and Vegetables,131.4284,OUT027,1985,Medium,Tier 3,Supermarket Type3,5404.9644 +FDA28,16.1,Regular,0.047801883,Frozen Foods,127.4362,OUT046,1997,Small,Tier 1,Supermarket Type1,2265.0516 +FDB05,5.155,Low Fat,0.083198341,Frozen Foods,246.0776,OUT046,1997,Small,Tier 1,Supermarket Type1,990.7104 +FDK45,,Low Fat,0.059281315,Seafood,111.586,OUT019,1985,Small,Tier 1,Grocery Store,339.558 +DRH01,,Low Fat,0.171417316,Soft Drinks,173.0738,OUT019,1985,Small,Tier 1,Grocery Store,347.5476 +FDY52,6.365,Low Fat,0.007348286,Frozen Foods,62.8536,OUT046,1997,Small,Tier 1,Supermarket Type1,796.2968 +FDR48,11.65,LF,0,Baking Goods,152.6024,OUT035,2004,Small,Tier 2,Supermarket Type1,303.6048 +FDY15,18.25,Regular,0.170795745,Dairy,154.463,OUT035,2004,Small,Tier 2,Supermarket Type1,2190.482 +FDM51,11.8,Regular,0.025966531,Meat,102.2674,OUT049,1999,Medium,Tier 1,Supermarket Type1,2444.8176 +FDR43,18.2,Low Fat,0.161489509,Fruits and Vegetables,37.619,OUT046,1997,Small,Tier 1,Supermarket Type1,366.19 +FDW09,13.65,reg,0.025899245,Snack Foods,81.1302,OUT013,1987,High,Tier 3,Supermarket Type1,792.302 +FDV44,8.365,Regular,0.039906377,Fruits and Vegetables,191.3188,OUT049,1999,Medium,Tier 1,Supermarket Type1,1713.7692 +DRH37,,Low Fat,0.072864869,Soft Drinks,165.2526,OUT019,1985,Small,Tier 1,Grocery Store,822.263 +FDZ47,20.7,Regular,0.079419755,Baking Goods,99.8042,OUT049,1999,Medium,Tier 1,Supermarket Type1,1488.063 +NCP43,17.75,Low Fat,0.03050705,Others,180.366,OUT046,1997,Small,Tier 1,Supermarket Type1,2336.958 +FDL26,18,Low Fat,0.073490977,Canned,157.3972,OUT018,2009,Medium,Tier 3,Supermarket Type2,778.986 +DRM35,9.695,Low Fat,0.070843019,Hard Drinks,177.7344,OUT017,2007,,Tier 2,Supermarket Type1,1605.9096 +FDM39,6.42,Low Fat,0.053688479,Dairy,178.3002,OUT018,2009,Medium,Tier 3,Supermarket Type2,2328.3026 +DRD15,10.6,Low Fat,0.056911107,Dairy,233.9642,OUT045,2002,,Tier 2,Supermarket Type1,3717.8272 +NCK06,5.03,Low Fat,0.014472516,Household,122.0756,OUT010,1998,,Tier 3,Grocery Store,121.1756 +FDV04,7.825,Regular,0.150319469,Frozen Foods,156.9288,OUT045,2002,,Tier 2,Supermarket Type1,1571.288 +FDG46,,Regular,0.032750291,Snack Foods,112.1518,OUT027,1985,Medium,Tier 3,Supermarket Type3,5351.0346 +FDO19,17.7,Regular,0.016622448,Fruits and Vegetables,50.2034,OUT049,1999,Medium,Tier 1,Supermarket Type1,1166.4816 +NCN05,8.235,Low Fat,0.014482153,Health and Hygiene,182.295,OUT049,1999,Medium,Tier 1,Supermarket Type1,3661.9 +DRA12,11.6,Low Fat,0,Soft Drinks,141.6154,OUT045,2002,,Tier 2,Supermarket Type1,3829.0158 +FDJ02,17.2,Regular,0.025205909,Canned,149.1418,OUT049,1999,Medium,Tier 1,Supermarket Type1,1177.1344 +NCK17,11,Low Fat,0.037971697,Health and Hygiene,38.948,OUT045,2002,,Tier 2,Supermarket Type1,519.324 +FDO58,19.6,Low Fat,0.039544237,Snack Foods,163.6526,OUT013,1987,High,Tier 3,Supermarket Type1,1151.1682 +FDB22,8.02,Low Fat,0.111613921,Snack Foods,152.6998,OUT049,1999,Medium,Tier 1,Supermarket Type1,3383.5956 +FDG33,5.365,Regular,0.140524691,Seafood,172.7764,OUT045,2002,,Tier 2,Supermarket Type1,2233.0932 +FDK58,11.35,Regular,0.045073782,Snack Foods,101.9016,OUT045,2002,,Tier 2,Supermarket Type1,2631.2416 +DRH49,,Low Fat,0.043168763,Soft Drinks,82.8592,OUT019,1985,Small,Tier 1,Grocery Store,165.1184 +FDT43,16.35,Low Fat,0.020547951,Fruits and Vegetables,51.2324,OUT046,1997,Small,Tier 1,Supermarket Type1,571.2564 +NCR38,17.25,Low Fat,0.113694957,Household,253.4724,OUT049,1999,Medium,Tier 1,Supermarket Type1,6040.1376 +DRI39,13.8,Low Fat,0.097043739,Dairy,57.493,OUT035,2004,Small,Tier 2,Supermarket Type1,1358.232 +NCZ05,8.485,Low Fat,0.058121214,Health and Hygiene,104.499,OUT035,2004,Small,Tier 2,Supermarket Type1,1238.388 +FDU21,11.8,reg,0.07665661,Snack Foods,32.3558,OUT013,1987,High,Tier 3,Supermarket Type1,169.779 +NCP54,15.35,Low Fat,0.035204319,Household,122.873,OUT049,1999,Medium,Tier 1,Supermarket Type1,2832.979 +NCX29,10,Low Fat,0.089333332,Health and Hygiene,145.6102,OUT045,2002,,Tier 2,Supermarket Type1,2624.5836 +FDV01,19.2,Regular,0,Canned,153.3314,OUT017,2007,,Tier 2,Supermarket Type1,3257.7594 +NCS17,18.6,Low Fat,0.080956792,Health and Hygiene,95.2436,OUT017,2007,,Tier 2,Supermarket Type1,1796.3284 +NCN07,18.5,Low Fat,0.03391645,Others,130.9284,OUT013,1987,High,Tier 3,Supermarket Type1,1713.7692 +FDB14,20.25,Regular,0.102704495,Canned,94.312,OUT035,2004,Small,Tier 2,Supermarket Type1,2982.784 +NCJ18,12.35,Low Fat,0.163910938,Household,119.2124,OUT035,2004,Small,Tier 2,Supermarket Type1,1303.6364 +FDF57,14.5,Regular,0.058827383,Fruits and Vegetables,172.2448,OUT046,1997,Small,Tier 1,Supermarket Type1,2897.5616 +DRG01,14.8,Low Fat,0.044840933,Soft Drinks,78.367,OUT013,1987,High,Tier 3,Supermarket Type1,918.804 +FDA02,14,Regular,0.029843736,Dairy,143.9786,OUT018,2009,Medium,Tier 3,Supermarket Type2,866.8716 +DRJ37,10.8,Low Fat,0.061446997,Soft Drinks,150.4024,OUT017,2007,,Tier 2,Supermarket Type1,2884.2456 +NCP55,14.65,Low Fat,0.011180713,Others,53.8614,OUT013,1987,High,Tier 3,Supermarket Type1,221.0456 +FDW45,,Low Fat,0.038822077,Snack Foods,147.7418,OUT027,1985,Medium,Tier 3,Supermarket Type3,1618.5598 +FDK38,6.65,Low Fat,0.053397989,Canned,149.3734,OUT045,2002,,Tier 2,Supermarket Type1,296.9468 +NCZ30,6.59,Low Fat,0.043828293,Household,121.4098,OUT010,1998,,Tier 3,Grocery Store,241.0196 +FDK08,,Regular,0.214139786,Fruits and Vegetables,102.4016,OUT019,1985,Small,Tier 1,Grocery Store,202.4032 +DRY23,9.395,Regular,0.109075742,Soft Drinks,42.9112,OUT035,2004,Small,Tier 2,Supermarket Type1,426.112 +FDT31,19.75,Low Fat,0.012448294,Fruits and Vegetables,188.2872,OUT046,1997,Small,Tier 1,Supermarket Type1,2647.2208 +FDU52,7.56,Low Fat,0.064030636,Frozen Foods,154.463,OUT018,2009,Medium,Tier 3,Supermarket Type2,2503.408 +NCG19,20.25,Low Fat,0.14781046,Household,234.8616,OUT013,1987,High,Tier 3,Supermarket Type1,2812.3392 +NCR30,20.6,Low Fat,0.071136948,Household,76.3696,OUT045,2002,,Tier 2,Supermarket Type1,372.848 +FDN23,6.575,Regular,0.07566089,Breads,145.4444,OUT045,2002,,Tier 2,Supermarket Type1,2612.5992 +FDQ01,19.7,Regular,0.16102755,Canned,254.1014,OUT045,2002,,Tier 2,Supermarket Type1,4845.0266 +FDO22,13.5,Regular,0.029893094,Snack Foods,81.096,OUT010,1998,,Tier 3,Grocery Store,159.792 +DRE13,6.28,Low Fat,0.027761289,Soft Drinks,85.8198,OUT045,2002,,Tier 2,Supermarket Type1,872.198 +FDL44,18.25,Low Fat,0.012272797,Fruits and Vegetables,160.2894,OUT035,2004,Small,Tier 2,Supermarket Type1,3235.788 +FDT34,9.3,Low Fat,0.174317307,Snack Foods,106.7964,OUT035,2004,Small,Tier 2,Supermarket Type1,841.5712 +DRM23,16.6,Low Fat,0.135707553,Hard Drinks,170.6422,OUT035,2004,Small,Tier 2,Supermarket Type1,1379.5376 +FDF32,16.35,Low Fat,0.068219025,Fruits and Vegetables,198.9426,OUT045,2002,,Tier 2,Supermarket Type1,3559.3668 +NCE18,10,Low Fat,0.021468792,Household,251.675,OUT045,2002,,Tier 2,Supermarket Type1,4244.475 +FDA51,,Regular,0.163882129,Dairy,113.2518,OUT027,1985,Medium,Tier 3,Supermarket Type3,3415.554 +DRZ24,7.535,Low Fat,0.082250143,Soft Drinks,118.344,OUT017,2007,,Tier 2,Supermarket Type1,3115.944 +FDT48,4.92,Low Fat,0.046026479,Baking Goods,196.5084,OUT049,1999,Medium,Tier 1,Supermarket Type1,3769.7596 +DRG11,6.385,Low Fat,0,Hard Drinks,108.9596,OUT046,1997,Small,Tier 1,Supermarket Type1,1186.4556 +FDE58,18.5,Low Fat,0.052149675,Snack Foods,118.3124,OUT049,1999,Medium,Tier 1,Supermarket Type1,1540.6612 +DRA12,11.6,Low Fat,0.040911824,Soft Drinks,142.3154,OUT013,1987,High,Tier 3,Supermarket Type1,2552.6772 +FDP60,17.35,Low Fat,0.056235142,Baking Goods,102.0016,OUT017,2007,,Tier 2,Supermarket Type1,1619.2256 +FDT10,16.7,Regular,0.062170334,Snack Foods,60.9562,OUT045,2002,,Tier 2,Supermarket Type1,829.5868 +FDE05,10.895,Regular,0.032427039,Frozen Foods,147.7102,OUT013,1987,High,Tier 3,Supermarket Type1,1166.4816 +FDC32,18.35,Low Fat,0.099309997,Fruits and Vegetables,91.4462,OUT045,2002,,Tier 2,Supermarket Type1,1665.8316 +FDJ22,18.75,Low Fat,0.05310896,Snack Foods,193.6504,OUT017,2007,,Tier 2,Supermarket Type1,2876.256 +NCH18,9.3,Low Fat,0.044843161,Household,246.1802,OUT018,2009,Medium,Tier 3,Supermarket Type2,2702.4822 +DRE37,,Low Fat,0.164966345,Soft Drinks,189.4872,OUT019,1985,Small,Tier 1,Grocery Store,189.0872 +DRC13,8.26,Regular,0.032435437,Soft Drinks,124.873,OUT035,2004,Small,Tier 2,Supermarket Type1,2956.152 +FDG47,12.8,Low Fat,0.06961884,Starchy Foods,260.3252,OUT046,1997,Small,Tier 1,Supermarket Type1,8132.0812 +FDY55,16.75,Low Fat,0.08165147,Fruits and Vegetables,258.3988,OUT018,2009,Medium,Tier 3,Supermarket Type2,1541.9928 +NCW29,,Low Fat,0.028723187,Health and Hygiene,131.831,OUT027,1985,Medium,Tier 3,Supermarket Type3,3635.268 +NCT05,10.895,Low Fat,0.020994339,Health and Hygiene,255.6672,OUT045,2002,,Tier 2,Supermarket Type1,4346.3424 +FDN50,16.85,Regular,0.026561057,Canned,93.712,OUT049,1999,Medium,Tier 1,Supermarket Type1,466.06 +FDU60,20,Regular,0.100262068,Baking Goods,169.6132,OUT010,1998,,Tier 3,Grocery Store,169.1132 +FDX02,16,Low Fat,0.057012606,Dairy,225.0404,OUT013,1987,High,Tier 3,Supermarket Type1,5851.0504 +FDL34,16,Low Fat,0.041009558,Snack Foods,141.2496,OUT049,1999,Medium,Tier 1,Supermarket Type1,2681.8424 +DRF27,8.93,low fat,0.028578012,Dairy,152.234,OUT017,2007,,Tier 2,Supermarket Type1,3828.35 +FDZ35,9.6,Regular,0,Breads,101.699,OUT049,1999,Medium,Tier 1,Supermarket Type1,2373.577 +DRF03,,Low Fat,0.045088724,Dairy,39.7138,OUT027,1985,Medium,Tier 3,Supermarket Type3,1096.5726 +NCO41,,Low Fat,0.018757586,Health and Hygiene,96.9384,OUT027,1985,Medium,Tier 3,Supermarket Type3,2167.8448 +FDQ59,9.8,Regular,0.056500895,Breads,85.8908,OUT045,2002,,Tier 2,Supermarket Type1,1845.5976 +NCZ53,9.6,Low Fat,0.024576875,Health and Hygiene,186.6214,OUT018,2009,Medium,Tier 3,Supermarket Type2,1884.214 +FDZ33,,Low Fat,0.188038372,Snack Foods,146.4076,OUT019,1985,Small,Tier 1,Grocery Store,147.8076 +FDD34,7.945,Low Fat,0.015908485,Snack Foods,161.421,OUT045,2002,,Tier 2,Supermarket Type1,3425.541 +NCM06,7.475,Low Fat,0.075845634,Household,156.0656,OUT049,1999,Medium,Tier 1,Supermarket Type1,1853.5872 +FDY43,14.85,Low Fat,0.098803088,Fruits and Vegetables,169.7474,OUT018,2009,Medium,Tier 3,Supermarket Type2,673.7896 +DRM23,16.6,Low Fat,0.227189581,Hard Drinks,173.9422,OUT010,1998,,Tier 3,Grocery Store,172.4422 +FDT20,10.5,Low Fat,0.041459804,Fruits and Vegetables,39.2164,OUT049,1999,Medium,Tier 1,Supermarket Type1,540.6296 +FDG46,8.63,Regular,0.032882271,Snack Foods,113.5518,OUT013,1987,High,Tier 3,Supermarket Type1,2732.4432 +FDH10,21,Low Fat,0.049583899,Snack Foods,193.8478,OUT017,2007,,Tier 2,Supermarket Type1,1162.4868 +FDF24,15.5,Regular,0.02536567,Baking Goods,82.7934,OUT035,2004,Small,Tier 2,Supermarket Type1,1228.401 +FDG57,14.7,Low Fat,0.07229836,Fruits and Vegetables,48.2034,OUT046,1997,Small,Tier 1,Supermarket Type1,874.8612 +FDN44,13.15,LF,0.022924552,Fruits and Vegetables,157.892,OUT017,2007,,Tier 2,Supermarket Type1,1917.504 +FDD32,17.7,Regular,0.040897932,Fruits and Vegetables,82.6276,OUT013,1987,High,Tier 3,Supermarket Type1,731.0484 +FDI04,,Regular,0.127660257,Frozen Foods,198.5426,OUT019,1985,Small,Tier 1,Grocery Store,790.9704 +FDA56,9.21,Low Fat,0.008764786,Fruits and Vegetables,123.1414,OUT046,1997,Small,Tier 1,Supermarket Type1,4264.449 +DRG51,12.1,Low Fat,0.011604894,Dairy,166.0526,OUT017,2007,,Tier 2,Supermarket Type1,1480.0734 +FDZ04,9.31,Low Fat,0.038169783,Frozen Foods,64.551,OUT017,2007,,Tier 2,Supermarket Type1,1581.275 +FDT13,14.85,Low Fat,0.018568129,Canned,188.2214,OUT035,2004,Small,Tier 2,Supermarket Type1,3014.7424 +FDY56,,Regular,0.062109174,Fruits and Vegetables,223.7062,OUT027,1985,Medium,Tier 3,Supermarket Type3,4965.5364 +FDB51,6.92,LF,0.038671588,Dairy,64.2852,OUT017,2007,,Tier 2,Supermarket Type1,438.0964 +NCY29,13.65,Low Fat,0.077169841,Health and Hygiene,55.593,OUT013,1987,High,Tier 3,Supermarket Type1,282.965 +FDL34,16,Low Fat,0.041028937,Snack Foods,142.6496,OUT045,2002,,Tier 2,Supermarket Type1,1834.9448 +NCQ38,16.35,Low Fat,0.013387211,Others,105.628,OUT049,1999,Medium,Tier 1,Supermarket Type1,1065.28 +NCR41,,Low Fat,0.017936715,Health and Hygiene,93.7094,OUT027,1985,Medium,Tier 3,Supermarket Type3,4189.2136 +FDY24,4.88,Regular,0.223440258,Baking Goods,52.2298,OUT010,1998,,Tier 3,Grocery Store,161.7894 +NCA42,6.965,Low Fat,0,Household,159.6604,OUT045,2002,,Tier 2,Supermarket Type1,3327.6684 +FDB11,16,Low Fat,0.060942632,Starchy Foods,225.6404,OUT049,1999,Medium,Tier 1,Supermarket Type1,2925.5252 +FDG26,18.85,Low Fat,0.042641788,Canned,257.833,OUT035,2004,Small,Tier 2,Supermarket Type1,5382.993 +FDH24,20.7,Low Fat,0.021427082,Baking Goods,156.5288,OUT035,2004,Small,Tier 2,Supermarket Type1,1571.288 +FDX44,9.3,Low Fat,0.042930789,Fruits and Vegetables,88.5172,OUT013,1987,High,Tier 3,Supermarket Type1,1427.4752 +FDT52,9.695,Regular,0.047697859,Frozen Foods,244.6144,OUT017,2007,,Tier 2,Supermarket Type1,2695.1584 +FDT04,17.25,Low Fat,0.10764721,Frozen Foods,39.3822,OUT017,2007,,Tier 2,Supermarket Type1,314.2576 +FDO58,19.6,Low Fat,0.039577173,Snack Foods,166.1526,OUT046,1997,Small,Tier 1,Supermarket Type1,2960.1468 +FDR60,14.3,Low Fat,0.130415118,Baking Goods,75.9328,OUT046,1997,Small,Tier 1,Supermarket Type1,1158.492 +NCL54,12.6,Low Fat,0.082921642,Household,175.2054,OUT045,2002,,Tier 2,Supermarket Type1,3502.108 +FDW50,13.1,Low Fat,0.075515154,Dairy,167.2158,OUT013,1987,High,Tier 3,Supermarket Type1,3008.0844 +FDK43,,Low Fat,0.046994717,Meat,125.802,OUT019,1985,Small,Tier 1,Grocery Store,253.004 +FDQ32,17.85,Regular,0.04679836,Fruits and Vegetables,123.8388,OUT018,2009,Medium,Tier 3,Supermarket Type2,866.8716 +FDE29,8.905,LF,0.143129124,Frozen Foods,58.8878,OUT046,1997,Small,Tier 1,Supermarket Type1,1151.1682 +NCN07,18.5,Low Fat,0.034013539,Others,133.2284,OUT045,2002,,Tier 2,Supermarket Type1,2768.3964 +FDB37,20.25,Regular,0.022921735,Baking Goods,240.7538,OUT013,1987,High,Tier 3,Supermarket Type1,3364.9532 +FDD21,10.3,Regular,0.030616757,Fruits and Vegetables,112.7176,OUT049,1999,Medium,Tier 1,Supermarket Type1,343.5528 +FDX16,17.85,Low Fat,0.06575528,Frozen Foods,151.505,OUT013,1987,High,Tier 3,Supermarket Type1,2546.685 +FDN46,7.21,Regular,0.144856342,Snack Foods,100.5332,OUT049,1999,Medium,Tier 1,Supermarket Type1,1127.8652 +FDV28,16.1,Regular,0.267352587,Frozen Foods,34.9558,OUT010,1998,,Tier 3,Grocery Store,67.9116 +FDR48,,Low Fat,0.130867413,Baking Goods,150.8024,OUT027,1985,Medium,Tier 3,Supermarket Type3,4402.2696 +FDW37,,Low Fat,0.123449671,Canned,89.7488,OUT027,1985,Medium,Tier 3,Supermarket Type3,1901.5248 +FDV40,17.35,Low Fat,0.014689006,Frozen Foods,74.5038,OUT035,2004,Small,Tier 2,Supermarket Type1,739.038 +FDZ57,10,Regular,0.037918142,Snack Foods,129.6994,OUT018,2009,Medium,Tier 3,Supermarket Type2,1413.4934 +FDY46,18.6,Low Fat,0.047964395,Snack Foods,185.0898,OUT049,1999,Medium,Tier 1,Supermarket Type1,2993.4368 +FDX45,16.75,Low Fat,0.105018817,Snack Foods,155.263,OUT049,1999,Medium,Tier 1,Supermarket Type1,1721.093 +FDB33,17.75,Low Fat,0.014577412,Fruits and Vegetables,160.7262,OUT035,2004,Small,Tier 2,Supermarket Type1,2864.2716 +FDT58,9,Low Fat,0.143870574,Snack Foods,169.4816,OUT010,1998,,Tier 3,Grocery Store,503.3448 +FDM39,6.42,Low Fat,0.053553794,Dairy,178.6002,OUT049,1999,Medium,Tier 1,Supermarket Type1,3582.004 +NCY41,16.75,LF,0.075889215,Health and Hygiene,37.6532,OUT045,2002,,Tier 2,Supermarket Type1,575.2512 +NCL31,7.39,Low Fat,0.120280989,Others,142.747,OUT046,1997,Small,Tier 1,Supermarket Type1,3149.234 +NCJ31,19.2,Low Fat,0.182653772,Others,243.0196,OUT046,1997,Small,Tier 1,Supermarket Type1,3374.2744 +FDO23,,Low Fat,0.25637539,Breads,94.8436,OUT019,1985,Small,Tier 1,Grocery Store,567.2616 +FDN56,5.46,Regular,0.107036943,Fruits and Vegetables,144.2786,OUT035,2004,Small,Tier 2,Supermarket Type1,288.9572 +FDF04,17.5,Low Fat,0,Frozen Foods,258.3304,OUT013,1987,High,Tier 3,Supermarket Type1,3358.2952 +FDJ44,12.3,Regular,0.106238768,Fruits and Vegetables,176.1396,OUT013,1987,High,Tier 3,Supermarket Type1,3663.2316 +FDS50,17,Low Fat,0.055545797,Dairy,220.5114,OUT045,2002,,Tier 2,Supermarket Type1,5321.0736 +NCQ41,,Low Fat,0.019386057,Health and Hygiene,194.5794,OUT027,1985,Medium,Tier 3,Supermarket Type3,3511.4292 +FDA49,19.7,Low Fat,0.064921764,Canned,88.1198,OUT046,1997,Small,Tier 1,Supermarket Type1,1744.396 +NCZ06,19.6,Low Fat,0.094694278,Household,254.9698,OUT017,2007,,Tier 2,Supermarket Type1,2536.698 +NCM43,14.5,Low Fat,0.019554705,Others,162.421,OUT018,2009,Medium,Tier 3,Supermarket Type2,1957.452 +FDH19,19.35,Low Fat,0.033060937,Meat,172.4738,OUT013,1987,High,Tier 3,Supermarket Type1,1911.5118 +FDS15,9.195,Regular,0.078181964,Meat,106.7596,OUT049,1999,Medium,Tier 1,Supermarket Type1,4098.6648 +FDO50,16.25,LF,0,Canned,90.2804,OUT018,2009,Medium,Tier 3,Supermarket Type2,1653.8472 +FDJ20,20.7,Regular,0.100583009,Fruits and Vegetables,123.5388,OUT018,2009,Medium,Tier 3,Supermarket Type2,1981.4208 +NCI31,20,low fat,0.136124989,Others,38.319,OUT010,1998,,Tier 3,Grocery Store,146.476 +FDU20,,Regular,0.021353642,Fruits and Vegetables,122.1098,OUT027,1985,Medium,Tier 3,Supermarket Type3,3374.2744 +DRK13,11.8,Low Fat,0.115167579,Soft Drinks,199.8084,OUT046,1997,Small,Tier 1,Supermarket Type1,2380.9008 +DRJ24,11.8,Low Fat,0.113559058,Soft Drinks,184.2924,OUT045,2002,,Tier 2,Supermarket Type1,1850.924 +FDI20,19.1,Low Fat,0.038641968,Fruits and Vegetables,212.1586,OUT045,2002,,Tier 2,Supermarket Type1,5909.6408 +FDF10,15.5,Regular,0.157246634,Snack Foods,145.6418,OUT045,2002,,Tier 2,Supermarket Type1,2207.127 +FDQ45,9.5,Regular,0.010917052,Snack Foods,185.3608,OUT046,1997,Small,Tier 1,Supermarket Type1,2021.3688 +FDQ10,12.85,Low Fat,0.033172957,Snack Foods,172.0422,OUT035,2004,Small,Tier 2,Supermarket Type1,5345.7082 +FDM36,11.65,Regular,0.058719726,Baking Goods,171.1422,OUT035,2004,Small,Tier 2,Supermarket Type1,2931.5174 +FDN12,15.6,Low Fat,0,Baking Goods,111.8544,OUT018,2009,Medium,Tier 3,Supermarket Type2,1454.1072 +FDD50,18.85,Low Fat,0.141524348,Canned,168.4132,OUT013,1987,High,Tier 3,Supermarket Type1,2874.9244 +FDG17,6.865,Regular,0.035895934,Frozen Foods,244.4486,OUT049,1999,Medium,Tier 1,Supermarket Type1,6353.0636 +FDY58,11.65,Low Fat,0.039980644,Snack Foods,227.3694,OUT049,1999,Medium,Tier 1,Supermarket Type1,4567.388 +NCK29,,Low Fat,0,Health and Hygiene,123.473,OUT019,1985,Small,Tier 1,Grocery Store,369.519 +FDM32,20.5,Low Fat,0,Fruits and Vegetables,90.883,OUT010,1998,,Tier 3,Grocery Store,89.883 +FDL46,20.35,Low Fat,0.054056927,Snack Foods,116.8466,OUT046,1997,Small,Tier 1,Supermarket Type1,2356.932 +FDC51,10.895,Regular,0.009636821,Dairy,121.873,OUT049,1999,Medium,Tier 1,Supermarket Type1,2463.46 +FDF16,7.3,Low Fat,0.086266286,Frozen Foods,147.2076,OUT049,1999,Medium,Tier 1,Supermarket Type1,1921.4988 +NCV54,11.1,Low Fat,0.033081389,Household,116.5124,OUT013,1987,High,Tier 3,Supermarket Type1,1066.6116 +FDE35,7.06,Regular,0.043989429,Starchy Foods,60.2904,OUT045,2002,,Tier 2,Supermarket Type1,644.4944 +FDA23,9.8,Low Fat,0.047178116,Baking Goods,99.4016,OUT035,2004,Small,Tier 2,Supermarket Type1,2428.8384 +FDI46,9.5,Low Fat,0.074496043,Snack Foods,251.9724,OUT045,2002,,Tier 2,Supermarket Type1,2516.724 +FDZ21,17.6,Regular,0.039189221,Snack Foods,97.341,OUT013,1987,High,Tier 3,Supermarket Type1,965.41 +DRK13,11.8,Low Fat,0.115819014,Soft Drinks,198.3084,OUT017,2007,,Tier 2,Supermarket Type1,4563.3932 +FDX36,9.695,Regular,0.129008866,Baking Goods,226.9404,OUT017,2007,,Tier 2,Supermarket Type1,2700.4848 +FDY22,16.5,Regular,0.160371305,Snack Foods,143.9128,OUT018,2009,Medium,Tier 3,Supermarket Type2,1581.9408 +FDR32,,Regular,0.085392428,Fruits and Vegetables,226.7694,OUT027,1985,Medium,Tier 3,Supermarket Type3,6165.9738 +DRF25,9,Low Fat,0.038925251,Soft Drinks,34.919,OUT046,1997,Small,Tier 1,Supermarket Type1,476.047 +FDK20,12.6,Regular,0.041557653,Fruits and Vegetables,124.5072,OUT046,1997,Small,Tier 1,Supermarket Type1,2450.144 +DRI11,,Low Fat,0.060237465,Hard Drinks,115.9834,OUT019,1985,Small,Tier 1,Grocery Store,345.5502 +FDH05,14.35,Regular,0.091098018,Frozen Foods,233.5984,OUT045,2002,,Tier 2,Supermarket Type1,1853.5872 +FDA46,13.6,Low Fat,0.117874024,Snack Foods,193.6136,OUT045,2002,,Tier 2,Supermarket Type1,4471.5128 +DRD24,13.85,Low Fat,0.030795085,Soft Drinks,143.3154,OUT046,1997,Small,Tier 1,Supermarket Type1,1985.4156 +FDL39,16.1,Regular,0.063689583,Dairy,181.9318,OUT017,2007,,Tier 2,Supermarket Type1,5954.2494 +FDD52,18.25,Regular,0.184041545,Dairy,110.157,OUT018,2009,Medium,Tier 3,Supermarket Type2,1867.569 +FDR55,12.15,reg,0.13283066,Fruits and Vegetables,190.6872,OUT017,2007,,Tier 2,Supermarket Type1,2269.0464 +DRI13,15.35,Low Fat,0.020441939,Soft Drinks,216.4508,OUT017,2007,,Tier 2,Supermarket Type1,5426.27 +FDG31,,Low Fat,0.037712875,Meat,64.4826,OUT027,1985,Medium,Tier 3,Supermarket Type3,2518.7214 +FDP04,15.35,Low Fat,0.013840784,Frozen Foods,65.2168,OUT045,2002,,Tier 2,Supermarket Type1,958.752 +FDH35,18.25,Low Fat,0.060198496,Starchy Foods,162.9526,OUT013,1987,High,Tier 3,Supermarket Type1,1151.1682 +NCB42,11.8,Low Fat,0.008559557,Health and Hygiene,117.2492,OUT035,2004,Small,Tier 2,Supermarket Type1,2432.8332 +FDQ14,9.27,Low Fat,0.061883353,Dairy,147.905,OUT049,1999,Medium,Tier 1,Supermarket Type1,1647.855 +FDI19,,Low Fat,0.052085615,Meat,242.8512,OUT027,1985,Medium,Tier 3,Supermarket Type3,5816.4288 +FDJ55,12.8,Regular,0.039385992,Meat,224.8404,OUT010,1998,,Tier 3,Grocery Store,1575.2828 +DRN59,15,Low Fat,0.064241345,Hard Drinks,45.206,OUT049,1999,Medium,Tier 1,Supermarket Type1,792.302 +NCR06,12.5,Low Fat,0.006759519,Household,42.8112,OUT013,1987,High,Tier 3,Supermarket Type1,639.168 +NCF42,17.35,Low Fat,0.167243769,Household,176.2712,OUT013,1987,High,Tier 3,Supermarket Type1,2988.1104 +FDG24,7.975,Low Fat,0.01469075,Baking Goods,84.725,OUT018,2009,Medium,Tier 3,Supermarket Type2,1747.725 +FDB58,10.5,Regular,0.013551445,Snack Foods,142.0154,OUT018,2009,Medium,Tier 3,Supermarket Type2,2410.8618 +FDQ56,,Low Fat,0.105085956,Fruits and Vegetables,82.3908,OUT027,1985,Medium,Tier 3,Supermarket Type3,3691.1952 +NCV41,14.35,Low Fat,0.017038777,Health and Hygiene,112.5228,OUT046,1997,Small,Tier 1,Supermarket Type1,1989.4104 +FDW19,12.35,Regular,0.038718195,Fruits and Vegetables,110.657,OUT017,2007,,Tier 2,Supermarket Type1,2087.283 +FDO56,10.195,Regular,0.075291577,Fruits and Vegetables,119.1808,OUT010,1998,,Tier 3,Grocery Store,351.5424 +FDI41,18.5,Regular,0,Frozen Foods,148.7418,OUT045,2002,,Tier 2,Supermarket Type1,2501.4106 +FDN10,11.5,Low Fat,0,Snack Foods,119.5124,OUT018,2009,Medium,Tier 3,Supermarket Type2,829.5868 +FDY20,12.5,Regular,0.082085787,Fruits and Vegetables,92.2488,OUT018,2009,Medium,Tier 3,Supermarket Type2,1358.232 +DRM37,,LF,0.095931002,Soft Drinks,198.5768,OUT027,1985,Medium,Tier 3,Supermarket Type3,6897.688 +FDV34,10.695,Regular,0.011448629,Snack Foods,72.9038,OUT045,2002,,Tier 2,Supermarket Type1,1034.6532 +NCX18,14.15,Low Fat,0.00879232,Household,195.011,OUT035,2004,Small,Tier 2,Supermarket Type1,1964.11 +FDY10,17.6,Low Fat,0.049167388,Snack Foods,114.9176,OUT045,2002,,Tier 2,Supermarket Type1,1946.7992 +NCZ17,,Low Fat,0.079046992,Health and Hygiene,39.8506,OUT027,1985,Medium,Tier 3,Supermarket Type3,1480.0734 +FDT12,6.215,Regular,0.049580407,Baking Goods,227.4062,OUT013,1987,High,Tier 3,Supermarket Type1,5191.2426 +FDD57,18.1,Low Fat,0.022399592,Fruits and Vegetables,96.0094,OUT046,1997,Small,Tier 1,Supermarket Type1,1808.9786 +FDK45,11.65,Low Fat,0.033926852,Seafood,111.586,OUT045,2002,,Tier 2,Supermarket Type1,3395.58 +FDJ57,7.42,Regular,0.021617397,Seafood,185.0582,OUT045,2002,,Tier 2,Supermarket Type1,5201.2296 +NCI31,20,Low Fat,0.0814536,Others,36.819,OUT049,1999,Medium,Tier 1,Supermarket Type1,768.999 +FDZ48,17.75,LF,0.07607772,Baking Goods,112.4544,OUT049,1999,Medium,Tier 1,Supermarket Type1,2348.9424 +FDI16,14,Regular,0.135775701,Frozen Foods,54.564,OUT046,1997,Small,Tier 1,Supermarket Type1,1597.92 +FDZ31,15.35,Regular,0,Fruits and Vegetables,193.0504,OUT049,1999,Medium,Tier 1,Supermarket Type1,2492.7552 +DRG15,6.13,Low Fat,0.076891526,Dairy,61.5536,OUT045,2002,,Tier 2,Supermarket Type1,796.2968 +FDX36,9.695,Regular,0.128543405,Baking Goods,226.5404,OUT045,2002,,Tier 2,Supermarket Type1,4500.808 +FDD40,20.25,Regular,0.014793357,Dairy,191.5162,OUT046,1997,Small,Tier 1,Supermarket Type1,3078.6592 +FDA04,,Regular,0.066406853,Frozen Foods,259.7962,OUT027,1985,Medium,Tier 3,Supermarket Type3,5697.9164 +FDL21,15.85,Regular,0.007140468,Snack Foods,40.848,OUT013,1987,High,Tier 3,Supermarket Type1,679.116 +FDS21,19.85,Regular,0.020858779,Snack Foods,62.8194,OUT013,1987,High,Tier 3,Supermarket Type1,928.791 +DRF23,4.61,Low Fat,0.123346085,Hard Drinks,172.5396,OUT017,2007,,Tier 2,Supermarket Type1,3663.2316 +FDM46,7.365,Low Fat,0.159937597,Snack Foods,93.912,OUT035,2004,Small,Tier 2,Supermarket Type1,1304.968 +DRG49,,Low Fat,0.067128641,Soft Drinks,242.8486,OUT027,1985,Medium,Tier 3,Supermarket Type3,3420.8804 +FDG26,18.85,low fat,0.042736348,Canned,255.933,OUT045,2002,,Tier 2,Supermarket Type1,3844.995 +FDR51,,Regular,0.172629683,Meat,148.4708,OUT027,1985,Medium,Tier 3,Supermarket Type3,3761.77 +FDV39,11.3,Low Fat,0.007278512,Meat,196.7426,OUT035,2004,Small,Tier 2,Supermarket Type1,2768.3964 +FDC39,7.405,Low Fat,0,Dairy,205.7296,OUT017,2007,,Tier 2,Supermarket Type1,4570.0512 +FDP45,15.7,Regular,0.03079807,Snack Foods,252.9724,OUT017,2007,,Tier 2,Supermarket Type1,3020.0688 +FDC56,7.72,Low Fat,0.12152072,Fruits and Vegetables,118.244,OUT046,1997,Small,Tier 1,Supermarket Type1,958.752 +FDK38,6.65,Low Fat,0.053591345,Canned,149.7734,OUT017,2007,,Tier 2,Supermarket Type1,2375.5744 +NCJ29,10.6,low fat,0.035163639,Health and Hygiene,84.4224,OUT013,1987,High,Tier 3,Supermarket Type1,852.224 +NCF19,,Low Fat,0.061470858,Household,48.6034,OUT019,1985,Small,Tier 1,Grocery Store,145.8102 +FDG59,15.85,Low Fat,0.043226398,Starchy Foods,37.5164,OUT035,2004,Small,Tier 2,Supermarket Type1,270.3148 +FDE59,12.15,Low Fat,0.062640143,Starchy Foods,36.6532,OUT017,2007,,Tier 2,Supermarket Type1,251.6724 +FDB04,11.35,Regular,0.06358394,Dairy,89.4856,OUT017,2007,,Tier 2,Supermarket Type1,1142.5128 +NCK05,20.1,Low Fat,0.077389797,Health and Hygiene,60.8536,OUT013,1987,High,Tier 3,Supermarket Type1,1347.5792 +FDR03,15.7,Regular,0.00878535,Meat,204.998,OUT017,2007,,Tier 2,Supermarket Type1,5366.348 +FDQ03,,Regular,0.136592891,Meat,238.0248,OUT019,1985,Small,Tier 1,Grocery Store,711.0744 +FDC59,16.7,Regular,0.054937907,Starchy Foods,64.2168,OUT017,2007,,Tier 2,Supermarket Type1,1661.8368 +DRB13,6.115,Regular,0.007084185,Soft Drinks,191.153,OUT017,2007,,Tier 2,Supermarket Type1,3415.554 +NCE54,20.7,Low Fat,0.027052013,Household,73.9354,OUT017,2007,,Tier 2,Supermarket Type1,1655.1788 +FDC10,9.8,reg,0.072863893,Snack Foods,118.6098,OUT035,2004,Small,Tier 2,Supermarket Type1,843.5686 +FDR46,,Low Fat,0.244102315,Snack Foods,148.076,OUT019,1985,Small,Tier 1,Grocery Store,146.476 +FDA10,20.35,Low Fat,0.141789197,Snack Foods,121.9072,OUT035,2004,Small,Tier 2,Supermarket Type1,1347.5792 +FDP23,,Low Fat,0.035414528,Breads,218.2166,OUT027,1985,Medium,Tier 3,Supermarket Type3,3701.1822 +FDJ41,6.85,Low Fat,0.022864238,Frozen Foods,260.0594,OUT013,1987,High,Tier 3,Supermarket Type1,6018.1662 +FDL46,20.35,Low Fat,0.054011943,Snack Foods,116.5466,OUT013,1987,High,Tier 3,Supermarket Type1,1885.5456 +FDX33,9.195,Regular,0.117462619,Snack Foods,158.9578,OUT035,2004,Small,Tier 2,Supermarket Type1,2246.4092 +NCL29,9.695,Low Fat,0.11411658,Health and Hygiene,158.8604,OUT049,1999,Medium,Tier 1,Supermarket Type1,4436.8912 +FDE16,,Low Fat,0.046124444,Frozen Foods,206.7954,OUT019,1985,Small,Tier 1,Grocery Store,833.5816 +FDM57,11.65,Regular,0.075849167,Snack Foods,85.1908,OUT046,1997,Small,Tier 1,Supermarket Type1,2181.1608 +FDZ36,6.035,Regular,0.065729039,Baking Goods,188.324,OUT013,1987,High,Tier 3,Supermarket Type1,1491.392 +NCW42,18.2,Low Fat,0.097865088,Household,221.8456,OUT010,1998,,Tier 3,Grocery Store,884.1824 +NCI54,,LF,0.058827583,Household,110.4912,OUT019,1985,Small,Tier 1,Grocery Store,436.7648 +DRK01,7.63,Low Fat,0.061313057,Soft Drinks,93.3436,OUT018,2009,Medium,Tier 3,Supermarket Type2,1323.6104 +FDX10,6.385,Regular,0.123961415,Snack Foods,33.2874,OUT045,2002,,Tier 2,Supermarket Type1,141.1496 +FDO46,9.6,Regular,0.014270394,Snack Foods,187.3872,OUT018,2009,Medium,Tier 3,Supermarket Type2,2647.2208 +FDD16,20.5,Low Fat,0.060847634,Frozen Foods,75.0696,OUT010,1998,,Tier 3,Grocery Store,149.1392 +FDZ20,,Low Fat,0,Fruits and Vegetables,253.0356,OUT027,1985,Medium,Tier 3,Supermarket Type3,11445.102 +NCI18,18.35,Low Fat,0.014103354,Household,225.4746,OUT017,2007,,Tier 2,Supermarket Type1,1346.2476 +DRI25,19.6,Low Fat,0.033901442,Soft Drinks,56.2614,OUT046,1997,Small,Tier 1,Supermarket Type1,773.6596 +FDY44,14.15,Regular,0.024454052,Fruits and Vegetables,197.211,OUT045,2002,,Tier 2,Supermarket Type1,3731.809 +FDW38,,Regular,0,Dairy,55.9298,OUT019,1985,Small,Tier 1,Grocery Store,107.8596 +FDY33,,Regular,0.096730427,Snack Foods,159.0262,OUT027,1985,Medium,Tier 3,Supermarket Type3,5887.6694 +DRH51,17.6,Low Fat,0.097198194,Dairy,89.8856,OUT035,2004,Small,Tier 2,Supermarket Type1,351.5424 +FDT32,19,Regular,0.066005186,Fruits and Vegetables,188.4214,OUT017,2007,,Tier 2,Supermarket Type1,2826.321 +FDI50,8.42,Regular,0.030890618,Canned,228.7352,OUT049,1999,Medium,Tier 1,Supermarket Type1,5954.9152 +FDB60,9.3,Low Fat,0.028498354,Baking Goods,195.8136,OUT013,1987,High,Tier 3,Supermarket Type1,2332.9632 +FDP09,19.75,LF,0.033883448,Snack Foods,213.2902,OUT035,2004,Small,Tier 2,Supermarket Type1,4247.804 +FDA20,6.78,Low Fat,0.066565644,Fruits and Vegetables,185.324,OUT013,1987,High,Tier 3,Supermarket Type1,3914.904 +NCX05,,Low Fat,0.169943195,Health and Hygiene,116.2492,OUT019,1985,Small,Tier 1,Grocery Store,115.8492 +DRF37,17.25,Low Fat,0,Soft Drinks,263.591,OUT045,2002,,Tier 2,Supermarket Type1,788.973 +FDJ26,15.3,Regular,0.084765192,Canned,215.0218,OUT046,1997,Small,Tier 1,Supermarket Type1,1923.4962 +FDZ25,15.7,Regular,0.027617046,Canned,168.279,OUT046,1997,Small,Tier 1,Supermarket Type1,4074.696 +FDZ58,17.85,Low Fat,0.052166995,Snack Foods,121.7072,OUT035,2004,Small,Tier 2,Supermarket Type1,2817.6656 +FDZ50,,Regular,0,Dairy,184.2608,OUT027,1985,Medium,Tier 3,Supermarket Type3,6064.1064 +NCG18,15.3,Low Fat,0.038460297,Household,104.0332,OUT010,1998,,Tier 3,Grocery Store,205.0664 +FDZ56,16.25,Low Fat,0.025789175,Fruits and Vegetables,166.9474,OUT045,2002,,Tier 2,Supermarket Type1,2863.6058 +FDH50,15,Regular,0.161301097,Canned,185.1266,OUT013,1987,High,Tier 3,Supermarket Type1,2213.1192 +DRO35,13.85,Low Fat,0.034640466,Hard Drinks,116.1492,OUT045,2002,,Tier 2,Supermarket Type1,1274.3412 +DRH51,,Low Fat,0,Dairy,89.1856,OUT027,1985,Medium,Tier 3,Supermarket Type3,2109.2544 +FDS19,13.8,Regular,0.064307102,Fruits and Vegetables,77.3012,OUT049,1999,Medium,Tier 1,Supermarket Type1,1593.9252 +NCM06,7.475,Low Fat,0.076036381,Household,153.9656,OUT018,2009,Medium,Tier 3,Supermarket Type2,2625.9152 +FDP52,18.7,Regular,0.071091591,Frozen Foods,228.601,OUT017,2007,,Tier 2,Supermarket Type1,4823.721 +FDK02,12.5,Low Fat,0.187841082,Canned,119.244,OUT010,1998,,Tier 3,Grocery Store,119.844 +FDG59,15.85,Low Fat,0.043234574,Starchy Foods,38.3164,OUT046,1997,Small,Tier 1,Supermarket Type1,540.6296 +FDN20,,Low Fat,0.026055106,Fruits and Vegetables,169.5474,OUT027,1985,Medium,Tier 3,Supermarket Type3,4211.185 +FDO57,20.75,Low Fat,0.109153001,Snack Foods,161.3578,OUT018,2009,Medium,Tier 3,Supermarket Type2,4492.8184 +NCJ30,5.82,Low Fat,0.08062523,Household,168.379,OUT035,2004,Small,Tier 2,Supermarket Type1,1188.453 +FDQ31,5.785,Regular,0.0901292,Fruits and Vegetables,89.8856,OUT010,1998,,Tier 3,Grocery Store,175.7712 +FDC05,13.1,Regular,0.098938169,Frozen Foods,195.7768,OUT049,1999,Medium,Tier 1,Supermarket Type1,4138.6128 +FDM08,10.1,Regular,0,Fruits and Vegetables,225.1088,OUT013,1987,High,Tier 3,Supermarket Type1,3579.3408 +NCA41,16.75,Low Fat,0.032580547,Health and Hygiene,192.1162,OUT035,2004,Small,Tier 2,Supermarket Type1,3848.324 +FDK15,,Low Fat,0.097937252,Meat,98.9042,OUT027,1985,Medium,Tier 3,Supermarket Type3,4960.21 +FDX56,17.1,Regular,0,Fruits and Vegetables,208.5638,OUT049,1999,Medium,Tier 1,Supermarket Type1,5383.6588 +FDT21,7.42,Low Fat,0.020391845,Snack Foods,248.9092,OUT046,1997,Small,Tier 1,Supermarket Type1,2241.0828 +FDQ46,7.51,Low Fat,0.103813029,Snack Foods,113.7544,OUT046,1997,Small,Tier 1,Supermarket Type1,671.1264 +FDS01,,Low Fat,0.031069203,Canned,179.6686,OUT019,1985,Small,Tier 1,Grocery Store,177.7686 +FDW34,,Low Fat,0.062294473,Snack Foods,242.417,OUT019,1985,Small,Tier 1,Grocery Store,486.034 +FDX07,19.2,Regular,0.022914478,Fruits and Vegetables,181.195,OUT035,2004,Small,Tier 2,Supermarket Type1,2380.235 +FDN13,18.6,Low Fat,0.152058281,Breakfast,99.9358,OUT046,1997,Small,Tier 1,Supermarket Type1,201.0716 +NCP02,7.105,Low Fat,0.044991294,Household,59.2562,OUT018,2009,Medium,Tier 3,Supermarket Type2,651.8182 +FDT48,4.92,Low Fat,0.046214971,Baking Goods,199.8084,OUT017,2007,,Tier 2,Supermarket Type1,3968.168 +FDZ49,11,Regular,0.13312044,Canned,221.5798,OUT035,2004,Small,Tier 2,Supermarket Type1,4187.2162 +NCJ17,7.68,Low Fat,0.255348289,Health and Hygiene,84.4224,OUT010,1998,,Tier 3,Grocery Store,170.4448 +FDB17,13.15,Low Fat,0.036879539,Frozen Foods,181.3976,OUT017,2007,,Tier 2,Supermarket Type1,3078.6592 +FDP48,7.52,Regular,0.044202545,Baking Goods,182.995,OUT018,2009,Medium,Tier 3,Supermarket Type2,4394.28 +FDI53,8.895,Regular,0.137858955,Frozen Foods,162.1236,OUT049,1999,Medium,Tier 1,Supermarket Type1,2577.9776 +FDW02,4.805,Regular,0.037668051,Dairy,126.7704,OUT013,1987,High,Tier 3,Supermarket Type1,2628.5784 +FDL20,,Low Fat,0.224837308,Fruits and Vegetables,112.7886,OUT019,1985,Small,Tier 1,Grocery Store,222.3772 +FDV32,7.785,Low Fat,0.089069748,Fruits and Vegetables,62.751,OUT018,2009,Medium,Tier 3,Supermarket Type2,1707.777 +FDG38,8.975,Regular,0.053027398,Canned,86.0224,OUT017,2007,,Tier 2,Supermarket Type1,1278.336 +NCB31,,Low Fat,0.118099673,Household,262.891,OUT027,1985,Medium,Tier 3,Supermarket Type3,5522.811 +FDF52,9.3,Low Fat,0,Frozen Foods,182.9292,OUT017,2007,,Tier 2,Supermarket Type1,4013.4424 +FDB15,10.895,Low Fat,0.137023446,Dairy,263.7568,OUT049,1999,Medium,Tier 1,Supermarket Type1,7646.0472 +FDO48,15,Regular,0.026950104,Baking Goods,220.9456,OUT018,2009,Medium,Tier 3,Supermarket Type2,1768.3648 +NCR53,12.15,Low Fat,0,Health and Hygiene,224.4404,OUT018,2009,Medium,Tier 3,Supermarket Type2,5626.01 +FDF56,16.7,Regular,0.119362812,Fruits and Vegetables,180.3976,OUT013,1987,High,Tier 3,Supermarket Type1,3078.6592 +FDL57,15.1,Regular,0.067350054,Snack Foods,257.3304,OUT018,2009,Medium,Tier 3,Supermarket Type2,3874.956 +NCC31,8.02,Low Fat,0,Household,157.7972,OUT013,1987,High,Tier 3,Supermarket Type1,1713.7692 +FDE33,19.35,reg,0.049712775,Fruits and Vegetables,78.2644,OUT049,1999,Medium,Tier 1,Supermarket Type1,1492.7236 +FDV52,20.7,Regular,0.122208091,Frozen Foods,119.7466,OUT017,2007,,Tier 2,Supermarket Type1,4006.7844 +FDR46,,Low Fat,0.138742518,Snack Foods,147.476,OUT027,1985,Medium,Tier 3,Supermarket Type3,3368.948 +DRE12,4.59,Low Fat,0.070780558,Soft Drinks,114.586,OUT046,1997,Small,Tier 1,Supermarket Type1,1245.046 +FDD57,18.1,Low Fat,0.037492325,Fruits and Vegetables,95.5094,OUT010,1998,,Tier 3,Grocery Store,95.2094 +NCS41,12.85,Low Fat,0.053527105,Health and Hygiene,185.1608,OUT049,1999,Medium,Tier 1,Supermarket Type1,2388.8904 +NCY41,16.75,low fat,0.076164013,Health and Hygiene,34.0532,OUT017,2007,,Tier 2,Supermarket Type1,575.2512 +FDV22,14.85,Regular,0.009995002,Snack Foods,154.463,OUT017,2007,,Tier 2,Supermarket Type1,3755.112 +FDF12,8.235,Low Fat,0.08259502,Baking Goods,149.1076,OUT045,2002,,Tier 2,Supermarket Type1,1182.4608 +FDM13,6.425,Low Fat,0.063122753,Breakfast,131.3626,OUT013,1987,High,Tier 3,Supermarket Type1,262.3252 +FDQ56,6.59,Low Fat,0.105597316,Fruits and Vegetables,83.4908,OUT046,1997,Small,Tier 1,Supermarket Type1,1342.2528 +FDW55,,Regular,0.021863506,Fruits and Vegetables,247.0092,OUT027,1985,Medium,Tier 3,Supermarket Type3,5478.2024 +NCT29,,Low Fat,0.063800266,Health and Hygiene,123.0414,OUT027,1985,Medium,Tier 3,Supermarket Type3,4629.9732 +NCX42,6.36,Low Fat,0.006012413,Household,163.0526,OUT017,2007,,Tier 2,Supermarket Type1,1644.526 +FDR24,17.35,Regular,0.063207198,Baking Goods,89.383,OUT017,2007,,Tier 2,Supermarket Type1,1258.362 +NCS42,8.6,Low Fat,0.069809115,Household,90.5146,OUT017,2007,,Tier 2,Supermarket Type1,729.7168 +FDL40,17.7,Low Fat,0.011660463,Frozen Foods,96.541,OUT018,2009,Medium,Tier 3,Supermarket Type2,2220.443 +FDD47,7.6,Regular,0.142410775,Starchy Foods,171.9448,OUT046,1997,Small,Tier 1,Supermarket Type1,3749.7856 +DRE03,19.6,Low Fat,0.024226902,Dairy,48.7718,OUT046,1997,Small,Tier 1,Supermarket Type1,236.359 +NCM18,,Low Fat,0.082440705,Household,61.3194,OUT027,1985,Medium,Tier 3,Supermarket Type3,2043.3402 +FDF52,9.3,Low Fat,0.066918731,Frozen Foods,184.2292,OUT045,2002,,Tier 2,Supermarket Type1,1641.8628 +NCG43,20.2,Low Fat,0.074390007,Household,91.4462,OUT045,2002,,Tier 2,Supermarket Type1,1943.4702 +FDE20,11.35,Regular,0.005530516,Fruits and Vegetables,171.179,OUT046,1997,Small,Tier 1,Supermarket Type1,4923.591 +FDI33,16.5,Low Fat,0.028579565,Snack Foods,90.3146,OUT017,2007,,Tier 2,Supermarket Type1,2554.0088 +NCT06,17.1,Low Fat,0.038705317,Household,165.0842,OUT013,1987,High,Tier 3,Supermarket Type1,2320.9788 +FDY24,4.88,Regular,0,Baking Goods,53.1298,OUT035,2004,Small,Tier 2,Supermarket Type1,808.947 +FDZ33,10.195,Low Fat,0.108004532,Snack Foods,148.7076,OUT017,2007,,Tier 2,Supermarket Type1,1330.2684 +FDJ55,12.8,Regular,0.023626808,Meat,223.2404,OUT018,2009,Medium,Tier 3,Supermarket Type2,2475.4444 +FDE45,,Low Fat,0.070660449,Fruits and Vegetables,180.4002,OUT019,1985,Small,Tier 1,Grocery Store,716.4008 +FDD44,8.05,Regular,0.078719835,Fruits and Vegetables,258.5646,OUT018,2009,Medium,Tier 3,Supermarket Type2,3091.9752 +FDD10,20.6,reg,0.046208155,Snack Foods,178.0344,OUT018,2009,Medium,Tier 3,Supermarket Type2,1605.9096 +FDA39,6.32,Low Fat,0.012769753,Meat,39.9822,OUT018,2009,Medium,Tier 3,Supermarket Type2,78.5644 +FDB36,5.465,Regular,0.048486801,Baking Goods,131.2626,OUT013,1987,High,Tier 3,Supermarket Type1,3410.2276 +FDK52,18.25,Low Fat,0.132596101,Frozen Foods,226.2062,OUT010,1998,,Tier 3,Grocery Store,677.1186 +FDJ36,14.5,Regular,0.128459481,Baking Goods,102.0332,OUT049,1999,Medium,Tier 1,Supermarket Type1,2050.664 +NCB55,15.7,Low Fat,0.161317495,Household,57.5562,OUT018,2009,Medium,Tier 3,Supermarket Type2,829.5868 +NCK18,9.6,Low Fat,0.011211251,Household,166.9184,OUT010,1998,,Tier 3,Grocery Store,660.4736 +FDX27,20.7,reg,0.114294512,Dairy,94.9436,OUT049,1999,Medium,Tier 1,Supermarket Type1,1229.0668 +FDB08,6.055,Low Fat,0.031103357,Fruits and Vegetables,159.9578,OUT046,1997,Small,Tier 1,Supermarket Type1,2727.7826 +FDX43,5.655,LF,0.085274988,Fruits and Vegetables,165.05,OUT046,1997,Small,Tier 1,Supermarket Type1,2330.3 +FDA20,6.78,Low Fat,0.066892471,Fruits and Vegetables,186.424,OUT018,2009,Medium,Tier 3,Supermarket Type2,1304.968 +FDC04,,Low Fat,0.078764059,Dairy,241.3854,OUT019,1985,Small,Tier 1,Grocery Store,483.3708 +FDG17,6.865,Regular,0.036042939,Frozen Foods,244.4486,OUT017,2007,,Tier 2,Supermarket Type1,4153.9262 +FDU58,6.61,Regular,0.04855968,Snack Foods,188.4898,OUT010,1998,,Tier 3,Grocery Store,187.0898 +FDP24,,Low Fat,0.082602127,Baking Goods,120.9756,OUT027,1985,Medium,Tier 3,Supermarket Type3,3877.6192 +NCT29,12.6,Low Fat,0.064240743,Health and Hygiene,121.9414,OUT045,2002,,Tier 2,Supermarket Type1,1462.0968 +FDB08,6.055,Low Fat,0.031230059,Fruits and Vegetables,160.3578,OUT018,2009,Medium,Tier 3,Supermarket Type2,1765.0358 +NCB43,20.2,Low Fat,0.100114941,Household,188.3898,OUT045,2002,,Tier 2,Supermarket Type1,3554.7062 +FDL09,,Regular,0.22417463,Snack Foods,168.8816,OUT019,1985,Small,Tier 1,Grocery Store,167.7816 +DRK49,14.15,Low Fat,0.035943717,Soft Drinks,40.5138,OUT046,1997,Small,Tier 1,Supermarket Type1,446.7518 +FDR37,16.5,Regular,0.06619442,Breakfast,184.4292,OUT013,1987,High,Tier 3,Supermarket Type1,3101.2964 +FDG56,13.3,Regular,0.071439051,Fruits and Vegetables,61.0536,OUT035,2004,Small,Tier 2,Supermarket Type1,1898.8616 +FDE34,9.195,Low Fat,0.108059141,Snack Foods,181.7634,OUT049,1999,Medium,Tier 1,Supermarket Type1,6179.9556 +FDE16,,Low Fat,0.026216144,Frozen Foods,207.5954,OUT027,1985,Medium,Tier 3,Supermarket Type3,6668.6528 +FDT58,9,Low Fat,0.085938463,Snack Foods,168.6816,OUT035,2004,Small,Tier 2,Supermarket Type1,1342.2528 +FDR03,15.7,Regular,0.008734284,Meat,207.898,OUT035,2004,Small,Tier 2,Supermarket Type1,3095.97 +NCL30,18.1,Low Fat,0.049016517,Household,128.7336,OUT049,1999,Medium,Tier 1,Supermarket Type1,2173.1712 +FDT22,,Low Fat,0.111554381,Snack Foods,59.822,OUT027,1985,Medium,Tier 3,Supermarket Type3,1677.816 +FDP45,15.7,Regular,0.030672457,Snack Foods,253.1724,OUT049,1999,Medium,Tier 1,Supermarket Type1,5285.1204 +FDS15,9.195,Regular,0.077995641,Meat,107.1596,OUT013,1987,High,Tier 3,Supermarket Type1,2804.3496 +FDF16,,Low Fat,0.085715273,Frozen Foods,146.6076,OUT027,1985,Medium,Tier 3,Supermarket Type3,1773.6912 +FDL13,13.85,Regular,0.056432784,Breakfast,234.93,OUT045,2002,,Tier 2,Supermarket Type1,4660.6 +NCV30,20.2,Low Fat,0.066200667,Household,61.451,OUT018,2009,Medium,Tier 3,Supermarket Type2,126.502 +FDG33,,Regular,0.245542627,Seafood,172.2764,OUT019,1985,Small,Tier 1,Grocery Store,171.7764 +FDO10,13.65,reg,0.0127517,Snack Foods,55.5588,OUT046,1997,Small,Tier 1,Supermarket Type1,1603.2464 +FDQ03,15,Regular,0.077949334,Meat,238.7248,OUT013,1987,High,Tier 3,Supermarket Type1,2133.2232 +NCC55,10.695,Low Fat,0.064022881,Household,36.0848,OUT018,2009,Medium,Tier 3,Supermarket Type2,372.848 +FDD52,,Regular,0.182407266,Dairy,109.157,OUT027,1985,Medium,Tier 3,Supermarket Type3,1867.569 +FDI16,14,Regular,0.136328794,Frozen Foods,54.864,OUT018,2009,Medium,Tier 3,Supermarket Type2,319.584 +FDB44,6.655,Low Fat,0.016958832,Fruits and Vegetables,210.0586,OUT046,1997,Small,Tier 1,Supermarket Type1,4221.172 +FDA25,16.5,Regular,0.068125756,Canned,101.199,OUT046,1997,Small,Tier 1,Supermarket Type1,1031.99 +FDV33,9.6,Regular,0.02734361,Snack Foods,257.8304,OUT046,1997,Small,Tier 1,Supermarket Type1,1808.3128 +FDX47,6.55,Regular,0.034658144,Breads,155.8288,OUT049,1999,Medium,Tier 1,Supermarket Type1,1099.9016 +FDO50,16.25,low fat,0,Canned,89.8804,OUT017,2007,,Tier 2,Supermarket Type1,1102.5648 +FDV57,15.25,Regular,0.065841719,Snack Foods,179.866,OUT013,1987,High,Tier 3,Supermarket Type1,2696.49 +FDB02,9.695,Regular,0.029158763,Canned,174.537,OUT035,2004,Small,Tier 2,Supermarket Type1,1235.059 +FDD16,,Low Fat,0.063649582,Frozen Foods,74.7696,OUT019,1985,Small,Tier 1,Grocery Store,74.5696 +FDX02,16,LF,0.05706009,Dairy,225.0404,OUT046,1997,Small,Tier 1,Supermarket Type1,4950.8888 +FDP11,15.85,Low Fat,0.11566015,Breads,218.3166,OUT010,1998,,Tier 3,Grocery Store,435.4332 +FDH32,,Low Fat,0.075691713,Fruits and Vegetables,98.241,OUT027,1985,Medium,Tier 3,Supermarket Type3,2220.443 +NCL18,18.85,Low Fat,0.167844438,Household,193.9136,OUT049,1999,Medium,Tier 1,Supermarket Type1,3110.6176 +FDT12,6.215,Regular,0.049722335,Baking Goods,224.5062,OUT045,2002,,Tier 2,Supermarket Type1,4514.124 +FDD50,,Low Fat,0.14095631,Canned,167.7132,OUT027,1985,Medium,Tier 3,Supermarket Type3,3889.6036 +NCU05,11.8,Low Fat,0.058827557,Health and Hygiene,80.8618,OUT049,1999,Medium,Tier 1,Supermarket Type1,1288.9888 +FDI56,7.325,Low Fat,0.093765794,Fruits and Vegetables,90.3146,OUT018,2009,Medium,Tier 3,Supermarket Type2,1733.0774 +DRL11,10.5,Low Fat,0.048092816,Hard Drinks,159.2946,OUT049,1999,Medium,Tier 1,Supermarket Type1,1893.5352 +FDQ08,15.7,Regular,0.018968743,Fruits and Vegetables,61.9536,OUT045,2002,,Tier 2,Supermarket Type1,1225.072 +FDW20,,Low Fat,0.024032484,Fruits and Vegetables,124.973,OUT027,1985,Medium,Tier 3,Supermarket Type3,2463.46 +FDW46,13,Regular,0.070444232,Snack Foods,63.4484,OUT045,2002,,Tier 2,Supermarket Type1,1043.9744 +FDO09,13.5,Regular,0.125469442,Snack Foods,264.491,OUT049,1999,Medium,Tier 1,Supermarket Type1,6574.775 +DRJ49,6.865,Low Fat,0.01405025,Soft Drinks,128.9652,OUT018,2009,Medium,Tier 3,Supermarket Type2,1679.1476 +FDP26,7.785,Low Fat,0.139436695,Dairy,103.0306,OUT013,1987,High,Tier 3,Supermarket Type1,2404.2038 +FDO19,17.7,Regular,0.016593506,Fruits and Vegetables,46.9034,OUT035,2004,Small,Tier 2,Supermarket Type1,972.068 +NCG43,20.2,Low Fat,0.124261614,Household,93.6462,OUT010,1998,,Tier 3,Grocery Store,277.6386 +FDG02,7.855,Low Fat,0.011261165,Canned,189.5188,OUT046,1997,Small,Tier 1,Supermarket Type1,1904.188 +FDO32,6.36,Low Fat,0.120520818,Fruits and Vegetables,45.906,OUT035,2004,Small,Tier 2,Supermarket Type1,419.454 +FDR34,17,Regular,0.015965308,Snack Foods,229.4352,OUT046,1997,Small,Tier 1,Supermarket Type1,4809.7392 +FDU59,5.78,Low Fat,0.096386227,Breads,163.5552,OUT046,1997,Small,Tier 1,Supermarket Type1,1787.0072 +FDN31,11.5,Low Fat,0.073029341,Fruits and Vegetables,187.953,OUT045,2002,,Tier 2,Supermarket Type1,2656.542 +FDT55,,Regular,0.043443753,Fruits and Vegetables,158.1946,OUT027,1985,Medium,Tier 3,Supermarket Type3,6942.9624 +FDE08,18.2,Low Fat,0.049520593,Fruits and Vegetables,147.3734,OUT018,2009,Medium,Tier 3,Supermarket Type2,2375.5744 +FDK52,18.25,Low Fat,0.079152918,Frozen Foods,223.8062,OUT013,1987,High,Tier 3,Supermarket Type1,4288.4178 +FDW11,12.6,Low Fat,0.048741487,Breads,60.4194,OUT013,1987,High,Tier 3,Supermarket Type1,990.7104 +FDC03,8.575,reg,0.071958197,Dairy,195.3794,OUT049,1999,Medium,Tier 1,Supermarket Type1,3511.4292 +FDR43,18.2,Low Fat,0.162147349,Fruits and Vegetables,37.719,OUT018,2009,Medium,Tier 3,Supermarket Type2,549.285 +FDL14,8.115,reg,0.05382735,Canned,155.2972,OUT010,1998,,Tier 3,Grocery Store,311.5944 +FDP39,12.65,Low Fat,0.069565759,Meat,52.4324,OUT045,2002,,Tier 2,Supermarket Type1,571.2564 +FDG29,,Low Fat,0.056019324,Frozen Foods,40.0454,OUT027,1985,Medium,Tier 3,Supermarket Type3,419.454 +DRH15,8.775,Low Fat,0.109911272,Dairy,41.9428,OUT046,1997,Small,Tier 1,Supermarket Type1,1537.998 +FDT11,5.94,Regular,0.029366813,Breads,187.7556,OUT035,2004,Small,Tier 2,Supermarket Type1,3755.112 +FDU48,18.85,Low Fat,0.055347985,Baking Goods,131.5284,OUT035,2004,Small,Tier 2,Supermarket Type1,1581.9408 +FDY12,9.8,Regular,0,Baking Goods,49.2008,OUT013,1987,High,Tier 3,Supermarket Type1,657.8104 +FDS44,12.65,Regular,0.156926608,Fruits and Vegetables,238.3538,OUT017,2007,,Tier 2,Supermarket Type1,5528.1374 +NCP06,20.7,Low Fat,0.039405676,Household,149.8366,OUT018,2009,Medium,Tier 3,Supermarket Type2,2267.049 +DRH23,14.65,Low Fat,0.170176516,Hard Drinks,55.2614,OUT013,1987,High,Tier 3,Supermarket Type1,718.3982 +FDA16,,Low Fat,0.033777629,Frozen Foods,222.8456,OUT027,1985,Medium,Tier 3,Supermarket Type3,7073.4592 +FDT45,15.85,Low Fat,0.057546914,Snack Foods,55.8956,OUT018,2009,Medium,Tier 3,Supermarket Type2,491.3604 +FDE56,17.25,Regular,0.160095901,Fruits and Vegetables,61.5194,OUT017,2007,,Tier 2,Supermarket Type1,1052.6298 +FDA40,16,Regular,0.099832728,Frozen Foods,87.4856,OUT017,2007,,Tier 2,Supermarket Type1,263.6568 +FDA39,6.32,Low Fat,0.012717946,Meat,40.2822,OUT046,1997,Small,Tier 1,Supermarket Type1,628.5152 +NCB19,6.525,LF,0.090278634,Household,86.7882,OUT035,2004,Small,Tier 2,Supermarket Type1,1975.4286 +FDZ34,6.695,Low Fat,0,Starchy Foods,191.882,OUT013,1987,High,Tier 3,Supermarket Type1,3861.64 +FDV22,14.85,Regular,0.009958941,Snack Foods,157.963,OUT045,2002,,Tier 2,Supermarket Type1,2816.334 +FDO40,17.1,Low Fat,0.032678839,Frozen Foods,150.7392,OUT049,1999,Medium,Tier 1,Supermarket Type1,3131.9232 +FDD21,10.3,Regular,0,Fruits and Vegetables,115.0176,OUT013,1987,High,Tier 3,Supermarket Type1,4122.6336 +FDO36,19.7,Low Fat,0.077849003,Baking Goods,179.166,OUT013,1987,High,Tier 3,Supermarket Type1,3056.022 +FDV34,10.695,Regular,0.011443222,Snack Foods,73.5038,OUT049,1999,Medium,Tier 1,Supermarket Type1,1478.076 +NCY18,7.285,Low Fat,0.031214809,Household,177.1054,OUT045,2002,,Tier 2,Supermarket Type1,2626.581 +NCM54,17.7,LF,0.051146565,Household,127.3678,OUT018,2009,Medium,Tier 3,Supermarket Type2,3306.3628 +FDB59,18.25,Low Fat,0.015302653,Snack Foods,198.0084,OUT049,1999,Medium,Tier 1,Supermarket Type1,793.6336 +FDS45,5.175,Regular,0.04937018,Snack Foods,106.7622,OUT010,1998,,Tier 3,Grocery Store,211.7244 +FDV24,5.635,Low Fat,0,Baking Goods,148.705,OUT049,1999,Medium,Tier 1,Supermarket Type1,1198.44 +FDD46,6.035,Low Fat,0.236433601,Snack Foods,155.5998,OUT010,1998,,Tier 3,Grocery Store,153.7998 +FDQ39,14.8,Low Fat,0.081372267,Meat,191.4846,OUT018,2009,Medium,Tier 3,Supermarket Type2,3057.3536 +FDD52,18.25,Regular,0.18329488,Dairy,111.657,OUT046,1997,Small,Tier 1,Supermarket Type1,1537.998 +FDL39,16.1,Regular,0.06358934,Dairy,179.4318,OUT018,2009,Medium,Tier 3,Supermarket Type2,360.8636 +FDV02,16.75,Low Fat,0.060792265,Dairy,170.4106,OUT018,2009,Medium,Tier 3,Supermarket Type2,513.3318 +FDE11,17.7,Regular,0,Starchy Foods,184.3924,OUT046,1997,Small,Tier 1,Supermarket Type1,4257.1252 +NCU54,8.88,Low Fat,0.098775709,Household,208.927,OUT049,1999,Medium,Tier 1,Supermarket Type1,7130.718 +FDR43,18.2,Low Fat,0.270300331,Fruits and Vegetables,38.319,OUT010,1998,,Tier 3,Grocery Store,109.857 +FDD51,11.15,low fat,0.119852889,Dairy,44.9744,OUT013,1987,High,Tier 3,Supermarket Type1,498.0184 +FDO60,20,LF,0.034563936,Baking Goods,45.3086,OUT017,2007,,Tier 2,Supermarket Type1,490.6946 +NCS06,7.935,Low Fat,0.031710329,Household,263.091,OUT013,1987,High,Tier 3,Supermarket Type1,5522.811 +FDX50,20.1,LF,0.074778547,Dairy,110.7228,OUT045,2002,,Tier 2,Supermarket Type1,1657.842 +FDQ55,13.65,Regular,0.013035609,Fruits and Vegetables,114.7834,OUT035,2004,Small,Tier 2,Supermarket Type1,3455.502 +FDL52,6.635,Regular,0.046277956,Frozen Foods,36.7506,OUT018,2009,Medium,Tier 3,Supermarket Type2,75.9012 +FDK52,18.25,Low Fat,0.0793795,Frozen Foods,226.1062,OUT045,2002,,Tier 2,Supermarket Type1,6771.186 +NCO02,11.15,Low Fat,0.073783159,Others,66.0142,OUT017,2007,,Tier 2,Supermarket Type1,988.713 +NCO30,19.5,Low Fat,0.01572192,Household,185.6608,OUT035,2004,Small,Tier 2,Supermarket Type1,918.804 +FDA33,6.48,LF,0.033952603,Snack Foods,148.2076,OUT049,1999,Medium,Tier 1,Supermarket Type1,3399.5748 +FDB12,11.15,Regular,0.105220024,Baking Goods,102.7648,OUT013,1987,High,Tier 3,Supermarket Type1,1142.5128 +FDT40,5.985,Low Fat,0.095715608,Frozen Foods,125.8678,OUT013,1987,High,Tier 3,Supermarket Type1,3560.6984 +NCO05,7.27,Low Fat,0.046822808,Health and Hygiene,99.3384,OUT017,2007,,Tier 2,Supermarket Type1,2759.0752 +FDR32,6.78,Regular,0,Fruits and Vegetables,227.5694,OUT049,1999,Medium,Tier 1,Supermarket Type1,3653.9104 +FDM04,9.195,Regular,0.04731256,Frozen Foods,50.7666,OUT018,2009,Medium,Tier 3,Supermarket Type2,512.666 +DRL01,19.5,Regular,0.077108099,Soft Drinks,232.8958,OUT013,1987,High,Tier 3,Supermarket Type1,5608.6992 +FDQ56,6.59,Low Fat,0.106027474,Fruits and Vegetables,83.9908,OUT018,2009,Medium,Tier 3,Supermarket Type2,1426.1436 +FDH08,7.51,Low Fat,0.01742908,Fruits and Vegetables,229.601,OUT046,1997,Small,Tier 1,Supermarket Type1,6201.927 +NCQ06,,Low Fat,0.073229342,Household,254.1014,OUT019,1985,Small,Tier 1,Grocery Store,255.0014 +FDG16,,Low Fat,0.157257637,Frozen Foods,215.0192,OUT019,1985,Small,Tier 1,Grocery Store,1078.596 +FDZ40,,Low Fat,0.039988162,Frozen Foods,55.7298,OUT027,1985,Medium,Tier 3,Supermarket Type3,1024.6662 +FDY51,12.5,Low Fat,0.081119484,Meat,220.0798,OUT035,2004,Small,Tier 2,Supermarket Type1,1322.2788 +NCN41,17,Low Fat,0.052421981,Health and Hygiene,123.773,OUT018,2009,Medium,Tier 3,Supermarket Type2,1231.73 +NCM17,,Low Fat,0.070791391,Health and Hygiene,46.4086,OUT027,1985,Medium,Tier 3,Supermarket Type3,2007.387 +FDP39,12.65,Low Fat,0.069817659,Meat,53.5324,OUT017,2007,,Tier 2,Supermarket Type1,830.9184 +FDZ08,12.5,Regular,0.109971578,Fruits and Vegetables,82.7592,OUT035,2004,Small,Tier 2,Supermarket Type1,577.9144 +FDU03,18.7,Regular,0.091950972,Meat,184.2292,OUT018,2009,Medium,Tier 3,Supermarket Type2,1277.0044 +FDZ49,11,Regular,0.133145617,Canned,218.4798,OUT046,1997,Small,Tier 1,Supermarket Type1,2203.798 +NCX30,,LF,0.046609281,Household,248.6776,OUT019,1985,Small,Tier 1,Grocery Store,495.3552 +FDV08,7.35,Low Fat,0.028652919,Fruits and Vegetables,40.5454,OUT045,2002,,Tier 2,Supermarket Type1,545.2902 +FDB15,10.895,Low Fat,0.136696892,Dairy,264.5568,OUT013,1987,High,Tier 3,Supermarket Type1,5536.7928 +FDY49,17.2,Regular,0.012002075,Canned,165.3184,OUT013,1987,High,Tier 3,Supermarket Type1,990.7104 +FDF24,15.5,reg,0.025513973,Baking Goods,83.7934,OUT017,2007,,Tier 2,Supermarket Type1,1474.0812 +DRK47,7.905,Low Fat,0.064194304,Hard Drinks,229.4694,OUT045,2002,,Tier 2,Supermarket Type1,2055.3246 +DRD37,9.8,Low Fat,0.013920032,Soft Drinks,45.006,OUT017,2007,,Tier 2,Supermarket Type1,792.302 +FDH40,11.6,Regular,0.079251097,Frozen Foods,79.2276,OUT018,2009,Medium,Tier 3,Supermarket Type2,649.8208 +FDL12,,Regular,0.121043709,Baking Goods,59.422,OUT027,1985,Medium,Tier 3,Supermarket Type3,1078.596 +FDW11,,Low Fat,0.048545853,Breads,60.1194,OUT027,1985,Medium,Tier 3,Supermarket Type3,1114.5492 +NCE06,5.825,LF,0.091467933,Household,159.7894,OUT035,2004,Small,Tier 2,Supermarket Type1,1294.3152 +FDF32,16.35,Low Fat,0,Fruits and Vegetables,196.3426,OUT018,2009,Medium,Tier 3,Supermarket Type2,1384.1982 +DRI47,14.7,Low Fat,0.020916223,Hard Drinks,141.8128,OUT035,2004,Small,Tier 2,Supermarket Type1,1869.5664 +DRA12,11.6,LF,0,Soft Drinks,141.9154,OUT035,2004,Small,Tier 2,Supermarket Type1,992.7078 +FDX45,16.75,Low Fat,0.104768536,Snack Foods,155.163,OUT013,1987,High,Tier 3,Supermarket Type1,2972.797 +FDR35,12.5,Low Fat,0.020680499,Breads,197.2742,OUT013,1987,High,Tier 3,Supermarket Type1,2587.9646 +FDK03,12.6,Regular,0.123727659,Dairy,253.0356,OUT010,1998,,Tier 3,Grocery Store,254.3356 +NCJ18,12.35,Low Fat,0.163805509,Household,117.6124,OUT013,1987,High,Tier 3,Supermarket Type1,3910.9092 +FDN48,13.35,Low Fat,0.065082452,Baking Goods,93.0804,OUT045,2002,,Tier 2,Supermarket Type1,2113.2492 +FDZ59,,Regular,0.182128363,Baking Goods,165.65,OUT019,1985,Small,Tier 1,Grocery Store,665.8 +FDB57,,Regular,0.01871404,Fruits and Vegetables,223.4772,OUT027,1985,Medium,Tier 3,Supermarket Type3,7116.0704 +DRP35,,Low Fat,0.159096908,Hard Drinks,129.3336,OUT019,1985,Small,Tier 1,Grocery Store,127.8336 +FDZ59,6.63,Regular,0.103935018,Baking Goods,166.85,OUT013,1987,High,Tier 3,Supermarket Type1,5326.4 +FDU58,6.61,Regular,0.029129907,Snack Foods,188.4898,OUT018,2009,Medium,Tier 3,Supermarket Type2,4677.245 +FDL09,19.6,Regular,0.128011859,Snack Foods,166.8816,OUT035,2004,Small,Tier 2,Supermarket Type1,1845.5976 +FDY38,13.6,Regular,0.119850541,Dairy,234.53,OUT017,2007,,Tier 2,Supermarket Type1,6524.84 +FDI46,,Low Fat,0.073985248,Snack Foods,252.5724,OUT027,1985,Medium,Tier 3,Supermarket Type3,3271.7412 +FDL03,19.25,Regular,0.027233781,Meat,197.511,OUT017,2007,,Tier 2,Supermarket Type1,982.055 +DRC25,,Low Fat,0.079440262,Soft Drinks,86.7882,OUT019,1985,Small,Tier 1,Grocery Store,85.8882 +FDU60,20,Regular,0.060022526,Baking Goods,168.7132,OUT045,2002,,Tier 2,Supermarket Type1,6426.3016 +FDP25,,Low Fat,0.02110482,Canned,217.0824,OUT027,1985,Medium,Tier 3,Supermarket Type3,6769.8544 +FDO57,20.75,Low Fat,0.181958524,Snack Foods,161.0578,OUT010,1998,,Tier 3,Grocery Store,481.3734 +FDQ09,7.235,Low Fat,0.058222587,Snack Foods,114.8834,OUT049,1999,Medium,Tier 1,Supermarket Type1,3340.3186 +NCY05,,Low Fat,0.054723717,Health and Hygiene,36.6874,OUT027,1985,Medium,Tier 3,Supermarket Type3,1058.622 +FDA20,6.78,Low Fat,0.066724663,Fruits and Vegetables,187.724,OUT049,1999,Medium,Tier 1,Supermarket Type1,1491.392 +FDF16,7.3,Low Fat,0.144167934,Frozen Foods,146.3076,OUT010,1998,,Tier 3,Grocery Store,886.8456 +NCG07,12.3,Low Fat,0.052458358,Household,188.753,OUT013,1987,High,Tier 3,Supermarket Type1,3795.06 +FDR46,16.85,Low Fat,0.139985583,Snack Foods,145.276,OUT018,2009,Medium,Tier 3,Supermarket Type2,2490.092 +FDP22,14.65,Regular,0.099286298,Snack Foods,49.8666,OUT049,1999,Medium,Tier 1,Supermarket Type1,563.9326 +FDL45,15.6,Low Fat,0.037680711,Snack Foods,123.7704,OUT035,2004,Small,Tier 2,Supermarket Type1,3129.26 +NCF42,17.35,Low Fat,0.168064909,Household,176.2712,OUT018,2009,Medium,Tier 3,Supermarket Type2,1230.3984 +FDD04,16,Low Fat,0.090111173,Dairy,141.3154,OUT049,1999,Medium,Tier 1,Supermarket Type1,3261.7542 +FDC45,17,Low Fat,0.136286138,Fruits and Vegetables,170.9106,OUT018,2009,Medium,Tier 3,Supermarket Type2,1197.7742 +FDI40,11.5,reg,0.125857678,Frozen Foods,100.5358,OUT045,2002,,Tier 2,Supermarket Type1,2111.2518 +FDQ11,5.695,Regular,0.067700925,Breads,256.5988,OUT046,1997,Small,Tier 1,Supermarket Type1,2055.9904 +DRM48,15.2,Low Fat,0.112896669,Soft Drinks,36.0848,OUT046,1997,Small,Tier 1,Supermarket Type1,1193.1136 +FDS12,9.1,Low Fat,0.173973652,Baking Goods,126.5362,OUT013,1987,High,Tier 3,Supermarket Type1,1761.7068 +FDR46,16.85,Low Fat,0,Snack Foods,146.076,OUT017,2007,,Tier 2,Supermarket Type1,2636.568 +NCO02,11.15,Low Fat,0.073516952,Others,65.9142,OUT045,2002,,Tier 2,Supermarket Type1,790.9704 +FDQ52,17,Low Fat,0.119285634,Frozen Foods,247.4434,OUT013,1987,High,Tier 3,Supermarket Type1,2980.1208 +FDY28,7.47,Regular,0.153011599,Frozen Foods,215.2218,OUT017,2007,,Tier 2,Supermarket Type1,3419.5488 +FDE32,20.7,Low Fat,0.04875891,Fruits and Vegetables,37.3506,OUT046,1997,Small,Tier 1,Supermarket Type1,834.9132 +FDJ58,15.6,Regular,0.105276162,Snack Foods,173.2764,OUT035,2004,Small,Tier 2,Supermarket Type1,3779.0808 +FDJ27,17.7,Regular,0.122123201,Meat,100.7674,OUT045,2002,,Tier 2,Supermarket Type1,814.9392 +NCM18,13,Low Fat,0.082970667,Household,60.0194,OUT049,1999,Medium,Tier 1,Supermarket Type1,1114.5492 +FDA02,14,Regular,0.029782937,Dairy,146.3786,OUT045,2002,,Tier 2,Supermarket Type1,866.8716 +FDT26,18.85,Regular,0.067953506,Dairy,119.044,OUT046,1997,Small,Tier 1,Supermarket Type1,2396.88 +DRD60,15.7,Low Fat,0.03722507,Soft Drinks,182.4634,OUT035,2004,Small,Tier 2,Supermarket Type1,1999.3974 +NCR18,15.85,Low Fat,0.020487625,Household,44.0112,OUT046,1997,Small,Tier 1,Supermarket Type1,468.7232 +FDO27,6.175,Regular,0.179077475,Meat,94.3752,OUT046,1997,Small,Tier 1,Supermarket Type1,1342.2528 +FDP25,,low fat,0.037131628,Canned,216.4824,OUT019,1985,Small,Tier 1,Grocery Store,218.3824 +FDQ51,16,Regular,0.017547958,Meat,48.3718,OUT035,2004,Small,Tier 2,Supermarket Type1,614.5334 +NCH07,13.15,Low Fat,0.093191195,Household,158.1604,OUT017,2007,,Tier 2,Supermarket Type1,1426.1436 +FDP44,16.5,Regular,0.079875237,Fruits and Vegetables,102.7332,OUT045,2002,,Tier 2,Supermarket Type1,1537.998 +NCP55,14.65,Low Fat,0.01125332,Others,57.0614,OUT017,2007,,Tier 2,Supermarket Type1,939.4438 +FDO09,13.5,Regular,0.125170423,Snack Foods,261.491,OUT013,1987,High,Tier 3,Supermarket Type1,3418.883 +FDP38,10.1,Low Fat,0.032152004,Canned,50.6008,OUT049,1999,Medium,Tier 1,Supermarket Type1,404.8064 +FDI48,11.85,Regular,0.056033565,Baking Goods,51.4666,OUT017,2007,,Tier 2,Supermarket Type1,974.0654 +FDS58,9.285,Regular,0.021049215,Snack Foods,161.0578,OUT045,2002,,Tier 2,Supermarket Type1,2406.867 +FDJ55,12.8,Regular,0.023526504,Meat,223.5404,OUT035,2004,Small,Tier 2,Supermarket Type1,5626.01 +NCF06,6.235,Low Fat,0.020229757,Household,260.8962,OUT049,1999,Medium,Tier 1,Supermarket Type1,5956.9126 +FDF41,12.15,Low Fat,0.131445848,Frozen Foods,246.846,OUT045,2002,,Tier 2,Supermarket Type1,6404.996 +NCL05,,Low Fat,0.083862625,Health and Hygiene,44.077,OUT019,1985,Small,Tier 1,Grocery Store,216.385 +FDT24,12.35,reg,0.18614827,Baking Goods,78.2328,OUT049,1999,Medium,Tier 1,Supermarket Type1,1158.492 +FDK08,9.195,Regular,0.204713036,Fruits and Vegetables,101.0016,OUT010,1998,,Tier 3,Grocery Store,202.4032 +FDU55,16.2,Low Fat,0.036057562,Fruits and Vegetables,260.3278,OUT018,2009,Medium,Tier 3,Supermarket Type2,2342.9502 +NCY18,7.285,Low Fat,0.031327839,Household,174.6054,OUT017,2007,,Tier 2,Supermarket Type1,2976.7918 +FDS11,7.05,Regular,0.055558509,Breads,224.7088,OUT046,1997,Small,Tier 1,Supermarket Type1,3131.9232 +FDC28,,Low Fat,0,Frozen Foods,109.9254,OUT019,1985,Small,Tier 1,Grocery Store,108.5254 +FDR59,14.5,Regular,0.063863551,Breads,262.3594,OUT046,1997,Small,Tier 1,Supermarket Type1,4448.2098 +DRE15,13.35,Low Fat,0,Dairy,75.7012,OUT017,2007,,Tier 2,Supermarket Type1,1442.1228 +FDP19,11.5,Low Fat,0,Fruits and Vegetables,128.4652,OUT049,1999,Medium,Tier 1,Supermarket Type1,2841.6344 +DRN47,12.1,Low Fat,0.016852909,Hard Drinks,180.666,OUT049,1999,Medium,Tier 1,Supermarket Type1,2876.256 +FDJ34,11.8,Regular,0.094037241,Snack Foods,124.5704,OUT018,2009,Medium,Tier 3,Supermarket Type2,1001.3632 +FDX21,7.05,Low Fat,0.085312137,Snack Foods,107.4912,OUT018,2009,Medium,Tier 3,Supermarket Type2,982.7208 +FDI57,,Low Fat,0.053764023,Seafood,195.7768,OUT027,1985,Medium,Tier 3,Supermarket Type3,3547.3824 +NCI42,18.75,Low Fat,0.010365546,Household,207.0954,OUT046,1997,Small,Tier 1,Supermarket Type1,3125.931 +FDL03,19.25,Regular,0.027135522,Meat,196.311,OUT045,2002,,Tier 2,Supermarket Type1,3142.576 +FDX37,16.2,Low Fat,0,Canned,100.57,OUT013,1987,High,Tier 3,Supermarket Type1,1398.18 +FDW57,8.31,reg,0.116148596,Snack Foods,176.0028,OUT018,2009,Medium,Tier 3,Supermarket Type2,4427.57 +FDX14,13.1,Low Fat,0.075363922,Dairy,73.8354,OUT017,2007,,Tier 2,Supermarket Type1,1956.1204 +FDD09,13.5,Low Fat,0.021496403,Fruits and Vegetables,180.5976,OUT046,1997,Small,Tier 1,Supermarket Type1,3078.6592 +FDM09,11.15,Regular,0.085931544,Snack Foods,169.679,OUT046,1997,Small,Tier 1,Supermarket Type1,1018.674 +NCW54,7.5,Low Fat,0.096806008,Household,56.2588,OUT018,2009,Medium,Tier 3,Supermarket Type2,687.1056 +DRL11,,low fat,0.04778563,Hard Drinks,156.5946,OUT027,1985,Medium,Tier 3,Supermarket Type3,3787.0704 +FDJ58,15.6,Regular,0.105725004,Snack Foods,169.9764,OUT018,2009,Medium,Tier 3,Supermarket Type2,2748.4224 +FDX21,,Low Fat,0.148764535,Snack Foods,111.1912,OUT019,1985,Small,Tier 1,Grocery Store,109.1912 +FDA20,6.78,Low Fat,0.066997921,Fruits and Vegetables,186.524,OUT017,2007,,Tier 2,Supermarket Type1,2609.936 +FDL34,16,Low Fat,0.040938155,Snack Foods,141.1496,OUT035,2004,Small,Tier 2,Supermarket Type1,4516.7872 +FDL38,,Regular,0.014661762,Canned,89.1172,OUT027,1985,Medium,Tier 3,Supermarket Type3,2319.6472 +DRL11,10.5,LF,0.048213766,Hard Drinks,159.6946,OUT018,2009,Medium,Tier 3,Supermarket Type2,3629.2758 +FDO40,17.1,Low Fat,0.032761024,Frozen Foods,148.8392,OUT018,2009,Medium,Tier 3,Supermarket Type2,2087.9488 +DRZ24,7.535,Low Fat,0,Soft Drinks,121.644,OUT045,2002,,Tier 2,Supermarket Type1,1557.972 +FDM52,15.1,Low Fat,0.025988508,Frozen Foods,146.6076,OUT035,2004,Small,Tier 2,Supermarket Type1,2364.9216 +FDM52,15.1,Low Fat,0.026140452,Frozen Foods,149.0076,OUT017,2007,,Tier 2,Supermarket Type1,4138.6128 +FDV49,10,low fat,0.025932408,Canned,264.7226,OUT018,2009,Medium,Tier 3,Supermarket Type2,3171.8712 +FDF47,20.85,Low Fat,0.098170402,Starchy Foods,224.0746,OUT017,2007,,Tier 2,Supermarket Type1,2243.746 +FDF56,16.7,Regular,0.119439636,Fruits and Vegetables,182.1976,OUT035,2004,Small,Tier 2,Supermarket Type1,724.3904 +FDW12,8.315,Regular,0.059540542,Baking Goods,143.6444,OUT010,1998,,Tier 3,Grocery Store,145.1444 +FDY09,,Low Fat,0.044122209,Snack Foods,173.8054,OUT019,1985,Small,Tier 1,Grocery Store,175.1054 +FDY55,16.75,Low Fat,0.081304829,Fruits and Vegetables,258.4988,OUT035,2004,Small,Tier 2,Supermarket Type1,4111.9808 +FDU36,,Low Fat,0.081014461,Baking Goods,98.8384,OUT019,1985,Small,Tier 1,Grocery Store,492.692 +NCR06,12.5,Low Fat,0.006775667,Household,42.9112,OUT049,1999,Medium,Tier 1,Supermarket Type1,1022.6688 +FDW24,6.8,Low Fat,0.03749705,Baking Goods,49.9034,OUT046,1997,Small,Tier 1,Supermarket Type1,194.4136 +FDF16,7.3,Low Fat,0.086060695,Frozen Foods,149.8076,OUT013,1987,High,Tier 3,Supermarket Type1,2808.3444 +NCR18,15.85,Low Fat,0.020519478,Household,42.5112,OUT049,1999,Medium,Tier 1,Supermarket Type1,852.224 +DRD01,12.1,Regular,0.061163967,Soft Drinks,56.5614,OUT035,2004,Small,Tier 2,Supermarket Type1,828.921 +FDS15,9.195,Regular,0.07821891,Meat,107.6596,OUT045,2002,,Tier 2,Supermarket Type1,323.5788 +FDT19,7.59,Regular,0.14492016,Fruits and Vegetables,174.708,OUT013,1987,High,Tier 3,Supermarket Type1,2942.836 +FDE59,12.15,Low Fat,0.062235983,Starchy Foods,34.5532,OUT013,1987,High,Tier 3,Supermarket Type1,359.532 +FDE04,19.75,Regular,0.030166924,Frozen Foods,179.766,OUT010,1998,,Tier 3,Grocery Store,719.064 +NCV17,18.85,Low Fat,0.016104504,Health and Hygiene,130.2626,OUT035,2004,Small,Tier 2,Supermarket Type1,2360.9268 +FDC17,12.15,LF,0.01544786,Frozen Foods,211.2928,OUT013,1987,High,Tier 3,Supermarket Type1,2735.1064 +FDI45,13.1,Low Fat,0.037574137,Fruits and Vegetables,174.2054,OUT035,2004,Small,Tier 2,Supermarket Type1,3677.2134 +FDZ33,,Low Fat,0.106876976,Snack Foods,146.7076,OUT027,1985,Medium,Tier 3,Supermarket Type3,3842.9976 +FDJ56,,Low Fat,0.32111501,Fruits and Vegetables,100.77,OUT019,1985,Small,Tier 1,Grocery Store,199.74 +FDN25,7.895,Regular,0.061124626,Breakfast,58.5588,OUT013,1987,High,Tier 3,Supermarket Type1,171.7764 +FDC10,,Regular,0.127599399,Snack Foods,118.9098,OUT019,1985,Small,Tier 1,Grocery Store,120.5098 +FDQ22,16.75,Low Fat,0.029785889,Snack Foods,38.9822,OUT049,1999,Medium,Tier 1,Supermarket Type1,628.5152 +NCR54,16.35,Low Fat,0,Household,198.211,OUT035,2004,Small,Tier 2,Supermarket Type1,2946.165 +DRK11,8.21,Low Fat,0.010762387,Hard Drinks,149.5392,OUT035,2004,Small,Tier 2,Supermarket Type1,1789.6704 +DRI37,15.85,Low Fat,0.108206497,Soft Drinks,58.3904,OUT017,2007,,Tier 2,Supermarket Type1,468.7232 +FDX37,16.2,Low Fat,0.063127333,Canned,100.47,OUT049,1999,Medium,Tier 1,Supermarket Type1,1597.92 +FDF05,17.5,Low Fat,0.02687089,Frozen Foods,264.491,OUT046,1997,Small,Tier 1,Supermarket Type1,3681.874 +FDW36,,Low Fat,0.099681705,Baking Goods,107.4622,OUT019,1985,Small,Tier 1,Grocery Store,317.5866 +FDI04,13.65,Regular,0.072898645,Frozen Foods,198.1426,OUT035,2004,Small,Tier 2,Supermarket Type1,1977.426 +FDB04,11.35,Regular,0.063354531,Dairy,88.9856,OUT045,2002,,Tier 2,Supermarket Type1,1230.3984 +FDU38,10.8,Low Fat,0.082534287,Dairy,191.1504,OUT035,2004,Small,Tier 2,Supermarket Type1,4410.2592 +FDY28,7.47,Regular,0.152024355,Frozen Foods,211.8218,OUT013,1987,High,Tier 3,Supermarket Type1,1496.0526 +FDP20,19.85,Low Fat,0.045669236,Fruits and Vegetables,126.402,OUT046,1997,Small,Tier 1,Supermarket Type1,1012.016 +FDC29,8.39,Regular,0.024342578,Frozen Foods,113.6176,OUT017,2007,,Tier 2,Supermarket Type1,2862.94 +FDR45,10.8,Low Fat,0.028988288,Snack Foods,239.2222,OUT049,1999,Medium,Tier 1,Supermarket Type1,6692.6216 +NCC42,15,Low Fat,0.044908404,Health and Hygiene,140.2838,OUT046,1997,Small,Tier 1,Supermarket Type1,1404.838 +NCF42,17.35,Low Fat,0.168329848,Household,176.7712,OUT017,2007,,Tier 2,Supermarket Type1,2812.3392 +FDZ45,14.1,Low Fat,0.111936685,Snack Foods,198.8084,OUT010,1998,,Tier 3,Grocery Store,992.042 +FDB23,19.2,Regular,0.005620213,Starchy Foods,226.6062,OUT017,2007,,Tier 2,Supermarket Type1,5191.2426 +FDC41,15.6,Low Fat,0.117095014,Frozen Foods,78.067,OUT049,1999,Medium,Tier 1,Supermarket Type1,1148.505 +FDA10,,LF,0.248301532,Snack Foods,124.1072,OUT019,1985,Small,Tier 1,Grocery Store,245.0144 +NCM26,20.5,LF,0.023274107,Others,154.134,OUT017,2007,,Tier 2,Supermarket Type1,2909.546 +FDZ58,,Low Fat,0.091354948,Snack Foods,122.3072,OUT019,1985,Small,Tier 1,Grocery Store,122.5072 +FDW35,10.6,Low Fat,0.011087128,Breads,41.4454,OUT035,2004,Small,Tier 2,Supermarket Type1,1468.089 +FDX32,15.1,Regular,0.099839365,Fruits and Vegetables,143.3786,OUT035,2004,Small,Tier 2,Supermarket Type1,1733.7432 +FDK40,7.035,Low Fat,0.021938404,Frozen Foods,264.691,OUT018,2009,Medium,Tier 3,Supermarket Type2,5785.802 +FDD04,16,Low Fat,0.090480206,Dairy,142.4154,OUT017,2007,,Tier 2,Supermarket Type1,1985.4156 +FDP28,13.65,Regular,0.080640478,Frozen Foods,262.6936,OUT046,1997,Small,Tier 1,Supermarket Type1,4175.8976 +NCL42,18.85,Low Fat,0.040338009,Household,246.7144,OUT013,1987,High,Tier 3,Supermarket Type1,6615.3888 +DRB13,6.115,Regular,0.007043008,Soft Drinks,190.353,OUT035,2004,Small,Tier 2,Supermarket Type1,569.259 +FDC33,8.96,Regular,0.069219165,Fruits and Vegetables,196.5768,OUT018,2009,Medium,Tier 3,Supermarket Type2,2759.0752 +FDO58,19.6,Low Fat,0.039569689,Snack Foods,165.9526,OUT035,2004,Small,Tier 2,Supermarket Type1,2631.2416 +FDE34,9.195,Low Fat,0.180588082,Snack Foods,182.2634,OUT010,1998,,Tier 3,Grocery Store,363.5268 +NCE19,8.97,Low Fat,0.09301462,Household,52.7956,OUT046,1997,Small,Tier 1,Supermarket Type1,1037.3164 +NCJ18,12.35,LF,0.274405193,Household,117.1124,OUT010,1998,,Tier 3,Grocery Store,355.5372 +FDF52,9.3,Low Fat,0.066887123,Frozen Foods,183.9292,OUT049,1999,Medium,Tier 1,Supermarket Type1,3283.7256 +FDY04,17.7,Regular,0.042468413,Frozen Foods,162.421,OUT035,2004,Small,Tier 2,Supermarket Type1,1468.089 +DRF49,7.27,Low Fat,0.071188446,Soft Drinks,111.9518,OUT049,1999,Medium,Tier 1,Supermarket Type1,1138.518 +FDX27,20.7,Regular,0.191008614,Dairy,92.8436,OUT010,1998,,Tier 3,Grocery Store,189.0872 +FDV28,16.1,Regular,0.159595473,Frozen Foods,32.8558,OUT013,1987,High,Tier 3,Supermarket Type1,339.558 +FDE33,,Regular,0.086905536,Fruits and Vegetables,78.8644,OUT019,1985,Small,Tier 1,Grocery Store,314.2576 +FDQ37,20.75,Low Fat,0.089186387,Breakfast,193.3478,OUT013,1987,High,Tier 3,Supermarket Type1,6006.1818 +NCG30,20.2,LF,0.112321218,Household,123.6046,OUT046,1997,Small,Tier 1,Supermarket Type1,2988.1104 +NCH29,5.51,Low Fat,0.034668802,Health and Hygiene,98.5726,OUT017,2007,,Tier 2,Supermarket Type1,1761.7068 +FDV20,20.2,Regular,0,Fruits and Vegetables,129.0678,OUT017,2007,,Tier 2,Supermarket Type1,3560.6984 +FDG57,14.7,Low Fat,0.072592873,Fruits and Vegetables,48.5034,OUT018,2009,Medium,Tier 3,Supermarket Type2,874.8612 +FDU60,20,Regular,0.059889718,Baking Goods,168.5132,OUT035,2004,Small,Tier 2,Supermarket Type1,2874.9244 +NCH30,17.1,Low Fat,0.112402118,Household,112.986,OUT010,1998,,Tier 3,Grocery Store,113.186 +NCM29,11.5,Low Fat,0.029529474,Health and Hygiene,132.6626,OUT010,1998,,Tier 3,Grocery Store,262.3252 +FDB12,11.15,Regular,0.105736638,Baking Goods,104.4648,OUT018,2009,Medium,Tier 3,Supermarket Type2,2181.1608 +FDD53,16.2,Low Fat,0.044291251,Frozen Foods,43.3454,OUT049,1999,Medium,Tier 1,Supermarket Type1,503.3448 +FDI44,16.1,Low Fat,0.100388706,Fruits and Vegetables,76.0328,OUT049,1999,Medium,Tier 1,Supermarket Type1,1853.5872 +FDW56,,Low Fat,0.070556945,Fruits and Vegetables,191.2162,OUT027,1985,Medium,Tier 3,Supermarket Type3,7504.2318 +FDA01,15,Regular,0.054599767,Canned,59.4904,OUT018,2009,Medium,Tier 3,Supermarket Type2,644.4944 +FDG47,12.8,Low Fat,0.069560905,Starchy Foods,263.0252,OUT013,1987,High,Tier 3,Supermarket Type1,2885.5772 +FDT40,5.985,Low Fat,0,Frozen Foods,125.2678,OUT035,2004,Small,Tier 2,Supermarket Type1,1017.3424 +FDU20,19.35,Regular,0.021453493,Fruits and Vegetables,120.3098,OUT035,2004,Small,Tier 2,Supermarket Type1,2530.7058 +NCP41,16.6,Low Fat,0.016276741,Health and Hygiene,109.8596,OUT018,2009,Medium,Tier 3,Supermarket Type2,1617.894 +FDW36,,LF,0.056656942,Baking Goods,106.2622,OUT027,1985,Medium,Tier 3,Supermarket Type3,2328.9684 +FDN31,11.5,Low Fat,0.072994847,Fruits and Vegetables,189.253,OUT049,1999,Medium,Tier 1,Supermarket Type1,1328.271 +NCU54,8.88,Low Fat,0.165073642,Household,207.727,OUT010,1998,,Tier 3,Grocery Store,209.727 +FDS01,11.6,Low Fat,0.017744999,Canned,177.9686,OUT046,1997,Small,Tier 1,Supermarket Type1,1244.3802 +FDA23,9.8,LF,0.047453947,Baking Goods,101.7016,OUT017,2007,,Tier 2,Supermarket Type1,1518.024 +FDY08,9.395,Regular,0.171422166,Fruits and Vegetables,139.1838,OUT045,2002,,Tier 2,Supermarket Type1,1685.8056 +FDJ28,12.3,Low Fat,0.021860985,Frozen Foods,193.3162,OUT046,1997,Small,Tier 1,Supermarket Type1,3078.6592 +DRF36,16.1,Low Fat,0.023577298,Soft Drinks,192.6846,OUT046,1997,Small,Tier 1,Supermarket Type1,2866.269 +FDH44,19.1,Regular,0.043304681,Fruits and Vegetables,147.5418,OUT010,1998,,Tier 3,Grocery Store,294.2836 +NCY54,8.43,Low Fat,0.177971115,Household,174.0422,OUT049,1999,Medium,Tier 1,Supermarket Type1,2069.3064 +FDR59,14.5,Regular,0.106894492,Breads,260.4594,OUT010,1998,,Tier 3,Grocery Store,1046.6376 +DRA59,8.27,Regular,0.127927931,Soft Drinks,184.8924,OUT046,1997,Small,Tier 1,Supermarket Type1,4442.2176 +FDS55,7.02,Low Fat,0.081623275,Fruits and Vegetables,148.0734,OUT017,2007,,Tier 2,Supermarket Type1,1930.1542 +FDZ28,20,Regular,0.051596927,Frozen Foods,128.0678,OUT045,2002,,Tier 2,Supermarket Type1,1780.3492 +DRG49,7.81,Low Fat,0.067592098,Soft Drinks,246.0486,OUT045,2002,,Tier 2,Supermarket Type1,7086.1094 +FDH21,,Low Fat,0.054670967,Seafood,158.6604,OUT019,1985,Small,Tier 1,Grocery Store,316.9208 +NCN19,13.1,Low Fat,0.012089479,Others,189.853,OUT013,1987,High,Tier 3,Supermarket Type1,3415.554 +FDP25,15.2,Low Fat,0.021250528,Canned,216.5824,OUT045,2002,,Tier 2,Supermarket Type1,5241.1776 +DRH59,10.8,Low Fat,0.05843345,Hard Drinks,74.738,OUT046,1997,Small,Tier 1,Supermarket Type1,1025.332 +FDH09,12.6,Low Fat,0.05606697,Seafood,50.7982,OUT035,2004,Small,Tier 2,Supermarket Type1,473.3838 +NCK54,12.15,Low Fat,0.029569276,Household,115.015,OUT049,1999,Medium,Tier 1,Supermarket Type1,2912.875 +FDT21,7.42,Low Fat,0.0204332,Snack Foods,248.9092,OUT045,2002,,Tier 2,Supermarket Type1,5976.2208 +FDR12,,Regular,0.055213281,Baking Goods,172.4764,OUT019,1985,Small,Tier 1,Grocery Store,687.1056 +FDS25,6.885,Regular,0.1408005,Canned,111.4228,OUT017,2007,,Tier 2,Supermarket Type1,2984.1156 +NCL05,,Low Fat,0.047665717,Health and Hygiene,42.177,OUT027,1985,Medium,Tier 3,Supermarket Type3,1255.033 +NCI30,20.25,Low Fat,0.059268885,Household,246.446,OUT017,2007,,Tier 2,Supermarket Type1,3695.19 +FDJ26,15.3,Regular,0.084937098,Canned,214.0218,OUT045,2002,,Tier 2,Supermarket Type1,1068.609 +FDA56,9.21,Low Fat,0.008778413,Fruits and Vegetables,122.4414,OUT049,1999,Medium,Tier 1,Supermarket Type1,1583.9382 +FDM33,15.6,Low Fat,0,Snack Foods,220.4798,OUT018,2009,Medium,Tier 3,Supermarket Type2,661.1394 +FDP04,15.35,Low Fat,0.013834247,Frozen Foods,62.7168,OUT049,1999,Medium,Tier 1,Supermarket Type1,958.752 +FDR55,12.15,Regular,0.132351411,Fruits and Vegetables,190.3872,OUT045,2002,,Tier 2,Supermarket Type1,2836.308 +NCZ54,,Low Fat,0.082955719,Household,164.0552,OUT027,1985,Medium,Tier 3,Supermarket Type3,5523.4768 +NCA53,11.395,low fat,0.009893817,Health and Hygiene,50.3034,OUT049,1999,Medium,Tier 1,Supermarket Type1,972.068 +FDL20,17.1,Low Fat,0,Fruits and Vegetables,111.9886,OUT046,1997,Small,Tier 1,Supermarket Type1,3002.0922 +FDT26,18.85,Regular,0.067940657,Dairy,119.044,OUT035,2004,Small,Tier 2,Supermarket Type1,1198.44 +NCZ06,19.6,Low Fat,0.094161662,Household,251.9698,OUT046,1997,Small,Tier 1,Supermarket Type1,4566.0564 +FDA04,11.3,Regular,0.067107448,Frozen Foods,258.1962,OUT017,2007,,Tier 2,Supermarket Type1,4402.9354 +FDD29,,Low Fat,0.018321361,Frozen Foods,255.3698,OUT027,1985,Medium,Tier 3,Supermarket Type3,4819.7262 +FDS56,5.785,Regular,0.038756864,Fruits and Vegetables,260.7252,OUT046,1997,Small,Tier 1,Supermarket Type1,6033.4796 +FDT07,5.82,Regular,0.077254736,Fruits and Vegetables,257.633,OUT013,1987,High,Tier 3,Supermarket Type1,1537.998 +FDT58,9,Low Fat,0.08630486,Snack Foods,168.0816,OUT018,2009,Medium,Tier 3,Supermarket Type2,2181.1608 +FDJ10,,Regular,0.128876537,Snack Foods,139.1838,OUT027,1985,Medium,Tier 3,Supermarket Type3,4916.933 +FDN25,7.895,Regular,0.061163967,Breakfast,59.2588,OUT035,2004,Small,Tier 2,Supermarket Type1,801.6232 +DRC27,13.8,Low Fat,0.058220302,Dairy,247.4802,OUT045,2002,,Tier 2,Supermarket Type1,1474.0812 +FDA38,5.44,Low Fat,0.025519534,Dairy,238.7538,OUT049,1999,Medium,Tier 1,Supermarket Type1,3605.307 +FDM56,16.7,Low Fat,0.070133177,Fruits and Vegetables,109.8912,OUT013,1987,High,Tier 3,Supermarket Type1,873.5296 +NCI43,19.85,Low Fat,0.025947095,Household,46.9376,OUT013,1987,High,Tier 3,Supermarket Type1,575.2512 +FDP36,10.395,Regular,0.091688111,Baking Goods,49.0008,OUT017,2007,,Tier 2,Supermarket Type1,860.2136 +DRK49,,LF,0,Soft Drinks,40.5138,OUT019,1985,Small,Tier 1,Grocery Store,40.6138 +FDW32,,Regular,0.165101585,Fruits and Vegetables,87.7882,OUT019,1985,Small,Tier 1,Grocery Store,515.3292 +NCW18,15.1,Low Fat,0.059417055,Household,237.9248,OUT049,1999,Medium,Tier 1,Supermarket Type1,2133.2232 +FDQ44,20.5,Low Fat,0.036287517,Fruits and Vegetables,121.2756,OUT018,2009,Medium,Tier 3,Supermarket Type2,2181.1608 +FDL45,15.6,Low Fat,0.037764269,Snack Foods,124.9704,OUT045,2002,,Tier 2,Supermarket Type1,2253.0672 +DRB48,16.75,Regular,0.024848788,Soft Drinks,39.9822,OUT035,2004,Small,Tier 2,Supermarket Type1,746.3618 +FDQ34,10.85,Low Fat,0.162903525,Snack Foods,104.9622,OUT018,2009,Medium,Tier 3,Supermarket Type2,1482.0708 +FDH17,16.2,Regular,0.016747538,Frozen Foods,98.6726,OUT017,2007,,Tier 2,Supermarket Type1,1272.3438 +FDN08,7.72,Regular,0.147904328,Fruits and Vegetables,116.6466,OUT010,1998,,Tier 3,Grocery Store,117.8466 +FDK57,,Low Fat,0.079904068,Snack Foods,120.044,OUT027,1985,Medium,Tier 3,Supermarket Type3,4434.228 +FDK10,5.785,Regular,0.040325274,Snack Foods,180.466,OUT013,1987,High,Tier 3,Supermarket Type1,719.064 +FDL39,,Regular,0.06302467,Dairy,181.6318,OUT027,1985,Medium,Tier 3,Supermarket Type3,1263.0226 +FDP25,15.2,Low Fat,0.021203509,Canned,216.3824,OUT035,2004,Small,Tier 2,Supermarket Type1,6114.7072 +FDC05,13.1,Regular,0.098765906,Frozen Foods,196.3768,OUT035,2004,Small,Tier 2,Supermarket Type1,2167.8448 +FDA39,6.32,Low Fat,0.012707362,Meat,41.0822,OUT013,1987,High,Tier 3,Supermarket Type1,942.7728 +FDZ10,17.85,Low Fat,0.04442649,Snack Foods,124.902,OUT013,1987,High,Tier 3,Supermarket Type1,1897.53 +FDK08,,Regular,0.121712459,Fruits and Vegetables,101.2016,OUT027,1985,Medium,Tier 3,Supermarket Type3,2631.2416 +DRD24,13.85,Low Fat,0.030769458,Soft Drinks,141.7154,OUT013,1987,High,Tier 3,Supermarket Type1,2978.1234 +DRG48,5.78,Low Fat,0.014614357,Soft Drinks,147.3102,OUT018,2009,Medium,Tier 3,Supermarket Type2,2332.9632 +FDH52,,Regular,0.076868664,Frozen Foods,62.1194,OUT019,1985,Small,Tier 1,Grocery Store,123.8388 +FDS25,6.885,Regular,0.140292495,Canned,108.5228,OUT045,2002,,Tier 2,Supermarket Type1,1989.4104 +NCH43,8.42,Low Fat,0.070555571,Household,216.0192,OUT035,2004,Small,Tier 2,Supermarket Type1,2372.9112 +DRK01,7.63,Low Fat,0.061409711,Soft Drinks,94.6436,OUT017,2007,,Tier 2,Supermarket Type1,1607.2412 +FDD59,10.5,Regular,0.066555152,Starchy Foods,80.896,OUT017,2007,,Tier 2,Supermarket Type1,958.752 +FDB27,7.575,Low Fat,0.092711708,Dairy,197.7768,OUT010,1998,,Tier 3,Grocery Store,197.0768 +FDO22,13.5,Regular,0.017844609,Snack Foods,81.396,OUT013,1987,High,Tier 3,Supermarket Type1,1198.44 +FDD35,12.15,Low Fat,0.025916883,Starchy Foods,120.244,OUT045,2002,,Tier 2,Supermarket Type1,2277.036 +FDR01,5.405,Regular,0.053611144,Canned,197.7742,OUT035,2004,Small,Tier 2,Supermarket Type1,796.2968 +NCB31,,Low Fat,0.207783483,Household,262.291,OUT019,1985,Small,Tier 1,Grocery Store,525.982 +FDC35,7.435,Low Fat,0.122837694,Starchy Foods,208.7638,OUT046,1997,Small,Tier 1,Supermarket Type1,3105.957 +FDS23,4.635,Low Fat,0.141174838,Breads,127.0994,OUT045,2002,,Tier 2,Supermarket Type1,2826.9868 +FDC33,8.96,Regular,0.069078149,Fruits and Vegetables,197.7768,OUT045,2002,,Tier 2,Supermarket Type1,3153.2288 +NCF18,18.35,LF,0.089345074,Household,191.9504,OUT018,2009,Medium,Tier 3,Supermarket Type2,5369.0112 +FDM36,11.65,Regular,0.058822142,Baking Goods,173.5422,OUT049,1999,Medium,Tier 1,Supermarket Type1,3448.844 +FDJ53,10.5,Low Fat,0.071368699,Frozen Foods,121.3098,OUT049,1999,Medium,Tier 1,Supermarket Type1,1446.1176 +NCL17,7.39,Low Fat,0.068055818,Health and Hygiene,140.7812,OUT018,2009,Medium,Tier 3,Supermarket Type2,1567.2932 +FDW27,,Regular,0.150122794,Meat,154.5314,OUT027,1985,Medium,Tier 3,Supermarket Type3,1396.1826 +FDA32,14,Low Fat,0.030094192,Fruits and Vegetables,215.7192,OUT046,1997,Small,Tier 1,Supermarket Type1,1078.596 +FDA03,18.5,Regular,0.076097035,Dairy,145.8102,OUT010,1998,,Tier 3,Grocery Store,291.6204 +FDW09,13.65,Regular,0.025973384,Snack Foods,79.6302,OUT045,2002,,Tier 2,Supermarket Type1,554.6114 +FDN09,14.15,LF,0,Snack Foods,244.1828,OUT045,2002,,Tier 2,Supermarket Type1,731.0484 +FDM08,10.1,Regular,0.053887301,Fruits and Vegetables,225.6088,OUT017,2007,,Tier 2,Supermarket Type1,4250.4672 +FDX01,10.1,LF,0.024262772,Canned,117.615,OUT018,2009,Medium,Tier 3,Supermarket Type2,1514.695 +DRO35,13.85,Low Fat,0.034624104,Hard Drinks,115.0492,OUT049,1999,Medium,Tier 1,Supermarket Type1,4054.722 +FDS31,13.1,Regular,0.044281996,Fruits and Vegetables,178.5318,OUT045,2002,,Tier 2,Supermarket Type1,3067.3406 +NCM53,18.75,Low Fat,0.052121825,Health and Hygiene,104.828,OUT049,1999,Medium,Tier 1,Supermarket Type1,2343.616 +FDI16,14,Regular,0.135662712,Frozen Foods,52.064,OUT013,1987,High,Tier 3,Supermarket Type1,852.224 +DRF36,16.1,Low Fat,0.023613955,Soft Drinks,192.8846,OUT049,1999,Medium,Tier 1,Supermarket Type1,5350.3688 +FDW49,,Low Fat,0.082152451,Canned,179.9002,OUT027,1985,Medium,Tier 3,Supermarket Type3,4119.3046 +FDB58,,Regular,0.02363057,Snack Foods,141.7154,OUT019,1985,Small,Tier 1,Grocery Store,425.4462 +NCJ18,12.35,Low Fat,0.164274416,Household,119.8124,OUT045,2002,,Tier 2,Supermarket Type1,2133.2232 +FDL51,20.7,Regular,0.047587685,Dairy,215.0876,OUT045,2002,,Tier 2,Supermarket Type1,5145.3024 +FDS03,7.825,Low Fat,0.079952983,Meat,62.7826,OUT018,2009,Medium,Tier 3,Supermarket Type2,1162.4868 +NCO54,,low fat,0.024992442,Household,53.6614,OUT019,1985,Small,Tier 1,Grocery Store,165.7842 +FDA48,12.1,Low Fat,0.115107028,Baking Goods,222.0114,OUT045,2002,,Tier 2,Supermarket Type1,3547.3824 +NCK06,,Low Fat,0.008604657,Household,123.1756,OUT027,1985,Medium,Tier 3,Supermarket Type3,1211.756 +NCZ54,14.65,Low Fat,0.083528446,Household,162.4552,OUT045,2002,,Tier 2,Supermarket Type1,2274.3728 +FDW39,,Regular,0.036731658,Meat,177.237,OUT027,1985,Medium,Tier 3,Supermarket Type3,4763.799 +FDI09,20.75,Regular,0.129337594,Seafood,238.188,OUT046,1997,Small,Tier 1,Supermarket Type1,5033.448 +NCO02,11.15,Low Fat,0,Others,65.0142,OUT049,1999,Medium,Tier 1,Supermarket Type1,1120.5414 +DRF13,12.1,Low Fat,0.029827665,Soft Drinks,144.3444,OUT049,1999,Medium,Tier 1,Supermarket Type1,2612.5992 +FDK25,11.6,Regular,0.157718931,Breakfast,168.3474,OUT017,2007,,Tier 2,Supermarket Type1,4548.0798 +FDZ38,17.6,Low Fat,0.008046275,Dairy,173.7422,OUT017,2007,,Tier 2,Supermarket Type1,5863.0348 +NCQ42,,Low Fat,0.068753558,Household,127.9678,OUT019,1985,Small,Tier 1,Grocery Store,254.3356 +FDM14,,Low Fat,0.013199737,Canned,108.9254,OUT027,1985,Medium,Tier 3,Supermarket Type3,2713.135 +FDC20,10.65,LF,0.023971463,Fruits and Vegetables,54.0272,OUT046,1997,Small,Tier 1,Supermarket Type1,447.4176 +FDW32,18.35,Regular,0.09468096,Fruits and Vegetables,86.2882,OUT018,2009,Medium,Tier 3,Supermarket Type2,1631.8758 +FDQ19,7.35,Regular,0.014394261,Fruits and Vegetables,241.3512,OUT045,2002,,Tier 2,Supermarket Type1,5331.7264 +FDE08,18.2,Low Fat,0.049396364,Fruits and Vegetables,146.4734,OUT049,1999,Medium,Tier 1,Supermarket Type1,3563.3616 +FDC29,8.39,Regular,0.024243294,Frozen Foods,116.0176,OUT049,1999,Medium,Tier 1,Supermarket Type1,1603.2464 +FDV50,14.3,Low Fat,0.122469209,Dairy,121.973,OUT013,1987,High,Tier 3,Supermarket Type1,2709.806 +FDF11,10.195,Regular,0.017730951,Starchy Foods,239.8538,OUT017,2007,,Tier 2,Supermarket Type1,4086.0146 +FDN09,14.15,LF,0.035016754,Snack Foods,245.3828,OUT018,2009,Medium,Tier 3,Supermarket Type2,1705.7796 +DRG37,16.2,Low Fat,0.019417732,Soft Drinks,153.7972,OUT045,2002,,Tier 2,Supermarket Type1,1402.1748 +NCV06,,Low Fat,0.066358426,Household,195.2478,OUT027,1985,Medium,Tier 3,Supermarket Type3,7168.6686 +DRJ13,12.65,Low Fat,0.105265475,Soft Drinks,159.9578,OUT010,1998,,Tier 3,Grocery Store,962.7468 +DRF25,,Low Fat,0.038736754,Soft Drinks,37.319,OUT027,1985,Medium,Tier 3,Supermarket Type3,1281.665 +FDE53,10.895,Low Fat,0.044991876,Frozen Foods,107.228,OUT010,1998,,Tier 3,Grocery Store,426.112 +FDS08,5.735,Low Fat,0.05696122,Fruits and Vegetables,176.337,OUT046,1997,Small,Tier 1,Supermarket Type1,1764.37 +FDO23,17.85,Low Fat,0.147255604,Breads,93.7436,OUT017,2007,,Tier 2,Supermarket Type1,1701.7848 +FDT07,5.82,Regular,0.077319079,Fruits and Vegetables,255.433,OUT046,1997,Small,Tier 1,Supermarket Type1,4357.661 +NCX29,10,Low Fat,0.089135671,Health and Hygiene,146.9102,OUT035,2004,Small,Tier 2,Supermarket Type1,3207.8244 +FDG22,17.6,Regular,0.041373331,Snack Foods,38.119,OUT035,2004,Small,Tier 2,Supermarket Type1,732.38 +DRJ47,,Low Fat,0.04403602,Hard Drinks,173.308,OUT027,1985,Medium,Tier 3,Supermarket Type3,6751.212 +FDL43,10.1,Low Fat,0.027041859,Meat,77.567,OUT013,1987,High,Tier 3,Supermarket Type1,306.268 +FDZ43,,Regular,0.056782237,Fruits and Vegetables,241.2512,OUT027,1985,Medium,Tier 3,Supermarket Type3,8239.9408 +FDZ21,17.6,Regular,0.03922186,Snack Foods,97.241,OUT046,1997,Small,Tier 1,Supermarket Type1,193.082 +FDJ50,8.645,Low Fat,0.021581922,Canned,53.3982,OUT035,2004,Small,Tier 2,Supermarket Type1,1209.7586 +FDV35,19.5,Low Fat,0.128206001,Breads,155.9314,OUT046,1997,Small,Tier 1,Supermarket Type1,3878.285 +FDW56,7.68,Low Fat,0.071301323,Fruits and Vegetables,190.8162,OUT017,2007,,Tier 2,Supermarket Type1,2693.8268 +DRL35,15.7,Low Fat,0.030765898,Hard Drinks,43.277,OUT045,2002,,Tier 2,Supermarket Type1,649.155 +FDR01,5.405,Regular,0.053730029,Canned,199.0742,OUT045,2002,,Tier 2,Supermarket Type1,4777.7808 +FDS24,20.85,Regular,0.062350672,Baking Goods,86.9514,OUT045,2002,,Tier 2,Supermarket Type1,1416.8224 +NCL17,7.39,Low Fat,0.068163102,Health and Hygiene,140.4812,OUT017,2007,,Tier 2,Supermarket Type1,2422.1804 +FDS13,6.465,Low Fat,0,Canned,263.1884,OUT018,2009,Medium,Tier 3,Supermarket Type2,2914.8724 +FDB59,18.25,Low Fat,0.015309885,Snack Foods,197.6084,OUT045,2002,,Tier 2,Supermarket Type1,2380.9008 +FDW26,,Regular,0.106538757,Dairy,222.3772,OUT027,1985,Medium,Tier 3,Supermarket Type3,1556.6404 +FDQ12,,Low Fat,0.061999648,Baking Goods,230.001,OUT019,1985,Small,Tier 1,Grocery Store,689.103 +FDX59,10.195,Low Fat,0.051618281,Breads,31.9558,OUT013,1987,High,Tier 3,Supermarket Type1,373.5138 +FDL36,15.1,Low Fat,0.076505799,Baking Goods,91.583,OUT017,2007,,Tier 2,Supermarket Type1,539.298 +FDQ55,13.65,Regular,0.013091186,Fruits and Vegetables,114.8834,OUT018,2009,Medium,Tier 3,Supermarket Type2,1612.5676 +FDV46,,Low Fat,0.022074764,Snack Foods,141.418,OUT019,1985,Small,Tier 1,Grocery Store,559.272 +FDM28,,Low Fat,0.079146113,Frozen Foods,181.466,OUT019,1985,Small,Tier 1,Grocery Store,179.766 +FDT40,5.985,Low Fat,0.096337184,Frozen Foods,125.2678,OUT017,2007,,Tier 2,Supermarket Type1,763.0068 +DRJ11,9.5,Low Fat,0.142425145,Hard Drinks,189.9872,OUT010,1998,,Tier 3,Grocery Store,756.3488 +FDD51,11.15,Low Fat,0,Dairy,44.7744,OUT045,2002,,Tier 2,Supermarket Type1,181.0976 +NCT17,,Low Fat,0.041663111,Health and Hygiene,188.6214,OUT027,1985,Medium,Tier 3,Supermarket Type3,6029.4848 +NCW17,18,Low Fat,0.019386234,Health and Hygiene,126.8994,OUT046,1997,Small,Tier 1,Supermarket Type1,3083.9856 +NCY29,,Low Fat,0.135226962,Health and Hygiene,56.293,OUT019,1985,Small,Tier 1,Grocery Store,113.186 +DRH36,16.2,Low Fat,0,Soft Drinks,73.4696,OUT013,1987,High,Tier 3,Supermarket Type1,2087.9488 +FDB17,13.15,Low Fat,0.036729122,Frozen Foods,179.7976,OUT049,1999,Medium,Tier 1,Supermarket Type1,2535.3664 +NCA17,20.6,LF,0.045380404,Health and Hygiene,148.4392,OUT013,1987,High,Tier 3,Supermarket Type1,1789.6704 +FDT27,11.395,Regular,0.069587171,Meat,234.6616,OUT046,1997,Small,Tier 1,Supermarket Type1,4687.232 +FDR32,6.78,Regular,0.08573655,Fruits and Vegetables,229.5694,OUT013,1987,High,Tier 3,Supermarket Type1,3425.541 +FDG41,8.84,Regular,0.076681143,Frozen Foods,110.7228,OUT049,1999,Medium,Tier 1,Supermarket Type1,1657.842 +FDX25,16.7,LF,0.102055777,Canned,184.0292,OUT046,1997,Small,Tier 1,Supermarket Type1,3101.2964 +FDG56,13.3,Regular,0.071856726,Fruits and Vegetables,63.2536,OUT017,2007,,Tier 2,Supermarket Type1,1347.5792 +FDN16,12.6,Regular,0.063054947,Frozen Foods,102.399,OUT017,2007,,Tier 2,Supermarket Type1,2270.378 +FDD47,7.6,Regular,0.142383847,Starchy Foods,172.3448,OUT035,2004,Small,Tier 2,Supermarket Type1,2556.672 +FDR12,12.6,Regular,0.03150851,Baking Goods,170.5764,OUT013,1987,High,Tier 3,Supermarket Type1,3779.0808 +FDS33,6.67,Regular,0.123620492,Snack Foods,90.0514,OUT049,1999,Medium,Tier 1,Supermarket Type1,1505.3738 +NCC55,10.695,Low Fat,0.06375108,Household,36.7848,OUT035,2004,Small,Tier 2,Supermarket Type1,782.9808 +FDA38,,Low Fat,0.04461205,Dairy,241.1538,OUT019,1985,Small,Tier 1,Grocery Store,480.7076 +FDK44,16.6,Low Fat,0.122204371,Fruits and Vegetables,173.5738,OUT035,2004,Small,Tier 2,Supermarket Type1,1911.5118 +FDZ57,10,Regular,0.037764307,Snack Foods,127.2994,OUT046,1997,Small,Tier 1,Supermarket Type1,642.497 +NCN14,19.1,Low Fat,0.092437711,Others,185.2608,OUT017,2007,,Tier 2,Supermarket Type1,1470.0864 +NCB06,17.6,Low Fat,0.137807013,Health and Hygiene,161.792,OUT010,1998,,Tier 3,Grocery Store,159.792 +DRL01,19.5,Regular,0.077292302,Soft Drinks,235.3958,OUT049,1999,Medium,Tier 1,Supermarket Type1,6309.7866 +FDU10,10.1,Regular,0.045763062,Snack Foods,38.4848,OUT049,1999,Medium,Tier 1,Supermarket Type1,633.8416 +NCS38,8.6,Low Fat,0.090558833,Household,112.6176,OUT018,2009,Medium,Tier 3,Supermarket Type2,3091.9752 +FDQ16,19.7,LF,0.041703666,Frozen Foods,109.1912,OUT013,1987,High,Tier 3,Supermarket Type1,1637.868 +FDS40,15.35,Low Fat,0.014098693,Frozen Foods,37.219,OUT017,2007,,Tier 2,Supermarket Type1,805.618 +FDE36,5.26,Regular,0.042008667,Baking Goods,162.6868,OUT017,2007,,Tier 2,Supermarket Type1,3767.0964 +FDV31,9.8,Low Fat,0.106933748,Fruits and Vegetables,175.337,OUT045,2002,,Tier 2,Supermarket Type1,529.311 +NCD42,16.5,Low Fat,0.012663476,Health and Hygiene,39.3506,OUT045,2002,,Tier 2,Supermarket Type1,645.1602 +FDT20,10.5,LF,0.041387618,Fruits and Vegetables,40.1164,OUT035,2004,Small,Tier 2,Supermarket Type1,849.5608 +NCN19,13.1,Low Fat,0.012148836,Others,191.353,OUT018,2009,Medium,Tier 3,Supermarket Type2,1328.271 +FDW21,,Regular,0.005935001,Snack Foods,98.8358,OUT027,1985,Medium,Tier 3,Supermarket Type3,2010.716 +FDF34,9.3,Regular,0.014047825,Snack Foods,196.5084,OUT045,2002,,Tier 2,Supermarket Type1,4364.9848 +FDI28,14.3,Low Fat,0.026375082,Frozen Foods,79.6302,OUT045,2002,,Tier 2,Supermarket Type1,792.302 +FDG44,,Low Fat,0,Fruits and Vegetables,55.7298,OUT027,1985,Medium,Tier 3,Supermarket Type3,2804.3496 +DRF60,10.8,low fat,0.052174319,Soft Drinks,240.3564,OUT045,2002,,Tier 2,Supermarket Type1,4290.4152 +FDQ36,,Regular,0,Baking Goods,38.1848,OUT019,1985,Small,Tier 1,Grocery Store,37.2848 +FDP34,12.85,LF,0.137786856,Snack Foods,157.763,OUT018,2009,Medium,Tier 3,Supermarket Type2,2659.871 +FDA20,6.78,Low Fat,0.066608487,Fruits and Vegetables,184.624,OUT035,2004,Small,Tier 2,Supermarket Type1,5406.296 +FDE41,9.195,Regular,0.064002068,Frozen Foods,85.5566,OUT035,2004,Small,Tier 2,Supermarket Type1,930.1226 +DRK47,7.905,Low Fat,0.06406438,Hard Drinks,229.2694,OUT046,1997,Small,Tier 1,Supermarket Type1,1826.9552 +FDY10,17.6,Low Fat,0.049345425,Snack Foods,115.4176,OUT017,2007,,Tier 2,Supermarket Type1,1145.176 +FDI02,15.7,Regular,0.11521312,Canned,112.0202,OUT017,2007,,Tier 2,Supermarket Type1,3150.5656 +FDE41,,reg,0,Frozen Foods,83.7566,OUT019,1985,Small,Tier 1,Grocery Store,253.6698 +FDZ52,19.2,Low Fat,0.099991245,Frozen Foods,112.7886,OUT013,1987,High,Tier 3,Supermarket Type1,1779.0176 +FDG50,7.405,Low Fat,0.015334003,Canned,92.7146,OUT018,2009,Medium,Tier 3,Supermarket Type2,1185.7898 +DRL01,19.5,Regular,0.129170642,Soft Drinks,233.9958,OUT010,1998,,Tier 3,Grocery Store,467.3916 +FDV48,9.195,Regular,0.051908824,Baking Goods,78.1644,OUT017,2007,,Tier 2,Supermarket Type1,1414.1592 +FDR48,11.65,Low Fat,0.131770922,Baking Goods,151.1024,OUT045,2002,,Tier 2,Supermarket Type1,1518.024 +NCD54,21.1,Low Fat,0.028984804,Household,146.1786,OUT013,1987,High,Tier 3,Supermarket Type1,3034.0506 +NCT54,8.695,Low Fat,0.120211747,Household,93.2094,OUT017,2007,,Tier 2,Supermarket Type1,666.4658 +FDH02,7.27,Regular,0.02076385,Canned,89.0488,OUT013,1987,High,Tier 3,Supermarket Type1,181.0976 +NCD43,8.85,Low Fat,0.016006626,Household,105.6964,OUT013,1987,High,Tier 3,Supermarket Type1,210.3928 +FDE46,18.6,Low Fat,0.015766712,Snack Foods,152.9366,OUT035,2004,Small,Tier 2,Supermarket Type1,1662.5026 +NCO42,,Low Fat,0.024536199,Household,144.6102,OUT027,1985,Medium,Tier 3,Supermarket Type3,3791.0652 +FDR40,9.1,Regular,0.008046878,Frozen Foods,78.7618,OUT049,1999,Medium,Tier 1,Supermarket Type1,402.809 +FDG24,7.975,Low Fat,0.014653896,Baking Goods,82.425,OUT049,1999,Medium,Tier 1,Supermarket Type1,749.025 +NCO17,10,Low Fat,0.073794811,Health and Hygiene,121.444,OUT017,2007,,Tier 2,Supermarket Type1,2516.724 +FDF22,6.865,Low Fat,0.056830682,Snack Foods,214.0218,OUT046,1997,Small,Tier 1,Supermarket Type1,5556.7668 +FDC59,16.7,Regular,0.054618573,Starchy Foods,65.5168,OUT035,2004,Small,Tier 2,Supermarket Type1,1022.6688 +NCY18,7.285,Low Fat,0.052141447,Household,174.9054,OUT010,1998,,Tier 3,Grocery Store,525.3162 +DRE48,8.43,Low Fat,0.017360867,Soft Drinks,196.2768,OUT045,2002,,Tier 2,Supermarket Type1,1576.6144 +FDV60,20.2,Regular,0.196438668,Baking Goods,194.611,OUT010,1998,,Tier 3,Grocery Store,392.822 +FDB56,8.75,Regular,0.074743226,Fruits and Vegetables,187.6556,OUT049,1999,Medium,Tier 1,Supermarket Type1,5257.1568 +FDL20,,Low Fat,0.127792701,Fruits and Vegetables,111.1886,OUT027,1985,Medium,Tier 3,Supermarket Type3,4447.544 +NCZ53,,Low Fat,0.024358634,Health and Hygiene,190.4214,OUT027,1985,Medium,Tier 3,Supermarket Type3,5652.642 +DRM35,9.695,Low Fat,0.070431235,Hard Drinks,177.5344,OUT035,2004,Small,Tier 2,Supermarket Type1,3033.3848 +FDV16,7.75,Regular,0.082930699,Frozen Foods,35.2558,OUT046,1997,Small,Tier 1,Supermarket Type1,780.9834 +FDY19,19.75,Low Fat,0.041330512,Fruits and Vegetables,115.8466,OUT013,1987,High,Tier 3,Supermarket Type1,2474.7786 +FDY12,9.8,Regular,0.235354055,Baking Goods,50.8008,OUT010,1998,,Tier 3,Grocery Store,101.2016 +FDM15,11.8,Regular,0.057746382,Meat,152.4366,OUT017,2007,,Tier 2,Supermarket Type1,3929.5516 +FDP12,9.8,Regular,0.045337184,Baking Goods,36.8874,OUT049,1999,Medium,Tier 1,Supermarket Type1,564.5984 +FDT21,7.42,Low Fat,0.020374875,Snack Foods,248.0092,OUT013,1987,High,Tier 3,Supermarket Type1,1245.046 +DRE49,20.75,Low Fat,0.035568147,Soft Drinks,151.8024,OUT010,1998,,Tier 3,Grocery Store,151.8024 +FDN16,12.6,Regular,0.062797771,Frozen Foods,103.999,OUT049,1999,Medium,Tier 1,Supermarket Type1,825.592 +FDE04,19.75,Regular,0.018096488,Frozen Foods,179.566,OUT018,2009,Medium,Tier 3,Supermarket Type2,2696.49 +FDC51,10.895,Regular,0.009613854,Dairy,122.973,OUT013,1987,High,Tier 3,Supermarket Type1,1231.73 +FDO04,16.6,Low Fat,0.026645307,Frozen Foods,53.5614,OUT018,2009,Medium,Tier 3,Supermarket Type2,939.4438 +FDD41,6.765,Regular,0.087753682,Frozen Foods,105.3306,OUT017,2007,,Tier 2,Supermarket Type1,2090.612 +FDI45,13.1,Low Fat,0.037657459,Fruits and Vegetables,175.8054,OUT045,2002,,Tier 2,Supermarket Type1,2801.6864 +NCB18,,Low Fat,0.041091215,Household,89.5514,OUT027,1985,Medium,Tier 3,Supermarket Type3,3364.9532 +FDW51,6.155,Regular,0.095195306,Meat,213.956,OUT017,2007,,Tier 2,Supermarket Type1,2343.616 +NCK07,10.65,Low Fat,0.048686689,Others,164.1526,OUT046,1997,Small,Tier 1,Supermarket Type1,1808.9786 +FDZ45,,Low Fat,0.117091213,Snack Foods,197.9084,OUT019,1985,Small,Tier 1,Grocery Store,992.042 +FDB37,20.25,Regular,0.022940826,Baking Goods,241.8538,OUT046,1997,Small,Tier 1,Supermarket Type1,5768.4912 +FDZ60,20.5,Low Fat,0.119339241,Baking Goods,106.0596,OUT035,2004,Small,Tier 2,Supermarket Type1,970.7364 +FDN04,11.8,Regular,0.014075334,Frozen Foods,176.8344,OUT013,1987,High,Tier 3,Supermarket Type1,3568.688 +FDW47,15,Low Fat,0.046336634,Breads,120.0414,OUT013,1987,High,Tier 3,Supermarket Type1,3533.4006 +FDB17,13.15,Low Fat,0.036641589,Frozen Foods,180.7976,OUT013,1987,High,Tier 3,Supermarket Type1,6157.3184 +FDR56,15.5,Regular,0.101176316,Fruits and Vegetables,198.9768,OUT018,2009,Medium,Tier 3,Supermarket Type2,4729.8432 +FDU55,,Low Fat,0.035737373,Fruits and Vegetables,260.6278,OUT027,1985,Medium,Tier 3,Supermarket Type3,9371.8008 +FDH40,11.6,Regular,0.079376029,Frozen Foods,81.7276,OUT017,2007,,Tier 2,Supermarket Type1,1949.4624 +FDH05,14.35,reg,0.091054989,Frozen Foods,231.8984,OUT049,1999,Medium,Tier 1,Supermarket Type1,4633.968 +FDX58,13.15,LF,0.043852434,Snack Foods,182.695,OUT045,2002,,Tier 2,Supermarket Type1,4211.185 +FDC51,10.895,Regular,0.009620042,Dairy,121.673,OUT035,2004,Small,Tier 2,Supermarket Type1,1970.768 +NCR05,10.1,Low Fat,0.054939848,Health and Hygiene,199.5084,OUT017,2007,,Tier 2,Supermarket Type1,3372.9428 +DRH25,18.7,Low Fat,0.014675574,Soft Drinks,50.8324,OUT017,2007,,Tier 2,Supermarket Type1,934.7832 +NCR53,12.15,Low Fat,0.14526636,Health and Hygiene,224.0404,OUT049,1999,Medium,Tier 1,Supermarket Type1,3375.606 +FDS04,10.195,Regular,0.146662938,Frozen Foods,138.6838,OUT046,1997,Small,Tier 1,Supermarket Type1,2388.2246 +FDC03,8.575,Regular,0.071786706,Dairy,193.3794,OUT013,1987,High,Tier 3,Supermarket Type1,780.3176 +FDP44,16.5,Regular,0.133424184,Fruits and Vegetables,102.2332,OUT010,1998,,Tier 3,Grocery Store,102.5332 +FDK16,9.065,Low Fat,0.115799592,Frozen Foods,95.3094,OUT018,2009,Medium,Tier 3,Supermarket Type2,1713.7692 +NCC30,16.6,Low Fat,0.027579198,Household,178.7344,OUT046,1997,Small,Tier 1,Supermarket Type1,1605.9096 +FDZ26,11.6,Regular,0.241055611,Dairy,238.5222,OUT010,1998,,Tier 3,Grocery Store,717.0666 +NCO54,19.5,Low Fat,0.014332439,Household,57.1614,OUT018,2009,Medium,Tier 3,Supermarket Type2,1381.535 +NCP41,16.6,Low Fat,0.027133398,Health and Hygiene,106.2596,OUT010,1998,,Tier 3,Grocery Store,215.7192 +DRE27,11.85,Low Fat,0.132876847,Dairy,98.0726,OUT049,1999,Medium,Tier 1,Supermarket Type1,1076.5986 +FDQ10,12.85,Low Fat,0.03315162,Snack Foods,170.6422,OUT013,1987,High,Tier 3,Supermarket Type1,2931.5174 +NCU42,9,Low Fat,0.019536981,Household,170.0474,OUT049,1999,Medium,Tier 1,Supermarket Type1,4211.185 +FDX43,5.655,Low Fat,0.085258864,Fruits and Vegetables,165.85,OUT035,2004,Small,Tier 2,Supermarket Type1,1830.95 +NCD19,8.93,Low Fat,0.013179388,Household,55.1614,OUT046,1997,Small,Tier 1,Supermarket Type1,939.4438 +NCI54,15.2,Low Fat,0.033592687,Household,108.1912,OUT035,2004,Small,Tier 2,Supermarket Type1,1856.2504 +FDS37,7.655,Low Fat,0.05346916,Canned,114.1492,OUT010,1998,,Tier 3,Grocery Store,115.8492 +FDO25,,Low Fat,0.126831854,Canned,209.027,OUT027,1985,Medium,Tier 3,Supermarket Type3,4613.994 +FDS57,15.5,Low Fat,0.103603094,Snack Foods,143.547,OUT049,1999,Medium,Tier 1,Supermarket Type1,1431.47 +FDI52,18.7,Low Fat,0.104840884,Frozen Foods,122.1072,OUT049,1999,Medium,Tier 1,Supermarket Type1,490.0288 +DRK12,9.5,Low Fat,0.042056944,Soft Drinks,31.89,OUT018,2009,Medium,Tier 3,Supermarket Type2,366.19 +FDG40,13.65,Low Fat,0.040049609,Frozen Foods,34.4558,OUT017,2007,,Tier 2,Supermarket Type1,611.2044 +FDU49,19.5,Regular,0.03075661,Canned,86.254,OUT045,2002,,Tier 2,Supermarket Type1,2163.85 +FDR49,8.71,Low Fat,0,Canned,46.5376,OUT013,1987,High,Tier 3,Supermarket Type1,575.2512 +FDF40,,Regular,0.03941584,Dairy,247.8092,OUT019,1985,Small,Tier 1,Grocery Store,498.0184 +DRE03,19.6,Low Fat,0.024363939,Dairy,46.3718,OUT017,2007,,Tier 2,Supermarket Type1,661.8052 +FDR55,,Regular,0.131443921,Fruits and Vegetables,189.1872,OUT027,1985,Medium,Tier 3,Supermarket Type3,5294.4416 +NCU05,11.8,Low Fat,0.058725131,Health and Hygiene,82.3618,OUT035,2004,Small,Tier 2,Supermarket Type1,1208.427 +FDR36,6.715,reg,0.122274118,Baking Goods,40.3454,OUT017,2007,,Tier 2,Supermarket Type1,838.908 +NCM30,19.1,LF,0.067239404,Household,39.6796,OUT013,1987,High,Tier 3,Supermarket Type1,660.4736 +FDH24,20.7,Low Fat,0.021464454,Baking Goods,156.6288,OUT049,1999,Medium,Tier 1,Supermarket Type1,3928.22 +DRO47,10.195,Low Fat,0.112681821,Hard Drinks,113.986,OUT018,2009,Medium,Tier 3,Supermarket Type2,452.744 +FDQ49,20.2,Regular,0.039469737,Breakfast,155.163,OUT017,2007,,Tier 2,Supermarket Type1,782.315 +DRJ37,10.8,Low Fat,0.061101383,Soft Drinks,151.9024,OUT046,1997,Small,Tier 1,Supermarket Type1,2580.6408 +NCJ42,19.75,Low Fat,0.014359584,Household,100.8332,OUT018,2009,Medium,Tier 3,Supermarket Type2,1537.998 +FDD05,19.35,Low Fat,0.016637301,Frozen Foods,120.9098,OUT049,1999,Medium,Tier 1,Supermarket Type1,1687.1372 +FDC39,7.405,Low Fat,0.159843921,Dairy,206.6296,OUT018,2009,Medium,Tier 3,Supermarket Type2,3115.944 +NCY06,15.25,Low Fat,0.061308889,Household,128.8968,OUT045,2002,,Tier 2,Supermarket Type1,2348.9424 +NCS06,,Low Fat,0.055566935,Household,263.591,OUT019,1985,Small,Tier 1,Grocery Store,262.991 +FDE16,8.895,Low Fat,0.026397141,Frozen Foods,207.8954,OUT045,2002,,Tier 2,Supermarket Type1,3542.7218 +NCQ50,18.75,Low Fat,0.034307348,Household,215.2218,OUT046,1997,Small,Tier 1,Supermarket Type1,4701.8796 +FDX50,20.1,Low Fat,0.074627201,Dairy,110.3228,OUT046,1997,Small,Tier 1,Supermarket Type1,1768.3648 +NCL41,12.35,Low Fat,0.041973712,Health and Hygiene,35.7216,OUT017,2007,,Tier 2,Supermarket Type1,519.324 +FDM58,16.85,Regular,0.080015028,Snack Foods,111.8544,OUT018,2009,Medium,Tier 3,Supermarket Type2,1677.816 +FDH35,18.25,Low Fat,0.10084386,Starchy Foods,166.3526,OUT010,1998,,Tier 3,Grocery Store,164.4526 +FDS50,17,Low Fat,0.055519561,Dairy,219.8114,OUT049,1999,Medium,Tier 1,Supermarket Type1,1108.557 +FDT09,,Regular,0.012203915,Snack Foods,133.2284,OUT027,1985,Medium,Tier 3,Supermarket Type3,4350.3372 +FDR60,14.3,Low Fat,0.130946374,Baking Goods,76.7328,OUT018,2009,Medium,Tier 3,Supermarket Type2,1312.9576 +FDG22,17.6,Regular,0.041381156,Snack Foods,35.019,OUT046,1997,Small,Tier 1,Supermarket Type1,659.142 +FDL52,,Regular,0.04586701,Frozen Foods,37.9506,OUT027,1985,Medium,Tier 3,Supermarket Type3,910.8144 +DRJ39,20.25,Low Fat,0.036474041,Dairy,218.3482,OUT018,2009,Medium,Tier 3,Supermarket Type2,2409.5302 +FDW45,18,Low Fat,0.039231652,Snack Foods,145.1418,OUT017,2007,,Tier 2,Supermarket Type1,2648.5524 +NCQ38,16.35,Low Fat,0.013393537,Others,106.028,OUT045,2002,,Tier 2,Supermarket Type1,1065.28 +FDB26,14,reg,0.031444357,Canned,53.764,OUT017,2007,,Tier 2,Supermarket Type1,798.96 +DRG48,5.78,Low Fat,0.014555066,Soft Drinks,145.2102,OUT046,1997,Small,Tier 1,Supermarket Type1,3062.0142 +FDH10,21,Low Fat,0.082526478,Snack Foods,191.8478,OUT010,1998,,Tier 3,Grocery Store,774.9912 +FDP28,13.65,Regular,0.080765853,Frozen Foods,262.8936,OUT049,1999,Medium,Tier 1,Supermarket Type1,4958.8784 +FDJ44,12.3,Regular,0.17797002,Fruits and Vegetables,173.1396,OUT010,1998,,Tier 3,Grocery Store,697.7584 +FDI07,12.35,reg,0.03382933,Meat,196.9426,OUT045,2002,,Tier 2,Supermarket Type1,2768.3964 +DRJ24,11.8,Low Fat,0.11397026,Soft Drinks,185.1924,OUT017,2007,,Tier 2,Supermarket Type1,2591.2936 +DRL47,19.7,Low Fat,0.038729457,Hard Drinks,127.3362,OUT035,2004,Small,Tier 2,Supermarket Type1,755.0172 +FDP38,10.1,Low Fat,0.032075379,Canned,50.9008,OUT013,1987,High,Tier 3,Supermarket Type1,354.2056 +FDK02,,Low Fat,0.196490902,Canned,120.544,OUT019,1985,Small,Tier 1,Grocery Store,479.376 +FDO23,17.85,Low Fat,0.146305498,Breads,94.1436,OUT013,1987,High,Tier 3,Supermarket Type1,1607.2412 +NCE54,20.7,Low Fat,0.026877471,Household,74.6354,OUT013,1987,High,Tier 3,Supermarket Type1,1053.2956 +FDS52,8.89,low fat,0.005474515,Frozen Foods,99.7016,OUT046,1997,Small,Tier 1,Supermarket Type1,1922.8304 +FDW01,14.5,Low Fat,0.064048405,Canned,153.4682,OUT035,2004,Small,Tier 2,Supermarket Type1,1677.1502 +NCF07,9,Low Fat,0.032203667,Household,100.8016,OUT017,2007,,Tier 2,Supermarket Type1,1113.2176 +DRE15,13.35,Low Fat,0.017857847,Dairy,77.5012,OUT018,2009,Medium,Tier 3,Supermarket Type2,1518.024 +FDR58,6.675,Low Fat,0.041921462,Snack Foods,92.3462,OUT046,1997,Small,Tier 1,Supermarket Type1,2406.2012 +FDL24,10.3,Regular,0.024875871,Baking Goods,173.0422,OUT013,1987,High,Tier 3,Supermarket Type1,2069.3064 +FDQ25,,Regular,0.028139761,Canned,173.7422,OUT027,1985,Medium,Tier 3,Supermarket Type3,3621.2862 +FDX56,17.1,Regular,0.073997843,Fruits and Vegetables,207.0638,OUT013,1987,High,Tier 3,Supermarket Type1,4969.5312 +FDD20,14.15,LF,0.020798905,Fruits and Vegetables,123.6046,OUT018,2009,Medium,Tier 3,Supermarket Type2,1245.046 +DRF60,10.8,Low Fat,0.052363244,Soft Drinks,236.5564,OUT017,2007,,Tier 2,Supermarket Type1,5243.8408 +FDW13,8.5,Low Fat,0.098283459,Canned,51.3324,OUT018,2009,Medium,Tier 3,Supermarket Type2,934.7832 +FDF09,6.215,Low Fat,0.012138795,Fruits and Vegetables,39.2848,OUT013,1987,High,Tier 3,Supermarket Type1,521.9872 +FDY45,17.5,Low Fat,0,Snack Foods,253.0356,OUT035,2004,Small,Tier 2,Supermarket Type1,4578.0408 +FDR26,20.7,Low Fat,0.042923652,Dairy,178.3028,OUT045,2002,,Tier 2,Supermarket Type1,1062.6168 +FDZ01,8.975,Regular,0.009058845,Canned,103.399,OUT046,1997,Small,Tier 1,Supermarket Type1,2579.975 +FDH53,20.5,Regular,0.032136417,Frozen Foods,83.9592,OUT010,1998,,Tier 3,Grocery Store,165.1184 +FDG52,13.65,Low Fat,0.065898197,Frozen Foods,46.1402,OUT018,2009,Medium,Tier 3,Supermarket Type2,459.402 +FDW50,13.1,Low Fat,0.075731322,Dairy,167.5158,OUT045,2002,,Tier 2,Supermarket Type1,1504.0422 +FDX49,4.615,Regular,0.101812521,Canned,232.23,OUT035,2004,Small,Tier 2,Supermarket Type1,5126.66 +FDJ44,12.3,Regular,0.106327251,Fruits and Vegetables,172.8396,OUT046,1997,Small,Tier 1,Supermarket Type1,2616.594 +NCI31,,Low Fat,0.080933328,Others,37.519,OUT027,1985,Medium,Tier 3,Supermarket Type3,842.237 +FDZ52,19.2,Low Fat,0.100055601,Frozen Foods,112.4886,OUT035,2004,Small,Tier 2,Supermarket Type1,1223.0746 +FDE17,20.1,Regular,0.054540159,Frozen Foods,152.1366,OUT049,1999,Medium,Tier 1,Supermarket Type1,755.683 +FDG34,11.5,Regular,0.037723476,Snack Foods,109.5254,OUT018,2009,Medium,Tier 3,Supermarket Type2,1953.4572 +FDE26,9.3,Low Fat,0.14897741,Canned,143.0786,OUT010,1998,,Tier 3,Grocery Store,288.9572 +FDD56,15.2,Regular,0.104201019,Fruits and Vegetables,176.5054,OUT018,2009,Medium,Tier 3,Supermarket Type2,2976.7918 +FDR52,12.65,Regular,0.076198809,Frozen Foods,191.3846,OUT045,2002,,Tier 2,Supermarket Type1,2675.1844 +FDQ13,11.1,LF,0.010639596,Canned,84.1908,OUT035,2004,Small,Tier 2,Supermarket Type1,755.0172 +NCJ42,,Low Fat,0.025039776,Household,102.7332,OUT019,1985,Small,Tier 1,Grocery Store,410.1328 +FDH10,,Low Fat,0.086326707,Snack Foods,192.6478,OUT019,1985,Small,Tier 1,Grocery Store,387.4956 +NCG42,19.2,Low Fat,0.041220035,Household,131.231,OUT035,2004,Small,Tier 2,Supermarket Type1,3635.268 +FDT31,19.75,Low Fat,0.01247354,Fruits and Vegetables,187.5872,OUT045,2002,,Tier 2,Supermarket Type1,1323.6104 +DRD25,6.135,Low Fat,0.079132212,Soft Drinks,112.686,OUT045,2002,,Tier 2,Supermarket Type1,2942.836 +FDR35,12.5,Low Fat,0.020693809,Breads,199.1742,OUT035,2004,Small,Tier 2,Supermarket Type1,4379.6324 +FDL33,7.235,Low Fat,0.10016525,Snack Foods,193.9452,OUT045,2002,,Tier 2,Supermarket Type1,2936.178 +FDT45,15.85,Low Fat,0.057302606,Snack Foods,53.3956,OUT035,2004,Small,Tier 2,Supermarket Type1,600.5516 +FDT16,9.895,Regular,0.048761046,Frozen Foods,260.5278,OUT045,2002,,Tier 2,Supermarket Type1,8851.1452 +DRE49,20.75,Low Fat,0,Soft Drinks,153.0024,OUT035,2004,Small,Tier 2,Supermarket Type1,2428.8384 +DRF60,10.8,Low Fat,0.052149675,Soft Drinks,239.9564,OUT049,1999,Medium,Tier 1,Supermarket Type1,3813.7024 +NCB54,8.76,Low Fat,0.050130529,Health and Hygiene,128.3336,OUT049,1999,Medium,Tier 1,Supermarket Type1,2556.672 +FDH20,16.1,Regular,0.024987903,Fruits and Vegetables,97.341,OUT049,1999,Medium,Tier 1,Supermarket Type1,1255.033 +FDA31,7.1,Low Fat,0.109990885,Fruits and Vegetables,172.908,OUT035,2004,Small,Tier 2,Supermarket Type1,2769.728 +FDE33,19.35,Regular,0.049736267,Fruits and Vegetables,76.8644,OUT045,2002,,Tier 2,Supermarket Type1,1571.288 +FDM12,16.7,reg,0.117026714,Baking Goods,189.2214,OUT010,1998,,Tier 3,Grocery Store,188.4214 +FDW44,9.5,Regular,0.035121963,Fruits and Vegetables,168.6448,OUT013,1987,High,Tier 3,Supermarket Type1,1022.6688 +DRE48,8.43,Low Fat,0.017311312,Soft Drinks,197.8768,OUT013,1987,High,Tier 3,Supermarket Type1,3744.4592 +NCX18,14.15,Low Fat,0.008811818,Household,196.511,OUT045,2002,,Tier 2,Supermarket Type1,2749.754 +FDA38,5.44,Low Fat,0.025583714,Dairy,239.1538,OUT018,2009,Medium,Tier 3,Supermarket Type2,480.7076 +FDQ19,7.35,Regular,0.014353174,Fruits and Vegetables,242.6512,OUT013,1987,High,Tier 3,Supermarket Type1,969.4048 +FDY47,,Regular,0.054220618,Breads,129.131,OUT027,1985,Medium,Tier 3,Supermarket Type3,4933.578 +FDE17,20.1,Regular,0.054410179,Frozen Foods,151.3366,OUT013,1987,High,Tier 3,Supermarket Type1,2720.4588 +FDY25,12,Low Fat,0.033974436,Canned,181.8976,OUT046,1997,Small,Tier 1,Supermarket Type1,4527.44 +FDT03,21.25,Low Fat,0.009996872,Meat,185.5608,OUT035,2004,Small,Tier 2,Supermarket Type1,3123.9336 +FDB49,8.3,Regular,0.030212499,Baking Goods,98.0384,OUT045,2002,,Tier 2,Supermarket Type1,2857.6136 +FDL43,10.1,Low Fat,0.027217468,Meat,76.067,OUT017,2007,,Tier 2,Supermarket Type1,1454.773 +FDE47,14.15,Low Fat,0.038123176,Starchy Foods,123.5046,OUT017,2007,,Tier 2,Supermarket Type1,1992.0736 +FDS49,9,Low Fat,0.079506434,Canned,78.3644,OUT045,2002,,Tier 2,Supermarket Type1,1728.4168 +FDU23,12.15,Low Fat,0.021811987,Breads,163.6184,OUT018,2009,Medium,Tier 3,Supermarket Type2,2311.6576 +FDU38,,Low Fat,0.082150145,Dairy,192.9504,OUT027,1985,Medium,Tier 3,Supermarket Type3,7478.2656 +FDV09,,Low Fat,0.036012919,Snack Foods,148.0734,OUT019,1985,Small,Tier 1,Grocery Store,593.8936 +FDR20,20,Regular,0.028167478,Fruits and Vegetables,45.5744,OUT049,1999,Medium,Tier 1,Supermarket Type1,452.744 +FDY11,6.71,Regular,0.029560451,Baking Goods,65.8142,OUT046,1997,Small,Tier 1,Supermarket Type1,856.8846 +FDG40,,Low Fat,0.039631495,Frozen Foods,31.9558,OUT027,1985,Medium,Tier 3,Supermarket Type3,984.7182 +FDX20,7.365,Low Fat,0.04280099,Fruits and Vegetables,228.372,OUT017,2007,,Tier 2,Supermarket Type1,2037.348 +FDZ27,7.935,LF,0.017141985,Dairy,50.035,OUT013,1987,High,Tier 3,Supermarket Type1,149.805 +FDH09,12.6,Low Fat,0.056394771,Seafood,51.3982,OUT017,2007,,Tier 2,Supermarket Type1,473.3838 +FDG29,17.6,Low Fat,0.056379439,Frozen Foods,42.7454,OUT049,1999,Medium,Tier 1,Supermarket Type1,293.6178 +NCA30,19,low fat,0.129534812,Household,190.1872,OUT049,1999,Medium,Tier 1,Supermarket Type1,5105.3544 +NCL53,7.5,Low Fat,0.036439878,Health and Hygiene,175.3028,OUT017,2007,,Tier 2,Supermarket Type1,3010.7476 +DRE15,13.35,Low Fat,0,Dairy,77.6012,OUT046,1997,Small,Tier 1,Supermarket Type1,986.7156 +NCS38,8.6,Low Fat,0.090191431,Household,112.9176,OUT046,1997,Small,Tier 1,Supermarket Type1,458.0704 +FDY21,,LF,0.30374337,Snack Foods,196.011,OUT019,1985,Small,Tier 1,Grocery Store,589.233 +FDB58,10.5,Regular,0.022590318,Snack Foods,140.6154,OUT010,1998,,Tier 3,Grocery Store,283.6308 +FDH41,9,Low Fat,0.082011521,Frozen Foods,213.3534,OUT046,1997,Small,Tier 1,Supermarket Type1,1935.4806 +DRF23,4.61,Low Fat,0.122843005,Hard Drinks,172.4396,OUT049,1999,Medium,Tier 1,Supermarket Type1,1569.9564 +FDE05,10.895,Regular,0.05432142,Frozen Foods,146.2102,OUT010,1998,,Tier 3,Grocery Store,437.4306 +FDY10,17.6,Low Fat,0.049144165,Snack Foods,112.7176,OUT049,1999,Medium,Tier 1,Supermarket Type1,1717.764 +FDS43,11.65,Low Fat,0.040577878,Fruits and Vegetables,188.224,OUT049,1999,Medium,Tier 1,Supermarket Type1,1304.968 +NCM30,19.1,Low Fat,0.067400032,Household,41.9796,OUT049,1999,Medium,Tier 1,Supermarket Type1,784.3124 +FDY49,17.2,Regular,0.012036432,Canned,165.7184,OUT045,2002,,Tier 2,Supermarket Type1,1816.3024 +FDN02,16.5,Low Fat,0.073977473,Canned,206.8638,OUT045,2002,,Tier 2,Supermarket Type1,2070.638 +FDP37,15.6,Low Fat,0.143396175,Breakfast,128.0994,OUT045,2002,,Tier 2,Supermarket Type1,2184.4898 +NCF07,9,Low Fat,0.03201648,Household,99.6016,OUT035,2004,Small,Tier 2,Supermarket Type1,1922.8304 +FDJ09,15,Low Fat,0.058346234,Snack Foods,44.0744,OUT013,1987,High,Tier 3,Supermarket Type1,633.8416 +FDO23,,Low Fat,0.14571827,Breads,94.3436,OUT027,1985,Medium,Tier 3,Supermarket Type3,2269.0464 +FDH09,,Low Fat,0.055806016,Seafood,52.4982,OUT027,1985,Medium,Tier 3,Supermarket Type3,1209.7586 +FDX34,6.195,Low Fat,0.072097449,Snack Foods,119.3098,OUT049,1999,Medium,Tier 1,Supermarket Type1,1205.098 +FDV60,20.2,Regular,0.117543713,Baking Goods,197.311,OUT049,1999,Medium,Tier 1,Supermarket Type1,3338.987 +FDE32,20.7,Low Fat,0.048718334,Fruits and Vegetables,38.7506,OUT013,1987,High,Tier 3,Supermarket Type1,227.7036 +NCI30,20.25,Low Fat,0.0591756,Household,245.046,OUT018,2009,Medium,Tier 3,Supermarket Type2,4680.574 +FDS37,7.655,Low Fat,0.031918284,Canned,117.7492,OUT013,1987,High,Tier 3,Supermarket Type1,695.0952 +FDC57,,Regular,0.095587976,Fruits and Vegetables,193.982,OUT019,1985,Small,Tier 1,Grocery Store,579.246 +DRC01,5.92,Regular,0.019308607,Soft Drinks,49.0692,OUT017,2007,,Tier 2,Supermarket Type1,1478.076 +DRD27,18.75,Low Fat,0.023974769,Dairy,99.0042,OUT017,2007,,Tier 2,Supermarket Type1,694.4294 +FDI12,9.395,Regular,0.100602552,Baking Goods,88.3856,OUT045,2002,,Tier 2,Supermarket Type1,703.0848 +FDQ33,13.35,Low Fat,0.091189915,Snack Foods,149.3708,OUT035,2004,Small,Tier 2,Supermarket Type1,4514.124 +FDQ27,,Regular,0.077480627,Meat,101.399,OUT019,1985,Small,Tier 1,Grocery Store,206.398 +NCB07,19.2,Low Fat,0.129731747,Household,196.211,OUT010,1998,,Tier 3,Grocery Store,589.233 +FDC08,19,Regular,0.103363904,Fruits and Vegetables,226.172,OUT013,1987,High,Tier 3,Supermarket Type1,3169.208 +FDD20,14.15,LF,0.020714523,Fruits and Vegetables,124.2046,OUT046,1997,Small,Tier 1,Supermarket Type1,2490.092 +FDS24,20.85,Regular,0.062212713,Baking Goods,88.1514,OUT035,2004,Small,Tier 2,Supermarket Type1,1151.1682 +FDH34,8.63,Low Fat,0.031271134,Snack Foods,186.0582,OUT017,2007,,Tier 2,Supermarket Type1,3900.9222 +NCX30,16.7,Low Fat,0.026729068,Household,248.4776,OUT018,2009,Medium,Tier 3,Supermarket Type2,6439.6176 +FDM01,7.895,Regular,0.094567181,Breakfast,104.5332,OUT046,1997,Small,Tier 1,Supermarket Type1,1845.5976 +FDB20,7.72,Low Fat,0.05193741,Fruits and Vegetables,77.9986,OUT013,1987,High,Tier 3,Supermarket Type1,934.7832 +NCK29,5.615,Low Fat,0.126480422,Health and Hygiene,121.573,OUT017,2007,,Tier 2,Supermarket Type1,3202.498 +FDS11,7.05,Regular,0.055644887,Breads,224.9088,OUT049,1999,Medium,Tier 1,Supermarket Type1,2684.5056 +NCV41,14.35,Low Fat,0.028519419,Health and Hygiene,109.2228,OUT010,1998,,Tier 3,Grocery Store,221.0456 +DRL60,8.52,Low Fat,0.027101431,Soft Drinks,151.7682,OUT049,1999,Medium,Tier 1,Supermarket Type1,2439.4912 +FDV10,7.645,Regular,0.067083367,Snack Foods,44.0112,OUT017,2007,,Tier 2,Supermarket Type1,596.5568 +FDV09,12.1,Low Fat,0.020652362,Snack Foods,149.5734,OUT018,2009,Medium,Tier 3,Supermarket Type2,2227.101 +FDQ39,14.8,Low Fat,0.081042136,Meat,192.4846,OUT046,1997,Small,Tier 1,Supermarket Type1,5159.2842 +DRE49,20.75,Low Fat,0.021336565,Soft Drinks,153.6024,OUT018,2009,Medium,Tier 3,Supermarket Type2,1366.2216 +FDR45,10.8,Low Fat,0.029001987,Snack Foods,238.6222,OUT045,2002,,Tier 2,Supermarket Type1,8604.7992 +DRJ23,18.35,Low Fat,0.069745165,Hard Drinks,190.2872,OUT010,1998,,Tier 3,Grocery Store,378.1744 +FDQ26,13.5,Regular,0.068148886,Dairy,58.6562,OUT018,2009,Medium,Tier 3,Supermarket Type2,711.0744 +NCA06,20.5,Low Fat,0.144094079,Household,34.819,OUT017,2007,,Tier 2,Supermarket Type1,1061.951 +FDT24,12.35,Regular,0.186616421,Baking Goods,78.6328,OUT018,2009,Medium,Tier 3,Supermarket Type2,1004.0264 +DRG27,8.895,Low Fat,0.105323859,Dairy,39.1138,OUT045,2002,,Tier 2,Supermarket Type1,609.207 +FDR02,16.7,Low Fat,0.022110425,Dairy,110.8886,OUT045,2002,,Tier 2,Supermarket Type1,3558.0352 +DRG37,16.2,Low Fat,0.019374768,Soft Drinks,155.8972,OUT035,2004,Small,Tier 2,Supermarket Type1,2025.3636 +FDJ07,7.26,Low Fat,0.014482278,Meat,118.115,OUT018,2009,Medium,Tier 3,Supermarket Type2,1864.24 +FDP32,6.65,Low Fat,0.087805788,Fruits and Vegetables,126.7678,OUT049,1999,Medium,Tier 1,Supermarket Type1,1907.517 +FDV59,13.35,Low Fat,0.048027043,Breads,218.9166,OUT046,1997,Small,Tier 1,Supermarket Type1,5660.6316 +FDP60,17.35,Low Fat,0.055908268,Baking Goods,99.8016,OUT035,2004,Small,Tier 2,Supermarket Type1,607.2096 +FDE32,,Low Fat,0.048522793,Fruits and Vegetables,39.6506,OUT027,1985,Medium,Tier 3,Supermarket Type3,1024.6662 +FDK26,5.46,Regular,0.032359413,Canned,187.424,OUT017,2007,,Tier 2,Supermarket Type1,3169.208 +FDW28,18.25,Low Fat,0.088807455,Frozen Foods,197.3452,OUT035,2004,Small,Tier 2,Supermarket Type1,2740.4328 +FDP56,8.185,LF,0.046556408,Fruits and Vegetables,47.7692,OUT049,1999,Medium,Tier 1,Supermarket Type1,640.4996 +FDT25,7.5,Low Fat,0.050750977,Canned,122.2072,OUT046,1997,Small,Tier 1,Supermarket Type1,1960.1152 +FDQ12,12.65,Low Fat,0.035404052,Baking Goods,230.601,OUT035,2004,Small,Tier 2,Supermarket Type1,2067.309 +FDR60,14.3,Low Fat,0.130390458,Baking Goods,77.2328,OUT035,2004,Small,Tier 2,Supermarket Type1,231.6984 +FDZ10,17.85,Low Fat,0.074422769,Snack Foods,128.002,OUT010,1998,,Tier 3,Grocery Store,253.004 +FDM13,6.425,Low Fat,0.105742544,Breakfast,130.5626,OUT010,1998,,Tier 3,Grocery Store,131.1626 +FDF26,6.825,Regular,0.046729336,Canned,153.4998,OUT045,2002,,Tier 2,Supermarket Type1,2153.1972 +FDN02,,Low Fat,0.073470234,Canned,205.3638,OUT027,1985,Medium,Tier 3,Supermarket Type3,5383.6588 +NCI30,20.25,Low Fat,0.058886477,Household,245.546,OUT013,1987,High,Tier 3,Supermarket Type1,1724.422 +NCJ31,19.2,Low Fat,0.18293775,Others,243.0196,OUT049,1999,Medium,Tier 1,Supermarket Type1,3615.294 +NCQ54,17.7,Low Fat,0.020993364,Household,166.8474,OUT010,1998,,Tier 3,Grocery Store,168.4474 +FDB02,9.695,Regular,0.029223424,Canned,175.437,OUT045,2002,,Tier 2,Supermarket Type1,2999.429 +FDC02,,Low Fat,0.068489201,Canned,259.3278,OUT027,1985,Medium,Tier 3,Supermarket Type3,4165.2448 +FDA11,7.75,LF,0.043326511,Baking Goods,95.6436,OUT045,2002,,Tier 2,Supermarket Type1,1134.5232 +DRI23,,Low Fat,0.136532569,Hard Drinks,159.6578,OUT027,1985,Medium,Tier 3,Supermarket Type3,2888.2404 +FDE04,19.75,Regular,0.018051091,Frozen Foods,179.866,OUT049,1999,Medium,Tier 1,Supermarket Type1,2696.49 +FDW38,5.325,Regular,0.23212188,Dairy,55.5298,OUT010,1998,,Tier 3,Grocery Store,53.9298 +FDG46,,Regular,0.057620562,Snack Foods,115.4518,OUT019,1985,Small,Tier 1,Grocery Store,113.8518 +NCJ05,,LF,0.045865089,Health and Hygiene,152.3682,OUT027,1985,Medium,Tier 3,Supermarket Type3,2287.023 +FDU01,,Regular,0.021002171,Canned,185.1924,OUT019,1985,Small,Tier 1,Grocery Store,555.2772 +FDY11,6.71,Regular,0.029727657,Baking Goods,66.6142,OUT017,2007,,Tier 2,Supermarket Type1,1120.5414 +FDX60,14.35,Low Fat,0.080527065,Baking Goods,79.296,OUT013,1987,High,Tier 3,Supermarket Type1,719.064 +NCN29,15.2,Low Fat,0,Health and Hygiene,47.8034,OUT049,1999,Medium,Tier 1,Supermarket Type1,437.4306 +FDT07,5.82,reg,0,Fruits and Vegetables,256.633,OUT049,1999,Medium,Tier 1,Supermarket Type1,2050.664 +FDI21,5.59,Regular,0.056833394,Snack Foods,61.9168,OUT018,2009,Medium,Tier 3,Supermarket Type2,1214.4192 +FDI41,18.5,Regular,0.062256921,Frozen Foods,148.0418,OUT046,1997,Small,Tier 1,Supermarket Type1,2059.9852 +FDE10,,Regular,0.089512542,Snack Foods,133.1626,OUT027,1985,Medium,Tier 3,Supermarket Type3,3672.5528 +FDQ28,14,Regular,0.060427062,Frozen Foods,153.5656,OUT046,1997,Small,Tier 1,Supermarket Type1,3089.312 +FDY32,7.605,Low Fat,0.216323008,Fruits and Vegetables,165.021,OUT010,1998,,Tier 3,Grocery Store,815.605 +NCK05,,Low Fat,0.135612397,Health and Hygiene,61.1536,OUT019,1985,Small,Tier 1,Grocery Store,61.2536 +FDH12,9.6,Low Fat,0.085125951,Baking Goods,107.128,OUT045,2002,,Tier 2,Supermarket Type1,1278.336 +FDJ27,17.7,Regular,0.122565413,Meat,103.8674,OUT017,2007,,Tier 2,Supermarket Type1,1528.011 +DRL35,15.7,Low Fat,0,Hard Drinks,43.377,OUT010,1998,,Tier 3,Grocery Store,129.831 +NCY29,13.65,Low Fat,0.077670981,Health and Hygiene,55.093,OUT017,2007,,Tier 2,Supermarket Type1,1301.639 +FDC21,14.6,Regular,0.043201813,Fruits and Vegetables,110.1254,OUT017,2007,,Tier 2,Supermarket Type1,1844.9318 +FDM33,15.6,Low Fat,0.088215871,Snack Foods,220.1798,OUT017,2007,,Tier 2,Supermarket Type1,5068.7354 +DRJ39,20.25,Low Fat,0.036295834,Dairy,217.5482,OUT013,1987,High,Tier 3,Supermarket Type1,1095.241 +FDB22,8.02,Low Fat,0.186528819,Snack Foods,151.9998,OUT010,1998,,Tier 3,Grocery Store,307.5996 +FDC32,18.35,Low Fat,0.099026525,Fruits and Vegetables,93.8462,OUT013,1987,High,Tier 3,Supermarket Type1,1295.6468 +FDD02,16.6,LF,0,Canned,118.8124,OUT046,1997,Small,Tier 1,Supermarket Type1,2607.2728 +FDL28,10,Regular,0.063162608,Frozen Foods,228.6668,OUT035,2004,Small,Tier 2,Supermarket Type1,3455.502 +FDL39,16.1,Regular,0.063429818,Dairy,179.4318,OUT049,1999,Medium,Tier 1,Supermarket Type1,2345.6134 +FDV37,13,Regular,0.139785104,Canned,196.2426,OUT010,1998,,Tier 3,Grocery Store,197.7426 +FDA28,16.1,Regular,0.04807227,Frozen Foods,126.5362,OUT017,2007,,Tier 2,Supermarket Type1,1761.7068 +FDL04,19,Low Fat,0.112097433,Frozen Foods,105.5622,OUT049,1999,Medium,Tier 1,Supermarket Type1,1905.5196 +FDR10,17.6,Low Fat,0.010037996,Snack Foods,163.5552,OUT035,2004,Small,Tier 2,Supermarket Type1,3086.6488 +FDA39,6.32,Low Fat,0.012789884,Meat,39.1822,OUT017,2007,,Tier 2,Supermarket Type1,1060.6194 +FDR15,9.3,Regular,0.033431669,Meat,153.1314,OUT035,2004,Small,Tier 2,Supermarket Type1,4653.942 +FDQ40,11.1,Regular,0.03623131,Frozen Foods,175.0712,OUT017,2007,,Tier 2,Supermarket Type1,3339.6528 +DRG23,,Low Fat,0.086360962,Hard Drinks,151.2682,OUT027,1985,Medium,Tier 3,Supermarket Type3,2439.4912 +FDU36,6.15,Low Fat,0.046232445,Baking Goods,99.4384,OUT013,1987,High,Tier 3,Supermarket Type1,1379.5376 +FDF47,20.85,Low Fat,0.097618234,Starchy Foods,223.9746,OUT046,1997,Small,Tier 1,Supermarket Type1,897.4984 +FDH14,17.1,Regular,0.046808553,Canned,141.4838,OUT046,1997,Small,Tier 1,Supermarket Type1,1404.838 +FDO45,13.15,Regular,0.03810738,Snack Foods,86.3856,OUT018,2009,Medium,Tier 3,Supermarket Type2,615.1992 +FDK60,16.5,Regular,0.093846532,Baking Goods,95.7068,OUT035,2004,Small,Tier 2,Supermarket Type1,1069.2748 +FDS43,11.65,Low Fat,0.040744057,Fruits and Vegetables,185.924,OUT017,2007,,Tier 2,Supermarket Type1,4101.328 +FDN44,13.15,Low Fat,0.022831052,Fruits and Vegetables,160.292,OUT049,1999,Medium,Tier 1,Supermarket Type1,4793.76 +FDS34,19.35,Regular,0.076878416,Snack Foods,113.9518,OUT049,1999,Medium,Tier 1,Supermarket Type1,1138.518 +FDU20,19.35,Regular,0.021501067,Fruits and Vegetables,122.2098,OUT045,2002,,Tier 2,Supermarket Type1,2771.7254 +FDP44,16.5,Regular,0.07964724,Fruits and Vegetables,101.4332,OUT013,1987,High,Tier 3,Supermarket Type1,1948.1308 +FDC02,21.35,Low Fat,0.068809463,Canned,258.5278,OUT035,2004,Small,Tier 2,Supermarket Type1,5206.556 +FDT56,16,Regular,0.115570552,Fruits and Vegetables,57.5246,OUT035,2004,Small,Tier 2,Supermarket Type1,173.7738 +NCA06,20.5,Low Fat,0.143164371,Household,34.919,OUT013,1987,High,Tier 3,Supermarket Type1,73.238 +FDE04,19.75,Regular,0.018008071,Frozen Foods,180.466,OUT013,1987,High,Tier 3,Supermarket Type1,3415.554 +NCX06,17.6,Low Fat,0.015775777,Household,179.1976,OUT017,2007,,Tier 2,Supermarket Type1,3803.0496 +FDX49,4.615,Regular,0.102407778,Canned,234.33,OUT017,2007,,Tier 2,Supermarket Type1,3961.51 +DRM59,5.88,Low Fat,0.003606726,Hard Drinks,154.1998,OUT018,2009,Medium,Tier 3,Supermarket Type2,1384.1982 +FDJ34,11.8,Regular,0.093801337,Snack Foods,126.0704,OUT049,1999,Medium,Tier 1,Supermarket Type1,1251.704 +FDP60,17.35,Low Fat,0,Baking Goods,101.9016,OUT013,1987,High,Tier 3,Supermarket Type1,1821.6288 +FDI07,12.35,Regular,0.033760862,Meat,196.9426,OUT046,1997,Small,Tier 1,Supermarket Type1,5141.3076 +FDV07,,Low Fat,0.031131455,Fruits and Vegetables,111.0228,OUT027,1985,Medium,Tier 3,Supermarket Type3,3205.1612 +FDH41,9,Low Fat,0.082177842,Frozen Foods,214.1534,OUT045,2002,,Tier 2,Supermarket Type1,1720.4272 +NCB31,6.235,Low Fat,0.118858866,Household,263.291,OUT049,1999,Medium,Tier 1,Supermarket Type1,3418.883 +FDW34,9.6,Low Fat,0,Snack Foods,244.817,OUT035,2004,Small,Tier 2,Supermarket Type1,4374.306 +FDX45,16.75,Low Fat,0.105448901,Snack Foods,156.163,OUT017,2007,,Tier 2,Supermarket Type1,782.315 +FDH14,17.1,Regular,0.046881328,Canned,141.3838,OUT049,1999,Medium,Tier 1,Supermarket Type1,1685.8056 +FDF26,6.825,Regular,0.078057026,Canned,154.5998,OUT010,1998,,Tier 3,Grocery Store,153.7998 +FDU24,6.78,Regular,0.140955857,Baking Goods,92.212,OUT017,2007,,Tier 2,Supermarket Type1,4101.328 +FDX11,16,Regular,0.107186944,Baking Goods,181.9634,OUT018,2009,Medium,Tier 3,Supermarket Type2,3453.5046 +FDF35,15,Low Fat,0.153960209,Starchy Foods,105.9938,OUT035,2004,Small,Tier 2,Supermarket Type1,1179.1318 +NCC43,7.39,Low Fat,0.093160853,Household,251.3066,OUT018,2009,Medium,Tier 3,Supermarket Type2,1004.0264 +FDG29,17.6,Low Fat,0.05629192,Frozen Foods,42.5454,OUT046,1997,Small,Tier 1,Supermarket Type1,419.454 +FDS44,12.65,Regular,0.15604396,Fruits and Vegetables,239.6538,OUT046,1997,Small,Tier 1,Supermarket Type1,3845.6608 +FDZ10,17.85,Low Fat,0.044463491,Snack Foods,127.102,OUT046,1997,Small,Tier 1,Supermarket Type1,2024.032 +FDC52,11.15,Regular,0.00827301,Dairy,150.4708,OUT013,1987,High,Tier 3,Supermarket Type1,1956.1204 +DRL35,15.7,low fat,0.030697825,Hard Drinks,42.877,OUT035,2004,Small,Tier 2,Supermarket Type1,1168.479 +NCP55,14.65,Low Fat,0,Others,56.4614,OUT010,1998,,Tier 3,Grocery Store,55.2614 +FDV38,,Low Fat,0.101281,Dairy,55.0956,OUT027,1985,Medium,Tier 3,Supermarket Type3,2020.0372 +FDL44,18.25,Low Fat,0.012300013,Fruits and Vegetables,160.4894,OUT045,2002,,Tier 2,Supermarket Type1,3073.9986 +FDZ47,20.7,Regular,0,Baking Goods,98.7042,OUT017,2007,,Tier 2,Supermarket Type1,1884.8798 +FDT45,15.85,Low Fat,0.057313443,Snack Foods,53.3956,OUT046,1997,Small,Tier 1,Supermarket Type1,1364.89 +FDN23,6.575,Regular,0.075625152,Breads,145.7444,OUT049,1999,Medium,Tier 1,Supermarket Type1,3193.1768 +NCP43,17.75,Low Fat,0.030568919,Others,177.866,OUT045,2002,,Tier 2,Supermarket Type1,2336.958 +DRJ24,,Low Fat,0.198424841,Soft Drinks,185.2924,OUT019,1985,Small,Tier 1,Grocery Store,370.1848 +FDA02,,Regular,0.029578726,Dairy,143.5786,OUT027,1985,Medium,Tier 3,Supermarket Type3,3756.4436 +FDH33,,LF,0.213125482,Snack Foods,44.9428,OUT019,1985,Small,Tier 1,Grocery Store,175.7712 +FDF56,16.7,Regular,0.120137953,Fruits and Vegetables,181.2976,OUT017,2007,,Tier 2,Supermarket Type1,3078.6592 +NCN26,10.85,Low Fat,0.028679894,Household,115.1808,OUT046,1997,Small,Tier 1,Supermarket Type1,2109.2544 +FDD22,10,Low Fat,0.099804623,Snack Foods,113.7544,OUT049,1999,Medium,Tier 1,Supermarket Type1,3243.7776 +FDU15,13.65,Regular,0.044526443,Meat,37.9532,OUT010,1998,,Tier 3,Grocery Store,71.9064 +FDB41,19,Regular,0.162882227,Frozen Foods,46.8718,OUT010,1998,,Tier 3,Grocery Store,189.0872 +FDZ35,9.6,Regular,0.022404493,Breads,102.499,OUT017,2007,,Tier 2,Supermarket Type1,2579.975 +FDT60,12,Low Fat,0.075975642,Baking Goods,124.1388,OUT017,2007,,Tier 2,Supermarket Type1,1486.0656 +FDE51,5.925,Regular,0.09644909,Dairy,43.8086,OUT035,2004,Small,Tier 2,Supermarket Type1,312.2602 +NCQ06,13,Low Fat,0.041816615,Household,254.5014,OUT035,2004,Small,Tier 2,Supermarket Type1,4845.0266 +FDS28,8.18,Regular,0.082867689,Frozen Foods,58.5588,OUT017,2007,,Tier 2,Supermarket Type1,171.7764 +FDH32,12.8,Low Fat,0.076214289,Fruits and Vegetables,96.541,OUT045,2002,,Tier 2,Supermarket Type1,1834.279 +FDW37,19.2,Low Fat,0.124301968,Canned,89.7488,OUT045,2002,,Tier 2,Supermarket Type1,2082.6224 +FDY33,14.5,Regular,0.097201128,Snack Foods,159.4262,OUT046,1997,Small,Tier 1,Supermarket Type1,2705.1454 +FDF17,5.19,Low Fat,0.042861968,Frozen Foods,196.811,OUT017,2007,,Tier 2,Supermarket Type1,3731.809 +FDG56,13.3,Regular,0.0713931,Fruits and Vegetables,61.0536,OUT013,1987,High,Tier 3,Supermarket Type1,1592.5936 +NCB18,19.6,Low Fat,0.041256807,Household,88.8514,OUT013,1987,High,Tier 3,Supermarket Type1,2125.2336 +FDU14,17.75,Low Fat,0.034746076,Dairy,248.275,OUT035,2004,Small,Tier 2,Supermarket Type1,998.7 +FDU22,12.35,Low Fat,0.093441604,Snack Foods,119.1124,OUT049,1999,Medium,Tier 1,Supermarket Type1,3673.8844 +NCV41,14.35,Low Fat,0.017024598,Health and Hygiene,109.8228,OUT013,1987,High,Tier 3,Supermarket Type1,2099.9332 +FDY52,6.365,Low Fat,0.007363189,Frozen Foods,63.2536,OUT045,2002,,Tier 2,Supermarket Type1,1225.072 +DRG48,,Low Fat,0.014484582,Soft Drinks,143.9102,OUT027,1985,Medium,Tier 3,Supermarket Type3,3062.0142 +FDU01,,Regular,0.011937183,Canned,184.7924,OUT027,1985,Medium,Tier 3,Supermarket Type3,4442.2176 +NCP53,14.75,Low Fat,0.032862976,Health and Hygiene,238.6906,OUT013,1987,High,Tier 3,Supermarket Type1,4278.4308 +FDC17,12.15,Low Fat,0.015484763,Frozen Foods,211.9928,OUT049,1999,Medium,Tier 1,Supermarket Type1,631.1784 +NCZ30,6.59,Low Fat,0.026163192,Household,121.5098,OUT013,1987,High,Tier 3,Supermarket Type1,602.549 +FDK03,12.6,Regular,0.073920438,Dairy,255.6356,OUT046,1997,Small,Tier 1,Supermarket Type1,2797.6916 +FDE08,,Low Fat,0.086352403,Fruits and Vegetables,149.8734,OUT019,1985,Small,Tier 1,Grocery Store,445.4202 +NCM07,,Low Fat,0.03976832,Others,83.9908,OUT027,1985,Medium,Tier 3,Supermarket Type3,2348.9424 +FDY35,,Regular,0.015950066,Breads,47.7402,OUT027,1985,Medium,Tier 3,Supermarket Type3,1975.4286 +FDS28,,Regular,0.082002559,Frozen Foods,59.2588,OUT027,1985,Medium,Tier 3,Supermarket Type3,1374.2112 +FDI56,7.325,Low Fat,0.093307668,Fruits and Vegetables,92.7146,OUT013,1987,High,Tier 3,Supermarket Type1,2006.7212 +FDR23,,Low Fat,0.143199389,Breads,175.837,OUT019,1985,Small,Tier 1,Grocery Store,352.874 +FDF29,15.1,Regular,0.019965179,Frozen Foods,130.531,OUT049,1999,Medium,Tier 1,Supermarket Type1,908.817 +FDA47,,Regular,0.116108797,Baking Goods,164.121,OUT027,1985,Medium,Tier 3,Supermarket Type3,6035.477 +FDI10,8.51,reg,0.078339081,Snack Foods,172.9422,OUT013,1987,High,Tier 3,Supermarket Type1,1379.5376 +FDC45,,Low Fat,0.237651344,Fruits and Vegetables,170.2106,OUT019,1985,Small,Tier 1,Grocery Store,171.1106 +FDA27,20.35,Regular,0.031102571,Dairy,257.2672,OUT017,2007,,Tier 2,Supermarket Type1,2045.3376 +NCR41,17.85,Low Fat,0.018097419,Health and Hygiene,96.9094,OUT018,2009,Medium,Tier 3,Supermarket Type2,1332.9316 +FDR09,18.25,Low Fat,0.078041216,Snack Foods,258.4962,OUT018,2009,Medium,Tier 3,Supermarket Type2,2848.9582 +NCB06,17.6,Low Fat,0.08226356,Health and Hygiene,160.492,OUT013,1987,High,Tier 3,Supermarket Type1,1278.336 +FDE53,10.895,Low Fat,0.026880159,Frozen Foods,106.428,OUT046,1997,Small,Tier 1,Supermarket Type1,1491.392 +DRE27,11.85,Low Fat,0.222063351,Dairy,99.6726,OUT010,1998,,Tier 3,Grocery Store,195.7452 +NCA06,,Low Fat,0.142589751,Household,35.919,OUT027,1985,Medium,Tier 3,Supermarket Type3,585.904 +FDL56,14.1,Low Fat,0.126292985,Fruits and Vegetables,88.6198,OUT018,2009,Medium,Tier 3,Supermarket Type2,1133.8574 +FDT09,15.15,Regular,0.012260981,Snack Foods,131.7284,OUT035,2004,Small,Tier 2,Supermarket Type1,1186.4556 +DRH03,17.25,Low Fat,0.05869048,Dairy,91.612,OUT010,1998,,Tier 3,Grocery Store,93.212 +NCQ53,17.6,Low Fat,0.018982338,Health and Hygiene,237.059,OUT018,2009,Medium,Tier 3,Supermarket Type2,2836.308 +NCT18,14.6,Low Fat,0.059405152,Household,179.6976,OUT046,1997,Small,Tier 1,Supermarket Type1,3621.952 +FDL43,10.1,Low Fat,0.027059264,Meat,76.467,OUT035,2004,Small,Tier 2,Supermarket Type1,1761.041 +FDJ53,10.5,Low Fat,0.071244438,Frozen Foods,119.2098,OUT035,2004,Small,Tier 2,Supermarket Type1,1325.6078 +NCQ02,12.6,Low Fat,0.007455054,Household,186.9556,OUT035,2004,Small,Tier 2,Supermarket Type1,3942.8676 +NCJ05,18.7,Low Fat,0.046088273,Health and Hygiene,153.6682,OUT046,1997,Small,Tier 1,Supermarket Type1,3506.7686 +FDT40,5.985,LF,0.096185556,Frozen Foods,127.1678,OUT018,2009,Medium,Tier 3,Supermarket Type2,3560.6984 +FDA48,12.1,Low Fat,0.11487406,Baking Goods,221.4114,OUT046,1997,Small,Tier 1,Supermarket Type1,5099.3622 +FDV37,13,Regular,0.083643716,Canned,196.0426,OUT049,1999,Medium,Tier 1,Supermarket Type1,2570.6538 +FDX07,19.2,Regular,0.022965292,Fruits and Vegetables,181.695,OUT045,2002,,Tier 2,Supermarket Type1,2563.33 +DRG48,5.78,Low Fat,0.014584584,Soft Drinks,146.3102,OUT045,2002,,Tier 2,Supermarket Type1,2187.153 +FDF44,7.17,Regular,0.059716729,Fruits and Vegetables,130.9968,OUT035,2004,Small,Tier 2,Supermarket Type1,2348.9424 +FDS24,20.85,Regular,0.062224479,Baking Goods,88.1514,OUT046,1997,Small,Tier 1,Supermarket Type1,1682.4766 +NCQ50,18.75,Low Fat,0.034360687,Household,215.7218,OUT049,1999,Medium,Tier 1,Supermarket Type1,4274.436 +FDT25,7.5,Low Fat,0.050708743,Canned,123.4072,OUT013,1987,High,Tier 3,Supermarket Type1,3185.1872 +FDO03,10.395,Regular,0.036957777,Meat,230.5352,OUT045,2002,,Tier 2,Supermarket Type1,4580.704 +FDJ55,12.8,Regular,0.023530953,Meat,223.5404,OUT046,1997,Small,Tier 1,Supermarket Type1,1800.3232 +FDM36,11.65,Regular,0.058681957,Baking Goods,170.4422,OUT013,1987,High,Tier 3,Supermarket Type1,517.3266 +FDM21,20.2,Low Fat,0.064728148,Snack Foods,258.0646,OUT017,2007,,Tier 2,Supermarket Type1,5668.6212 +FDK58,11.35,Regular,0,Snack Foods,103.0016,OUT035,2004,Small,Tier 2,Supermarket Type1,2125.2336 +FDD26,8.71,Regular,0.120773451,Canned,186.5924,OUT010,1998,,Tier 3,Grocery Store,555.2772 +FDW57,8.31,Regular,0.115911972,Snack Foods,177.3028,OUT045,2002,,Tier 2,Supermarket Type1,1948.1308 +FDT32,19,Regular,0.10985775,Fruits and Vegetables,188.8214,OUT010,1998,,Tier 3,Grocery Store,188.4214 +FDT25,7.5,Low Fat,0.050853901,Canned,121.7072,OUT045,2002,,Tier 2,Supermarket Type1,367.5216 +NCB19,6.525,Low Fat,0.090295708,Household,84.6882,OUT046,1997,Small,Tier 1,Supermarket Type1,601.2174 +FDD05,,Low Fat,0.029084548,Frozen Foods,122.0098,OUT019,1985,Small,Tier 1,Grocery Store,361.5294 +NCE54,,Low Fat,0.026769592,Household,77.0354,OUT027,1985,Medium,Tier 3,Supermarket Type3,2332.2974 +FDO39,6.985,Regular,0.137580452,Meat,182.8608,OUT049,1999,Medium,Tier 1,Supermarket Type1,4042.7376 +NCV06,11.3,Low Fat,0.066816565,Household,192.2478,OUT045,2002,,Tier 2,Supermarket Type1,1356.2346 +DRB13,6.115,Regular,0.01179078,Soft Drinks,189.053,OUT010,1998,,Tier 3,Grocery Store,948.765 +FDX51,9.5,Regular,0.036921781,Meat,194.2452,OUT010,1998,,Tier 3,Grocery Store,782.9808 +FDC38,15.7,Low Fat,0.122742389,Canned,134.2942,OUT045,2002,,Tier 2,Supermarket Type1,1192.4478 +FDD04,16,Low Fat,0.089971292,Dairy,143.2154,OUT046,1997,Small,Tier 1,Supermarket Type1,1701.7848 +FDC05,13.1,Regular,0.099186992,Frozen Foods,198.7768,OUT018,2009,Medium,Tier 3,Supermarket Type2,3153.2288 +DRJ59,,Low Fat,0,Hard Drinks,39.0164,OUT027,1985,Medium,Tier 3,Supermarket Type3,1042.6428 +FDL22,16.85,low fat,0.036596012,Snack Foods,90.6488,OUT017,2007,,Tier 2,Supermarket Type1,633.8416 +DRH13,,Low Fat,0.041821227,Soft Drinks,107.628,OUT019,1985,Small,Tier 1,Grocery Store,213.056 +FDV22,14.85,Regular,0.016635488,Snack Foods,157.563,OUT010,1998,,Tier 3,Grocery Store,312.926 +FDP07,18.2,Low Fat,0.090084098,Fruits and Vegetables,197.211,OUT045,2002,,Tier 2,Supermarket Type1,3142.576 +FDK27,11,Low Fat,0.008960445,Meat,119.1756,OUT049,1999,Medium,Tier 1,Supermarket Type1,1696.4584 +FDP31,21.1,Regular,0.162418495,Fruits and Vegetables,64.9168,OUT017,2007,,Tier 2,Supermarket Type1,639.168 +NCI54,15.2,Low Fat,0.056237906,Household,110.7912,OUT010,1998,,Tier 3,Grocery Store,109.1912 +DRK35,,Low Fat,0.071498575,Hard Drinks,37.7506,OUT027,1985,Medium,Tier 3,Supermarket Type3,796.9626 +NCO07,9.06,Low Fat,0.009791467,Others,213.256,OUT049,1999,Medium,Tier 1,Supermarket Type1,4687.232 +FDN31,11.5,Low Fat,0.072820885,Fruits and Vegetables,191.253,OUT013,1987,High,Tier 3,Supermarket Type1,3036.048 +NCO02,11.15,Low Fat,0.073354286,Others,66.8142,OUT035,2004,Small,Tier 2,Supermarket Type1,2372.9112 +FDQ26,13.5,Regular,0.068010049,Dairy,57.2562,OUT045,2002,,Tier 2,Supermarket Type1,770.3306 +FDQ07,15.1,Regular,0.087406863,Fruits and Vegetables,221.8456,OUT046,1997,Small,Tier 1,Supermarket Type1,663.1368 +FDB49,8.3,Regular,0.030198228,Baking Goods,98.2384,OUT049,1999,Medium,Tier 1,Supermarket Type1,2167.8448 +FDY44,14.15,Regular,0.024442501,Fruits and Vegetables,196.411,OUT049,1999,Medium,Tier 1,Supermarket Type1,2749.754 +NCI54,,Low Fat,0.033436336,Household,107.3912,OUT027,1985,Medium,Tier 3,Supermarket Type3,3057.3536 +FDV44,8.365,Regular,0.039844429,Fruits and Vegetables,190.1188,OUT046,1997,Small,Tier 1,Supermarket Type1,1904.188 +FDI48,11.85,Regular,0.055805027,Baking Goods,53.0666,OUT049,1999,Medium,Tier 1,Supermarket Type1,512.666 +NCL05,19.6,Low Fat,0.047888606,Health and Hygiene,42.277,OUT035,2004,Small,Tier 2,Supermarket Type1,605.878 +FDT32,19,Regular,0.065735977,Fruits and Vegetables,189.6214,OUT049,1999,Medium,Tier 1,Supermarket Type1,2826.321 +FDM10,18.25,Low Fat,0.076089711,Snack Foods,212.9218,OUT049,1999,Medium,Tier 1,Supermarket Type1,3846.9924 +FDS21,19.85,Regular,0.020908608,Snack Foods,63.5194,OUT049,1999,Medium,Tier 1,Supermarket Type1,557.2746 +FDD11,12.85,Low Fat,0.030678825,Starchy Foods,251.704,OUT045,2002,,Tier 2,Supermarket Type1,3542.056 +FDL04,,Low Fat,0.111381428,Frozen Foods,106.7622,OUT027,1985,Medium,Tier 3,Supermarket Type3,2964.1416 +FDO58,19.6,Low Fat,0.039738393,Snack Foods,163.7526,OUT018,2009,Medium,Tier 3,Supermarket Type2,2960.1468 +FDQ08,15.7,Regular,0.01903743,Fruits and Vegetables,60.5536,OUT017,2007,,Tier 2,Supermarket Type1,490.0288 +FDT28,13.3,Low Fat,0.06356617,Frozen Foods,151.3708,OUT046,1997,Small,Tier 1,Supermarket Type1,3611.2992 +FDT22,10.395,Low Fat,0.112553853,Snack Foods,59.022,OUT018,2009,Medium,Tier 3,Supermarket Type2,1378.206 +FDB58,10.5,Regular,0.013493914,Snack Foods,143.7154,OUT035,2004,Small,Tier 2,Supermarket Type1,3119.9388 +FDN45,19.35,Low Fat,0.118102769,Snack Foods,224.8088,OUT046,1997,Small,Tier 1,Supermarket Type1,2013.3792 +FDZ45,14.1,Low Fat,0.06682033,Snack Foods,198.9084,OUT013,1987,High,Tier 3,Supermarket Type1,4761.8016 +FDJ38,8.6,Regular,0.040205535,Canned,188.753,OUT046,1997,Small,Tier 1,Supermarket Type1,7590.12 +NCT06,17.1,Low Fat,0.038816115,Household,166.4842,OUT045,2002,,Tier 2,Supermarket Type1,1326.2736 +FDU21,,Regular,0.076348933,Snack Foods,32.8558,OUT027,1985,Medium,Tier 3,Supermarket Type3,713.0718 +NCP30,20.5,Low Fat,0.032819637,Household,38.9822,OUT049,1999,Medium,Tier 1,Supermarket Type1,982.055 +FDR27,15.1,Regular,0.096249842,Meat,134.4942,OUT049,1999,Medium,Tier 1,Supermarket Type1,2119.9072 +FDW39,6.69,Regular,0,Meat,176.937,OUT017,2007,,Tier 2,Supermarket Type1,4234.488 +DRZ24,,Low Fat,0,Soft Drinks,121.044,OUT027,1985,Medium,Tier 3,Supermarket Type3,2396.88 +FDK21,7.905,Low Fat,0.010003987,Snack Foods,250.7408,OUT013,1987,High,Tier 3,Supermarket Type1,5757.8384 +FDJ04,18,Low Fat,0.124452048,Frozen Foods,118.5124,OUT046,1997,Small,Tier 1,Supermarket Type1,1303.6364 +FDZ13,7.84,Regular,0.154363209,Canned,50.835,OUT017,2007,,Tier 2,Supermarket Type1,599.22 +FDS16,15.15,Regular,0.066551268,Frozen Foods,144.676,OUT017,2007,,Tier 2,Supermarket Type1,3954.852 +FDD56,15.2,Regular,0.173703549,Fruits and Vegetables,175.8054,OUT010,1998,,Tier 3,Grocery Store,1050.6324 +FDI57,19.85,Low Fat,0.054025644,Seafood,197.2768,OUT046,1997,Small,Tier 1,Supermarket Type1,6503.5344 +FDQ12,,Low Fat,0.03523927,Baking Goods,231.601,OUT027,1985,Medium,Tier 3,Supermarket Type3,5972.226 +FDI56,7.325,Low Fat,0.093385381,Fruits and Vegetables,91.3146,OUT046,1997,Small,Tier 1,Supermarket Type1,1641.8628 +NCT42,5.88,Low Fat,0.024937792,Household,148.4392,OUT045,2002,,Tier 2,Supermarket Type1,2087.9488 +FDM25,10.695,Regular,0.060654268,Breakfast,174.7712,OUT035,2004,Small,Tier 2,Supermarket Type1,3339.6528 +DRB25,,Low Fat,0.06912336,Soft Drinks,106.0938,OUT027,1985,Medium,Tier 3,Supermarket Type3,2787.0388 +NCY30,20.25,LF,0.025953257,Household,179.5976,OUT046,1997,Small,Tier 1,Supermarket Type1,2535.3664 +FDD44,8.05,Regular,0.07884393,Fruits and Vegetables,257.0646,OUT017,2007,,Tier 2,Supermarket Type1,8760.5964 +FDK45,11.65,Low Fat,0.033851785,Seafood,112.186,OUT035,2004,Small,Tier 2,Supermarket Type1,1018.674 +FDN45,19.35,Low Fat,0.118342285,Snack Foods,222.6088,OUT045,2002,,Tier 2,Supermarket Type1,1789.6704 +FDQ09,7.235,Low Fat,0.058121214,Snack Foods,115.8834,OUT035,2004,Small,Tier 2,Supermarket Type1,1382.2008 +FDC17,12.15,Low Fat,0.015457803,Frozen Foods,209.9928,OUT035,2004,Small,Tier 2,Supermarket Type1,5259.82 +FDD45,8.615,low fat,0.116152226,Fruits and Vegetables,94.1436,OUT013,1987,High,Tier 3,Supermarket Type1,1512.6976 +FDD41,6.765,Regular,0.087260103,Frozen Foods,105.0306,OUT046,1997,Small,Tier 1,Supermarket Type1,2090.612 +FDU46,10.3,Regular,0.0111263,Snack Foods,87.254,OUT046,1997,Small,Tier 1,Supermarket Type1,1211.756 +FDO45,13.15,Regular,0.038167453,Snack Foods,89.4856,OUT017,2007,,Tier 2,Supermarket Type1,1230.3984 +FDG41,8.84,Regular,0.076547632,Frozen Foods,109.5228,OUT035,2004,Small,Tier 2,Supermarket Type1,1657.842 +DRC13,8.26,Regular,0,Soft Drinks,122.573,OUT045,2002,,Tier 2,Supermarket Type1,739.038 +FDX50,20.1,Low Fat,0.074931201,Dairy,108.9228,OUT018,2009,Medium,Tier 3,Supermarket Type2,1105.228 +FDK56,9.695,Low Fat,0,Fruits and Vegetables,185.1898,OUT035,2004,Small,Tier 2,Supermarket Type1,2619.2572 +NCL18,18.85,Low Fat,0.16758389,Household,194.6136,OUT046,1997,Small,Tier 1,Supermarket Type1,2721.7904 +FDN57,18.25,Low Fat,0.054318517,Snack Foods,140.9154,OUT049,1999,Medium,Tier 1,Supermarket Type1,6381.693 +FDX03,,Regular,0.060800116,Meat,44.4744,OUT027,1985,Medium,Tier 3,Supermarket Type3,769.6648 +NCU17,5.32,Low Fat,0,Health and Hygiene,101.7674,OUT013,1987,High,Tier 3,Supermarket Type1,1120.5414 +FDL14,8.115,reg,0.032152786,Canned,157.3972,OUT035,2004,Small,Tier 2,Supermarket Type1,1869.5664 +NCU18,15.1,Low Fat,0.055840055,Household,139.8496,OUT046,1997,Small,Tier 1,Supermarket Type1,1411.496 +NCH43,8.42,Low Fat,0.070968081,Household,215.9192,OUT017,2007,,Tier 2,Supermarket Type1,1941.4728 +FDH41,9,Low Fat,0.081996013,Frozen Foods,216.2534,OUT035,2004,Small,Tier 2,Supermarket Type1,4301.068 +FDS28,8.18,Regular,0.082737261,Frozen Foods,57.3588,OUT018,2009,Medium,Tier 3,Supermarket Type2,343.5528 +FDG02,,Low Fat,0.011206632,Canned,191.4188,OUT027,1985,Medium,Tier 3,Supermarket Type3,3998.7948 +FDS40,15.35,Low Fat,0.014047825,Frozen Foods,36.719,OUT045,2002,,Tier 2,Supermarket Type1,585.904 +FDD10,20.6,Regular,0.045982389,Snack Foods,177.0344,OUT013,1987,High,Tier 3,Supermarket Type1,535.3032 +DRQ35,9.3,Low Fat,0.042256257,Hard Drinks,124.4388,OUT013,1987,High,Tier 3,Supermarket Type1,1609.9044 +NCL05,19.6,Low Fat,0,Health and Hygiene,42.877,OUT049,1999,Medium,Tier 1,Supermarket Type1,649.155 +FDJ48,11.3,Low Fat,0.056424146,Baking Goods,247.8118,OUT035,2004,Small,Tier 2,Supermarket Type1,2223.1062 +FDV21,,Low Fat,0.170254469,Snack Foods,124.8704,OUT027,1985,Medium,Tier 3,Supermarket Type3,2127.8968 +FDJ26,15.3,Regular,0.084749164,Canned,215.5218,OUT035,2004,Small,Tier 2,Supermarket Type1,4060.7142 +NCN05,8.235,Low Fat,0.014541462,Health and Hygiene,184.495,OUT017,2007,,Tier 2,Supermarket Type1,3844.995 +FDK09,15.2,Low Fat,0.091763303,Snack Foods,228.5352,OUT046,1997,Small,Tier 1,Supermarket Type1,1832.2816 +FDM56,,low fat,0.069851683,Fruits and Vegetables,110.9912,OUT027,1985,Medium,Tier 3,Supermarket Type3,1310.2944 +DRF25,9,Low Fat,0.039004193,Soft Drinks,37.019,OUT045,2002,,Tier 2,Supermarket Type1,659.142 +FDG14,9,reg,0.05060313,Canned,150.9024,OUT045,2002,,Tier 2,Supermarket Type1,4402.2696 +FDZ31,15.35,Regular,0.113195815,Fruits and Vegetables,190.8504,OUT035,2004,Small,Tier 2,Supermarket Type1,3643.2576 +FDU21,,Regular,0.134327613,Snack Foods,35.0558,OUT019,1985,Small,Tier 1,Grocery Store,33.9558 +FDC57,20.1,Regular,0.054584207,Fruits and Vegetables,193.382,OUT035,2004,Small,Tier 2,Supermarket Type1,4247.804 +FDU46,10.3,Regular,0.018623146,Snack Foods,87.854,OUT010,1998,,Tier 3,Grocery Store,259.662 +FDU22,12.35,Low Fat,0.093278912,Snack Foods,118.7124,OUT035,2004,Small,Tier 2,Supermarket Type1,2607.2728 +DRG23,8.88,Low Fat,0.086957199,Hard Drinks,152.5682,OUT045,2002,,Tier 2,Supermarket Type1,1372.2138 +FDR23,15.85,Low Fat,0.13689554,Breads,176.437,OUT010,1998,,Tier 3,Grocery Store,529.311 +FDI14,14.1,Low Fat,0.090043082,Canned,140.1496,OUT018,2009,Medium,Tier 3,Supermarket Type2,846.8976 +NCN42,20.25,Low Fat,0.014251461,Household,148.6418,OUT045,2002,,Tier 2,Supermarket Type1,2648.5524 +NCM41,16.5,Low Fat,0.035711426,Health and Hygiene,93.612,OUT049,1999,Medium,Tier 1,Supermarket Type1,1584.604 +FDT55,13.6,Regular,0.043655155,Fruits and Vegetables,156.7946,OUT046,1997,Small,Tier 1,Supermarket Type1,3629.2758 +DRY23,,Regular,0.108568067,Soft Drinks,42.9112,OUT027,1985,Medium,Tier 3,Supermarket Type3,809.6128 +FDL46,20.35,Low Fat,0.090480214,Snack Foods,119.5466,OUT010,1998,,Tier 3,Grocery Store,117.8466 +FDQ57,7.275,Low Fat,0.027942357,Snack Foods,145.076,OUT035,2004,Small,Tier 2,Supermarket Type1,1611.236 +FDQ16,19.7,Low Fat,0.041730507,Frozen Foods,109.2912,OUT035,2004,Small,Tier 2,Supermarket Type1,2402.2064 +FDZ52,,Low Fat,0.099589909,Frozen Foods,109.1886,OUT027,1985,Medium,Tier 3,Supermarket Type3,4225.1668 +FDL16,,Low Fat,0.294939214,Frozen Foods,47.106,OUT019,1985,Small,Tier 1,Grocery Store,139.818 +NCX18,14.15,Low Fat,0.008829806,Household,196.811,OUT018,2009,Medium,Tier 3,Supermarket Type2,4517.453 +FDM34,19,Low Fat,0.067722325,Snack Foods,130.8626,OUT018,2009,Medium,Tier 3,Supermarket Type2,1573.9512 +FDG60,,Low Fat,0.060405784,Baking Goods,234.5616,OUT027,1985,Medium,Tier 3,Supermarket Type3,6796.4864 +NCA06,20.5,Low Fat,0,Household,37.119,OUT018,2009,Medium,Tier 3,Supermarket Type2,842.237 +DRD12,6.96,Low Fat,0.077193561,Soft Drinks,89.9146,OUT046,1997,Small,Tier 1,Supermarket Type1,1277.0044 +FDP04,15.35,Low Fat,0.013869039,Frozen Foods,62.5168,OUT018,2009,Medium,Tier 3,Supermarket Type2,447.4176 +NCH30,17.1,Low Fat,0.067290244,Household,114.586,OUT045,2002,,Tier 2,Supermarket Type1,1584.604 +FDS04,10.195,Regular,0.146960375,Frozen Foods,142.2838,OUT045,2002,,Tier 2,Supermarket Type1,1685.8056 +FDQ13,,Low Fat,0.018632082,Canned,82.9908,OUT019,1985,Small,Tier 1,Grocery Store,503.3448 +FDU59,5.78,Low Fat,0.096536082,Breads,162.8552,OUT049,1999,Medium,Tier 1,Supermarket Type1,3574.0144 +DRG11,6.385,Low Fat,0.084008316,Hard Drinks,108.2596,OUT045,2002,,Tier 2,Supermarket Type1,1186.4556 +FDA36,,Low Fat,0.005638944,Baking Goods,184.9924,OUT027,1985,Medium,Tier 3,Supermarket Type3,3146.5708 +FDA15,9.3,Low Fat,0.01601936,Dairy,248.5092,OUT035,2004,Small,Tier 2,Supermarket Type1,6474.2392 +FDZ03,13.65,Regular,0.13187274,Dairy,188.024,OUT010,1998,,Tier 3,Grocery Store,745.696 +FDJ16,9.195,LF,0.114863923,Frozen Foods,59.0246,OUT035,2004,Small,Tier 2,Supermarket Type1,1853.5872 +FDZ12,9.17,Low Fat,0.103138922,Baking Goods,141.747,OUT049,1999,Medium,Tier 1,Supermarket Type1,3006.087 +FDH09,12.6,Low Fat,0.056191301,Seafood,53.2982,OUT045,2002,,Tier 2,Supermarket Type1,736.3748 +FDT13,14.85,Low Fat,0.01867669,Canned,188.7214,OUT017,2007,,Tier 2,Supermarket Type1,3956.8494 +FDU20,19.35,Regular,0.021578923,Fruits and Vegetables,120.5098,OUT017,2007,,Tier 2,Supermarket Type1,1807.647 +DRH25,18.7,Low Fat,0,Soft Drinks,52.2324,OUT035,2004,Small,Tier 2,Supermarket Type1,467.3916 +FDK26,5.46,Regular,0.032242661,Canned,187.624,OUT045,2002,,Tier 2,Supermarket Type1,3542.056 +FDU32,8.785,Low Fat,0.025962714,Fruits and Vegetables,120.9414,OUT035,2004,Small,Tier 2,Supermarket Type1,1949.4624 +FDI22,12.6,Low Fat,0.096407554,Snack Foods,210.8612,OUT045,2002,,Tier 2,Supermarket Type1,3344.9792 +NCB54,8.76,Low Fat,0.050256604,Health and Hygiene,127.3336,OUT018,2009,Medium,Tier 3,Supermarket Type2,2684.5056 +FDX46,12.3,Regular,0.058234621,Snack Foods,58.7562,OUT045,2002,,Tier 2,Supermarket Type1,592.562 +NCC07,19.6,Low Fat,0.023931217,Household,103.1964,OUT013,1987,High,Tier 3,Supermarket Type1,736.3748 +FDQ34,,LF,0.284065879,Snack Foods,105.5622,OUT019,1985,Small,Tier 1,Grocery Store,211.7244 +FDM16,8.155,Regular,0.033692089,Frozen Foods,76.2354,OUT018,2009,Medium,Tier 3,Supermarket Type2,1279.0018 +FDJ55,,Regular,0.023417004,Meat,223.8404,OUT027,1985,Medium,Tier 3,Supermarket Type3,7201.2928 +DRI01,7.97,Low Fat,0.034647829,Soft Drinks,171.2422,OUT017,2007,,Tier 2,Supermarket Type1,3103.9596 +FDD50,18.85,Low Fat,0.142219209,Canned,167.6132,OUT018,2009,Medium,Tier 3,Supermarket Type2,1522.0188 +FDJ08,11.1,Low Fat,0.11089655,Fruits and Vegetables,191.5846,OUT045,2002,,Tier 2,Supermarket Type1,2101.9306 +NCK18,9.6,Low Fat,0.006708517,Household,164.6184,OUT049,1999,Medium,Tier 1,Supermarket Type1,2972.1312 +FDQ14,9.27,Low Fat,0.103419257,Dairy,148.105,OUT010,1998,,Tier 3,Grocery Store,149.805 +FDS51,13.35,Low Fat,0.032180494,Meat,61.2194,OUT046,1997,Small,Tier 1,Supermarket Type1,433.4358 +FDA04,11.3,Regular,0.066717378,Frozen Foods,260.8962,OUT035,2004,Small,Tier 2,Supermarket Type1,4920.9278 +FDP10,19,Low Fat,0.128814669,Snack Foods,107.6622,OUT017,2007,,Tier 2,Supermarket Type1,1164.4842 +FDT36,12.3,Low Fat,0.111500259,Baking Goods,35.6874,OUT045,2002,,Tier 2,Supermarket Type1,846.8976 +FDH38,6.425,Low Fat,0.010497273,Canned,118.3808,OUT017,2007,,Tier 2,Supermarket Type1,2812.3392 +FDC16,11.5,Regular,0.020653603,Dairy,84.954,OUT018,2009,Medium,Tier 3,Supermarket Type2,865.54 +FDF17,5.19,Low Fat,0.042687151,Frozen Foods,195.911,OUT049,1999,Medium,Tier 1,Supermarket Type1,2946.165 +FDU23,12.15,Low Fat,0.021705417,Breads,163.5184,OUT013,1987,High,Tier 3,Supermarket Type1,3137.2496 +FDB34,15.25,Low Fat,0.026651184,Snack Foods,86.6198,OUT049,1999,Medium,Tier 1,Supermarket Type1,1657.1762 +FDW26,11.8,Regular,0.106968096,Dairy,221.6772,OUT013,1987,High,Tier 3,Supermarket Type1,3113.2808 +FDP45,15.7,Regular,0.030686952,Snack Foods,253.4724,OUT045,2002,,Tier 2,Supermarket Type1,1510.0344 +FDD38,16.75,Regular,0.008191729,Canned,103.5674,OUT046,1997,Small,Tier 1,Supermarket Type1,1629.8784 +FDM60,10.8,Regular,0.048218142,Baking Goods,42.2138,OUT049,1999,Medium,Tier 1,Supermarket Type1,690.4346 +FDW26,11.8,Regular,0.107036943,Dairy,220.3772,OUT035,2004,Small,Tier 2,Supermarket Type1,4447.544 +FDV51,,Low Fat,0.032381325,Meat,166.1842,OUT027,1985,Medium,Tier 3,Supermarket Type3,5470.8786 +FDT33,7.81,Regular,0.034043503,Snack Foods,168.7158,OUT049,1999,Medium,Tier 1,Supermarket Type1,2673.8528 +FDQ40,11.1,Regular,0.036027524,Frozen Foods,177.2712,OUT046,1997,Small,Tier 1,Supermarket Type1,3339.6528 +FDX40,12.85,Low Fat,0,Frozen Foods,38.3164,OUT035,2004,Small,Tier 2,Supermarket Type1,502.0132 +FDU31,10.5,Regular,0.02498633,Fruits and Vegetables,216.7508,OUT035,2004,Small,Tier 2,Supermarket Type1,3038.7112 +DRJ01,6.135,Low Fat,0.115032406,Soft Drinks,161.0236,OUT046,1997,Small,Tier 1,Supermarket Type1,1288.9888 +FDP11,,Low Fat,0.068765925,Breads,216.9166,OUT027,1985,Medium,Tier 3,Supermarket Type3,4354.332 +NCN43,,Low Fat,0.006727008,Others,125.173,OUT027,1985,Medium,Tier 3,Supermarket Type3,3202.498 +FDA15,9.3,Low Fat,0.016087659,Dairy,249.6092,OUT018,2009,Medium,Tier 3,Supermarket Type2,5976.2208 +FDO04,16.6,Low Fat,0,Frozen Foods,54.6614,OUT017,2007,,Tier 2,Supermarket Type1,884.1824 +NCF43,8.51,Low Fat,0.051936086,Household,142.947,OUT035,2004,Small,Tier 2,Supermarket Type1,3006.087 +NCI17,8.645,Low Fat,0.1442339,Health and Hygiene,95.441,OUT017,2007,,Tier 2,Supermarket Type1,3282.394 +FDY47,8.6,Regular,0.05443912,Breads,128.831,OUT013,1987,High,Tier 3,Supermarket Type1,1038.648 +FDF20,,Low Fat,0.033059299,Fruits and Vegetables,196.4768,OUT027,1985,Medium,Tier 3,Supermarket Type3,6306.4576 +NCS53,14.5,Low Fat,0.089778187,Health and Hygiene,158.4604,OUT046,1997,Small,Tier 1,Supermarket Type1,2693.8268 +FDK38,6.65,Low Fat,0.053372768,Canned,149.5734,OUT049,1999,Medium,Tier 1,Supermarket Type1,2524.0478 +FDW43,20.1,Regular,0.022406575,Fruits and Vegetables,225.9036,OUT013,1987,High,Tier 3,Supermarket Type1,3643.2576 +FDV57,15.25,Regular,0.065896556,Snack Foods,179.266,OUT046,1997,Small,Tier 1,Supermarket Type1,1438.128 +FDX26,17.7,Low Fat,0.088305201,Dairy,182.3292,OUT017,2007,,Tier 2,Supermarket Type1,4195.8716 +FDR04,7.075,Low Fat,0.022566975,Frozen Foods,97.3068,OUT046,1997,Small,Tier 1,Supermarket Type1,1263.6884 +FDP19,11.5,Low Fat,0,Fruits and Vegetables,129.3652,OUT013,1987,High,Tier 3,Supermarket Type1,2066.6432 +FDT07,5.82,Regular,0.077756427,Fruits and Vegetables,254.533,OUT017,2007,,Tier 2,Supermarket Type1,1281.665 +DRB24,8.785,Low Fat,0.020609218,Soft Drinks,155.1656,OUT049,1999,Medium,Tier 1,Supermarket Type1,4016.1056 +FDB36,5.465,Regular,0,Baking Goods,129.1626,OUT046,1997,Small,Tier 1,Supermarket Type1,3672.5528 +NCE07,,Low Fat,0.013066448,Household,140.9154,OUT027,1985,Medium,Tier 3,Supermarket Type3,2127.231 +FDI16,,reg,0.135118202,Frozen Foods,52.564,OUT027,1985,Medium,Tier 3,Supermarket Type3,2290.352 +FDP45,15.7,Regular,0.030624844,Snack Foods,252.2724,OUT046,1997,Small,Tier 1,Supermarket Type1,1258.362 +NCC43,7.39,low fat,0.092705683,Household,251.9066,OUT013,1987,High,Tier 3,Supermarket Type1,4267.1122 +FDQ23,,Low Fat,0.042941559,Breads,102.9332,OUT019,1985,Small,Tier 1,Grocery Store,102.5332 +FDW24,6.8,Low Fat,0.03748996,Baking Goods,48.6034,OUT035,2004,Small,Tier 2,Supermarket Type1,291.6204 +FDW09,,Regular,0.025795293,Snack Foods,80.2302,OUT027,1985,Medium,Tier 3,Supermarket Type3,2139.2154 +FDN10,11.5,Low Fat,0.046115083,Snack Foods,120.2124,OUT035,2004,Small,Tier 2,Supermarket Type1,1540.6612 +FDE23,17.6,Regular,0.053170949,Starchy Foods,45.606,OUT035,2004,Small,Tier 2,Supermarket Type1,1724.422 +FDV16,7.75,Regular,0.082915017,Frozen Foods,34.9558,OUT035,2004,Small,Tier 2,Supermarket Type1,645.1602 +FDF12,,Low Fat,0.082028694,Baking Goods,148.6076,OUT027,1985,Medium,Tier 3,Supermarket Type3,3990.8052 +FDN21,18.6,Low Fat,0.076975118,Snack Foods,161.8236,OUT049,1999,Medium,Tier 1,Supermarket Type1,1611.236 +DRC25,5.73,Low Fat,0.045371855,Soft Drinks,86.0882,OUT046,1997,Small,Tier 1,Supermarket Type1,1116.5466 +NCP18,12.15,Low Fat,0.028642712,Household,149.0708,OUT049,1999,Medium,Tier 1,Supermarket Type1,1203.7664 +FDW60,5.44,Regular,0.017047751,Baking Goods,174.637,OUT013,1987,High,Tier 3,Supermarket Type1,2999.429 +FDY04,17.7,Regular,0.042562588,Frozen Foods,165.021,OUT045,2002,,Tier 2,Supermarket Type1,3425.541 +NCJ31,,LF,0.181769264,Others,240.6196,OUT027,1985,Medium,Tier 3,Supermarket Type3,4579.3724 +DRN47,12.1,Low Fat,0.016812745,Hard Drinks,180.666,OUT013,1987,High,Tier 3,Supermarket Type1,4134.618 +FDU13,8.355,Low Fat,0,Canned,145.6418,OUT013,1987,High,Tier 3,Supermarket Type1,3384.2614 +FDT39,6.26,reg,0.016516867,Meat,151.1366,OUT010,1998,,Tier 3,Grocery Store,453.4098 +NCQ18,15.75,Low Fat,0.134960397,Household,101.37,OUT013,1987,High,Tier 3,Supermarket Type1,2097.27 +FDV25,5.905,low fat,0.045614252,Canned,221.5456,OUT013,1987,High,Tier 3,Supermarket Type1,6852.4136 +NCE30,16,Low Fat,0.099136036,Household,210.3902,OUT046,1997,Small,Tier 1,Supermarket Type1,1486.7314 +NCN42,20.25,Low Fat,0.014222617,Household,148.9418,OUT046,1997,Small,Tier 1,Supermarket Type1,3531.4032 +FDW25,5.175,Low Fat,0.037457098,Canned,83.4224,OUT049,1999,Medium,Tier 1,Supermarket Type1,1448.7808 +FDS49,9,Low Fat,0.079279489,Canned,77.2644,OUT013,1987,High,Tier 3,Supermarket Type1,1335.5948 +FDN34,15.6,Regular,0.045835395,Snack Foods,168.2132,OUT049,1999,Medium,Tier 1,Supermarket Type1,2367.5848 +FDS45,5.175,Regular,0.029616108,Snack Foods,107.7622,OUT018,2009,Medium,Tier 3,Supermarket Type2,2011.3818 +NCL53,,Low Fat,0,Health and Hygiene,175.4028,OUT027,1985,Medium,Tier 3,Supermarket Type3,6729.9064 +FDT38,18.7,Low Fat,0.0576269,Dairy,83.3566,OUT049,1999,Medium,Tier 1,Supermarket Type1,1860.2452 +NCX06,17.6,Low Fat,0.015687045,Household,182.6976,OUT046,1997,Small,Tier 1,Supermarket Type1,3440.8544 +NCY17,18.2,Low Fat,0.162960415,Health and Hygiene,43.5086,OUT013,1987,High,Tier 3,Supermarket Type1,1070.6064 +NCO18,13.15,Low Fat,0.024651269,Household,179.5686,OUT046,1997,Small,Tier 1,Supermarket Type1,1422.1488 +FDY47,8.6,Regular,0.091195818,Breads,130.231,OUT010,1998,,Tier 3,Grocery Store,129.831 +FDF57,,Regular,0.058542509,Fruits and Vegetables,168.6448,OUT027,1985,Medium,Tier 3,Supermarket Type3,3408.896 +FDS26,20.35,Low Fat,0.089608321,Dairy,262.1594,OUT049,1999,Medium,Tier 1,Supermarket Type1,3139.9128 +NCL17,7.39,Low Fat,0.067766896,Health and Hygiene,140.6812,OUT035,2004,Small,Tier 2,Supermarket Type1,3704.5112 +NCB18,19.6,Low Fat,0.041355366,Household,88.7514,OUT049,1999,Medium,Tier 1,Supermarket Type1,2656.542 +FDA50,16.25,LF,0.145913308,Dairy,95.441,OUT010,1998,,Tier 3,Grocery Store,193.082 +DRE13,6.28,Low Fat,0.027748176,Soft Drinks,86.5198,OUT049,1999,Medium,Tier 1,Supermarket Type1,1395.5168 +DRE60,9.395,Low Fat,0.159201868,Soft Drinks,226.072,OUT013,1987,High,Tier 3,Supermarket Type1,3621.952 +FDB20,7.72,Low Fat,0.052274691,Fruits and Vegetables,79.1986,OUT017,2007,,Tier 2,Supermarket Type1,778.986 +NCS18,12.65,Low Fat,0.042175992,Household,106.4938,OUT013,1987,High,Tier 3,Supermarket Type1,2465.4574 +FDH19,,Low Fat,0.057933643,Meat,175.1738,OUT019,1985,Small,Tier 1,Grocery Store,347.5476 +FDS47,16.75,Low Fat,0,Breads,88.7856,OUT045,2002,,Tier 2,Supermarket Type1,966.7416 +FDC09,15.5,Regular,0.026280116,Fruits and Vegetables,102.3332,OUT013,1987,High,Tier 3,Supermarket Type1,922.7988 +DRG23,8.88,Low Fat,0.086916126,Hard Drinks,153.3682,OUT049,1999,Medium,Tier 1,Supermarket Type1,1219.7456 +FDU34,18.25,Low Fat,0.075347426,Snack Foods,126.3046,OUT045,2002,,Tier 2,Supermarket Type1,747.0276 +FDZ40,8.935,Low Fat,0.040410039,Frozen Foods,52.9298,OUT017,2007,,Tier 2,Supermarket Type1,539.298 +NCE30,16,Low Fat,0.09911729,Household,210.7902,OUT035,2004,Small,Tier 2,Supermarket Type1,4460.1942 +FDA44,19.7,LF,0.053439522,Fruits and Vegetables,55.093,OUT018,2009,Medium,Tier 3,Supermarket Type2,1018.674 +FDB32,20.6,Low Fat,0.023448504,Fruits and Vegetables,93.9778,OUT035,2004,Small,Tier 2,Supermarket Type1,2816.334 +NCO06,19.25,Low Fat,0.108030434,Household,32.4558,OUT046,1997,Small,Tier 1,Supermarket Type1,101.8674 +FDY44,14.15,Regular,0.024404558,Fruits and Vegetables,198.311,OUT046,1997,Small,Tier 1,Supermarket Type1,2553.343 +FDG10,6.63,Regular,0.010961483,Snack Foods,58.2588,OUT045,2002,,Tier 2,Supermarket Type1,343.5528 +FDF38,11.8,Regular,0.026358005,Canned,39.6138,OUT046,1997,Small,Tier 1,Supermarket Type1,365.5242 +FDW59,,Low Fat,0.03627089,Breads,85.9566,OUT019,1985,Small,Tier 1,Grocery Store,169.1132 +FDP34,12.85,Low Fat,0.137227848,Snack Foods,155.563,OUT046,1997,Small,Tier 1,Supermarket Type1,4224.501 +FDZ26,11.6,Regular,0.144832027,Dairy,239.8222,OUT017,2007,,Tier 2,Supermarket Type1,4063.3774 +FDH17,,Regular,0.029157849,Frozen Foods,97.0726,OUT019,1985,Small,Tier 1,Grocery Store,293.6178 +FDU44,12.15,Regular,0.058756205,Fruits and Vegetables,161.0552,OUT017,2007,,Tier 2,Supermarket Type1,3411.5592 +FDS23,4.635,Low Fat,0.141108156,Breads,128.2994,OUT049,1999,Medium,Tier 1,Supermarket Type1,2698.4874 +DRE03,19.6,Low Fat,0.024325592,Dairy,48.5718,OUT018,2009,Medium,Tier 3,Supermarket Type2,425.4462 +FDY57,20.2,Regular,0.121500143,Snack Foods,95.0752,OUT045,2002,,Tier 2,Supermarket Type1,2588.6304 +FDH50,,Regular,0.160653682,Canned,185.2266,OUT027,1985,Medium,Tier 3,Supermarket Type3,5901.6512 +DRY23,9.395,Regular,0.109096371,Soft Drinks,44.6112,OUT046,1997,Small,Tier 1,Supermarket Type1,511.3344 +FDT27,11.395,Regular,0.069574013,Meat,232.8616,OUT035,2004,Small,Tier 2,Supermarket Type1,2812.3392 +FDB38,19.5,Regular,0.027458099,Canned,158.792,OUT018,2009,Medium,Tier 3,Supermarket Type2,2556.672 +FDY16,18.35,Regular,0.092226754,Frozen Foods,184.4266,OUT046,1997,Small,Tier 1,Supermarket Type1,3504.1054 +FDG33,5.365,Regular,0.234733477,Seafood,173.4764,OUT010,1998,,Tier 3,Grocery Store,171.7764 +FDN04,11.8,Regular,0.014144442,Frozen Foods,180.4344,OUT018,2009,Medium,Tier 3,Supermarket Type2,535.3032 +FDJ48,11.3,Low Fat,0.056754036,Baking Goods,247.5118,OUT017,2007,,Tier 2,Supermarket Type1,2470.118 +NCC07,19.6,Low Fat,0.023999722,Household,104.0964,OUT045,2002,,Tier 2,Supermarket Type1,525.982 +FDI35,14,Low Fat,0.041355366,Starchy Foods,182.0634,OUT049,1999,Medium,Tier 1,Supermarket Type1,4544.085 +DRH49,19.7,Low Fat,0.024655594,Soft Drinks,84.3592,OUT046,1997,Small,Tier 1,Supermarket Type1,743.0328 +FDY51,12.5,Low Fat,0.081134826,Meat,220.0798,OUT046,1997,Small,Tier 1,Supermarket Type1,4848.3556 +NCG07,12.3,Low Fat,0.052608525,Household,191.253,OUT045,2002,,Tier 2,Supermarket Type1,2656.542 +FDA22,7.435,Low Fat,0.084452363,Starchy Foods,165.2158,OUT046,1997,Small,Tier 1,Supermarket Type1,2840.9686 +FDA33,6.48,Low Fat,0.033899898,Snack Foods,146.9076,OUT046,1997,Small,Tier 1,Supermarket Type1,2956.152 +FDV03,17.6,Low Fat,0.058042926,Meat,154.6314,OUT013,1987,High,Tier 3,Supermarket Type1,1861.5768 +FDP27,8.155,Low Fat,0.119692888,Meat,188.453,OUT045,2002,,Tier 2,Supermarket Type1,4364.319 +FDZ20,16.1,Low Fat,0.0343603,Fruits and Vegetables,253.4356,OUT049,1999,Medium,Tier 1,Supermarket Type1,2797.6916 +FDR56,15.5,Regular,0.100922503,Fruits and Vegetables,199.0768,OUT049,1999,Medium,Tier 1,Supermarket Type1,2759.0752 +NCV41,,LF,0.016956266,Health and Hygiene,109.3228,OUT027,1985,Medium,Tier 3,Supermarket Type3,2431.5016 +FDU11,4.785,Low Fat,0.092576144,Breads,121.0098,OUT035,2004,Small,Tier 2,Supermarket Type1,2530.7058 +NCB30,14.6,Low Fat,0.025742955,Household,197.1084,OUT049,1999,Medium,Tier 1,Supermarket Type1,4761.8016 +FDX23,6.445,Low Fat,0.029812714,Baking Goods,95.4436,OUT018,2009,Medium,Tier 3,Supermarket Type2,1229.0668 +FDY24,4.88,Regular,0.133382115,Baking Goods,55.0298,OUT013,1987,High,Tier 3,Supermarket Type1,647.1576 +FDZ37,8.1,Regular,0,Canned,88.5198,OUT013,1987,High,Tier 3,Supermarket Type1,261.6594 +FDL10,8.395,Low Fat,0.039484739,Snack Foods,97.9042,OUT035,2004,Small,Tier 2,Supermarket Type1,1686.4714 +NCE18,10,Low Fat,0.021425341,Household,250.175,OUT046,1997,Small,Tier 1,Supermarket Type1,2996.1 +FDY60,,Regular,0.02624324,Baking Goods,143.8128,OUT027,1985,Medium,Tier 3,Supermarket Type3,4458.1968 +FDT24,12.35,Regular,0.185704641,Baking Goods,77.1328,OUT013,1987,High,Tier 3,Supermarket Type1,2239.7512 +NCV06,11.3,Low Fat,0.066668724,Household,192.4478,OUT035,2004,Small,Tier 2,Supermarket Type1,2712.4692 +FDP51,,Regular,0.149305497,Meat,119.6124,OUT019,1985,Small,Tier 1,Grocery Store,592.562 +FDU49,19.5,Regular,0.030688557,Canned,85.754,OUT035,2004,Small,Tier 2,Supermarket Type1,2163.85 +FDQ16,19.7,LF,0.041803291,Frozen Foods,110.3912,OUT049,1999,Medium,Tier 1,Supermarket Type1,3275.736 +FDV16,7.75,Regular,0.082861686,Frozen Foods,32.6558,OUT013,1987,High,Tier 3,Supermarket Type1,679.116 +FDL36,15.1,Low Fat,0.076385385,Baking Goods,88.483,OUT018,2009,Medium,Tier 3,Supermarket Type2,988.713 +FDE09,,Low Fat,0.021498768,Fruits and Vegetables,111.5228,OUT027,1985,Medium,Tier 3,Supermarket Type3,1768.3648 +NCV54,11.1,Low Fat,0.033102681,Household,116.6124,OUT035,2004,Small,Tier 2,Supermarket Type1,1540.6612 +FDH27,7.075,Low Fat,0.058676973,Dairy,142.0128,OUT017,2007,,Tier 2,Supermarket Type1,2588.6304 +FDF33,7.97,LF,0.021531416,Seafood,108.4596,OUT035,2004,Small,Tier 2,Supermarket Type1,3020.0688 +NCP18,12.15,Low Fat,0.028592842,Household,151.0708,OUT035,2004,Small,Tier 2,Supermarket Type1,2858.9452 +FDZ45,14.1,Low Fat,0.067148407,Snack Foods,200.4084,OUT018,2009,Medium,Tier 3,Supermarket Type2,3968.168 +FDU25,,Low Fat,0.026552056,Canned,56.2246,OUT027,1985,Medium,Tier 3,Supermarket Type3,1737.738 +FDQ40,11.1,Regular,0.060302689,Frozen Foods,175.8712,OUT010,1998,,Tier 3,Grocery Store,175.7712 +DRD25,,Low Fat,0.138269873,Soft Drinks,111.686,OUT019,1985,Small,Tier 1,Grocery Store,452.744 +FDJ57,7.42,Regular,0.036109859,Seafood,186.5582,OUT010,1998,,Tier 3,Grocery Store,185.7582 +FDT43,16.35,Low Fat,0.020579897,Fruits and Vegetables,52.1324,OUT049,1999,Medium,Tier 1,Supermarket Type1,934.7832 +FDH44,19.1,Regular,0.025912378,Fruits and Vegetables,146.8418,OUT049,1999,Medium,Tier 1,Supermarket Type1,1765.7016 +FDR31,,Regular,0.086077865,Fruits and Vegetables,143.8102,OUT019,1985,Small,Tier 1,Grocery Store,291.6204 +FDQ27,5.19,Regular,0.044432887,Meat,102.899,OUT018,2009,Medium,Tier 3,Supermarket Type2,1651.184 +DRK13,11.8,Low Fat,0.115346634,Soft Drinks,200.2084,OUT049,1999,Medium,Tier 1,Supermarket Type1,4563.3932 +FDB04,11.35,Regular,0.063226306,Dairy,87.9856,OUT046,1997,Small,Tier 1,Supermarket Type1,1494.0552 +NCI54,15.2,low fat,0.03366718,Household,109.6912,OUT045,2002,,Tier 2,Supermarket Type1,1419.4856 +FDP19,11.5,Low Fat,0.173867958,Fruits and Vegetables,128.8652,OUT045,2002,,Tier 2,Supermarket Type1,1291.652 +FDB37,20.25,Regular,0.022936488,Baking Goods,240.8538,OUT035,2004,Small,Tier 2,Supermarket Type1,7931.6754 +NCR05,10.1,Low Fat,0.054585372,Health and Hygiene,196.5084,OUT013,1987,High,Tier 3,Supermarket Type1,595.2252 +FDZ15,13.1,Low Fat,0.020913071,Dairy,120.1782,OUT045,2002,,Tier 2,Supermarket Type1,2026.0294 +NCQ29,12,Low Fat,0.104230135,Health and Hygiene,259.5278,OUT046,1997,Small,Tier 1,Supermarket Type1,2603.278 +FDL04,19,Low Fat,0.111923422,Frozen Foods,106.5622,OUT046,1997,Small,Tier 1,Supermarket Type1,2117.244 +DRH49,19.7,Low Fat,0.024756031,Soft Drinks,83.8592,OUT018,2009,Medium,Tier 3,Supermarket Type2,247.6776 +FDT07,,Regular,0.135375727,Fruits and Vegetables,256.133,OUT019,1985,Small,Tier 1,Grocery Store,256.333 +NCI55,18.6,Low Fat,0.012679226,Household,120.9414,OUT045,2002,,Tier 2,Supermarket Type1,2680.5108 +FDP19,11.5,LF,0.173483253,Fruits and Vegetables,129.0652,OUT035,2004,Small,Tier 2,Supermarket Type1,3487.4604 +FDV45,16.75,Low Fat,0.045138797,Snack Foods,187.9556,OUT045,2002,,Tier 2,Supermarket Type1,2816.334 +FDG26,18.85,Low Fat,0.04282359,Canned,254.433,OUT018,2009,Medium,Tier 3,Supermarket Type2,2050.664 +DRJ01,6.135,Low Fat,0.115010655,Soft Drinks,161.5236,OUT035,2004,Small,Tier 2,Supermarket Type1,1288.9888 +FDD14,20.7,Low Fat,0.169776346,Canned,184.4266,OUT035,2004,Small,Tier 2,Supermarket Type1,3688.532 +DRH37,17.6,Low Fat,0.041608488,Soft Drinks,165.4526,OUT035,2004,Small,Tier 2,Supermarket Type1,1644.526 +NCD18,16,Low Fat,0.072608647,Household,228.3668,OUT013,1987,High,Tier 3,Supermarket Type1,5298.4364 +NCE55,8.92,Low Fat,0.130191993,Household,176.837,OUT045,2002,,Tier 2,Supermarket Type1,2117.244 +NCQ43,17.75,Low Fat,0.111931193,Others,108.8912,OUT017,2007,,Tier 2,Supermarket Type1,327.5736 +FDC41,15.6,Low Fat,0.116913245,Frozen Foods,78.167,OUT046,1997,Small,Tier 1,Supermarket Type1,1837.608 +DRL01,,Regular,0.13511877,Soft Drinks,232.9958,OUT019,1985,Small,Tier 1,Grocery Store,934.7832 +FDX48,17.75,Regular,0.063416566,Baking Goods,154.6656,OUT010,1998,,Tier 3,Grocery Store,308.9312 +DRC25,5.73,Low Fat,0.075943184,Soft Drinks,85.5882,OUT010,1998,,Tier 3,Grocery Store,171.7764 +DRF48,5.73,Low Fat,0.05190652,Soft Drinks,188.1898,OUT045,2002,,Tier 2,Supermarket Type1,1496.7184 +FDT34,9.3,Low Fat,0.175060504,Snack Foods,106.7964,OUT018,2009,Medium,Tier 3,Supermarket Type2,525.982 +NCB43,20.2,Low Fat,0.099893424,Household,187.6898,OUT035,2004,Small,Tier 2,Supermarket Type1,3928.8858 +FDG44,,Low Fat,0.178923163,Fruits and Vegetables,55.7298,OUT019,1985,Small,Tier 1,Grocery Store,161.7894 +FDD35,12.15,Low Fat,0,Starchy Foods,119.244,OUT035,2004,Small,Tier 2,Supermarket Type1,2636.568 +FDC02,21.35,Low Fat,0.068765205,Canned,260.4278,OUT013,1987,High,Tier 3,Supermarket Type1,3644.5892 +FDU51,20.2,Regular,0.096906831,Meat,175.5028,OUT018,2009,Medium,Tier 3,Supermarket Type2,6729.9064 +NCC19,6.57,Low Fat,0.096862255,Household,193.982,OUT035,2004,Small,Tier 2,Supermarket Type1,2316.984 +FDJ60,19.35,Regular,0.062528426,Baking Goods,166.9184,OUT046,1997,Small,Tier 1,Supermarket Type1,3302.368 +NCI29,8.6,Low Fat,0.032621545,Health and Hygiene,143.2154,OUT046,1997,Small,Tier 1,Supermarket Type1,2127.231 +NCF43,8.51,Low Fat,0.05190268,Household,142.247,OUT013,1987,High,Tier 3,Supermarket Type1,2862.94 +FDY08,,Regular,0.170246782,Fruits and Vegetables,141.5838,OUT027,1985,Medium,Tier 3,Supermarket Type3,3231.1274 +FDD17,7.5,Low Fat,0.054610829,Frozen Foods,237.1906,OUT010,1998,,Tier 3,Grocery Store,237.6906 +FDK41,14.3,Low Fat,0.127517605,Frozen Foods,86.0224,OUT035,2004,Small,Tier 2,Supermarket Type1,1022.6688 +DRN59,15,Low Fat,0.064271703,Hard Drinks,45.506,OUT045,2002,,Tier 2,Supermarket Type1,466.06 +FDR60,14.3,Low Fat,0.13030659,Baking Goods,75.7328,OUT013,1987,High,Tier 3,Supermarket Type1,617.8624 +DRO47,10.195,Low Fat,0.187841082,Hard Drinks,112.486,OUT010,1998,,Tier 3,Grocery Store,113.186 +FDF26,6.825,Regular,0.046625941,Canned,154.9998,OUT035,2004,Small,Tier 2,Supermarket Type1,3075.996 +FDQ12,12.65,LF,0.035410748,Baking Goods,231.401,OUT046,1997,Small,Tier 1,Supermarket Type1,2067.309 +NCO29,11.15,Low Fat,0.032250092,Health and Hygiene,164.0526,OUT035,2004,Small,Tier 2,Supermarket Type1,4769.1254 +DRF03,19.1,Low Fat,0.045378573,Dairy,42.4138,OUT049,1999,Medium,Tier 1,Supermarket Type1,243.6828 +FDU48,18.85,Low Fat,0.0926587,Baking Goods,131.4284,OUT010,1998,,Tier 3,Grocery Store,263.6568 +DRE03,19.6,Low Fat,0.024222321,Dairy,45.5718,OUT035,2004,Small,Tier 2,Supermarket Type1,945.436 +FDX55,15.1,Low Fat,0.055518167,Fruits and Vegetables,217.3166,OUT017,2007,,Tier 2,Supermarket Type1,1306.2996 +FDP38,,Low Fat,0.031946638,Canned,51.6008,OUT027,1985,Medium,Tier 3,Supermarket Type3,1821.6288 +FDZ19,6.425,Low Fat,0.093983518,Fruits and Vegetables,175.5712,OUT017,2007,,Tier 2,Supermarket Type1,1230.3984 +NCU54,8.88,LF,0.098822387,Household,209.627,OUT045,2002,,Tier 2,Supermarket Type1,1887.543 +FDY36,12.3,Low Fat,0.009410528,Baking Goods,73.738,OUT046,1997,Small,Tier 1,Supermarket Type1,1318.284 +FDL16,12.85,Low Fat,0.169139066,Frozen Foods,46.406,OUT018,2009,Medium,Tier 3,Supermarket Type2,186.424 +FDW31,11.35,Regular,0.043122189,Fruits and Vegetables,197.9742,OUT013,1987,High,Tier 3,Supermarket Type1,995.371 +DRK49,,Low Fat,0.035769657,Soft Drinks,40.9138,OUT027,1985,Medium,Tier 3,Supermarket Type3,1380.8692 +FDC08,19,Regular,0.10361083,Fruits and Vegetables,228.372,OUT049,1999,Medium,Tier 1,Supermarket Type1,905.488 +FDO56,10.195,Regular,0.044974051,Fruits and Vegetables,115.5808,OUT035,2004,Small,Tier 2,Supermarket Type1,1874.8928 +NCV53,8.27,Low Fat,0.018920019,Health and Hygiene,238.088,OUT017,2007,,Tier 2,Supermarket Type1,6231.888 +FDA35,14.85,Regular,0.054142088,Baking Goods,124.1072,OUT017,2007,,Tier 2,Supermarket Type1,1837.608 +FDL40,,Low Fat,0,Frozen Foods,98.241,OUT019,1985,Small,Tier 1,Grocery Store,289.623 +FDJ04,18,Low Fat,0.124645538,Frozen Foods,117.2124,OUT049,1999,Medium,Tier 1,Supermarket Type1,2133.2232 +FDA31,7.1,LF,0.110459828,Fruits and Vegetables,172.108,OUT018,2009,Medium,Tier 3,Supermarket Type2,2250.404 +FDX24,8.355,Low Fat,0.013957308,Baking Goods,94.0462,OUT045,2002,,Tier 2,Supermarket Type1,1480.7392 +FDQ59,9.8,Regular,0.056386541,Breads,84.6908,OUT046,1997,Small,Tier 1,Supermarket Type1,503.3448 +FDF45,18.2,Regular,0.012273747,Fruits and Vegetables,60.0904,OUT017,2007,,Tier 2,Supermarket Type1,1113.2176 +FDH05,,Regular,0.090473389,Frozen Foods,229.7984,OUT027,1985,Medium,Tier 3,Supermarket Type3,6024.1584 +NCZ54,14.65,Low Fat,0.083359391,Household,161.9552,OUT046,1997,Small,Tier 1,Supermarket Type1,4711.2008 +FDW01,,Low Fat,0.112161697,Canned,154.4682,OUT019,1985,Small,Tier 1,Grocery Store,152.4682 +FDX36,9.695,Regular,0.128805815,Baking Goods,224.0404,OUT018,2009,Medium,Tier 3,Supermarket Type2,5851.0504 +NCO55,,Low Fat,0.090596378,Others,106.6938,OUT027,1985,Medium,Tier 3,Supermarket Type3,2251.0698 +FDL13,13.85,Regular,0.056637129,Breakfast,233.83,OUT017,2007,,Tier 2,Supermarket Type1,2796.36 +FDV16,7.75,Regular,0.083059634,Frozen Foods,35.7558,OUT049,1999,Medium,Tier 1,Supermarket Type1,611.2044 +FDN04,11.8,Regular,0.014115626,Frozen Foods,178.5344,OUT045,2002,,Tier 2,Supermarket Type1,3390.2536 +NCH06,12.3,Low Fat,0.076866235,Household,247.146,OUT018,2009,Medium,Tier 3,Supermarket Type2,492.692 +FDA40,16,Regular,0.099188598,Frozen Foods,88.9856,OUT013,1987,High,Tier 3,Supermarket Type1,1669.8264 +NCS05,11.5,Low Fat,0.021010687,Health and Hygiene,131.3942,OUT049,1999,Medium,Tier 1,Supermarket Type1,927.4594 +FDM15,,Regular,0.057143515,Meat,151.8366,OUT027,1985,Medium,Tier 3,Supermarket Type3,6196.6006 +FDK04,7.36,Low Fat,0.052607932,Frozen Foods,56.3588,OUT017,2007,,Tier 2,Supermarket Type1,744.3644 +FDI58,7.64,Regular,0.070645636,Snack Foods,91.212,OUT013,1987,High,Tier 3,Supermarket Type1,466.06 +FDB33,17.75,Low Fat,0.014568036,Fruits and Vegetables,158.1262,OUT013,1987,High,Tier 3,Supermarket Type1,4137.2812 +FDJ45,17.75,Low Fat,0.073524776,Seafood,34.8216,OUT049,1999,Medium,Tier 1,Supermarket Type1,207.7296 +NCO05,7.27,Low Fat,0.046559448,Health and Hygiene,100.5384,OUT046,1997,Small,Tier 1,Supermarket Type1,2463.46 +NCE31,7.67,Low Fat,0.309390255,Household,33.2216,OUT010,1998,,Tier 3,Grocery Store,138.4864 +FDQ49,20.2,Regular,0.039247736,Breakfast,157.663,OUT046,1997,Small,Tier 1,Supermarket Type1,1095.241 +FDL34,16,Low Fat,0.040945898,Snack Foods,143.1496,OUT046,1997,Small,Tier 1,Supermarket Type1,2258.3936 +FDV07,9.5,Low Fat,0.031331581,Fruits and Vegetables,111.1228,OUT049,1999,Medium,Tier 1,Supermarket Type1,663.1368 +FDX19,19.1,Low Fat,0.096929994,Fruits and Vegetables,233.8958,OUT045,2002,,Tier 2,Supermarket Type1,2103.2622 +FDO48,15,Regular,0.026840766,Baking Goods,219.8456,OUT046,1997,Small,Tier 1,Supermarket Type1,4863.0032 +FDK40,7.035,Low Fat,0,Frozen Foods,262.691,OUT013,1987,High,Tier 3,Supermarket Type1,6048.793 +FDY19,19.75,Low Fat,0.041429246,Fruits and Vegetables,117.2466,OUT049,1999,Medium,Tier 1,Supermarket Type1,2239.0854 +FDS16,,Regular,0,Frozen Foods,145.276,OUT027,1985,Medium,Tier 3,Supermarket Type3,5273.136 +FDS02,,Regular,0,Dairy,196.4794,OUT027,1985,Medium,Tier 3,Supermarket Type3,5852.382 +FDM51,11.8,Regular,0.025978802,Meat,102.5674,OUT045,2002,,Tier 2,Supermarket Type1,1629.8784 +FDW02,,Regular,0.066006824,Dairy,126.2704,OUT019,1985,Small,Tier 1,Grocery Store,250.3408 +FDS31,,Regular,0,Fruits and Vegetables,178.5318,OUT019,1985,Small,Tier 1,Grocery Store,180.4318 +DRF03,19.1,Low Fat,0.045492697,Dairy,40.3138,OUT018,2009,Medium,Tier 3,Supermarket Type2,527.9794 +FDT55,13.6,Regular,0.043618827,Fruits and Vegetables,156.7946,OUT013,1987,High,Tier 3,Supermarket Type1,2840.3028 +FDW21,5.34,Regular,0.005963881,Snack Foods,99.5358,OUT046,1997,Small,Tier 1,Supermarket Type1,1407.5012 +FDP07,18.2,Low Fat,0.08982696,Fruits and Vegetables,197.111,OUT013,1987,High,Tier 3,Supermarket Type1,589.233 +NCZ17,12.15,Low Fat,0.079431643,Health and Hygiene,38.6506,OUT046,1997,Small,Tier 1,Supermarket Type1,796.9626 +NCV41,14.35,Low Fat,0.017135155,Health and Hygiene,109.8228,OUT017,2007,,Tier 2,Supermarket Type1,1657.842 +FDP60,17.35,Low Fat,0.056005781,Baking Goods,99.2016,OUT049,1999,Medium,Tier 1,Supermarket Type1,1518.024 +FDG58,10.695,Regular,0.145253944,Snack Foods,156.8972,OUT010,1998,,Tier 3,Grocery Store,467.3916 +FDI60,7.22,Regular,0.0383808,Baking Goods,62.351,OUT049,1999,Medium,Tier 1,Supermarket Type1,885.514 +FDI20,19.1,Low Fat,0.03856376,Fruits and Vegetables,209.2586,OUT046,1997,Small,Tier 1,Supermarket Type1,3165.879 +DRC13,8.26,Regular,0.032625074,Soft Drinks,124.673,OUT017,2007,,Tier 2,Supermarket Type1,1847.595 +DRA24,,Regular,0.069909188,Soft Drinks,163.2868,OUT019,1985,Small,Tier 1,Grocery Store,491.3604 +FDW52,14,Regular,0.037491314,Frozen Foods,164.2526,OUT013,1987,High,Tier 3,Supermarket Type1,1808.9786 +FDN38,6.615,Regular,0.09234651,Canned,251.8408,OUT018,2009,Medium,Tier 3,Supermarket Type2,4506.1344 +DRI49,14.15,Low Fat,0.183879453,Soft Drinks,82.9276,OUT045,2002,,Tier 2,Supermarket Type1,1705.7796 +FDW26,11.8,Regular,0.107274301,Dairy,221.1772,OUT045,2002,,Tier 2,Supermarket Type1,3113.2808 +FDA28,,Regular,0.047570401,Frozen Foods,125.7362,OUT027,1985,Medium,Tier 3,Supermarket Type3,3020.0688 +FDZ52,19.2,Low Fat,0.100640587,Frozen Foods,112.6886,OUT017,2007,,Tier 2,Supermarket Type1,1779.0176 +FDU39,18.85,Low Fat,0.036111038,Meat,58.1562,OUT045,2002,,Tier 2,Supermarket Type1,1185.124 +FDR25,17,Regular,0.140090284,Canned,265.1884,OUT018,2009,Medium,Tier 3,Supermarket Type2,6359.7216 +FDM44,12.5,Low Fat,0.031225303,Fruits and Vegetables,102.899,OUT017,2007,,Tier 2,Supermarket Type1,2167.179 +FDA50,,Low Fat,0.086752988,Dairy,98.141,OUT027,1985,Medium,Tier 3,Supermarket Type3,1737.738 +FDJ38,8.6,Regular,0.040369315,Canned,189.753,OUT018,2009,Medium,Tier 3,Supermarket Type2,2846.295 +DRM47,9.3,Low Fat,0.043777415,Hard Drinks,192.9846,OUT035,2004,Small,Tier 2,Supermarket Type1,6114.7072 +NCO05,7.27,Low Fat,0.046631836,Health and Hygiene,98.4384,OUT049,1999,Medium,Tier 1,Supermarket Type1,1576.6144 +FDU21,11.8,Regular,0.076839735,Snack Foods,34.9558,OUT049,1999,Medium,Tier 1,Supermarket Type1,373.5138 +FDF32,16.35,Low Fat,0,Fruits and Vegetables,198.5426,OUT046,1997,Small,Tier 1,Supermarket Type1,1384.1982 +FDM27,,Regular,0.277459381,Meat,156.3946,OUT019,1985,Small,Tier 1,Grocery Store,473.3838 +FDL33,,Low Fat,0.099478451,Snack Foods,194.4452,OUT027,1985,Medium,Tier 3,Supermarket Type3,4697.8848 +FDO60,20,Low Fat,0.034369528,Baking Goods,43.7086,OUT046,1997,Small,Tier 1,Supermarket Type1,892.172 +NCJ30,5.82,Low Fat,0,Household,169.379,OUT013,1987,High,Tier 3,Supermarket Type1,2376.906 +NCI42,18.75,Low Fat,0.01035692,Household,208.3954,OUT013,1987,High,Tier 3,Supermarket Type1,2709.1402 +FDU37,9.5,Regular,0.104488444,Canned,77.896,OUT035,2004,Small,Tier 2,Supermarket Type1,1997.4 +FDV08,,Low Fat,0.028456456,Fruits and Vegetables,43.5454,OUT027,1985,Medium,Tier 3,Supermarket Type3,755.0172 +NCA29,10.5,Low Fat,0.027271252,Household,171.6106,OUT035,2004,Small,Tier 2,Supermarket Type1,2566.659 +FDD16,20.5,Low Fat,0.036346224,Frozen Foods,72.9696,OUT035,2004,Small,Tier 2,Supermarket Type1,596.5568 +FDB35,12.3,Regular,0.064984487,Starchy Foods,92.5804,OUT017,2007,,Tier 2,Supermarket Type1,2297.01 +FDS31,13.1,reg,0.044372393,Fruits and Vegetables,180.3318,OUT018,2009,Medium,Tier 3,Supermarket Type2,2886.9088 +NCA53,11.395,Low Fat,0.009934335,Health and Hygiene,47.2034,OUT017,2007,,Tier 2,Supermarket Type1,340.2238 +NCD19,8.93,Low Fat,0.013253936,Household,56.4614,OUT017,2007,,Tier 2,Supermarket Type1,828.921 +FDP07,18.2,Low Fat,0.089884775,Fruits and Vegetables,195.111,OUT035,2004,Small,Tier 2,Supermarket Type1,3731.809 +FDA44,19.7,Low Fat,0.053178425,Fruits and Vegetables,55.993,OUT013,1987,High,Tier 3,Supermarket Type1,905.488 +FDI14,14.1,Low Fat,0.089660816,Canned,140.0496,OUT035,2004,Small,Tier 2,Supermarket Type1,1411.496 +NCE31,7.67,Low Fat,0.185889129,Household,35.4216,OUT017,2007,,Tier 2,Supermarket Type1,173.108 +FDJ14,,Regular,0,Canned,78.896,OUT019,1985,Small,Tier 1,Grocery Store,399.48 +FDY44,14.15,Regular,0.024503972,Fruits and Vegetables,195.111,OUT018,2009,Medium,Tier 3,Supermarket Type2,982.055 +FDZ26,11.6,Regular,0.143990173,Dairy,239.6222,OUT035,2004,Small,Tier 2,Supermarket Type1,2390.222 +FDG26,18.85,Low Fat,0.042891098,Canned,257.633,OUT017,2007,,Tier 2,Supermarket Type1,5382.993 +FDN34,15.6,Regular,0.046023105,Snack Foods,169.2132,OUT017,2007,,Tier 2,Supermarket Type1,2536.698 +DRG11,6.385,Low Fat,0.084179812,Hard Drinks,109.0596,OUT018,2009,Medium,Tier 3,Supermarket Type2,1941.4728 +FDH20,16.1,Regular,0.025050746,Fruits and Vegetables,97.141,OUT018,2009,Medium,Tier 3,Supermarket Type2,1448.115 +FDX09,9,Low Fat,0.065515067,Snack Foods,178.137,OUT018,2009,Medium,Tier 3,Supermarket Type2,1058.622 +FDS09,,Regular,0.080695806,Snack Foods,51.3008,OUT027,1985,Medium,Tier 3,Supermarket Type3,759.012 +NCJ43,6.635,Low Fat,0.027222517,Household,174.0396,OUT017,2007,,Tier 2,Supermarket Type1,2093.2752 +NCR05,,Low Fat,0.054366282,Health and Hygiene,199.6084,OUT027,1985,Medium,Tier 3,Supermarket Type3,7142.7024 +DRE49,20.75,Low Fat,0.021232318,Soft Drinks,151.1024,OUT013,1987,High,Tier 3,Supermarket Type1,2428.8384 +FDZ59,6.63,Regular,0.104183308,Baking Goods,166.15,OUT049,1999,Medium,Tier 1,Supermarket Type1,3828.35 +NCH43,8.42,Low Fat,0.070856383,Household,217.4192,OUT018,2009,Medium,Tier 3,Supermarket Type2,431.4384 +FDP03,5.15,Regular,0.061272194,Meat,125.6388,OUT049,1999,Medium,Tier 1,Supermarket Type1,1733.7432 +DRC01,,Regular,0.019107027,Soft Drinks,48.4692,OUT027,1985,Medium,Tier 3,Supermarket Type3,1034.6532 +FDX28,,Low Fat,0,Frozen Foods,100.7042,OUT027,1985,Medium,Tier 3,Supermarket Type3,3174.5344 +FDI19,15.1,Low Fat,0.052329172,Meat,243.1512,OUT035,2004,Small,Tier 2,Supermarket Type1,4604.6728 +FDW15,15.35,Regular,0.055103174,Meat,149.7734,OUT035,2004,Small,Tier 2,Supermarket Type1,2820.9946 +NCX18,,Low Fat,0.015397129,Household,194.911,OUT019,1985,Small,Tier 1,Grocery Store,196.411 +FDF20,12.85,Low Fat,0.033271818,Fruits and Vegetables,196.5768,OUT049,1999,Medium,Tier 1,Supermarket Type1,5715.2272 +FDN57,,Low Fat,0.053971566,Snack Foods,141.2154,OUT027,1985,Medium,Tier 3,Supermarket Type3,3119.9388 +NCM06,7.475,LF,0.075713578,Household,156.4656,OUT035,2004,Small,Tier 2,Supermarket Type1,2471.4496 +NCV53,8.27,Low Fat,0.01889024,Health and Hygiene,238.188,OUT018,2009,Medium,Tier 3,Supermarket Type2,3835.008 +FDO20,12.85,Regular,0.152364317,Fruits and Vegetables,254.0382,OUT049,1999,Medium,Tier 1,Supermarket Type1,1261.691 +FDV44,8.365,Regular,0.039811272,Fruits and Vegetables,191.3188,OUT013,1987,High,Tier 3,Supermarket Type1,2285.0256 +FDJ56,8.985,Low Fat,0.183774965,Fruits and Vegetables,101.77,OUT045,2002,,Tier 2,Supermarket Type1,798.96 +NCB18,19.6,Low Fat,0.041283361,Household,87.0514,OUT035,2004,Small,Tier 2,Supermarket Type1,2125.2336 +FDZ20,16.1,Low Fat,0.057422821,Fruits and Vegetables,253.7356,OUT010,1998,,Tier 3,Grocery Store,508.6712 +NCR50,20.2,Low Fat,0.011820087,Household,151.634,OUT046,1997,Small,Tier 1,Supermarket Type1,1990.742 +FDL24,10.3,Regular,0.024891881,Baking Goods,170.9422,OUT035,2004,Small,Tier 2,Supermarket Type1,3103.9596 +FDU38,10.8,Low Fat,0.138171603,Dairy,191.4504,OUT010,1998,,Tier 3,Grocery Store,575.2512 +DRB48,16.75,Regular,0.041599644,Soft Drinks,40.9822,OUT010,1998,,Tier 3,Grocery Store,157.1288 +FDS27,,Regular,0.0218126,Meat,194.711,OUT019,1985,Small,Tier 1,Grocery Store,196.411 +FDR43,18.2,Low Fat,0.161740582,Fruits and Vegetables,38.419,OUT049,1999,Medium,Tier 1,Supermarket Type1,805.618 +FDI12,9.395,Regular,0.100966837,Baking Goods,86.8856,OUT017,2007,,Tier 2,Supermarket Type1,2548.6824 +FDU08,,LF,0.027183141,Fruits and Vegetables,99.7042,OUT027,1985,Medium,Tier 3,Supermarket Type3,3868.9638 +FDT56,,Regular,0.115032648,Fruits and Vegetables,58.0246,OUT027,1985,Medium,Tier 3,Supermarket Type3,2143.2102 +DRD15,,Low Fat,0.099442329,Dairy,233.1642,OUT019,1985,Small,Tier 1,Grocery Store,697.0926 +FDK26,5.46,Regular,0.032308482,Canned,185.224,OUT018,2009,Medium,Tier 3,Supermarket Type2,2423.512 +DRJ13,12.65,Low Fat,0.063246037,Soft Drinks,159.2578,OUT017,2007,,Tier 2,Supermarket Type1,2406.867 +FDP44,16.5,Regular,0.079713576,Fruits and Vegetables,101.3332,OUT046,1997,Small,Tier 1,Supermarket Type1,1537.998 +FDV40,17.35,Low Fat,0.014679558,Frozen Foods,73.6038,OUT013,1987,High,Tier 3,Supermarket Type1,739.038 +FDN28,5.88,Regular,0.030247903,Frozen Foods,101.399,OUT046,1997,Small,Tier 1,Supermarket Type1,2063.98 +FDY13,12.1,Low Fat,0.030297819,Canned,74.767,OUT017,2007,,Tier 2,Supermarket Type1,1454.773 +NCM17,7.93,Low Fat,0.07113587,Health and Hygiene,42.7086,OUT046,1997,Small,Tier 1,Supermarket Type1,356.8688 +DRE48,8.43,LF,0.017322454,Soft Drinks,196.8768,OUT035,2004,Small,Tier 2,Supermarket Type1,3350.3056 +FDA57,,LF,0.039451625,Snack Foods,39.548,OUT027,1985,Medium,Tier 3,Supermarket Type3,1358.232 +NCX18,14.15,Low Fat,0,Household,197.111,OUT049,1999,Medium,Tier 1,Supermarket Type1,3731.809 +DRK13,,Low Fat,0.114609875,Soft Drinks,197.0084,OUT027,1985,Medium,Tier 3,Supermarket Type3,3372.9428 +FDL57,,Regular,0.117442838,Snack Foods,257.7304,OUT019,1985,Small,Tier 1,Grocery Store,774.9912 +FDR27,15.1,Regular,0.160852421,Meat,131.3942,OUT010,1998,,Tier 3,Grocery Store,397.4826 +FDB52,17.75,Low Fat,0.03048292,Dairy,257.2672,OUT049,1999,Medium,Tier 1,Supermarket Type1,3068.0064 +FDQ10,12.85,Low Fat,0.033314389,Snack Foods,171.6422,OUT018,2009,Medium,Tier 3,Supermarket Type2,3276.4018 +FDY60,10.5,Regular,0.044139551,Baking Goods,143.9128,OUT010,1998,,Tier 3,Grocery Store,143.8128 +FDH33,,Low Fat,0,Snack Foods,44.1428,OUT027,1985,Medium,Tier 3,Supermarket Type3,1362.2268 +FDG56,,Regular,0.071106549,Fruits and Vegetables,60.5536,OUT027,1985,Medium,Tier 3,Supermarket Type3,2143.876 +FDS07,12.35,Low Fat,0.099674817,Fruits and Vegetables,112.2518,OUT013,1987,High,Tier 3,Supermarket Type1,1366.2216 +FDZ13,7.84,Regular,0.153806271,Canned,51.335,OUT045,2002,,Tier 2,Supermarket Type1,1198.44 +FDO31,6.76,reg,0.028958563,Fruits and Vegetables,78.396,OUT013,1987,High,Tier 3,Supermarket Type1,1757.712 +DRD49,9.895,Low Fat,0.168780385,Soft Drinks,236.8564,OUT017,2007,,Tier 2,Supermarket Type1,4767.128 +FDW12,8.315,reg,0.035627489,Baking Goods,146.6444,OUT049,1999,Medium,Tier 1,Supermarket Type1,870.8664 +FDP57,17.5,Low Fat,0.052657753,Snack Foods,103.699,OUT018,2009,Medium,Tier 3,Supermarket Type2,1031.99 +FDO21,11.6,Regular,0.009754896,Snack Foods,223.0404,OUT013,1987,High,Tier 3,Supermarket Type1,2025.3636 +NCY18,7.285,Low Fat,0.031151633,Household,173.2054,OUT046,1997,Small,Tier 1,Supermarket Type1,4902.9512 +NCR30,20.6,Low Fat,0.118827682,Household,75.0696,OUT010,1998,,Tier 3,Grocery Store,149.1392 +FDZ20,16.1,Low Fat,0.034501016,Fruits and Vegetables,255.7356,OUT017,2007,,Tier 2,Supermarket Type1,2543.356 +NCK17,11,Low Fat,0.038109194,Health and Hygiene,40.948,OUT017,2007,,Tier 2,Supermarket Type1,479.376 +FDX26,17.7,Low Fat,0.087791917,Dairy,180.6292,OUT035,2004,Small,Tier 2,Supermarket Type1,3101.2964 +FDR24,17.35,Regular,0.062839798,Baking Goods,90.883,OUT035,2004,Small,Tier 2,Supermarket Type1,1707.777 +FDQ22,,Low Fat,0.029595637,Snack Foods,40.9822,OUT027,1985,Medium,Tier 3,Supermarket Type3,864.2084 +FDP07,18.2,Low Fat,0.090267996,Fruits and Vegetables,194.711,OUT018,2009,Medium,Tier 3,Supermarket Type2,4910.275 +FDV04,7.825,Regular,0.150248468,Frozen Foods,155.2288,OUT049,1999,Medium,Tier 1,Supermarket Type1,1257.0304 +FDL48,19.35,Regular,0.082394321,Baking Goods,48.5034,OUT049,1999,Medium,Tier 1,Supermarket Type1,243.017 +FDE16,8.895,Low Fat,0.026451028,Frozen Foods,210.3954,OUT018,2009,Medium,Tier 3,Supermarket Type2,5001.4896 +NCK42,7.475,Low Fat,0.01319424,Household,217.4192,OUT017,2007,,Tier 2,Supermarket Type1,4314.384 +FDJ53,10.5,Low Fat,0.071257912,Frozen Foods,121.3098,OUT046,1997,Small,Tier 1,Supermarket Type1,843.5686 +FDH58,12.3,Low Fat,0.036908933,Snack Foods,115.9834,OUT013,1987,High,Tier 3,Supermarket Type1,2073.3012 +FDD46,6.035,Low Fat,0.141475625,Snack Foods,155.0998,OUT049,1999,Medium,Tier 1,Supermarket Type1,1230.3984 +FDW58,20.75,LF,0.007551665,Snack Foods,107.1622,OUT035,2004,Small,Tier 2,Supermarket Type1,1693.7952 +NCL07,13.85,Low Fat,0.031338558,Others,41.048,OUT046,1997,Small,Tier 1,Supermarket Type1,639.168 +FDU12,15.5,Regular,0.075904695,Baking Goods,263.9568,OUT045,2002,,Tier 2,Supermarket Type1,4745.8224 +FDO52,11.6,Regular,0.07760107,Frozen Foods,171.0106,OUT017,2007,,Tier 2,Supermarket Type1,3079.9908 +FDT16,,Regular,0.048426708,Frozen Foods,258.7278,OUT027,1985,Medium,Tier 3,Supermarket Type3,5466.8838 +FDG12,6.635,Regular,0.00636189,Baking Goods,121.1098,OUT017,2007,,Tier 2,Supermarket Type1,2651.2156 +FDX22,6.785,Regular,0.023021406,Snack Foods,208.9928,OUT045,2002,,Tier 2,Supermarket Type1,2103.928 +DRG37,16.2,Low Fat,0.019378432,Soft Drinks,156.4972,OUT046,1997,Small,Tier 1,Supermarket Type1,1090.5804 +FDI26,5.94,Low Fat,0.035084073,Canned,176.4344,OUT017,2007,,Tier 2,Supermarket Type1,2141.2128 +FDK34,13.35,Low Fat,0.038604817,Snack Foods,236.3564,OUT045,2002,,Tier 2,Supermarket Type1,2145.2076 +FDO25,6.3,Low Fat,0.21332355,Canned,208.527,OUT010,1998,,Tier 3,Grocery Store,419.454 +FDV47,17.1,Low Fat,0.054514169,Breads,84.4566,OUT017,2007,,Tier 2,Supermarket Type1,591.8962 +FDU13,8.355,Low Fat,0.187850233,Canned,146.5418,OUT049,1999,Medium,Tier 1,Supermarket Type1,2501.4106 +FDN57,18.25,Low Fat,0.054455125,Snack Foods,142.0154,OUT018,2009,Medium,Tier 3,Supermarket Type2,850.8924 +DRG01,,Low Fat,0.044660955,Soft Drinks,74.767,OUT027,1985,Medium,Tier 3,Supermarket Type3,2679.845 +FDU57,,Regular,0.089120516,Snack Foods,149.8708,OUT027,1985,Medium,Tier 3,Supermarket Type3,3611.2992 +FDF24,,Regular,0.02524761,Baking Goods,81.9934,OUT027,1985,Medium,Tier 3,Supermarket Type3,3439.5228 +FDP39,12.65,Low Fat,0.069707771,Meat,51.0324,OUT018,2009,Medium,Tier 3,Supermarket Type2,727.0536 +DRJ39,,Low Fat,0.036150153,Dairy,219.5482,OUT027,1985,Medium,Tier 3,Supermarket Type3,5695.2532 +FDN02,16.5,Low Fat,0.074245348,Canned,208.2638,OUT017,2007,,Tier 2,Supermarket Type1,4762.4674 +FDS24,20.85,reg,0.062321222,Baking Goods,87.2514,OUT049,1999,Medium,Tier 1,Supermarket Type1,265.6542 +FDW51,6.155,Regular,0.158441218,Meat,213.756,OUT010,1998,,Tier 3,Grocery Store,852.224 +NCR29,7.565,Low Fat,0.054630544,Health and Hygiene,57.393,OUT035,2004,Small,Tier 2,Supermarket Type1,735.709 +FDE29,8.905,Low Fat,0.143419394,Frozen Foods,61.4878,OUT045,2002,,Tier 2,Supermarket Type1,1151.1682 +NCX54,9.195,Low Fat,0.048059871,Household,105.8622,OUT046,1997,Small,Tier 1,Supermarket Type1,2223.1062 +FDF02,16.2,Low Fat,0.103894671,Canned,101.299,OUT018,2009,Medium,Tier 3,Supermarket Type2,1857.582 +NCR53,,Low Fat,0.253947823,Health and Hygiene,223.8404,OUT019,1985,Small,Tier 1,Grocery Store,675.1212 +FDV01,,Regular,0.148737487,Canned,155.1314,OUT019,1985,Small,Tier 1,Grocery Store,155.1314 +FDX46,12.3,Regular,0.058207114,Snack Foods,59.1562,OUT049,1999,Medium,Tier 1,Supermarket Type1,1185.124 +DRD25,6.135,Low Fat,0.078957122,Soft Drinks,111.986,OUT035,2004,Small,Tier 2,Supermarket Type1,1697.79 +FDX57,17.25,Regular,0,Snack Foods,95.2068,OUT013,1987,High,Tier 3,Supermarket Type1,2721.7904 +FDA04,11.3,Regular,0.066729996,Frozen Foods,257.2962,OUT046,1997,Small,Tier 1,Supermarket Type1,4920.9278 +FDB04,,Regular,0.1107011,Dairy,88.6856,OUT019,1985,Small,Tier 1,Grocery Store,351.5424 +NCR41,17.85,Low Fat,0.018052019,Health and Hygiene,96.6094,OUT049,1999,Medium,Tier 1,Supermarket Type1,856.8846 +FDE24,14.85,Low Fat,0.15643727,Baking Goods,142.0812,OUT010,1998,,Tier 3,Grocery Store,284.9624 +NCM41,16.5,Low Fat,0.035728302,Health and Hygiene,95.212,OUT045,2002,,Tier 2,Supermarket Type1,838.908 +DRG13,17.25,Low Fat,0.03717912,Soft Drinks,162.5526,OUT035,2004,Small,Tier 2,Supermarket Type1,5920.2936 +FDV34,10.695,Regular,0.019123874,Snack Foods,73.0038,OUT010,1998,,Tier 3,Grocery Store,147.8076 +FDK24,,Low Fat,0.177354373,Baking Goods,46.6744,OUT019,1985,Small,Tier 1,Grocery Store,135.8232 +FDX46,12.3,Regular,0.058116758,Snack Foods,57.5562,OUT046,1997,Small,Tier 1,Supermarket Type1,651.8182 +NCB31,6.235,Low Fat,0.118915034,Household,264.791,OUT045,2002,,Tier 2,Supermarket Type1,2103.928 +FDR55,12.15,Regular,0.131973625,Fruits and Vegetables,187.9872,OUT013,1987,High,Tier 3,Supermarket Type1,2458.1336 +FDY28,7.47,Regular,0,Frozen Foods,211.8218,OUT045,2002,,Tier 2,Supermarket Type1,6411.654 +FDM16,8.155,Regular,0.033555399,Frozen Foods,74.7354,OUT046,1997,Small,Tier 1,Supermarket Type1,1655.1788 +FDJ33,8.895,Regular,0.088681966,Snack Foods,121.973,OUT018,2009,Medium,Tier 3,Supermarket Type2,2956.152 +FDF33,7.97,Low Fat,0.021623214,Seafood,107.6596,OUT018,2009,Medium,Tier 3,Supermarket Type2,1833.6132 +DRH36,16.2,Low Fat,0.033373748,Soft Drinks,74.0696,OUT035,2004,Small,Tier 2,Supermarket Type1,894.8352 +NCS53,14.5,Low Fat,0.089917769,Health and Hygiene,160.3604,OUT049,1999,Medium,Tier 1,Supermarket Type1,2852.2872 +NCN53,,Low Fat,0.053148497,Health and Hygiene,36.3874,OUT019,1985,Small,Tier 1,Grocery Store,105.8622 +FDC38,15.7,Low Fat,0.122470805,Canned,131.7942,OUT035,2004,Small,Tier 2,Supermarket Type1,1987.413 +FDD36,13.3,Low Fat,0.035607579,Baking Goods,119.9124,OUT010,1998,,Tier 3,Grocery Store,118.5124 +FDF22,6.865,Low Fat,0.056819936,Snack Foods,212.6218,OUT035,2004,Small,Tier 2,Supermarket Type1,2137.218 +FDB16,8.21,Low Fat,0.044925784,Dairy,86.0198,OUT046,1997,Small,Tier 1,Supermarket Type1,1569.9564 +FDR26,20.7,Low Fat,0.071699984,Dairy,177.6028,OUT010,1998,,Tier 3,Grocery Store,531.3084 +FDO52,11.6,Regular,0.077321087,Frozen Foods,169.3106,OUT045,2002,,Tier 2,Supermarket Type1,2224.4378 +FDF16,,Low Fat,0.150806666,Frozen Foods,149.0076,OUT019,1985,Small,Tier 1,Grocery Store,295.6152 +FDR52,12.65,Regular,0.127283051,Frozen Foods,191.7846,OUT010,1998,,Tier 3,Grocery Store,382.1692 +FDW38,,Regular,0.138008431,Dairy,54.8298,OUT027,1985,Medium,Tier 3,Supermarket Type3,1348.245 +FDK03,12.6,Regular,0.074035365,Dairy,256.1356,OUT049,1999,Medium,Tier 1,Supermarket Type1,4578.0408 +FDQ33,13.35,Low Fat,0.091723066,Snack Foods,148.8708,OUT017,2007,,Tier 2,Supermarket Type1,3761.77 +DRF23,4.61,Low Fat,0.122901056,Hard Drinks,174.4396,OUT045,2002,,Tier 2,Supermarket Type1,2616.594 +FDI15,13.8,Low Fat,0,Dairy,263.7884,OUT049,1999,Medium,Tier 1,Supermarket Type1,3709.8376 +NCL41,,Low Fat,0.073077197,Health and Hygiene,34.3216,OUT019,1985,Small,Tier 1,Grocery Store,34.6216 +FDW40,14,Regular,0.175991929,Frozen Foods,140.7812,OUT010,1998,,Tier 3,Grocery Store,142.4812 +FDZ12,9.17,Low Fat,0.172365428,Baking Goods,144.847,OUT010,1998,,Tier 3,Grocery Store,572.588 +FDK60,16.5,Regular,0.094246644,Baking Goods,98.9068,OUT018,2009,Medium,Tier 3,Supermarket Type2,1749.7224 +FDX25,16.7,Low Fat,0.10203648,Canned,180.9292,OUT035,2004,Small,Tier 2,Supermarket Type1,2736.438 +NCM30,,Low Fat,0.066969525,Household,39.2796,OUT027,1985,Medium,Tier 3,Supermarket Type3,701.7532 +FDK14,6.98,LF,0.041071581,Canned,82.5934,OUT013,1987,High,Tier 3,Supermarket Type1,1310.2944 +NCP18,12.15,Low Fat,0.028656248,Household,149.3708,OUT045,2002,,Tier 2,Supermarket Type1,1203.7664 +FDH26,19.25,Regular,0.034693175,Canned,140.1496,OUT035,2004,Small,Tier 2,Supermarket Type1,1552.6456 +DRK23,,Low Fat,0.071628097,Hard Drinks,251.904,OUT027,1985,Medium,Tier 3,Supermarket Type3,4301.068 +FDB60,9.3,Low Fat,0.028516696,Baking Goods,194.6136,OUT035,2004,Small,Tier 2,Supermarket Type1,3110.6176 +NCN17,11,Low Fat,0.054939029,Health and Hygiene,101.4358,OUT046,1997,Small,Tier 1,Supermarket Type1,1608.5728 +FDE10,6.67,Regular,0.090130537,Snack Foods,131.4626,OUT045,2002,,Tier 2,Supermarket Type1,1705.1138 +FDR58,6.675,Low Fat,0,Snack Foods,92.9462,OUT018,2009,Medium,Tier 3,Supermarket Type2,1018.0082 +FDA33,6.48,Low Fat,0.033893487,Snack Foods,147.0076,OUT035,2004,Small,Tier 2,Supermarket Type1,3103.9596 +FDN24,14.1,low fat,0.113908117,Baking Goods,53.3956,OUT017,2007,,Tier 2,Supermarket Type1,982.7208 +DRI13,15.35,Low Fat,0.020326962,Soft Drinks,216.7508,OUT046,1997,Small,Tier 1,Supermarket Type1,1736.4064 +FDX21,7.05,Low Fat,0.08509812,Snack Foods,108.2912,OUT049,1999,Medium,Tier 1,Supermarket Type1,2293.0152 +FDQ40,11.1,Regular,0.035997543,Frozen Foods,176.9712,OUT013,1987,High,Tier 3,Supermarket Type1,3691.1952 +FDX23,6.445,Low Fat,0.029686148,Baking Goods,96.4436,OUT035,2004,Small,Tier 2,Supermarket Type1,378.1744 +FDD17,7.5,LF,0.032626952,Frozen Foods,235.9906,OUT046,1997,Small,Tier 1,Supermarket Type1,6893.0274 +DRH03,17.25,Low Fat,0.035057688,Dairy,91.612,OUT035,2004,Small,Tier 2,Supermarket Type1,279.636 +FDG60,20.35,Low Fat,0.060699725,Baking Goods,233.3616,OUT046,1997,Small,Tier 1,Supermarket Type1,6093.4016 +FDB32,,Low Fat,0.041063069,Fruits and Vegetables,93.5778,OUT019,1985,Small,Tier 1,Grocery Store,187.7556 +DRE12,4.59,Low Fat,0.070767174,Soft Drinks,111.986,OUT035,2004,Small,Tier 2,Supermarket Type1,792.302 +FDR12,12.6,Regular,0.031598706,Baking Goods,172.9764,OUT045,2002,,Tier 2,Supermarket Type1,2233.0932 +DRH11,5.98,Low Fat,0.075495088,Hard Drinks,55.3614,OUT013,1987,High,Tier 3,Supermarket Type1,497.3526 +FDY28,7.47,Regular,0.15277077,Frozen Foods,214.4218,OUT018,2009,Medium,Tier 3,Supermarket Type2,4274.436 +FDR26,20.7,Low Fat,0.04307908,Dairy,177.8028,OUT017,2007,,Tier 2,Supermarket Type1,1239.7196 +FDL27,6.17,Low Fat,0.010652508,Meat,65.6826,OUT045,2002,,Tier 2,Supermarket Type1,774.9912 +FDJ15,11.35,Regular,0.023318068,Dairy,182.4608,OUT035,2004,Small,Tier 2,Supermarket Type1,7534.1928 +FDU49,19.5,Regular,0.030819397,Canned,86.054,OUT018,2009,Medium,Tier 3,Supermarket Type2,2336.958 +DRF51,15.75,Low Fat,0.165838224,Dairy,36.6506,OUT046,1997,Small,Tier 1,Supermarket Type1,607.2096 +FDN12,15.6,Low Fat,0.13575135,Baking Goods,111.5544,OUT010,1998,,Tier 3,Grocery Store,223.7088 +DRK23,8.395,Low Fat,0.07191675,Hard Drinks,254.804,OUT013,1987,High,Tier 3,Supermarket Type1,7843.124 +FDL10,8.395,Low Fat,0.039653081,Snack Foods,99.5042,OUT018,2009,Medium,Tier 3,Supermarket Type2,1686.4714 +FDX07,19.2,Regular,0,Fruits and Vegetables,184.595,OUT018,2009,Medium,Tier 3,Supermarket Type2,3844.995 +FDO37,8.06,Low Fat,0.021358889,Breakfast,232.3326,OUT013,1987,High,Tier 3,Supermarket Type1,2541.3586 +NCA41,16.75,Low Fat,0.032652796,Health and Hygiene,190.8162,OUT045,2002,,Tier 2,Supermarket Type1,2886.243 +NCQ06,13,Low Fat,0.0420611,Household,254.1014,OUT017,2007,,Tier 2,Supermarket Type1,3315.0182 +FDJ48,11.3,Low Fat,0,Baking Goods,245.2118,OUT045,2002,,Tier 2,Supermarket Type1,5681.2714 +DRD24,,Low Fat,0.030645958,Soft Drinks,141.7154,OUT027,1985,Medium,Tier 3,Supermarket Type3,2694.4926 +FDW10,21.2,Low Fat,0.118297605,Snack Foods,175.037,OUT010,1998,,Tier 3,Grocery Store,529.311 +FDU51,20.2,Regular,0.096709408,Meat,175.8028,OUT045,2002,,Tier 2,Supermarket Type1,3896.2616 +NCC31,8.02,Low Fat,0.019901356,Household,157.5972,OUT049,1999,Medium,Tier 1,Supermarket Type1,3427.5384 +FDY02,,Regular,0.087221497,Dairy,263.991,OUT027,1985,Medium,Tier 3,Supermarket Type3,9467.676 +FDU34,18.25,Low Fat,0.07518071,Snack Foods,126.2046,OUT035,2004,Small,Tier 2,Supermarket Type1,1618.5598 +FDX21,7.05,Low Fat,0.1422157,Snack Foods,108.7912,OUT010,1998,,Tier 3,Grocery Store,109.1912 +NCH29,5.51,Low Fat,0.034543718,Health and Hygiene,99.7726,OUT045,2002,,Tier 2,Supermarket Type1,978.726 +DRL35,15.7,Low Fat,0.030751366,Hard Drinks,42.577,OUT049,1999,Medium,Tier 1,Supermarket Type1,952.094 +DRN37,9.6,Low Fat,0.096842096,Soft Drinks,166.1158,OUT017,2007,,Tier 2,Supermarket Type1,501.3474 +NCN53,5.175,Low Fat,0.050808821,Health and Hygiene,33.6874,OUT010,1998,,Tier 3,Grocery Store,70.5748 +FDL45,15.6,Low Fat,0.063081713,Snack Foods,125.7704,OUT010,1998,,Tier 3,Grocery Store,250.3408 +FDA37,7.81,Regular,0.055451725,Canned,122.6046,OUT018,2009,Medium,Tier 3,Supermarket Type2,2365.5874 +FDK20,,Regular,0,Fruits and Vegetables,120.5072,OUT027,1985,Medium,Tier 3,Supermarket Type3,2695.1584 +FDA49,19.7,Low Fat,0.108665723,Canned,86.4198,OUT010,1998,,Tier 3,Grocery Store,87.2198 +FDG59,15.85,Low Fat,0.043322254,Starchy Foods,39.6164,OUT045,2002,,Tier 2,Supermarket Type1,1004.0264 +FDV03,,LF,0.057809959,Meat,156.2314,OUT027,1985,Medium,Tier 3,Supermarket Type3,2947.4966 +FDF16,7.3,Low Fat,0.086132373,Frozen Foods,148.8076,OUT046,1997,Small,Tier 1,Supermarket Type1,3103.9596 +FDU36,6.15,Low Fat,0.046342889,Baking Goods,97.3384,OUT049,1999,Medium,Tier 1,Supermarket Type1,886.8456 +FDU35,6.44,Low Fat,0.132590283,Breads,98.17,OUT010,1998,,Tier 3,Grocery Store,199.74 +FDH08,,Low Fat,0.030516069,Fruits and Vegetables,227.801,OUT019,1985,Small,Tier 1,Grocery Store,459.402 +FDF24,15.5,Regular,0.025473816,Baking Goods,83.1934,OUT018,2009,Medium,Tier 3,Supermarket Type2,1146.5076 +DRN36,15.2,Low Fat,0,Soft Drinks,96.6752,OUT046,1997,Small,Tier 1,Supermarket Type1,479.376 +FDS59,14.8,Regular,0.043856919,Breads,109.057,OUT013,1987,High,Tier 3,Supermarket Type1,2746.425 +DRJ23,18.35,Low Fat,0.041904578,Hard Drinks,188.1872,OUT017,2007,,Tier 2,Supermarket Type1,4159.9184 +DRF25,9,Low Fat,0.038917891,Soft Drinks,35.919,OUT035,2004,Small,Tier 2,Supermarket Type1,1171.808 +FDL15,17.85,Low Fat,0.046707264,Meat,152.6682,OUT049,1999,Medium,Tier 1,Supermarket Type1,1829.6184 +NCP43,17.75,Low Fat,0.030501281,Others,180.566,OUT035,2004,Small,Tier 2,Supermarket Type1,3415.554 +FDB28,6.615,Low Fat,0.093574769,Dairy,199.4426,OUT045,2002,,Tier 2,Supermarket Type1,3361.6242 +FDX50,20.1,Low Fat,0.074565098,Dairy,111.3228,OUT013,1987,High,Tier 3,Supermarket Type1,663.1368 +FDE41,9.195,Regular,0.064014173,Frozen Foods,83.3566,OUT046,1997,Small,Tier 1,Supermarket Type1,1437.4622 +NCR50,20.2,Low Fat,0.011838464,Household,155.134,OUT049,1999,Medium,Tier 1,Supermarket Type1,2603.278 +FDD41,,Regular,0.086837543,Frozen Foods,106.2306,OUT027,1985,Medium,Tier 3,Supermarket Type3,2090.612 +DRI11,8.26,Low Fat,0.034457776,Hard Drinks,113.3834,OUT049,1999,Medium,Tier 1,Supermarket Type1,2073.3012 +FDJ28,,Low Fat,0,Frozen Foods,190.9162,OUT027,1985,Medium,Tier 3,Supermarket Type3,5772.486 +FDP48,7.52,Regular,0.044091657,Baking Goods,182.995,OUT049,1999,Medium,Tier 1,Supermarket Type1,3844.995 +FDY37,17,Regular,0.026546765,Canned,142.147,OUT013,1987,High,Tier 3,Supermarket Type1,2147.205 +NCC07,19.6,Low Fat,0.023951149,Household,105.6964,OUT046,1997,Small,Tier 1,Supermarket Type1,1577.946 +FDJ10,5.095,Regular,0.129705008,Snack Foods,141.8838,OUT049,1999,Medium,Tier 1,Supermarket Type1,1966.7732 +FDY37,17,Regular,0.026563851,Canned,141.247,OUT035,2004,Small,Tier 2,Supermarket Type1,3292.381 +NCL19,15.35,Low Fat,0.015700603,Others,141.147,OUT049,1999,Medium,Tier 1,Supermarket Type1,2719.793 +FDI50,8.42,Regular,0,Canned,229.0352,OUT035,2004,Small,Tier 2,Supermarket Type1,5496.8448 +FDO39,6.985,Regular,0.137366883,Meat,184.9608,OUT046,1997,Small,Tier 1,Supermarket Type1,3858.9768 +FDO25,6.3,Low Fat,0.127424932,Canned,208.127,OUT035,2004,Small,Tier 2,Supermarket Type1,2306.997 +FDE24,14.85,Low Fat,0.09384335,Baking Goods,142.3812,OUT018,2009,Medium,Tier 3,Supermarket Type2,1139.8496 +FDW19,12.35,Regular,0.038578501,Fruits and Vegetables,109.557,OUT045,2002,,Tier 2,Supermarket Type1,1757.712 +FDT36,12.3,LF,0.111727876,Baking Goods,33.9874,OUT018,2009,Medium,Tier 3,Supermarket Type2,564.5984 +FDH16,10.5,Low Fat,0.052637056,Frozen Foods,88.583,OUT049,1999,Medium,Tier 1,Supermarket Type1,808.947 +DRM37,15.35,Low Fat,0.096790497,Soft Drinks,197.2768,OUT018,2009,Medium,Tier 3,Supermarket Type2,3941.536 +NCN07,18.5,Low Fat,0.033997473,Others,129.9284,OUT049,1999,Medium,Tier 1,Supermarket Type1,1845.5976 +FDK25,11.6,Regular,0.157149885,Breakfast,168.2474,OUT045,2002,,Tier 2,Supermarket Type1,2863.6058 +FDK41,14.3,Low Fat,0.12780038,Frozen Foods,83.6224,OUT045,2002,,Tier 2,Supermarket Type1,852.224 +DRL60,8.52,LF,0.045291822,Soft Drinks,153.5682,OUT010,1998,,Tier 3,Grocery Store,457.4046 +FDR43,18.2,Low Fat,0.161458973,Fruits and Vegetables,37.819,OUT035,2004,Small,Tier 2,Supermarket Type1,256.333 +FDY15,18.25,Regular,0.171093639,Dairy,155.663,OUT049,1999,Medium,Tier 1,Supermarket Type1,2034.019 +FDW08,12.1,Low Fat,0.14825809,Fruits and Vegetables,108.428,OUT013,1987,High,Tier 3,Supermarket Type1,1278.336 +DRE15,13.35,Low Fat,0.017821466,Dairy,75.1012,OUT045,2002,,Tier 2,Supermarket Type1,1366.2216 +NCO30,19.5,Low Fat,0.01581384,Household,183.2608,OUT017,2007,,Tier 2,Supermarket Type1,2940.1728 +FDO32,,Low Fat,0.119959873,Fruits and Vegetables,45.506,OUT027,1985,Medium,Tier 3,Supermarket Type3,885.514 +FDH05,14.35,Regular,0.091283986,Frozen Foods,232.6984,OUT018,2009,Medium,Tier 3,Supermarket Type2,2316.984 +FDH10,,Low Fat,0.049066248,Snack Foods,192.4478,OUT027,1985,Medium,Tier 3,Supermarket Type3,8912.3988 +FDP58,11.1,Low Fat,0.135416391,Snack Foods,218.3482,OUT045,2002,,Tier 2,Supermarket Type1,2847.6266 +NCH43,8.42,Low Fat,0.070510189,Household,214.4192,OUT013,1987,High,Tier 3,Supermarket Type1,1725.7536 +FDZ32,,Regular,0.066765523,Fruits and Vegetables,107.1964,OUT019,1985,Small,Tier 1,Grocery Store,420.7856 +FDU12,15.5,Regular,0.07575107,Baking Goods,262.8568,OUT046,1997,Small,Tier 1,Supermarket Type1,5800.4496 +FDM36,11.65,Regular,0.058730831,Baking Goods,171.9422,OUT046,1997,Small,Tier 1,Supermarket Type1,3448.844 +NCP50,,Low Fat,0.020460284,Others,81.7618,OUT027,1985,Medium,Tier 3,Supermarket Type3,2175.1686 +DRB25,12.3,Low Fat,0.069401919,Soft Drinks,107.9938,OUT013,1987,High,Tier 3,Supermarket Type1,2036.6822 +FDU15,13.65,Regular,0.026579951,Meat,34.7532,OUT013,1987,High,Tier 3,Supermarket Type1,683.1108 +FDF58,13.3,LF,0,Snack Foods,62.151,OUT010,1998,,Tier 3,Grocery Store,63.251 +FDX35,,Regular,0.139913045,Breads,227.9036,OUT019,1985,Small,Tier 1,Grocery Store,455.4072 +FDX51,9.5,Regular,0.022093019,Meat,195.9452,OUT049,1999,Medium,Tier 1,Supermarket Type1,2348.9424 +FDB47,8.8,Low Fat,0.071369947,Snack Foods,209.1612,OUT013,1987,High,Tier 3,Supermarket Type1,2090.612 +FDL51,20.7,Regular,0.047482391,Dairy,215.9876,OUT035,2004,Small,Tier 2,Supermarket Type1,3430.2016 +NCM29,11.5,LF,0.017642229,Health and Hygiene,131.8626,OUT046,1997,Small,Tier 1,Supermarket Type1,2885.5772 +FDB29,16.7,Regular,0.052625179,Frozen Foods,113.4176,OUT018,2009,Medium,Tier 3,Supermarket Type2,1488.7288 +FDS25,6.885,Regular,0.14057889,Canned,112.1228,OUT018,2009,Medium,Tier 3,Supermarket Type2,663.1368 +FDR36,6.715,Regular,0.203510667,Baking Goods,41.0454,OUT010,1998,,Tier 3,Grocery Store,251.6724 +FDQ27,5.19,Regular,0.044321422,Meat,103.899,OUT049,1999,Medium,Tier 1,Supermarket Type1,2889.572 +FDZ22,9.395,Low Fat,0.045525961,Snack Foods,83.425,OUT017,2007,,Tier 2,Supermarket Type1,1498.05 +FDB02,9.695,Regular,0.029140008,Canned,176.337,OUT013,1987,High,Tier 3,Supermarket Type1,3528.74 +FDZ34,6.695,Low Fat,0.075878519,Starchy Foods,194.082,OUT046,1997,Small,Tier 1,Supermarket Type1,3861.64 +FDL46,20.35,Low Fat,0.054046706,Snack Foods,119.5466,OUT035,2004,Small,Tier 2,Supermarket Type1,353.5398 +FDN38,6.615,Regular,0.091954465,Canned,250.6408,OUT035,2004,Small,Tier 2,Supermarket Type1,4756.4752 +FDK04,7.36,Low Fat,0.052418124,Frozen Foods,56.5588,OUT045,2002,,Tier 2,Supermarket Type1,801.6232 +NCF31,9.13,Low Fat,0.052058629,Household,150.6024,OUT018,2009,Medium,Tier 3,Supermarket Type2,1821.6288 +FDV59,13.35,Low Fat,0.080387424,Breads,219.2166,OUT010,1998,,Tier 3,Grocery Store,1524.0162 +FDU13,8.355,Low Fat,0.187523164,Canned,146.2418,OUT035,2004,Small,Tier 2,Supermarket Type1,4414.254 +FDV14,19.85,Low Fat,0.044460448,Dairy,88.7856,OUT013,1987,High,Tier 3,Supermarket Type1,1142.5128 +FDR09,18.25,Low Fat,0.077882226,Snack Foods,258.0962,OUT045,2002,,Tier 2,Supermarket Type1,1035.9848 +DRP47,15.75,Low Fat,0.14048631,Hard Drinks,252.7382,OUT013,1987,High,Tier 3,Supermarket Type1,3280.3966 +FDC23,18,Low Fat,0.017979145,Starchy Foods,178.3686,OUT018,2009,Medium,Tier 3,Supermarket Type2,3199.8348 +FDU33,7.63,Regular,0.134919202,Snack Foods,46.9402,OUT049,1999,Medium,Tier 1,Supermarket Type1,780.9834 +FDS27,10.195,Regular,0.012447775,Meat,197.611,OUT013,1987,High,Tier 3,Supermarket Type1,2553.343 +DRO59,11.8,Low Fat,0.054264078,Hard Drinks,75.0012,OUT045,2002,,Tier 2,Supermarket Type1,834.9132 +FDD48,10.395,Low Fat,0.030219852,Baking Goods,114.7176,OUT045,2002,,Tier 2,Supermarket Type1,2748.4224 +FDL33,7.235,Low Fat,0.099879337,Snack Foods,195.1452,OUT013,1987,High,Tier 3,Supermarket Type1,1761.7068 +NCK30,14.85,Low Fat,0.061226969,Household,253.0698,OUT018,2009,Medium,Tier 3,Supermarket Type2,2283.0282 +NCP42,,Low Fat,0.028207784,Household,195.5478,OUT019,1985,Small,Tier 1,Grocery Store,387.4956 +FDP11,15.85,Low Fat,0.069491408,Breads,218.2166,OUT017,2007,,Tier 2,Supermarket Type1,4789.7652 +FDV52,20.7,Regular,0.122015744,Frozen Foods,117.7466,OUT018,2009,Medium,Tier 3,Supermarket Type2,2828.3184 +FDW33,9.395,Low Fat,0.099120588,Snack Foods,107.228,OUT046,1997,Small,Tier 1,Supermarket Type1,2024.032 +FDR19,13.5,Regular,0.159968994,Fruits and Vegetables,147.6102,OUT049,1999,Medium,Tier 1,Supermarket Type1,1603.9122 +FDW31,,Regular,0.042949109,Fruits and Vegetables,199.5742,OUT027,1985,Medium,Tier 3,Supermarket Type3,3981.484 +DRJ51,14.1,Low Fat,0.088172355,Dairy,232.2668,OUT045,2002,,Tier 2,Supermarket Type1,4146.6024 +FDU35,,Low Fat,0.078831762,Breads,98.97,OUT027,1985,Medium,Tier 3,Supermarket Type3,3395.58 +FDT37,14.15,Low Fat,0.035263498,Canned,254.8014,OUT035,2004,Small,Tier 2,Supermarket Type1,2040.0112 +FDK56,9.695,Low Fat,0.129889831,Fruits and Vegetables,185.3898,OUT013,1987,High,Tier 3,Supermarket Type1,3554.7062 +FDY24,4.88,Regular,0.134037,Baking Goods,53.3298,OUT018,2009,Medium,Tier 3,Supermarket Type2,539.298 +FDS02,10.195,Regular,0.145867347,Dairy,194.0794,OUT046,1997,Small,Tier 1,Supermarket Type1,3901.588 +FDP39,,Low Fat,0.121554149,Meat,53.7324,OUT019,1985,Small,Tier 1,Grocery Store,311.5944 +NCG07,,Low Fat,0.091924311,Household,189.753,OUT019,1985,Small,Tier 1,Grocery Store,189.753 +FDP58,,Low Fat,0.236616754,Snack Foods,217.6482,OUT019,1985,Small,Tier 1,Grocery Store,219.0482 +FDP46,15.35,Low Fat,0.074553522,Snack Foods,91.883,OUT013,1987,High,Tier 3,Supermarket Type1,2606.607 +FDZ34,6.695,Low Fat,0.075864171,Starchy Foods,192.082,OUT035,2004,Small,Tier 2,Supermarket Type1,6757.87 +FDZ57,10,Regular,0.037977917,Snack Foods,128.6994,OUT017,2007,,Tier 2,Supermarket Type1,642.497 +FDH34,8.63,Low Fat,0.031143591,Snack Foods,183.9582,OUT049,1999,Medium,Tier 1,Supermarket Type1,5386.9878 +FDF35,15,Low Fat,0.154860353,Starchy Foods,106.1938,OUT017,2007,,Tier 2,Supermarket Type1,4073.3644 +FDR20,20,Regular,0.028238317,Fruits and Vegetables,46.3744,OUT018,2009,Medium,Tier 3,Supermarket Type2,181.0976 +FDX56,,Regular,0.073700837,Fruits and Vegetables,207.1638,OUT027,1985,Medium,Tier 3,Supermarket Type3,7247.233 +FDR40,9.1,Regular,0.008027701,Frozen Foods,81.1618,OUT013,1987,High,Tier 3,Supermarket Type1,2255.7304 +NCE30,16,Low Fat,0.099290166,Household,214.0902,OUT049,1999,Medium,Tier 1,Supermarket Type1,1486.7314 +DRI37,15.85,Low Fat,0.180096791,Soft Drinks,57.3904,OUT010,1998,,Tier 3,Grocery Store,117.1808 +FDW48,,Low Fat,0.008499464,Baking Goods,81.3618,OUT027,1985,Medium,Tier 3,Supermarket Type3,1530.6742 +NCC18,19.1,Low Fat,0.177629525,Household,173.9422,OUT045,2002,,Tier 2,Supermarket Type1,2414.1908 +FDH02,7.27,Regular,0.020865797,Canned,90.2488,OUT018,2009,Medium,Tier 3,Supermarket Type2,814.9392 +NCZ30,6.59,Low Fat,0.026180032,Household,120.7098,OUT035,2004,Small,Tier 2,Supermarket Type1,2530.7058 +FDI45,13.1,Low Fat,0.037734334,Fruits and Vegetables,173.9054,OUT018,2009,Medium,Tier 3,Supermarket Type2,3677.2134 +FDK41,14.3,Low Fat,0.127435585,Frozen Foods,86.8224,OUT013,1987,High,Tier 3,Supermarket Type1,852.224 +FDQ07,15.1,Regular,0.087762922,Fruits and Vegetables,221.5456,OUT018,2009,Medium,Tier 3,Supermarket Type2,2873.5928 +NCE06,5.825,LF,0.153127523,Household,162.4894,OUT010,1998,,Tier 3,Grocery Store,323.5788 +FDF11,10.195,reg,0.017703044,Starchy Foods,239.4538,OUT018,2009,Medium,Tier 3,Supermarket Type2,3605.307 +FDU51,20.2,Regular,0.096433359,Meat,178.5028,OUT013,1987,High,Tier 3,Supermarket Type1,4604.6728 +NCH06,12.3,Low Fat,0.128136346,Household,248.346,OUT010,1998,,Tier 3,Grocery Store,985.384 +FDD38,16.75,Regular,0.008184912,Canned,101.2674,OUT013,1987,High,Tier 3,Supermarket Type1,1528.011 +FDU07,11.1,Low Fat,0.059846975,Fruits and Vegetables,150.1366,OUT046,1997,Small,Tier 1,Supermarket Type1,1813.6392 +FDK08,9.195,Regular,0.122494876,Fruits and Vegetables,100.1016,OUT049,1999,Medium,Tier 1,Supermarket Type1,1416.8224 +FDW15,,Regular,0.054846706,Meat,147.3734,OUT027,1985,Medium,Tier 3,Supermarket Type3,3266.4148 +FDE21,12.8,Low Fat,0.022980361,Fruits and Vegetables,117.7492,OUT049,1999,Medium,Tier 1,Supermarket Type1,1274.3412 +FDX28,6.325,Low Fat,0.125154452,Frozen Foods,99.2042,OUT035,2004,Small,Tier 2,Supermarket Type1,1388.8588 +NCR50,,LF,0.011762847,Household,153.534,OUT027,1985,Medium,Tier 3,Supermarket Type3,7503.566 +FDL27,6.17,Low Fat,0.010674255,Meat,63.4826,OUT018,2009,Medium,Tier 3,Supermarket Type2,774.9912 +FDK14,6.98,Low Fat,0.041098016,Canned,81.6934,OUT035,2004,Small,Tier 2,Supermarket Type1,818.934 +NCB07,,Low Fat,0.077132215,Household,197.411,OUT027,1985,Medium,Tier 3,Supermarket Type3,5892.33 +NCR53,12.15,Low Fat,0.145013434,Health and Hygiene,225.0404,OUT035,2004,Small,Tier 2,Supermarket Type1,4950.8888 +FDB60,9.3,Low Fat,0.028683422,Baking Goods,195.8136,OUT017,2007,,Tier 2,Supermarket Type1,3693.8584 +FDW48,18,Low Fat,0.008554102,Baking Goods,79.3618,OUT049,1999,Medium,Tier 1,Supermarket Type1,805.618 +FDR55,12.15,reg,0.132058566,Fruits and Vegetables,187.5872,OUT035,2004,Small,Tier 2,Supermarket Type1,4349.0056 +FDO22,13.5,reg,0.017895691,Snack Foods,79.496,OUT045,2002,,Tier 2,Supermarket Type1,1597.92 +FDL48,19.35,reg,0.082731751,Baking Goods,49.2034,OUT017,2007,,Tier 2,Supermarket Type1,777.6544 +NCZ05,8.485,Low Fat,0.058083831,Health and Hygiene,103.199,OUT013,1987,High,Tier 3,Supermarket Type1,722.393 +FDO25,6.3,Low Fat,0.127449031,Canned,210.527,OUT046,1997,Small,Tier 1,Supermarket Type1,6291.81 +FDF47,20.85,Low Fat,0.097536998,Starchy Foods,225.3746,OUT013,1987,High,Tier 3,Supermarket Type1,3365.619 +FDY40,15.5,Regular,0.143670179,Frozen Foods,48.4692,OUT010,1998,,Tier 3,Grocery Store,49.2692 +FDR25,17,Regular,0.139804885,Canned,265.7884,OUT045,2002,,Tier 2,Supermarket Type1,3974.826 +FDD59,,Regular,0.065860323,Starchy Foods,81.896,OUT027,1985,Medium,Tier 3,Supermarket Type3,1677.816 +FDX38,10.5,Regular,0.0481669,Dairy,48.8376,OUT013,1987,High,Tier 3,Supermarket Type1,671.1264 +FDE26,9.3,Low Fat,0.089005769,Canned,143.9786,OUT046,1997,Small,Tier 1,Supermarket Type1,2745.0934 +FDH48,,Low Fat,0.105893301,Baking Goods,86.254,OUT019,1985,Small,Tier 1,Grocery Store,519.324 +NCK29,5.615,Low Fat,0.12566436,Health and Hygiene,123.473,OUT013,1987,High,Tier 3,Supermarket Type1,1231.73 +NCF54,18,Low Fat,0.047377053,Household,171.1422,OUT046,1997,Small,Tier 1,Supermarket Type1,2931.5174 +FDI38,13.35,Regular,0,Canned,206.9638,OUT017,2007,,Tier 2,Supermarket Type1,7247.233 +FDJ07,,Low Fat,0.014353676,Meat,115.515,OUT027,1985,Medium,Tier 3,Supermarket Type3,1631.21 +FDS55,7.02,Low Fat,0,Fruits and Vegetables,148.1734,OUT018,2009,Medium,Tier 3,Supermarket Type2,890.8404 +NCX53,20.1,LF,0.025002878,Health and Hygiene,140.4154,OUT010,1998,,Tier 3,Grocery Store,567.2616 +NCP55,14.65,Low Fat,0,Others,53.8614,OUT035,2004,Small,Tier 2,Supermarket Type1,1105.228 +FDV04,7.825,Regular,0.150015234,Frozen Foods,157.5288,OUT046,1997,Small,Tier 1,Supermarket Type1,942.7728 +FDV40,17.35,Low Fat,0.014691784,Frozen Foods,74.1038,OUT046,1997,Small,Tier 1,Supermarket Type1,960.7494 +NCN30,16.35,Low Fat,0.017062427,Household,98.141,OUT018,2009,Medium,Tier 3,Supermarket Type2,1544.656 +FDT57,15.2,Low Fat,0.019142452,Snack Foods,237.5248,OUT017,2007,,Tier 2,Supermarket Type1,3318.3472 +FDI52,18.7,Low Fat,0.104890428,Frozen Foods,121.4072,OUT045,2002,,Tier 2,Supermarket Type1,3185.1872 +FDT57,15.2,Low Fat,0.019018943,Snack Foods,238.7248,OUT013,1987,High,Tier 3,Supermarket Type1,1659.1736 +FDK33,17.85,Low Fat,0.011233126,Snack Foods,211.556,OUT035,2004,Small,Tier 2,Supermarket Type1,5752.512 +FDQ39,14.8,Low Fat,0.081026811,Meat,190.0846,OUT035,2004,Small,Tier 2,Supermarket Type1,4586.0304 +FDR23,15.85,Low Fat,0.081953387,Breads,176.237,OUT045,2002,,Tier 2,Supermarket Type1,2646.555 +FDX47,,Regular,0.060587738,Breads,156.8288,OUT019,1985,Small,Tier 1,Grocery Store,471.3864 +DRP35,18.85,Low Fat,0.090850115,Hard Drinks,126.6336,OUT035,2004,Small,Tier 2,Supermarket Type1,1150.5024 +FDU26,16.7,Regular,0.071335395,Dairy,120.3782,OUT010,1998,,Tier 3,Grocery Store,119.1782 +FDR39,20.35,LF,0.083929569,Meat,182.4292,OUT049,1999,Medium,Tier 1,Supermarket Type1,4925.5884 +FDV48,9.195,Regular,0.086396038,Baking Goods,79.0644,OUT010,1998,,Tier 3,Grocery Store,157.1288 +NCG18,15.3,Low Fat,0.023071504,Household,101.8332,OUT018,2009,Medium,Tier 3,Supermarket Type2,1025.332 +NCD42,16.5,Low Fat,0.012627329,Health and Hygiene,38.7506,OUT013,1987,High,Tier 3,Supermarket Type1,759.012 +FDP59,20.85,Regular,0.094512029,Breads,104.5648,OUT010,1998,,Tier 3,Grocery Store,207.7296 +FDF34,,Regular,0.013951504,Snack Foods,199.9084,OUT027,1985,Medium,Tier 3,Supermarket Type3,5753.8436 +DRD15,10.6,Low Fat,0.056785183,Dairy,231.9642,OUT035,2004,Small,Tier 2,Supermarket Type1,2091.2778 +FDP03,5.15,Regular,0.06117708,Meat,121.8388,OUT046,1997,Small,Tier 1,Supermarket Type1,3219.8088 +FDO20,12.85,Regular,0.152099033,Fruits and Vegetables,252.6382,OUT035,2004,Small,Tier 2,Supermarket Type1,3532.7348 +NCY30,20.25,Low Fat,0.02594835,Household,180.0976,OUT035,2004,Small,Tier 2,Supermarket Type1,3440.8544 +DRH37,17.6,Low Fat,0.041581725,Soft Drinks,163.3526,OUT013,1987,High,Tier 3,Supermarket Type1,3453.5046 +FDT10,16.7,Regular,0.103849783,Snack Foods,58.8562,OUT010,1998,,Tier 3,Grocery Store,59.2562 +FDF35,15,Low Fat,0.154301621,Starchy Foods,105.9938,OUT045,2002,,Tier 2,Supermarket Type1,428.7752 +FDG10,6.63,Regular,0.010937229,Snack Foods,55.8588,OUT035,2004,Small,Tier 2,Supermarket Type1,801.6232 +FDK03,,Regular,0.073562475,Dairy,254.9356,OUT027,1985,Medium,Tier 3,Supermarket Type3,8138.7392 +FDG20,15.5,Regular,0.125687917,Fruits and Vegetables,178.2028,OUT046,1997,Small,Tier 1,Supermarket Type1,1416.8224 +NCL07,,Low Fat,0.0311868,Others,39.548,OUT027,1985,Medium,Tier 3,Supermarket Type3,759.012 +DRD49,9.895,LF,0.167831064,Soft Drinks,237.4564,OUT046,1997,Small,Tier 1,Supermarket Type1,715.0692 +NCG55,16.25,Low Fat,0,Household,115.2176,OUT017,2007,,Tier 2,Supermarket Type1,3206.4928 +FDR19,13.5,Regular,0.160624116,Fruits and Vegetables,147.0102,OUT017,2007,,Tier 2,Supermarket Type1,2770.3938 +NCM54,17.7,Low Fat,0.050929429,Household,129.1678,OUT035,2004,Small,Tier 2,Supermarket Type1,1780.3492 +FDZ44,,Low Fat,0.06780958,Fruits and Vegetables,118.1808,OUT019,1985,Small,Tier 1,Grocery Store,234.3616 +FDR28,13.85,Regular,0.026042966,Frozen Foods,161.221,OUT017,2007,,Tier 2,Supermarket Type1,1794.331 +FDB51,6.92,Low Fat,0.038610722,Dairy,61.4852,OUT018,2009,Medium,Tier 3,Supermarket Type2,1314.2892 +DRJ59,11.65,Low Fat,0.019372253,Hard Drinks,40.6164,OUT046,1997,Small,Tier 1,Supermarket Type1,308.9312 +FDZ43,11,Regular,0.057290978,Fruits and Vegetables,242.7512,OUT018,2009,Medium,Tier 3,Supermarket Type2,1938.8096 +NCC54,17.75,Low Fat,0.097909084,Health and Hygiene,242.1196,OUT045,2002,,Tier 2,Supermarket Type1,4097.3332 +FDQ11,5.695,Regular,0.067688124,Breads,258.8988,OUT035,2004,Small,Tier 2,Supermarket Type1,5396.9748 +DRH03,17.25,low fat,0.035207155,Dairy,93.512,OUT018,2009,Medium,Tier 3,Supermarket Type2,1491.392 +FDX38,10.5,Regular,0.080688663,Dairy,46.7376,OUT010,1998,,Tier 3,Grocery Store,47.9376 +DRH36,16.2,Low Fat,0.033447756,Soft Drinks,73.9696,OUT045,2002,,Tier 2,Supermarket Type1,894.8352 +NCB06,17.6,Low Fat,0.082797778,Health and Hygiene,161.492,OUT017,2007,,Tier 2,Supermarket Type1,3515.424 +FDR33,7.31,Low Fat,0.026940466,Snack Foods,108.457,OUT017,2007,,Tier 2,Supermarket Type1,2306.997 +FDE47,14.15,low fat,0.037877202,Starchy Foods,124.0046,OUT013,1987,High,Tier 3,Supermarket Type1,1618.5598 +FDA10,,Low Fat,0.141129263,Snack Foods,121.6072,OUT027,1985,Medium,Tier 3,Supermarket Type3,3430.2016 +DRI01,7.97,Low Fat,0.034424278,Soft Drinks,171.8422,OUT013,1987,High,Tier 3,Supermarket Type1,2069.3064 +NCJ54,9.895,LF,0.060067115,Household,230.6642,OUT046,1997,Small,Tier 1,Supermarket Type1,4647.284 +FDT14,10.695,Regular,0.127727102,Dairy,121.144,OUT046,1997,Small,Tier 1,Supermarket Type1,1917.504 +DRL49,13.15,Low Fat,0.05674821,Soft Drinks,144.3812,OUT017,2007,,Tier 2,Supermarket Type1,284.9624 +NCI18,18.35,Low Fat,0.014052469,Household,224.0746,OUT045,2002,,Tier 2,Supermarket Type1,1346.2476 +FDC38,15.7,Low Fat,0.122684413,Canned,132.2942,OUT049,1999,Medium,Tier 1,Supermarket Type1,2252.4014 +FDS56,5.785,Regular,0.038724612,Fruits and Vegetables,263.9252,OUT013,1987,High,Tier 3,Supermarket Type1,6033.4796 +FDX19,19.1,Low Fat,0.09688421,Fruits and Vegetables,233.5958,OUT049,1999,Medium,Tier 1,Supermarket Type1,2336.958 +FDU36,,Low Fat,0,Baking Goods,100.1384,OUT027,1985,Medium,Tier 3,Supermarket Type3,2956.152 +FDO44,12.6,Low Fat,0.087380432,Fruits and Vegetables,109.7228,OUT013,1987,High,Tier 3,Supermarket Type1,1547.3192 +FDG57,14.7,Low Fat,0.072707309,Fruits and Vegetables,49.5034,OUT017,2007,,Tier 2,Supermarket Type1,291.6204 +FDV20,20.2,Regular,0.059894378,Fruits and Vegetables,125.9678,OUT049,1999,Medium,Tier 1,Supermarket Type1,2797.6916 +FDE47,14.15,Low Fat,0.037901581,Starchy Foods,126.3046,OUT035,2004,Small,Tier 2,Supermarket Type1,2614.5966 +FDU32,,Low Fat,0.025841875,Fruits and Vegetables,120.7414,OUT027,1985,Medium,Tier 3,Supermarket Type3,4386.2904 +NCB06,,Low Fat,0.081933378,Health and Hygiene,161.492,OUT027,1985,Medium,Tier 3,Supermarket Type3,6391.68 +FDV46,18.2,Low Fat,0.012627478,Snack Foods,140.818,OUT049,1999,Medium,Tier 1,Supermarket Type1,3495.45 +FDP45,,Regular,0.030476541,Snack Foods,252.2724,OUT027,1985,Medium,Tier 3,Supermarket Type3,5033.448 +FDK03,12.6,Regular,0.074070351,Dairy,254.2356,OUT045,2002,,Tier 2,Supermarket Type1,4578.0408 +FDX37,16.2,Low Fat,0.063017421,Canned,100.37,OUT035,2004,Small,Tier 2,Supermarket Type1,998.7 +FDX58,13.15,Low Fat,0.043727261,Snack Foods,182.595,OUT013,1987,High,Tier 3,Supermarket Type1,3478.805 +FDQ46,7.51,Low Fat,0.104023565,Snack Foods,112.4544,OUT045,2002,,Tier 2,Supermarket Type1,2013.3792 +FDL13,13.85,Regular,0.056271701,Breakfast,232.23,OUT013,1987,High,Tier 3,Supermarket Type1,1398.18 +NCT30,9.1,Low Fat,0.080619969,Household,47.4718,OUT018,2009,Medium,Tier 3,Supermarket Type2,472.718 +FDP20,19.85,Low Fat,0.045761855,Fruits and Vegetables,125.602,OUT045,2002,,Tier 2,Supermarket Type1,632.51 +FDH40,11.6,Regular,0.078863888,Frozen Foods,83.2276,OUT013,1987,High,Tier 3,Supermarket Type1,1543.3244 +FDZ25,15.7,Regular,0.027729547,Canned,169.379,OUT018,2009,Medium,Tier 3,Supermarket Type2,1528.011 +FDU27,,Regular,0.170646494,Meat,46.3376,OUT027,1985,Medium,Tier 3,Supermarket Type3,2109.2544 +NCQ42,20.35,Low Fat,0.039235527,Household,127.2678,OUT013,1987,High,Tier 3,Supermarket Type1,1017.3424 +FDU31,10.5,reg,0.02502991,Fruits and Vegetables,218.4508,OUT049,1999,Medium,Tier 1,Supermarket Type1,2821.6604 +FDC35,7.435,Low Fat,0.205605116,Starchy Foods,207.7638,OUT010,1998,,Tier 3,Grocery Store,621.1914 +FDX43,5.655,Low Fat,0.085622362,Fruits and Vegetables,167.25,OUT018,2009,Medium,Tier 3,Supermarket Type2,2330.3 +FDU07,11.1,Low Fat,0.059968347,Fruits and Vegetables,152.8366,OUT045,2002,,Tier 2,Supermarket Type1,1662.5026 +DRD13,15,Low Fat,0.049038621,Soft Drinks,65.4168,OUT013,1987,High,Tier 3,Supermarket Type1,1661.8368 +DRK49,14.15,Low Fat,0.036147029,Soft Drinks,39.3138,OUT017,2007,,Tier 2,Supermarket Type1,527.9794 +FDL12,,Regular,0.212963193,Baking Goods,59.522,OUT019,1985,Small,Tier 1,Grocery Store,299.61 +FDZ08,12.5,Regular,0.110614538,Fruits and Vegetables,80.6592,OUT017,2007,,Tier 2,Supermarket Type1,1651.184 +FDA10,20.35,Low Fat,0.142393712,Snack Foods,122.7072,OUT018,2009,Medium,Tier 3,Supermarket Type2,1470.0864 +FDS20,8.85,Low Fat,0.053976156,Fruits and Vegetables,181.5292,OUT045,2002,,Tier 2,Supermarket Type1,1277.0044 +FDA07,7.55,Regular,0.03107068,Fruits and Vegetables,122.4072,OUT018,2009,Medium,Tier 3,Supermarket Type2,857.5504 +FDR08,18.7,Low Fat,0.03761584,Fruits and Vegetables,109.1886,OUT035,2004,Small,Tier 2,Supermarket Type1,1890.2062 +FDM44,,LF,0.054363971,Fruits and Vegetables,105.099,OUT019,1985,Small,Tier 1,Grocery Store,103.199 +FDI22,12.6,Low Fat,0.161039887,Snack Foods,210.2612,OUT010,1998,,Tier 3,Grocery Store,418.1224 +NCM07,9.395,Low Fat,0.040023967,Others,85.5908,OUT049,1999,Medium,Tier 1,Supermarket Type1,1006.6896 +FDN46,7.21,Regular,0,Snack Foods,103.1332,OUT017,2007,,Tier 2,Supermarket Type1,3281.0624 +NCW53,18.35,Low Fat,0.030619301,Health and Hygiene,194.0162,OUT018,2009,Medium,Tier 3,Supermarket Type2,2886.243 +FDZ51,11.3,Regular,0.054637635,Meat,93.3094,OUT049,1999,Medium,Tier 1,Supermarket Type1,3046.7008 +FDT04,17.25,Low Fat,0,Frozen Foods,40.8822,OUT018,2009,Medium,Tier 3,Supermarket Type2,628.5152 +FDZ48,,low fat,0.132995494,Baking Goods,113.5544,OUT019,1985,Small,Tier 1,Grocery Store,223.7088 +FDA08,11.85,Regular,0.050085152,Fruits and Vegetables,164.7526,OUT046,1997,Small,Tier 1,Supermarket Type1,1315.6208 +DRN37,9.6,LF,0.096689673,Soft Drinks,168.0158,OUT018,2009,Medium,Tier 3,Supermarket Type2,1336.9264 +FDD35,12.15,Low Fat,0.026010729,Starchy Foods,119.144,OUT017,2007,,Tier 2,Supermarket Type1,2157.192 +FDZ48,17.75,Low Fat,0.075959623,Baking Goods,112.4544,OUT046,1997,Small,Tier 1,Supermarket Type1,2460.7968 +NCN54,20.35,Low Fat,0.021413346,Household,76.2328,OUT018,2009,Medium,Tier 3,Supermarket Type2,463.3968 +FDU32,8.785,Low Fat,0,Fruits and Vegetables,120.5414,OUT013,1987,High,Tier 3,Supermarket Type1,1583.9382 +FDK41,,LF,0.126924095,Frozen Foods,87.2224,OUT027,1985,Medium,Tier 3,Supermarket Type3,3494.1184 +FDR44,6.11,Regular,0.103340142,Fruits and Vegetables,131.2968,OUT018,2009,Medium,Tier 3,Supermarket Type2,913.4776 +NCK29,,Low Fat,0,Health and Hygiene,125.173,OUT027,1985,Medium,Tier 3,Supermarket Type3,3572.017 +FDT09,15.15,Regular,0.012288171,Snack Foods,129.9284,OUT045,2002,,Tier 2,Supermarket Type1,2241.0828 +FDR11,10.5,Regular,0.142827296,Breads,159.4578,OUT045,2002,,Tier 2,Supermarket Type1,3048.6982 +FDD57,,Low Fat,0.022291121,Fruits and Vegetables,93.6094,OUT027,1985,Medium,Tier 3,Supermarket Type3,3713.1666 +FDT10,16.7,reg,0.061992874,Snack Foods,60.9562,OUT013,1987,High,Tier 3,Supermarket Type1,355.5372 +FDR51,9.035,Regular,0.17417636,Meat,148.9708,OUT018,2009,Medium,Tier 3,Supermarket Type2,2257.062 +NCK17,11,Low Fat,0.037953762,Health and Hygiene,38.448,OUT049,1999,Medium,Tier 1,Supermarket Type1,1198.44 +FDY07,11.8,Low Fat,0.122289654,Fruits and Vegetables,46.3402,OUT017,2007,,Tier 2,Supermarket Type1,275.6412 +FDT14,10.695,Regular,0.128247408,Dairy,121.844,OUT018,2009,Medium,Tier 3,Supermarket Type2,2277.036 +FDJ21,,Regular,0.038341654,Snack Foods,146.2102,OUT027,1985,Medium,Tier 3,Supermarket Type3,4228.4958 +NCR42,9.105,Low Fat,0.038699553,Household,33.79,OUT017,2007,,Tier 2,Supermarket Type1,199.74 +DRG37,16.2,Low Fat,0.01940856,Soft Drinks,156.7972,OUT049,1999,Medium,Tier 1,Supermarket Type1,3739.1328 +FDI24,,Low Fat,0.137870237,Baking Goods,175.037,OUT019,1985,Small,Tier 1,Grocery Store,352.874 +FDJ22,18.75,Low Fat,0.052800258,Snack Foods,193.2504,OUT035,2004,Small,Tier 2,Supermarket Type1,2684.5056 +FDT28,13.3,Low Fat,0.06355415,Frozen Foods,149.4708,OUT035,2004,Small,Tier 2,Supermarket Type1,1354.2372 +FDH38,6.425,Low Fat,0.01043823,Canned,115.8808,OUT046,1997,Small,Tier 1,Supermarket Type1,1757.712 +FDT43,16.35,Low Fat,0.020589623,Fruits and Vegetables,53.2324,OUT045,2002,,Tier 2,Supermarket Type1,727.0536 +FDX04,19.6,Regular,0.041806702,Frozen Foods,48.8376,OUT017,2007,,Tier 2,Supermarket Type1,527.3136 +FDV46,18.2,Low Fat,0.012679191,Snack Foods,139.818,OUT017,2007,,Tier 2,Supermarket Type1,838.908 +FDP10,19,Low Fat,0.128289285,Snack Foods,104.9622,OUT049,1999,Medium,Tier 1,Supermarket Type1,1164.4842 +NCA53,11.395,Low Fat,0.009878459,Health and Hygiene,47.6034,OUT046,1997,Small,Tier 1,Supermarket Type1,1312.2918 +FDL52,6.635,Regular,0.046090204,Frozen Foods,37.1506,OUT046,1997,Small,Tier 1,Supermarket Type1,834.9132 +FDQ32,17.85,Regular,0.046680961,Fruits and Vegetables,121.9388,OUT049,1999,Medium,Tier 1,Supermarket Type1,3962.8416 +FDT37,14.15,Low Fat,0.03546967,Canned,256.3014,OUT017,2007,,Tier 2,Supermarket Type1,4845.0266 +NCO43,5.5,Low Fat,0.047290068,Others,100.5016,OUT018,2009,Medium,Tier 3,Supermarket Type2,1416.8224 +FDI53,8.895,Regular,0.13842353,Frozen Foods,163.0236,OUT017,2007,,Tier 2,Supermarket Type1,1127.8652 +FDO19,17.7,Regular,0.027779381,Fruits and Vegetables,50.1034,OUT010,1998,,Tier 3,Grocery Store,97.2068 +FDG12,,Regular,0,Baking Goods,121.3098,OUT019,1985,Small,Tier 1,Grocery Store,120.5098 +FDG53,10,Low Fat,0.046043736,Frozen Foods,140.618,OUT018,2009,Medium,Tier 3,Supermarket Type2,2376.906 +FDK36,7.09,Low Fat,0.007215314,Baking Goods,47.6034,OUT046,1997,Small,Tier 1,Supermarket Type1,1458.102 +FDR55,12.15,Regular,0.132083542,Fruits and Vegetables,189.5872,OUT046,1997,Small,Tier 1,Supermarket Type1,3403.5696 +FDV16,7.75,Regular,0.083399788,Frozen Foods,34.5558,OUT017,2007,,Tier 2,Supermarket Type1,441.4254 +FDS31,,Regular,0.043978369,Fruits and Vegetables,178.4318,OUT027,1985,Medium,Tier 3,Supermarket Type3,2526.0452 +NCK06,5.03,Low Fat,0.008639333,Household,122.2756,OUT013,1987,High,Tier 3,Supermarket Type1,2059.9852 +FDN03,9.8,Regular,0.015089965,Meat,249.6408,OUT046,1997,Small,Tier 1,Supermarket Type1,1001.3632 +NCT30,,Low Fat,0.140582485,Household,47.1718,OUT019,1985,Small,Tier 1,Grocery Store,141.8154 +FDC50,15.85,Low Fat,0.228469522,Canned,93.3094,OUT010,1998,,Tier 3,Grocery Store,285.6282 +FDE11,17.7,Regular,0,Starchy Foods,183.5924,OUT035,2004,Small,Tier 2,Supermarket Type1,7033.5112 +FDM03,12.65,Low Fat,0.123007534,Meat,106.0938,OUT035,2004,Small,Tier 2,Supermarket Type1,2679.845 +NCP05,19.6,Low Fat,0,Health and Hygiene,150.3024,OUT018,2009,Medium,Tier 3,Supermarket Type2,2580.6408 +FDJ41,6.85,LF,0.02288328,Frozen Foods,261.2594,OUT046,1997,Small,Tier 1,Supermarket Type1,2878.2534 +FDR47,,Low Fat,0.087045086,Breads,196.7794,OUT027,1985,Medium,Tier 3,Supermarket Type3,6242.5408 +FDK36,7.09,Low Fat,0.007256127,Baking Goods,50.4034,OUT017,2007,,Tier 2,Supermarket Type1,340.2238 +FDQ23,6.55,Low Fat,0.024664556,Breads,103.3332,OUT017,2007,,Tier 2,Supermarket Type1,2050.664 +NCK42,,Low Fat,0.013056494,Household,215.9192,OUT027,1985,Medium,Tier 3,Supermarket Type3,7334.4528 +NCO06,19.25,Low Fat,0.180820798,Household,35.9558,OUT010,1998,,Tier 3,Grocery Store,67.9116 +FDV24,5.635,Low Fat,0.103693024,Baking Goods,149.905,OUT018,2009,Medium,Tier 3,Supermarket Type2,2546.685 +FDK40,7.035,Low Fat,0.021849398,Frozen Foods,262.091,OUT046,1997,Small,Tier 1,Supermarket Type1,4207.856 +FDT23,7.72,Regular,0.074731477,Breads,77.5986,OUT046,1997,Small,Tier 1,Supermarket Type1,1947.465 +FDB50,13,Low Fat,0.154244343,Canned,77.9986,OUT018,2009,Medium,Tier 3,Supermarket Type2,1168.479 +NCF43,8.51,Low Fat,0,Household,142.147,OUT049,1999,Medium,Tier 1,Supermarket Type1,1717.764 +FDU26,,Regular,0.042412572,Dairy,119.0782,OUT027,1985,Medium,Tier 3,Supermarket Type3,1549.3166 +FDC10,9.8,Regular,0.072990979,Snack Foods,121.6098,OUT049,1999,Medium,Tier 1,Supermarket Type1,1566.6274 +FDK51,19.85,Low Fat,0.005243282,Dairy,266.1884,OUT049,1999,Medium,Tier 1,Supermarket Type1,3179.8608 +FDV09,12.1,Low Fat,0.034427577,Snack Foods,146.6734,OUT010,1998,,Tier 3,Grocery Store,296.9468 +DRL37,15.5,Low Fat,0.053455158,Soft Drinks,43.677,OUT049,1999,Medium,Tier 1,Supermarket Type1,562.601 +FDQ45,9.5,Regular,0,Snack Foods,182.3608,OUT010,1998,,Tier 3,Grocery Store,1102.5648 +FDO45,,Regular,0.037768989,Snack Foods,88.5856,OUT027,1985,Medium,Tier 3,Supermarket Type3,1845.5976 +FDP27,8.155,Low Fat,0.119428052,Meat,190.853,OUT035,2004,Small,Tier 2,Supermarket Type1,2466.789 +NCE07,8.18,Low Fat,0.013183517,Household,143.1154,OUT018,2009,Medium,Tier 3,Supermarket Type2,1843.6002 +FDL26,,Low Fat,0.072838381,Canned,155.2972,OUT027,1985,Medium,Tier 3,Supermarket Type3,5141.3076 +FDL09,19.6,Regular,0.128235131,Snack Foods,169.2816,OUT049,1999,Medium,Tier 1,Supermarket Type1,1174.4712 +NCA17,20.6,Low Fat,0,Health and Hygiene,148.8392,OUT046,1997,Small,Tier 1,Supermarket Type1,2684.5056 +NCL29,9.695,Low Fat,0.114583922,Health and Hygiene,156.4604,OUT017,2007,,Tier 2,Supermarket Type1,2535.3664 +FDS20,8.85,Low Fat,0.054171606,Fruits and Vegetables,183.9292,OUT017,2007,,Tier 2,Supermarket Type1,2918.8672 +NCD19,8.93,LF,0,Household,53.2614,OUT049,1999,Medium,Tier 1,Supermarket Type1,552.614 +FDF05,17.5,Low Fat,0.026912667,Frozen Foods,261.291,OUT049,1999,Medium,Tier 1,Supermarket Type1,3418.883 +FDI44,16.1,Low Fat,0.100799828,Fruits and Vegetables,78.4328,OUT017,2007,,Tier 2,Supermarket Type1,1467.4232 +NCY29,13.65,Low Fat,0.077390746,Health and Hygiene,54.693,OUT045,2002,,Tier 2,Supermarket Type1,679.116 +FDC60,5.425,Regular,0.191603334,Baking Goods,87.0514,OUT010,1998,,Tier 3,Grocery Store,88.5514 +DRL49,13.15,Low Fat,0.056543464,Soft Drinks,140.5812,OUT045,2002,,Tier 2,Supermarket Type1,427.4436 +FDT39,6.26,Regular,0.009923732,Meat,152.8366,OUT017,2007,,Tier 2,Supermarket Type1,3778.415 +FDE50,19.7,Regular,0.016238512,Canned,186.4556,OUT045,2002,,Tier 2,Supermarket Type1,5069.4012 +FDK25,,Regular,0.156072361,Breakfast,169.3474,OUT027,1985,Medium,Tier 3,Supermarket Type3,3874.2902 +DRK13,11.8,Low Fat,0.115636723,Soft Drinks,199.7084,OUT018,2009,Medium,Tier 3,Supermarket Type2,3571.3512 +DRD24,13.85,Low Fat,0.030920531,Soft Drinks,141.0154,OUT018,2009,Medium,Tier 3,Supermarket Type2,1701.7848 +FDX60,14.35,Low Fat,0.080594133,Baking Goods,80.996,OUT046,1997,Small,Tier 1,Supermarket Type1,1757.712 +FDT40,,Low Fat,0.167725251,Frozen Foods,128.3678,OUT019,1985,Small,Tier 1,Grocery Store,127.1678 +FDJ20,20.7,Regular,0.100378096,Fruits and Vegetables,122.4388,OUT045,2002,,Tier 2,Supermarket Type1,1238.388 +FDI58,7.64,Regular,0.070847865,Snack Foods,91.712,OUT045,2002,,Tier 2,Supermarket Type1,2050.664 +FDX04,19.6,Regular,0.04163619,Frozen Foods,47.3376,OUT049,1999,Medium,Tier 1,Supermarket Type1,1150.5024 +FDK55,18.5,Low Fat,0.025756826,Meat,87.2172,OUT035,2004,Small,Tier 2,Supermarket Type1,802.9548 +NCH06,12.3,Low Fat,0.076987408,Household,247.946,OUT017,2007,,Tier 2,Supermarket Type1,3202.498 +NCG54,12.1,Low Fat,0.079968115,Household,170.8106,OUT045,2002,,Tier 2,Supermarket Type1,4619.9862 +FDN46,7.21,Regular,0.14460413,Snack Foods,102.6332,OUT035,2004,Small,Tier 2,Supermarket Type1,2153.1972 +FDS46,17.6,Regular,0.047524635,Snack Foods,118.2782,OUT017,2007,,Tier 2,Supermarket Type1,715.0692 +FDM24,6.135,Regular,0.079776075,Baking Goods,152.8366,OUT017,2007,,Tier 2,Supermarket Type1,1964.7758 +NCC07,19.6,Low Fat,0.023988387,Household,104.5964,OUT049,1999,Medium,Tier 1,Supermarket Type1,1262.3568 +DRG51,12.1,Low Fat,0.011563024,Dairy,164.9526,OUT045,2002,,Tier 2,Supermarket Type1,2302.3364 +NCS53,14.5,Low Fat,0.089703476,Health and Hygiene,158.3604,OUT013,1987,High,Tier 3,Supermarket Type1,1109.2228 +FDC33,8.96,Regular,0.06893834,Fruits and Vegetables,196.4768,OUT046,1997,Small,Tier 1,Supermarket Type1,2561.9984 +FDD14,20.7,Low Fat,0.169667145,Canned,183.5266,OUT013,1987,High,Tier 3,Supermarket Type1,4426.2384 +FDJ52,7.145,Low Fat,0.017814518,Frozen Foods,159.8578,OUT049,1999,Medium,Tier 1,Supermarket Type1,2246.4092 +FDV33,9.6,Regular,0.027399064,Snack Foods,258.3304,OUT045,2002,,Tier 2,Supermarket Type1,4133.2864 +FDY33,14.5,Regular,0.097398254,Snack Foods,157.4262,OUT045,2002,,Tier 2,Supermarket Type1,3978.155 +FDE28,,Regular,0.232072674,Frozen Foods,229.4668,OUT019,1985,Small,Tier 1,Grocery Store,460.7336 +FDA57,18.85,Low Fat,0.039723999,Snack Foods,41.048,OUT045,2002,,Tier 2,Supermarket Type1,918.804 +DRC27,13.8,Low Fat,0.05843112,Dairy,243.6802,OUT017,2007,,Tier 2,Supermarket Type1,1965.4416 +FDA27,20.35,Regular,0.030990354,Dairy,256.3672,OUT045,2002,,Tier 2,Supermarket Type1,1022.6688 +FDO57,20.75,Low Fat,0.108689606,Snack Foods,159.3578,OUT035,2004,Small,Tier 2,Supermarket Type1,4492.8184 +FDZ44,8.185,Low Fat,0.038721734,Fruits and Vegetables,115.8808,OUT035,2004,Small,Tier 2,Supermarket Type1,1523.3504 +FDA58,9.395,Low Fat,0.103664897,Snack Foods,233.6932,OUT013,1987,High,Tier 3,Supermarket Type1,1414.1592 +DRB01,7.39,Low Fat,0.082367244,Soft Drinks,187.753,OUT049,1999,Medium,Tier 1,Supermarket Type1,1518.024 +FDX45,16.75,low fat,0.105282932,Snack Foods,156.963,OUT018,2009,Medium,Tier 3,Supermarket Type2,2816.334 +FDY12,9.8,Regular,0.141406394,Baking Goods,50.0008,OUT017,2007,,Tier 2,Supermarket Type1,506.008 +NCZ29,15,Low Fat,0.071516201,Health and Hygiene,127.7362,OUT045,2002,,Tier 2,Supermarket Type1,1761.7068 +FDF09,6.215,Low Fat,0.012198395,Fruits and Vegetables,37.4848,OUT018,2009,Medium,Tier 3,Supermarket Type2,186.424 +FDR48,11.65,Low Fat,0.132248069,Baking Goods,150.5024,OUT017,2007,,Tier 2,Supermarket Type1,3187.8504 +NCH29,5.51,Low Fat,0.034445116,Health and Hygiene,95.8726,OUT013,1987,High,Tier 3,Supermarket Type1,2153.1972 +FDN08,7.72,Regular,0.088543868,Fruits and Vegetables,117.5466,OUT045,2002,,Tier 2,Supermarket Type1,824.9262 +NCN30,16.35,Low Fat,0.016979063,Household,97.441,OUT013,1987,High,Tier 3,Supermarket Type1,772.328 +FDS12,,LF,0.304859104,Baking Goods,125.4362,OUT019,1985,Small,Tier 1,Grocery Store,755.0172 +FDN58,13.8,Regular,0.056825065,Snack Foods,230.9984,OUT013,1987,High,Tier 3,Supermarket Type1,4633.968 +FDF50,4.905,Low Fat,0.1175683,Canned,197.6768,OUT045,2002,,Tier 2,Supermarket Type1,2956.152 +NCR54,16.35,Low Fat,0.090562192,Household,198.211,OUT046,1997,Small,Tier 1,Supermarket Type1,1964.11 +FDQ21,21.25,Low Fat,0.019423232,Snack Foods,120.8756,OUT046,1997,Small,Tier 1,Supermarket Type1,3150.5656 +FDA13,15.85,Low Fat,0.078489577,Canned,39.9506,OUT013,1987,High,Tier 3,Supermarket Type1,645.1602 +FDY47,8.6,reg,0.054706408,Breads,128.931,OUT018,2009,Medium,Tier 3,Supermarket Type2,1428.141 +NCF31,9.13,Low Fat,0.051804278,Household,150.2024,OUT013,1987,High,Tier 3,Supermarket Type1,1821.6288 +FDL44,,Low Fat,0.012215675,Fruits and Vegetables,162.7894,OUT027,1985,Medium,Tier 3,Supermarket Type3,5500.8396 +FDT51,,Regular,0.019117392,Meat,110.6544,OUT019,1985,Small,Tier 1,Grocery Store,223.7088 +NCF31,,Low Fat,0.090778148,Household,153.1024,OUT019,1985,Small,Tier 1,Grocery Store,303.6048 +NCK31,10.895,Low Fat,0.027047774,Others,50.6666,OUT046,1997,Small,Tier 1,Supermarket Type1,666.4658 +DRM47,9.3,Low Fat,0.043874493,Hard Drinks,191.0846,OUT045,2002,,Tier 2,Supermarket Type1,1337.5922 +FDL40,17.7,Low Fat,0.011603492,Frozen Foods,97.741,OUT013,1987,High,Tier 3,Supermarket Type1,1158.492 +FDT34,9.3,LF,0.291826616,Snack Foods,107.1964,OUT010,1998,,Tier 3,Grocery Store,420.7856 +FDP40,4.555,Regular,0.034350673,Frozen Foods,112.7544,OUT035,2004,Small,Tier 2,Supermarket Type1,1789.6704 +NCJ31,19.2,Low Fat,0.183686937,Others,241.8196,OUT017,2007,,Tier 2,Supermarket Type1,1687.1372 +FDT50,,reg,0.107714834,Dairy,97.8752,OUT027,1985,Medium,Tier 3,Supermarket Type3,2109.2544 +FDG21,17.35,Regular,0.146299902,Seafood,150.405,OUT046,1997,Small,Tier 1,Supermarket Type1,3894.93 +FDM03,12.65,Low Fat,0.123531974,Meat,108.2938,OUT018,2009,Medium,Tier 3,Supermarket Type2,535.969 +FDO11,8,Regular,0.030311951,Breads,247.4092,OUT049,1999,Medium,Tier 1,Supermarket Type1,6972.2576 +FDX26,17.7,Low Fat,0.087986599,Dairy,181.4292,OUT045,2002,,Tier 2,Supermarket Type1,2918.8672 +FDF39,14.85,Regular,0.019590769,Dairy,261.591,OUT018,2009,Medium,Tier 3,Supermarket Type2,2366.919 +NCR53,12.15,Low Fat,0.242768664,Health and Hygiene,226.5404,OUT010,1998,,Tier 3,Grocery Store,225.0404 +FDL57,15.1,Regular,0.067064128,Snack Foods,257.9304,OUT035,2004,Small,Tier 2,Supermarket Type1,6458.26 +FDO44,12.6,Low Fat,0.087630566,Fruits and Vegetables,110.0228,OUT045,2002,,Tier 2,Supermarket Type1,3205.1612 +NCY41,16.75,Low Fat,0.075721301,Health and Hygiene,34.3532,OUT035,2004,Small,Tier 2,Supermarket Type1,1042.6428 +FDL08,10.8,Low Fat,0.049719026,Fruits and Vegetables,246.7144,OUT046,1997,Small,Tier 1,Supermarket Type1,5145.3024 +NCV30,20.2,Low Fat,0.065932087,Household,64.851,OUT046,1997,Small,Tier 1,Supermarket Type1,948.765 +FDL45,,Low Fat,0.037505332,Snack Foods,126.2704,OUT027,1985,Medium,Tier 3,Supermarket Type3,4255.7936 +FDK09,15.2,Low Fat,0.092282353,Snack Foods,227.2352,OUT017,2007,,Tier 2,Supermarket Type1,4122.6336 +FDQ58,7.315,Low Fat,0.01532563,Snack Foods,153.434,OUT049,1999,Medium,Tier 1,Supermarket Type1,459.402 +FDA28,16.1,Regular,0.047996608,Frozen Foods,127.0362,OUT018,2009,Medium,Tier 3,Supermarket Type2,1384.1982 +FDA02,,Regular,0.052040539,Dairy,143.1786,OUT019,1985,Small,Tier 1,Grocery Store,288.9572 +NCC54,17.75,Low Fat,0.097629611,Health and Hygiene,240.4196,OUT013,1987,High,Tier 3,Supermarket Type1,4579.3724 +FDA55,17.2,reg,0.057221177,Fruits and Vegetables,225.4088,OUT018,2009,Medium,Tier 3,Supermarket Type2,2460.7968 +NCJ43,6.635,Low Fat,0.045308629,Household,173.1396,OUT010,1998,,Tier 3,Grocery Store,348.8792 +NCB19,,Low Fat,0.158096128,Household,86.3882,OUT019,1985,Small,Tier 1,Grocery Store,85.8882 +FDA19,7.52,Low Fat,0.055127499,Fruits and Vegetables,128.2994,OUT046,1997,Small,Tier 1,Supermarket Type1,3983.4814 +FDD35,12.15,LF,0.025842905,Starchy Foods,119.844,OUT013,1987,High,Tier 3,Supermarket Type1,599.22 +FDK08,9.195,Regular,0.122802943,Fruits and Vegetables,100.1016,OUT018,2009,Medium,Tier 3,Supermarket Type2,1113.2176 +FDN27,,Low Fat,0.039370913,Meat,116.9808,OUT027,1985,Medium,Tier 3,Supermarket Type3,3866.9664 +NCC19,,Low Fat,0.096411426,Household,192.982,OUT027,1985,Medium,Tier 3,Supermarket Type3,4633.968 +FDL16,12.85,Low Fat,0.16871476,Frozen Foods,47.306,OUT049,1999,Medium,Tier 1,Supermarket Type1,1071.938 +NCL54,,Low Fat,0.082353076,Household,176.9054,OUT027,1985,Medium,Tier 3,Supermarket Type3,4202.5296 +FDR33,7.31,Low Fat,0.026830586,Snack Foods,108.057,OUT049,1999,Medium,Tier 1,Supermarket Type1,2087.283 +FDD52,18.25,Regular,0.183260221,Dairy,108.557,OUT035,2004,Small,Tier 2,Supermarket Type1,1208.427 +FDV33,9.6,Regular,0.027386122,Snack Foods,259.2304,OUT049,1999,Medium,Tier 1,Supermarket Type1,4649.9472 +FDF21,10.3,Regular,0,Fruits and Vegetables,191.153,OUT035,2004,Small,Tier 2,Supermarket Type1,1707.777 +FDM56,16.7,Low Fat,0,Fruits and Vegetables,109.1912,OUT018,2009,Medium,Tier 3,Supermarket Type2,545.956 +FDB12,11.15,Regular,0.105287746,Baking Goods,103.2648,OUT035,2004,Small,Tier 2,Supermarket Type1,2388.8904 +FDI48,11.85,Regular,0,Baking Goods,51.2666,OUT035,2004,Small,Tier 2,Supermarket Type1,410.1328 +FDH09,12.6,Low Fat,0.05616476,Seafood,51.8982,OUT049,1999,Medium,Tier 1,Supermarket Type1,473.3838 +FDQ36,7.855,Regular,0,Baking Goods,38.3848,OUT046,1997,Small,Tier 1,Supermarket Type1,932.12 +FDY16,18.35,Regular,0.092150005,Frozen Foods,184.8266,OUT013,1987,High,Tier 3,Supermarket Type1,3872.9586 +NCM43,,Low Fat,0.01938106,Others,164.321,OUT027,1985,Medium,Tier 3,Supermarket Type3,5546.114 +FDF59,12.5,LF,0.071534226,Starchy Foods,124.902,OUT018,2009,Medium,Tier 3,Supermarket Type2,1771.028 +NCR38,17.25,Low Fat,0.113497001,Household,253.4724,OUT035,2004,Small,Tier 2,Supermarket Type1,755.0172 +FDY13,12.1,Low Fat,0.030121709,Canned,78.067,OUT035,2004,Small,Tier 2,Supermarket Type1,2220.443 +FDC40,16,Regular,0.065051586,Dairy,76.1986,OUT035,2004,Small,Tier 2,Supermarket Type1,1090.5804 +FDT11,5.94,Regular,0.029538509,Breads,189.4556,OUT017,2007,,Tier 2,Supermarket Type1,1877.556 +FDT59,13.65,Low Fat,0.015976249,Breads,230.2668,OUT018,2009,Medium,Tier 3,Supermarket Type2,2994.7684 +NCU54,8.88,Low Fat,0.098622378,Household,208.427,OUT046,1997,Small,Tier 1,Supermarket Type1,5452.902 +FDG34,11.5,Regular,0.062885197,Snack Foods,106.7254,OUT010,1998,,Tier 3,Grocery Store,542.627 +FDQ36,7.855,Regular,0.162461219,Baking Goods,39.2848,OUT017,2007,,Tier 2,Supermarket Type1,857.5504 +DRZ11,8.85,Regular,0.112840108,Soft Drinks,122.0388,OUT049,1999,Medium,Tier 1,Supermarket Type1,1238.388 +DRH23,,Low Fat,0.298205272,Hard Drinks,55.7614,OUT019,1985,Small,Tier 1,Grocery Store,110.5228 +FDT55,13.6,Regular,0.043902087,Fruits and Vegetables,157.0946,OUT017,2007,,Tier 2,Supermarket Type1,5522.811 +NCV53,8.27,Low Fat,0.018797945,Health and Hygiene,241.288,OUT013,1987,High,Tier 3,Supermarket Type1,5512.824 +FDQ33,,Low Fat,0,Snack Foods,151.6708,OUT027,1985,Medium,Tier 3,Supermarket Type3,4815.0656 +NCJ54,9.895,Low Fat,0.060017128,Household,230.8642,OUT013,1987,High,Tier 3,Supermarket Type1,4414.9198 +FDY16,,reg,0.16147714,Frozen Foods,186.2266,OUT019,1985,Small,Tier 1,Grocery Store,1106.5596 +NCN07,18.5,Low Fat,0.033944698,Others,129.9284,OUT046,1997,Small,Tier 1,Supermarket Type1,1054.6272 +FDO01,21.1,Regular,0.020803054,Breakfast,129.7994,OUT018,2009,Medium,Tier 3,Supermarket Type2,1284.994 +FDP32,6.65,Low Fat,0.08816538,Fruits and Vegetables,126.8678,OUT017,2007,,Tier 2,Supermarket Type1,1780.3492 +NCN07,18.5,Low Fat,0.034082974,Others,130.9284,OUT018,2009,Medium,Tier 3,Supermarket Type2,1977.426 +DRN47,,Low Fat,0.016745264,Hard Drinks,180.766,OUT027,1985,Medium,Tier 3,Supermarket Type3,3056.022 +NCM18,13,LF,0.083009876,Household,61.1194,OUT045,2002,,Tier 2,Supermarket Type1,2352.9372 +FDD40,,Regular,0.014721719,Dairy,193.6162,OUT027,1985,Medium,Tier 3,Supermarket Type3,5195.2374 +FDW47,15,Low Fat,0.046375227,Breads,122.8414,OUT046,1997,Small,Tier 1,Supermarket Type1,731.0484 +FDI45,13.1,Low Fat,0.037639672,Fruits and Vegetables,175.6054,OUT049,1999,Medium,Tier 1,Supermarket Type1,1050.6324 +FDJ46,11.1,Low Fat,0.04500603,Snack Foods,174.0054,OUT018,2009,Medium,Tier 3,Supermarket Type2,2101.2648 +FDD38,16.75,Regular,0.013711274,Canned,100.2674,OUT010,1998,,Tier 3,Grocery Store,203.7348 +FDS37,7.655,Low Fat,0.032009653,Canned,117.2492,OUT045,2002,,Tier 2,Supermarket Type1,2432.8332 +FDY60,10.5,Regular,0.026424424,Baking Goods,145.2128,OUT045,2002,,Tier 2,Supermarket Type1,3739.1328 +FDP13,8.1,Regular,0.134870732,Canned,41.948,OUT018,2009,Medium,Tier 3,Supermarket Type2,199.74 +FDM28,15.7,Low Fat,0.045295529,Frozen Foods,181.366,OUT045,2002,,Tier 2,Supermarket Type1,1977.426 +FDY33,14.5,Regular,0.097750937,Snack Foods,159.7262,OUT017,2007,,Tier 2,Supermarket Type1,5728.5432 +NCM54,17.7,Low Fat,0.05089667,Household,125.5678,OUT013,1987,High,Tier 3,Supermarket Type1,1398.8458 +FDK04,7.36,Low Fat,0.052312034,Frozen Foods,58.5588,OUT046,1997,Small,Tier 1,Supermarket Type1,801.6232 +NCI42,18.75,Low Fat,0.010363586,Household,207.1954,OUT035,2004,Small,Tier 2,Supermarket Type1,1667.1632 +FDF45,18.2,Regular,0.012254429,Fruits and Vegetables,59.9904,OUT018,2009,Medium,Tier 3,Supermarket Type2,644.4944 +FDN56,5.46,Regular,0.107223632,Fruits and Vegetables,144.8786,OUT049,1999,Medium,Tier 1,Supermarket Type1,3323.0078 +FDR56,15.5,Regular,0.101335811,Fruits and Vegetables,196.5768,OUT017,2007,,Tier 2,Supermarket Type1,3350.3056 +FDX40,12.85,Low Fat,0.098993139,Frozen Foods,39.3164,OUT046,1997,Small,Tier 1,Supermarket Type1,540.6296 +FDB34,15.25,Low Fat,0.026760329,Snack Foods,86.0198,OUT017,2007,,Tier 2,Supermarket Type1,2006.0554 +FDY47,8.6,Regular,0.054594957,Breads,130.531,OUT045,2002,,Tier 2,Supermarket Type1,1298.31 +DRB01,7.39,Low Fat,0.082170947,Soft Drinks,190.953,OUT013,1987,High,Tier 3,Supermarket Type1,2466.789 +FDR51,9.035,Regular,0.173821519,Meat,151.4708,OUT045,2002,,Tier 2,Supermarket Type1,2407.5328 +FDR48,11.65,LF,0.131708682,Baking Goods,152.3024,OUT049,1999,Medium,Tier 1,Supermarket Type1,1518.024 +FDZ25,15.7,Regular,0.027594064,Canned,171.179,OUT013,1987,High,Tier 3,Supermarket Type1,1867.569 +FDJ04,18,Low Fat,0.12470444,Frozen Foods,120.3124,OUT045,2002,,Tier 2,Supermarket Type1,2725.7852 +NCG07,,Low Fat,0.052247806,Household,190.853,OUT027,1985,Medium,Tier 3,Supermarket Type3,4554.072 +FDB52,17.75,Low Fat,0.030559583,Dairy,257.4672,OUT018,2009,Medium,Tier 3,Supermarket Type2,3835.008 +FDH14,17.1,Regular,0.046903482,Canned,142.0838,OUT045,2002,,Tier 2,Supermarket Type1,2528.7084 +NCY17,18.2,Low Fat,0.163096139,Health and Hygiene,43.0086,OUT046,1997,Small,Tier 1,Supermarket Type1,758.3462 +FDX31,20.35,Regular,0,Fruits and Vegetables,234.4958,OUT045,2002,,Tier 2,Supermarket Type1,1402.1748 +FDN12,15.6,Low Fat,0.081103929,Baking Goods,112.3544,OUT046,1997,Small,Tier 1,Supermarket Type1,1006.6896 +FDG56,13.3,reg,0.071743629,Fruits and Vegetables,59.7536,OUT018,2009,Medium,Tier 3,Supermarket Type2,918.804 +FDP23,6.71,Low Fat,0.035731825,Breads,218.3166,OUT018,2009,Medium,Tier 3,Supermarket Type2,5660.6316 +FDC47,15,Low Fat,0.119131749,Snack Foods,226.9694,OUT045,2002,,Tier 2,Supermarket Type1,6851.082 +FDW25,,Low Fat,0.037217847,Canned,86.8224,OUT027,1985,Medium,Tier 3,Supermarket Type3,1448.7808 +NCR42,9.105,Low Fat,0.038559926,Household,33.89,OUT045,2002,,Tier 2,Supermarket Type1,99.87 +DRO59,11.8,Low Fat,0.054238448,Hard Drinks,75.4012,OUT049,1999,Medium,Tier 1,Supermarket Type1,986.7156 +FDT60,12,Low Fat,0.075856062,Baking Goods,124.5388,OUT018,2009,Medium,Tier 3,Supermarket Type2,1733.7432 +FDE32,20.7,Low Fat,0.048957533,Fruits and Vegetables,37.8506,OUT018,2009,Medium,Tier 3,Supermarket Type2,265.6542 +FDF21,10.3,Regular,0.059160135,Fruits and Vegetables,191.553,OUT017,2007,,Tier 2,Supermarket Type1,6641.355 +FDX04,19.6,Regular,0.041536962,Frozen Foods,46.0376,OUT013,1987,High,Tier 3,Supermarket Type1,527.3136 +FDC22,6.89,Regular,0,Snack Foods,193.482,OUT049,1999,Medium,Tier 1,Supermarket Type1,2510.066 +FDD39,16.7,Low Fat,0.070297175,Dairy,216.385,OUT045,2002,,Tier 2,Supermarket Type1,3678.545 +DRC36,13,Regular,0.044984874,Soft Drinks,175.0054,OUT046,1997,Small,Tier 1,Supermarket Type1,1926.1594 +DRE01,10.1,Low Fat,0.167155198,Soft Drinks,241.7512,OUT046,1997,Small,Tier 1,Supermarket Type1,5331.7264 +FDP37,15.6,Low Fat,0.142986863,Breakfast,130.3994,OUT013,1987,High,Tier 3,Supermarket Type1,2826.9868 +DRI01,7.97,Low Fat,0,Soft Drinks,173.7422,OUT045,2002,,Tier 2,Supermarket Type1,2759.0752 +NCE19,,Low Fat,0.162856593,Household,54.5956,OUT019,1985,Small,Tier 1,Grocery Store,218.3824 +NCS30,5.945,Low Fat,0,Household,128.9652,OUT017,2007,,Tier 2,Supermarket Type1,1808.3128 +FDX31,20.35,Regular,0.014885998,Fruits and Vegetables,234.4958,OUT018,2009,Medium,Tier 3,Supermarket Type2,3271.7412 +FDH47,13.5,Regular,0.128816212,Starchy Foods,96.4068,OUT046,1997,Small,Tier 1,Supermarket Type1,2527.3768 +FDY11,6.71,reg,0.029680868,Baking Goods,65.0142,OUT018,2009,Medium,Tier 3,Supermarket Type2,856.8846 +FDU23,12.15,Low Fat,0.036360676,Breads,166.0184,OUT010,1998,,Tier 3,Grocery Store,330.2368 +FDO19,17.7,Regular,0.016582833,Fruits and Vegetables,50.5034,OUT013,1987,High,Tier 3,Supermarket Type1,1458.102 +FDP08,20.5,Regular,0.112316501,Fruits and Vegetables,193.9478,OUT013,1987,High,Tier 3,Supermarket Type1,4456.1994 +FDX19,19.1,Low Fat,0.096653315,Fruits and Vegetables,235.1958,OUT013,1987,High,Tier 3,Supermarket Type1,4673.916 +FDJ28,12.3,Low Fat,0.021984639,Frozen Foods,191.2162,OUT017,2007,,Tier 2,Supermarket Type1,1924.162 +FDE29,8.905,Low Fat,0.143351652,Frozen Foods,62.0878,OUT049,1999,Medium,Tier 1,Supermarket Type1,302.939 +FDC14,14.5,Regular,0.041482394,Canned,40.0454,OUT017,2007,,Tier 2,Supermarket Type1,209.727 +FDV44,8.365,Regular,0.040069806,Fruits and Vegetables,190.7188,OUT017,2007,,Tier 2,Supermarket Type1,1904.188 +NCF43,8.51,Low Fat,0.052239735,Household,141.947,OUT017,2007,,Tier 2,Supermarket Type1,2004.058 +NCY42,6.38,Low Fat,0.015149955,Household,144.047,OUT013,1987,High,Tier 3,Supermarket Type1,3149.234 +NCZ06,,Low Fat,0.09370568,Household,253.8698,OUT027,1985,Medium,Tier 3,Supermarket Type3,3297.7074 +FDB29,16.7,Regular,0.052401766,Frozen Foods,115.1176,OUT035,2004,Small,Tier 2,Supermarket Type1,1488.7288 +FDL28,10,Regular,0.063121982,Frozen Foods,231.7668,OUT013,1987,High,Tier 3,Supermarket Type1,460.7336 +FDF57,14.5,Regular,0.058946687,Fruits and Vegetables,168.6448,OUT045,2002,,Tier 2,Supermarket Type1,2897.5616 +FDE44,14.65,Low Fat,0.171245426,Fruits and Vegetables,50.3692,OUT013,1987,High,Tier 3,Supermarket Type1,591.2304 +FDU33,,Regular,0.134057426,Snack Foods,45.3402,OUT027,1985,Medium,Tier 3,Supermarket Type3,918.804 +FDA08,11.85,Regular,0.050368454,Fruits and Vegetables,163.8526,OUT017,2007,,Tier 2,Supermarket Type1,1808.9786 +NCC06,19,Low Fat,0.026986367,Household,127.1336,OUT046,1997,Small,Tier 1,Supermarket Type1,2812.3392 +FDO32,6.36,Low Fat,0.120543611,Fruits and Vegetables,45.806,OUT046,1997,Small,Tier 1,Supermarket Type1,1165.15 +FDU39,18.85,LF,0.036037952,Meat,58.4562,OUT046,1997,Small,Tier 1,Supermarket Type1,711.0744 +NCK18,9.6,Low Fat,0.006725388,Household,165.9184,OUT018,2009,Medium,Tier 3,Supermarket Type2,2972.1312 +FDI26,5.94,Low Fat,0.034940979,Canned,177.3344,OUT049,1999,Medium,Tier 1,Supermarket Type1,1605.9096 +DRE37,13.5,Low Fat,0.094219593,Soft Drinks,189.9872,OUT046,1997,Small,Tier 1,Supermarket Type1,1323.6104 +NCN26,10.85,LF,0.048004263,Household,117.5808,OUT010,1998,,Tier 3,Grocery Store,351.5424 +FDS16,15.15,Regular,0.066164431,Frozen Foods,147.376,OUT035,2004,Small,Tier 2,Supermarket Type1,2197.14 +FDE40,15.6,Regular,0,Dairy,62.4194,OUT018,2009,Medium,Tier 3,Supermarket Type2,804.9522 +FDP03,5.15,Regular,0,Meat,122.9388,OUT017,2007,,Tier 2,Supermarket Type1,2105.2596 +FDA27,20.35,Regular,0.030975716,Dairy,253.9672,OUT049,1999,Medium,Tier 1,Supermarket Type1,3068.0064 +FDJ12,8.895,Regular,0.039101813,Baking Goods,208.8296,OUT049,1999,Medium,Tier 1,Supermarket Type1,5400.9696 +FDT03,21.25,Low Fat,0.010039493,Meat,181.7608,OUT018,2009,Medium,Tier 3,Supermarket Type2,1102.5648 +FDF50,4.905,Low Fat,0.117308165,Canned,195.7768,OUT035,2004,Small,Tier 2,Supermarket Type1,2956.152 +FDC51,10.895,Regular,0.009641375,Dairy,124.173,OUT045,2002,,Tier 2,Supermarket Type1,1601.249 +NCL55,,Low Fat,0.113212516,Others,254.604,OUT019,1985,Small,Tier 1,Grocery Store,759.012 +FDZ23,17.75,Regular,0.067490036,Baking Goods,185.224,OUT035,2004,Small,Tier 2,Supermarket Type1,6338.416 +FDW24,6.8,Low Fat,0.037573095,Baking Goods,50.2034,OUT045,2002,,Tier 2,Supermarket Type1,1166.4816 +FDH21,10.395,Low Fat,0.031219108,Seafood,156.9604,OUT035,2004,Small,Tier 2,Supermarket Type1,4595.3516 +NCQ41,14.8,Low Fat,0.032606181,Health and Hygiene,193.5794,OUT010,1998,,Tier 3,Grocery Store,390.1588 +FDH48,13.5,Low Fat,0,Baking Goods,84.554,OUT018,2009,Medium,Tier 3,Supermarket Type2,778.986 +FDX11,16,Regular,0.106731895,Baking Goods,183.6634,OUT035,2004,Small,Tier 2,Supermarket Type1,2544.6876 +FDK33,17.85,Low Fat,0.0112259,Snack Foods,211.956,OUT013,1987,High,Tier 3,Supermarket Type1,4474.176 +FDV36,18.7,Low Fat,0.026355345,Baking Goods,127.102,OUT045,2002,,Tier 2,Supermarket Type1,3289.052 +NCW41,18,Low Fat,0.01548171,Health and Hygiene,159.3604,OUT045,2002,,Tier 2,Supermarket Type1,2059.9852 +FDU32,,Low Fat,0.045465958,Fruits and Vegetables,120.8414,OUT019,1985,Small,Tier 1,Grocery Store,852.8898 +FDE36,5.26,Regular,0.041857101,Baking Goods,162.7868,OUT045,2002,,Tier 2,Supermarket Type1,4258.4568 +FDO27,6.175,Regular,0,Meat,94.9752,OUT045,2002,,Tier 2,Supermarket Type1,1534.0032 +FDW27,5.86,Regular,0.151159243,Meat,156.6314,OUT045,2002,,Tier 2,Supermarket Type1,3257.7594 +FDJ48,,Low Fat,0.056161529,Baking Goods,246.9118,OUT027,1985,Medium,Tier 3,Supermarket Type3,5681.2714 +FDR11,10.5,Regular,0.142419608,Breads,161.1578,OUT013,1987,High,Tier 3,Supermarket Type1,1765.0358 +FDV07,9.5,Low Fat,0.031410378,Fruits and Vegetables,110.3228,OUT018,2009,Medium,Tier 3,Supermarket Type2,2763.07 +FDO50,,Low Fat,0.077790204,Canned,93.0804,OUT027,1985,Medium,Tier 3,Supermarket Type3,2940.1728 +FDN04,11.8,Regular,0.014166739,Frozen Foods,178.2344,OUT017,2007,,Tier 2,Supermarket Type1,2854.9504 +FDZ08,12.5,Regular,0.110215444,Fruits and Vegetables,81.8592,OUT045,2002,,Tier 2,Supermarket Type1,1238.388 +FDD05,19.35,Low Fat,0.016679143,Frozen Foods,119.3098,OUT018,2009,Medium,Tier 3,Supermarket Type2,1928.1568 +FDV60,20.2,Regular,0.117339056,Baking Goods,195.011,OUT035,2004,Small,Tier 2,Supermarket Type1,2749.754 +NCG30,20.2,Low Fat,0.112227747,Household,123.5046,OUT013,1987,High,Tier 3,Supermarket Type1,2739.1012 +FDX37,,Low Fat,0.062724117,Canned,100.57,OUT027,1985,Medium,Tier 3,Supermarket Type3,5093.37 +FDW24,6.8,Low Fat,0.037555348,Baking Goods,49.6034,OUT049,1999,Medium,Tier 1,Supermarket Type1,972.068 +DRM48,,Low Fat,0.112349962,Soft Drinks,39.1848,OUT027,1985,Medium,Tier 3,Supermarket Type3,559.272 +FDF46,,Low Fat,0.093217569,Snack Foods,116.7834,OUT027,1985,Medium,Tier 3,Supermarket Type3,4952.8862 +NCY54,8.43,Low Fat,0.177661246,Household,170.5422,OUT035,2004,Small,Tier 2,Supermarket Type1,3621.2862 +FDS35,9.3,Low Fat,0.11184963,Breads,64.6826,OUT017,2007,,Tier 2,Supermarket Type1,774.9912 +FDB04,11.35,Regular,0.06321435,Dairy,88.3856,OUT035,2004,Small,Tier 2,Supermarket Type1,1318.284 +NCK05,20.1,LF,0.077892365,Health and Hygiene,59.3536,OUT017,2007,,Tier 2,Supermarket Type1,918.804 +FDT46,11.35,Low Fat,0.051564827,Snack Foods,49.0008,OUT010,1998,,Tier 3,Grocery Store,101.2016 +FDP52,,Regular,0.070349402,Frozen Foods,228.601,OUT027,1985,Medium,Tier 3,Supermarket Type3,7350.432 +NCR17,9.8,Low Fat,0.024521239,Health and Hygiene,117.5492,OUT017,2007,,Tier 2,Supermarket Type1,1390.1904 +NCN54,20.35,Low Fat,0.021447102,Household,76.3328,OUT017,2007,,Tier 2,Supermarket Type1,1312.9576 +FDX12,18.2,Regular,0.026059557,Baking Goods,241.2196,OUT035,2004,Small,Tier 2,Supermarket Type1,6507.5292 +DRL23,18.35,Low Fat,0.015301418,Hard Drinks,105.2938,OUT035,2004,Small,Tier 2,Supermarket Type1,2036.6822 +DRN47,12.1,Low Fat,0,Hard Drinks,179.866,OUT045,2002,,Tier 2,Supermarket Type1,3595.32 +FDM25,10.695,Regular,0.060615254,Breakfast,174.0712,OUT013,1987,High,Tier 3,Supermarket Type1,2460.7968 +FDF52,,Low Fat,0.066459891,Frozen Foods,184.2292,OUT027,1985,Medium,Tier 3,Supermarket Type3,4560.73 +FDU21,11.8,Regular,0.076876046,Snack Foods,33.1558,OUT045,2002,,Tier 2,Supermarket Type1,543.2928 +FDI15,13.8,Low Fat,0.14215211,Dairy,263.5884,OUT017,2007,,Tier 2,Supermarket Type1,2384.8956 +FDJ09,15,Low Fat,0.058632705,Snack Foods,46.4744,OUT018,2009,Medium,Tier 3,Supermarket Type2,543.2928 +FDW03,5.63,Regular,0.024541277,Meat,105.1306,OUT046,1997,Small,Tier 1,Supermarket Type1,3135.918 +FDA07,7.55,Regular,0.030992735,Fruits and Vegetables,124.3072,OUT049,1999,Medium,Tier 1,Supermarket Type1,2695.1584 +FDU39,18.85,Low Fat,0.036241797,Meat,57.3562,OUT017,2007,,Tier 2,Supermarket Type1,1007.3554 +FDI60,7.22,Regular,0.038398937,Baking Goods,61.951,OUT045,2002,,Tier 2,Supermarket Type1,1518.024 +FDK33,17.85,Low Fat,0.011258035,Snack Foods,211.656,OUT045,2002,,Tier 2,Supermarket Type1,2556.672 +FDN01,8.895,Low Fat,0.072511335,Breakfast,177.437,OUT049,1999,Medium,Tier 1,Supermarket Type1,3528.74 +FDV38,19.25,Low Fat,0.101689151,Dairy,54.6956,OUT013,1987,High,Tier 3,Supermarket Type1,163.7868 +NCV06,11.3,Low Fat,0.066625843,Household,194.2478,OUT013,1987,High,Tier 3,Supermarket Type1,2712.4692 +FDQ34,10.85,Low Fat,0.162242617,Snack Foods,107.8622,OUT046,1997,Small,Tier 1,Supermarket Type1,1058.622 +DRK37,5,Low Fat,0,Soft Drinks,189.853,OUT045,2002,,Tier 2,Supermarket Type1,4933.578 +NCY53,20,Low Fat,0,Health and Hygiene,110.2544,OUT013,1987,High,Tier 3,Supermarket Type1,1454.1072 +FDD53,,Low Fat,0.044008347,Frozen Foods,43.7454,OUT027,1985,Medium,Tier 3,Supermarket Type3,671.1264 +FDV49,10,Low Fat,0.025867353,Canned,264.6226,OUT049,1999,Medium,Tier 1,Supermarket Type1,4757.8068 +FDY36,,Low Fat,0.016476619,Baking Goods,74.338,OUT019,1985,Small,Tier 1,Grocery Store,146.476 +FDH34,8.63,Low Fat,0.031095246,Snack Foods,185.7582,OUT046,1997,Small,Tier 1,Supermarket Type1,3529.4058 +NCD07,9.1,LF,0,Household,115.4518,OUT017,2007,,Tier 2,Supermarket Type1,2390.8878 +FDB51,6.92,Low Fat,0.038422076,Dairy,62.5852,OUT013,1987,High,Tier 3,Supermarket Type1,438.0964 +NCH42,6.86,Low Fat,0.061155983,Household,228.401,OUT010,1998,,Tier 3,Grocery Store,229.701 +NCI31,20,Low Fat,0.08131178,Others,37.819,OUT035,2004,Small,Tier 2,Supermarket Type1,439.428 +FDL56,14.1,Low Fat,0.125756824,Fruits and Vegetables,87.1198,OUT035,2004,Small,Tier 2,Supermarket Type1,2529.3742 +FDG29,17.6,Low Fat,0.05661033,Frozen Foods,41.7454,OUT017,2007,,Tier 2,Supermarket Type1,209.727 +FDJ45,17.75,LF,0.073709686,Seafood,35.1216,OUT018,2009,Medium,Tier 3,Supermarket Type2,415.4592 +FDJ38,8.6,Regular,0.040432954,Canned,191.653,OUT017,2007,,Tier 2,Supermarket Type1,3795.06 +NCO05,7.27,Low Fat,0.046749112,Health and Hygiene,100.4384,OUT018,2009,Medium,Tier 3,Supermarket Type2,1970.768 +FDW24,6.8,Low Fat,0.062762374,Baking Goods,50.4034,OUT010,1998,,Tier 3,Grocery Store,48.6034 +FDN34,,Regular,0.045542628,Snack Foods,170.7132,OUT027,1985,Medium,Tier 3,Supermarket Type3,4904.2828 +FDH46,6.935,Regular,0.041346469,Snack Foods,103.1332,OUT049,1999,Medium,Tier 1,Supermarket Type1,820.2656 +FDW39,6.69,Regular,0.036903419,Meat,175.137,OUT035,2004,Small,Tier 2,Supermarket Type1,1235.059 +DRK59,,Low Fat,0.075084457,Hard Drinks,233.9616,OUT027,1985,Medium,Tier 3,Supermarket Type3,4452.8704 +FDU25,12.35,Low Fat,0.026735372,Canned,57.4246,OUT045,2002,,Tier 2,Supermarket Type1,810.9444 +FDC44,15.6,Low Fat,0.172453254,Fruits and Vegetables,115.1518,OUT013,1987,High,Tier 3,Supermarket Type1,683.1108 +FDG17,,Regular,0.035666655,Frozen Foods,246.2486,OUT027,1985,Medium,Tier 3,Supermarket Type3,8063.5038 +FDI45,13.1,Low Fat,0.037581243,Fruits and Vegetables,175.5054,OUT046,1997,Small,Tier 1,Supermarket Type1,2451.4756 +FDK08,9.195,Regular,0.122202946,Fruits and Vegetables,100.1016,OUT013,1987,High,Tier 3,Supermarket Type1,1619.2256 +FDW36,11.15,Low Fat,0.056921876,Baking Goods,107.1622,OUT035,2004,Small,Tier 2,Supermarket Type1,423.4488 +FDL39,16.1,Regular,0.063319379,Dairy,180.9318,OUT035,2004,Small,Tier 2,Supermarket Type1,1984.7498 +FDS13,6.465,Low Fat,0.124402507,Canned,266.1884,OUT013,1987,High,Tier 3,Supermarket Type1,5299.768 +FDO57,20.75,Low Fat,0.108879177,Snack Foods,161.5578,OUT049,1999,Medium,Tier 1,Supermarket Type1,320.9156 +FDS37,7.655,Low Fat,0.032125561,Canned,115.7492,OUT017,2007,,Tier 2,Supermarket Type1,2548.6824 +FDV26,20.25,Regular,0.076097073,Dairy,193.5794,OUT013,1987,High,Tier 3,Supermarket Type1,1950.794 +FDJ22,18.75,low fat,0.052766297,Snack Foods,189.7504,OUT013,1987,High,Tier 3,Supermarket Type1,2492.7552 +FDC16,11.5,Regular,0.020601791,Dairy,86.054,OUT049,1999,Medium,Tier 1,Supermarket Type1,1038.648 +NCH42,,Low Fat,0.036360386,Household,231.601,OUT027,1985,Medium,Tier 3,Supermarket Type3,7580.133 +FDD46,,Low Fat,0.140571971,Snack Foods,154.7998,OUT027,1985,Medium,Tier 3,Supermarket Type3,3383.5956 +FDT25,7.5,Low Fat,0.05074138,Canned,123.2072,OUT035,2004,Small,Tier 2,Supermarket Type1,1837.608 +FDR34,17,Regular,0.015997687,Snack Foods,229.1352,OUT045,2002,,Tier 2,Supermarket Type1,4580.704 +FDQ10,,Low Fat,0.033018559,Snack Foods,170.4422,OUT027,1985,Medium,Tier 3,Supermarket Type3,5000.8238 +DRI03,6.03,Low Fat,0.022703693,Dairy,177.9028,OUT046,1997,Small,Tier 1,Supermarket Type1,4781.7756 +FDB58,,Regular,0.013431109,Snack Foods,143.7154,OUT027,1985,Medium,Tier 3,Supermarket Type3,4821.7236 +FDQ03,15,Regular,0,Meat,235.6248,OUT049,1999,Medium,Tier 1,Supermarket Type1,1896.1984 +DRD27,18.75,Low Fat,0.023876985,Dairy,97.4042,OUT049,1999,Medium,Tier 1,Supermarket Type1,2281.6966 +FDK33,17.85,Low Fat,0.011281018,Snack Foods,213.756,OUT018,2009,Medium,Tier 3,Supermarket Type2,3408.896 +DRL23,18.35,Low Fat,0.015328106,Hard Drinks,107.5938,OUT049,1999,Medium,Tier 1,Supermarket Type1,1822.2946 +FDW32,18.35,Regular,0.094488071,Fruits and Vegetables,87.1882,OUT045,2002,,Tier 2,Supermarket Type1,515.3292 +NCL05,19.6,Low Fat,0.047897663,Health and Hygiene,44.677,OUT046,1997,Small,Tier 1,Supermarket Type1,173.108 +DRB01,,Low Fat,0.081841136,Soft Drinks,190.053,OUT027,1985,Medium,Tier 3,Supermarket Type3,569.259 +NCL06,14.65,Low Fat,0.072212787,Household,260.9594,OUT045,2002,,Tier 2,Supermarket Type1,2878.2534 +FDH10,21,Low Fat,0.049505857,Snack Foods,195.3478,OUT018,2009,Medium,Tier 3,Supermarket Type2,1162.4868 +NCO14,9.6,Low Fat,0.02981155,Household,45.2086,OUT017,2007,,Tier 2,Supermarket Type1,669.129 +FDV03,17.6,Low Fat,0.058181585,Meat,154.4314,OUT049,1999,Medium,Tier 1,Supermarket Type1,2326.971 +FDW52,14,Regular,0.037734782,Frozen Foods,166.4526,OUT017,2007,,Tier 2,Supermarket Type1,4769.1254 +NCZ30,6.59,Low Fat,0,Household,119.1098,OUT017,2007,,Tier 2,Supermarket Type1,964.0784 +FDY35,17.6,Regular,0.026827052,Breads,47.8402,OUT010,1998,,Tier 3,Grocery Store,91.8804 +FDN31,11.5,Low Fat,0.072881535,Fruits and Vegetables,191.353,OUT046,1997,Small,Tier 1,Supermarket Type1,2277.036 +FDX31,20.35,Regular,0.014822802,Fruits and Vegetables,234.0958,OUT035,2004,Small,Tier 2,Supermarket Type1,2570.6538 +NCJ05,18.7,Low Fat,0.046159928,Health and Hygiene,152.3682,OUT049,1999,Medium,Tier 1,Supermarket Type1,1677.1502 +FDN56,5.46,Regular,0.107662745,Fruits and Vegetables,143.8786,OUT017,2007,,Tier 2,Supermarket Type1,4334.358 +FDZ04,9.31,Low Fat,0.038014104,Frozen Foods,62.351,OUT049,1999,Medium,Tier 1,Supermarket Type1,822.263 +FDJ44,12.3,Regular,0.106307146,Fruits and Vegetables,174.9396,OUT035,2004,Small,Tier 2,Supermarket Type1,1569.9564 +FDI08,18.2,Regular,0.066672058,Fruits and Vegetables,248.1092,OUT017,2007,,Tier 2,Supermarket Type1,4233.1564 +FDB59,18.25,Low Fat,0.015341139,Snack Foods,200.0084,OUT018,2009,Medium,Tier 3,Supermarket Type2,1984.084 +FDY15,18.25,Regular,0.171174491,Dairy,156.463,OUT045,2002,,Tier 2,Supermarket Type1,938.778 +NCZ18,,Low Fat,0.325780807,Household,252.7698,OUT019,1985,Small,Tier 1,Grocery Store,761.0094 +DRO47,10.195,Low Fat,0.112859454,Hard Drinks,114.486,OUT017,2007,,Tier 2,Supermarket Type1,2490.092 +FDW21,5.34,Regular,0.005962753,Snack Foods,102.4358,OUT035,2004,Small,Tier 2,Supermarket Type1,2010.716 +FDZ14,,Regular,0.047358246,Dairy,123.1756,OUT027,1985,Medium,Tier 3,Supermarket Type3,3998.7948 +FDM09,11.15,Regular,0.086105815,Snack Foods,167.879,OUT045,2002,,Tier 2,Supermarket Type1,2886.243 +FDK43,9.8,Low Fat,0.026882496,Meat,126.302,OUT049,1999,Medium,Tier 1,Supermarket Type1,3036.048 +FDE45,12.1,Low Fat,0.040521714,Fruits and Vegetables,178.5002,OUT018,2009,Medium,Tier 3,Supermarket Type2,5552.1062 +FDR35,,Low Fat,0.020597493,Breads,200.0742,OUT027,1985,Medium,Tier 3,Supermarket Type3,8958.339 +FDT58,,Low Fat,0.085538477,Snack Foods,169.2816,OUT027,1985,Medium,Tier 3,Supermarket Type3,3523.4136 +FDS57,15.5,Low Fat,0,Snack Foods,141.547,OUT017,2007,,Tier 2,Supermarket Type1,3006.087 +FDF10,15.5,Regular,0,Snack Foods,147.2418,OUT018,2009,Medium,Tier 3,Supermarket Type2,1324.2762 +FDP03,5.15,Regular,0.10239789,Meat,122.1388,OUT010,1998,,Tier 3,Grocery Store,495.3552 +FDT04,17.25,Low Fat,0,Frozen Foods,37.5822,OUT010,1998,,Tier 3,Grocery Store,196.411 +NCW53,18.35,Low Fat,0.0304697,Health and Hygiene,191.3162,OUT013,1987,High,Tier 3,Supermarket Type1,1346.9134 +FDA39,6.32,Low Fat,0.021287234,Meat,38.5822,OUT010,1998,,Tier 3,Grocery Store,78.5644 +NCH29,5.51,Low Fat,0.034467286,Health and Hygiene,96.7726,OUT035,2004,Small,Tier 2,Supermarket Type1,2642.5602 +FDU02,13.35,Low Fat,0.1027194,Dairy,228.8352,OUT045,2002,,Tier 2,Supermarket Type1,5267.8096 +FDN13,,Low Fat,0.266234421,Breakfast,98.5358,OUT019,1985,Small,Tier 1,Grocery Store,402.1432 +FDX56,,Regular,0.129668578,Fruits and Vegetables,206.8638,OUT019,1985,Small,Tier 1,Grocery Store,207.0638 +FDT11,,Regular,0.02923013,Breads,189.4556,OUT027,1985,Medium,Tier 3,Supermarket Type3,3567.3564 +NCC18,,Low Fat,0.176411579,Household,173.2422,OUT027,1985,Medium,Tier 3,Supermarket Type3,2069.3064 +FDA32,14,Low Fat,0.050371508,Fruits and Vegetables,214.7192,OUT010,1998,,Tier 3,Grocery Store,862.8768 +FDU39,18.85,Low Fat,0.036184755,Meat,58.5562,OUT018,2009,Medium,Tier 3,Supermarket Type2,770.3306 +FDV27,,Regular,0.070017381,Meat,89.3514,OUT019,1985,Small,Tier 1,Grocery Store,177.1028 +NCW53,18.35,Low Fat,0.030556922,Health and Hygiene,190.6162,OUT045,2002,,Tier 2,Supermarket Type1,3271.0754 +NCZ42,10.5,Low Fat,0.011278535,Household,237.0248,OUT013,1987,High,Tier 3,Supermarket Type1,5451.5704 +FDO46,9.6,Regular,0,Snack Foods,191.0872,OUT017,2007,,Tier 2,Supermarket Type1,4349.0056 +FDQ57,,Low Fat,0.027812304,Snack Foods,147.476,OUT027,1985,Medium,Tier 3,Supermarket Type3,3368.948 +FDZ36,6.035,Regular,0.066051758,Baking Goods,187.724,OUT018,2009,Medium,Tier 3,Supermarket Type2,2050.664 +FDK38,6.65,Low Fat,0.053506996,Canned,150.0734,OUT018,2009,Medium,Tier 3,Supermarket Type2,3563.3616 +FDU51,,Regular,0.096046304,Meat,178.7028,OUT027,1985,Medium,Tier 3,Supermarket Type3,4604.6728 +FDS14,7.285,Low Fat,0.049922304,Dairy,156.9288,OUT013,1987,High,Tier 3,Supermarket Type1,1571.288 +FDQ40,11.1,Regular,0.036083537,Frozen Foods,175.4712,OUT049,1999,Medium,Tier 1,Supermarket Type1,2988.1104 +FDE20,11.35,Regular,0.005539114,Fruits and Vegetables,167.879,OUT049,1999,Medium,Tier 1,Supermarket Type1,4074.696 +FDH58,12.3,Low Fat,0.036939673,Snack Foods,113.1834,OUT046,1997,Small,Tier 1,Supermarket Type1,3109.9518 +NCK53,11.6,Low Fat,0.037793818,Health and Hygiene,99.3042,OUT017,2007,,Tier 2,Supermarket Type1,2281.6966 +FDJ44,12.3,Regular,0.106928681,Fruits and Vegetables,173.7396,OUT017,2007,,Tier 2,Supermarket Type1,3663.2316 +FDN22,18.85,Regular,0.138585859,Snack Foods,252.4724,OUT045,2002,,Tier 2,Supermarket Type1,3271.7412 +FDH56,9.8,Regular,0.06407717,Fruits and Vegetables,116.7492,OUT018,2009,Medium,Tier 3,Supermarket Type2,1621.8888 +FDK48,7.445,Low Fat,0.037708542,Baking Goods,74.7354,OUT045,2002,,Tier 2,Supermarket Type1,1128.531 +FDQ40,11.1,Regular,0.036020711,Frozen Foods,177.2712,OUT035,2004,Small,Tier 2,Supermarket Type1,2109.2544 +FDH10,21,Low Fat,0.049295686,Snack Foods,194.4478,OUT035,2004,Small,Tier 2,Supermarket Type1,968.739 +FDM21,20.2,Low Fat,0.06449461,Snack Foods,259.2646,OUT045,2002,,Tier 2,Supermarket Type1,3091.9752 +FDX12,18.2,Regular,0.026117345,Baking Goods,239.2196,OUT045,2002,,Tier 2,Supermarket Type1,3133.2548 +FDM51,11.8,Regular,0.025904648,Meat,102.4674,OUT013,1987,High,Tier 3,Supermarket Type1,2037.348 +FDG09,20.6,Regular,0.080235512,Fruits and Vegetables,188.9556,OUT010,1998,,Tier 3,Grocery Store,563.2668 +DRD37,9.8,Low Fat,0.013830218,Soft Drinks,45.306,OUT013,1987,High,Tier 3,Supermarket Type1,1304.968 +FDN21,18.6,Low Fat,0.076855628,Snack Foods,161.0236,OUT046,1997,Small,Tier 1,Supermarket Type1,483.3708 +NCQ06,13,Low Fat,0.041824524,Household,256.7014,OUT046,1997,Small,Tier 1,Supermarket Type1,2805.0154 +FDV52,20.7,Regular,0.12152072,Frozen Foods,118.0466,OUT046,1997,Small,Tier 1,Supermarket Type1,1060.6194 +FDC10,9.8,Regular,0.073289899,Snack Foods,120.8098,OUT017,2007,,Tier 2,Supermarket Type1,1325.6078 +FDX51,9.5,Regular,0.022054553,Meat,195.4452,OUT035,2004,Small,Tier 2,Supermarket Type1,4502.1396 +NCD54,21.1,low fat,0.029054046,Household,144.6786,OUT049,1999,Medium,Tier 1,Supermarket Type1,2889.572 +NCK18,,Low Fat,0.006665667,Household,164.1184,OUT027,1985,Medium,Tier 3,Supermarket Type3,3797.7232 +FDZ01,8.975,Regular,0.009057132,Canned,104.099,OUT035,2004,Small,Tier 2,Supermarket Type1,2476.776 +FDT48,4.92,Low Fat,0.045955031,Baking Goods,199.1084,OUT046,1997,Small,Tier 1,Supermarket Type1,2182.4924 +FDB40,17.5,Regular,0.007551607,Dairy,145.8102,OUT049,1999,Medium,Tier 1,Supermarket Type1,1895.5326 +NCC07,,Low Fat,0.023835164,Household,103.3964,OUT027,1985,Medium,Tier 3,Supermarket Type3,3050.6956 +FDT52,9.695,Regular,0.047503318,Frozen Foods,244.6144,OUT049,1999,Medium,Tier 1,Supermarket Type1,3185.1872 +FDK09,,Low Fat,0.160665697,Snack Foods,227.5352,OUT019,1985,Small,Tier 1,Grocery Store,916.1408 +NCQ30,7.725,LF,0.048661041,Household,123.7414,OUT010,1998,,Tier 3,Grocery Store,121.8414 +FDZ60,,Low Fat,0.208987123,Baking Goods,106.0596,OUT019,1985,Small,Tier 1,Grocery Store,215.7192 +NCK18,9.6,Low Fat,0.006692529,Household,164.9184,OUT013,1987,High,Tier 3,Supermarket Type1,2972.1312 +FDV11,9.1,Regular,0.136695145,Breads,173.4054,OUT010,1998,,Tier 3,Grocery Store,875.527 +FDR25,17,Regular,0.140311123,Canned,265.6884,OUT017,2007,,Tier 2,Supermarket Type1,2649.884 +FDB26,14,Regular,0.031330907,Canned,52.364,OUT045,2002,,Tier 2,Supermarket Type1,745.696 +DRD01,12.1,Regular,0.061521569,Soft Drinks,55.8614,OUT017,2007,,Tier 2,Supermarket Type1,1436.7964 +FDG32,19.85,LF,0.176991029,Fruits and Vegetables,221.5772,OUT017,2007,,Tier 2,Supermarket Type1,3558.0352 +FDY49,17.2,Regular,0.0120098,Canned,163.1184,OUT035,2004,Small,Tier 2,Supermarket Type1,2807.0128 +FDD26,8.71,Regular,0.072141818,Canned,183.3924,OUT035,2004,Small,Tier 2,Supermarket Type1,2776.386 +FDC22,6.89,Regular,0.136984147,Snack Foods,192.682,OUT018,2009,Medium,Tier 3,Supermarket Type2,2703.148 +DRD27,18.75,Low Fat,0,Dairy,97.9042,OUT045,2002,,Tier 2,Supermarket Type1,1686.4714 +FDA44,,Low Fat,0.052964982,Fruits and Vegetables,57.793,OUT027,1985,Medium,Tier 3,Supermarket Type3,1754.383 +FDW01,14.5,LF,0,Canned,154.4682,OUT013,1987,High,Tier 3,Supermarket Type1,1524.682 +FDV32,,Low Fat,0.155316936,Fruits and Vegetables,64.151,OUT019,1985,Small,Tier 1,Grocery Store,316.255 +FDK32,,Regular,0.048738407,Fruits and Vegetables,152.8682,OUT027,1985,Medium,Tier 3,Supermarket Type3,5031.4506 +NCA05,20.75,Low Fat,0,Health and Hygiene,149.4734,OUT013,1987,High,Tier 3,Supermarket Type1,2969.468 +FDR10,17.6,Low Fat,0.010031539,Snack Foods,161.5552,OUT013,1987,High,Tier 3,Supermarket Type1,1787.0072 +FDL22,16.85,Low Fat,0.036383293,Snack Foods,91.0488,OUT035,2004,Small,Tier 2,Supermarket Type1,1086.5856 +FDD10,20.6,Regular,0,Snack Foods,178.1344,OUT035,2004,Small,Tier 2,Supermarket Type1,3568.688 +FDW25,5.175,LF,0.03736783,Canned,86.9224,OUT013,1987,High,Tier 3,Supermarket Type1,255.6672 +FDR47,17.85,Low Fat,0.087604647,Breads,196.9794,OUT049,1999,Medium,Tier 1,Supermarket Type1,1560.6352 +DRF27,8.93,Low Fat,0.028461453,Dairy,152.234,OUT049,1999,Medium,Tier 1,Supermarket Type1,5053.422 +FDQ48,,Regular,0.034244601,Baking Goods,97.2726,OUT027,1985,Medium,Tier 3,Supermarket Type3,1957.452 +FDS37,7.655,Low Fat,0.031938828,Canned,114.1492,OUT035,2004,Small,Tier 2,Supermarket Type1,1158.492 +NCI18,18.35,LF,0.014024028,Household,224.5746,OUT046,1997,Small,Tier 1,Supermarket Type1,2692.4952 +NCJ42,,Low Fat,0.014232071,Household,100.9332,OUT027,1985,Medium,Tier 3,Supermarket Type3,1743.0644 +FDY48,14,Low Fat,0.023730384,Baking Goods,104.3332,OUT035,2004,Small,Tier 2,Supermarket Type1,1435.4648 +FDB39,11.6,Low Fat,0.038578846,Dairy,56.1272,OUT049,1999,Medium,Tier 1,Supermarket Type1,671.1264 +DRI37,15.85,Low Fat,0.108036187,Soft Drinks,57.3904,OUT018,2009,Medium,Tier 3,Supermarket Type2,703.0848 +FDB58,10.5,Regular,0.013572808,Snack Foods,143.2154,OUT017,2007,,Tier 2,Supermarket Type1,1559.9694 +FDV12,16.7,Regular,0.06082402,Baking Goods,98.7384,OUT013,1987,High,Tier 3,Supermarket Type1,1773.6912 +NCU06,17.6,Low Fat,0.074345142,Household,230.901,OUT013,1987,High,Tier 3,Supermarket Type1,4364.319 +FDU34,18.25,Low Fat,0.075501241,Snack Foods,123.1046,OUT018,2009,Medium,Tier 3,Supermarket Type2,249.0092 +FDP31,21.1,Regular,0.16216286,Fruits and Vegetables,62.2168,OUT018,2009,Medium,Tier 3,Supermarket Type2,383.5008 +FDV11,9.1,Regular,0.081652352,Breads,177.0054,OUT035,2004,Small,Tier 2,Supermarket Type1,2101.2648 +NCY06,15.25,Low Fat,0.061434045,Household,130.9968,OUT018,2009,Medium,Tier 3,Supermarket Type2,2348.9424 +NCV41,14.35,Low Fat,0.017073332,Health and Hygiene,109.5228,OUT045,2002,,Tier 2,Supermarket Type1,1657.842 +FDQ52,,Low Fat,0.118806857,Frozen Foods,248.8434,OUT027,1985,Medium,Tier 3,Supermarket Type3,6705.2718 +FDM38,5.885,Regular,0.092694107,Canned,53.6982,OUT013,1987,High,Tier 3,Supermarket Type1,1525.3478 +FDA14,16.1,Low Fat,0.065183228,Dairy,148.076,OUT046,1997,Small,Tier 1,Supermarket Type1,1464.76 +FDB23,,Regular,0.005561538,Starchy Foods,224.0062,OUT027,1985,Medium,Tier 3,Supermarket Type3,3837.0054 +DRH49,19.7,Low Fat,0.024635077,Soft Drinks,84.1592,OUT013,1987,High,Tier 3,Supermarket Type1,1073.2696 +FDI40,11.5,Regular,0.126313413,Frozen Foods,100.6358,OUT017,2007,,Tier 2,Supermarket Type1,2010.716 +FDR37,16.5,Regular,0.066383907,Breakfast,180.4292,OUT045,2002,,Tier 2,Supermarket Type1,2189.1504 +FDS16,15.15,Regular,0.066279832,Frozen Foods,147.876,OUT049,1999,Medium,Tier 1,Supermarket Type1,4540.756 +FDT15,12.15,Regular,0.042681522,Meat,184.295,OUT046,1997,Small,Tier 1,Supermarket Type1,2014.045 +FDL32,15.7,Regular,0,Fruits and Vegetables,112.4544,OUT013,1987,High,Tier 3,Supermarket Type1,1230.3984 +FDB39,11.6,Low Fat,0.038736838,Dairy,55.8272,OUT017,2007,,Tier 2,Supermarket Type1,1454.1072 +FDX40,12.85,Low Fat,0.098910759,Frozen Foods,37.6164,OUT013,1987,High,Tier 3,Supermarket Type1,308.9312 +DRD13,15,Low Fat,0.049178998,Soft Drinks,65.6168,OUT045,2002,,Tier 2,Supermarket Type1,639.168 +FDZ43,11,Regular,0.057011062,Fruits and Vegetables,241.9512,OUT013,1987,High,Tier 3,Supermarket Type1,2908.2144 +DRM59,5.88,Low Fat,0.003589104,Hard Drinks,155.5998,OUT013,1987,High,Tier 3,Supermarket Type1,1691.7978 +NCZ18,7.825,Low Fat,0,Household,253.4698,OUT017,2007,,Tier 2,Supermarket Type1,6849.0846 +FDH52,,Regular,0.043690499,Frozen Foods,60.2194,OUT027,1985,Medium,Tier 3,Supermarket Type3,1733.7432 +FDM25,10.695,Regular,0.10154201,Breakfast,173.7712,OUT010,1998,,Tier 3,Grocery Store,175.7712 +NCP05,,Low Fat,0.025164132,Health and Hygiene,152.6024,OUT027,1985,Medium,Tier 3,Supermarket Type3,6072.096 +FDY38,13.6,Regular,0.119077255,Dairy,231.23,OUT013,1987,High,Tier 3,Supermarket Type1,2330.3 +FDO37,8.06,Low Fat,0.021497594,Breakfast,230.3326,OUT017,2007,,Tier 2,Supermarket Type1,1386.1956 +FDV49,,Low Fat,0.025702129,Canned,262.6226,OUT027,1985,Medium,Tier 3,Supermarket Type3,7136.7102 +NCP02,7.105,Low Fat,0.075000682,Household,61.0562,OUT010,1998,,Tier 3,Grocery Store,296.281 +NCJ19,18.6,LF,0.118419683,Others,58.3588,OUT045,2002,,Tier 2,Supermarket Type1,1545.9876 +FDW44,9.5,Regular,0.035151215,Fruits and Vegetables,171.8448,OUT046,1997,Small,Tier 1,Supermarket Type1,2556.672 +FDU56,16.85,LF,0.044414056,Fruits and Vegetables,182.4266,OUT046,1997,Small,Tier 1,Supermarket Type1,2028.6926 +FDZ58,17.85,Low Fat,0.052471995,Snack Foods,123.7072,OUT017,2007,,Tier 2,Supermarket Type1,2450.144 +FDZ15,13.1,Low Fat,0.020853376,Dairy,117.4782,OUT013,1987,High,Tier 3,Supermarket Type1,1906.8512 +NCI06,11.3,Low Fat,0.047791878,Household,180.766,OUT049,1999,Medium,Tier 1,Supermarket Type1,5033.448 +FDD36,13.3,Low Fat,0.02136022,Baking Goods,120.4124,OUT018,2009,Medium,Tier 3,Supermarket Type2,1777.686 +FDD56,15.2,Regular,0.103988736,Fruits and Vegetables,177.0054,OUT045,2002,,Tier 2,Supermarket Type1,3677.2134 +FDX27,20.7,Regular,0.114581955,Dairy,94.3436,OUT018,2009,Medium,Tier 3,Supermarket Type2,945.436 +FDG50,7.405,Low Fat,0.02556185,Canned,89.7146,OUT010,1998,,Tier 3,Grocery Store,182.4292 +FDU36,6.15,Low Fat,0.046459438,Baking Goods,100.5384,OUT018,2009,Medium,Tier 3,Supermarket Type2,1675.1528 +FDJ15,11.35,Regular,0.023322478,Dairy,182.5608,OUT046,1997,Small,Tier 1,Supermarket Type1,3307.6944 +FDG32,19.85,Low Fat,0.175962247,Fruits and Vegetables,223.0772,OUT035,2004,Small,Tier 2,Supermarket Type1,1779.0176 +FDV15,,Low Fat,0.255929096,Meat,103.3648,OUT019,1985,Small,Tier 1,Grocery Store,311.5944 +FDS28,8.18,Regular,0.082333019,Frozen Foods,58.1588,OUT013,1987,High,Tier 3,Supermarket Type1,343.5528 +FDU23,12.15,Low Fat,0.021757269,Breads,165.0184,OUT049,1999,Medium,Tier 1,Supermarket Type1,3302.368 +DRI03,6.03,Low Fat,0.0226994,Dairy,176.4028,OUT035,2004,Small,Tier 2,Supermarket Type1,4250.4672 +FDH28,15.85,Regular,0.110653377,Frozen Foods,36.9506,OUT017,2007,,Tier 2,Supermarket Type1,759.012 +FDP16,18.6,Low Fat,0.065771529,Frozen Foods,245.7802,OUT010,1998,,Tier 3,Grocery Store,245.6802 +NCQ29,12,Low Fat,0,Health and Hygiene,262.3278,OUT017,2007,,Tier 2,Supermarket Type1,1561.9668 +NCH30,17.1,Low Fat,0,Household,114.686,OUT018,2009,Medium,Tier 3,Supermarket Type2,1358.232 +FDU31,10.5,Regular,0.024991056,Fruits and Vegetables,217.9508,OUT046,1997,Small,Tier 1,Supermarket Type1,2821.6604 +FDF04,17.5,LF,0.013658248,Frozen Foods,256.3304,OUT049,1999,Medium,Tier 1,Supermarket Type1,6199.9296 +FDZ20,16.1,Low Fat,0.034278413,Fruits and Vegetables,255.2356,OUT013,1987,High,Tier 3,Supermarket Type1,6867.0612 +NCK05,20.1,Low Fat,0,Health and Hygiene,61.3536,OUT010,1998,,Tier 3,Grocery Store,183.7608 +FDV23,,Low Fat,0.185306514,Breads,125.6046,OUT019,1985,Small,Tier 1,Grocery Store,622.523 +FDA07,7.55,Regular,0.051794958,Fruits and Vegetables,122.6072,OUT010,1998,,Tier 3,Grocery Store,122.5072 +FDL03,19.25,Regular,0.027058066,Meat,194.811,OUT013,1987,High,Tier 3,Supermarket Type1,2749.754 +FDX04,19.6,Regular,0.041740902,Frozen Foods,49.2376,OUT018,2009,Medium,Tier 3,Supermarket Type2,958.752 +FDV19,14.85,Regular,0.035400659,Fruits and Vegetables,161.9578,OUT018,2009,Medium,Tier 3,Supermarket Type2,1444.1202 +FDP22,14.65,Regular,0.099535996,Snack Foods,52.2666,OUT018,2009,Medium,Tier 3,Supermarket Type2,615.1992 +FDT34,9.3,Low Fat,0.175336471,Snack Foods,107.0964,OUT017,2007,,Tier 2,Supermarket Type1,1472.7496 +FDZ26,,Regular,0.143319995,Dairy,237.5222,OUT027,1985,Medium,Tier 3,Supermarket Type3,7170.666 +NCM43,14.5,Low Fat,0.01950565,Others,163.921,OUT049,1999,Medium,Tier 1,Supermarket Type1,2446.815 +DRK35,8.365,Low Fat,0.071846495,Hard Drinks,37.9506,OUT046,1997,Small,Tier 1,Supermarket Type1,569.259 +FDO20,12.85,Regular,0,Fruits and Vegetables,252.3382,OUT046,1997,Small,Tier 1,Supermarket Type1,4794.4258 +FDO22,13.5,Regular,0.017887238,Snack Foods,79.496,OUT049,1999,Medium,Tier 1,Supermarket Type1,1438.128 +FDM46,7.365,Low Fat,0.159967845,Snack Foods,94.712,OUT046,1997,Small,Tier 1,Supermarket Type1,1304.968 +FDO01,21.1,Regular,0.020718655,Breakfast,130.4994,OUT046,1997,Small,Tier 1,Supermarket Type1,2184.4898 +NCX05,,Low Fat,0.096592065,Health and Hygiene,117.4492,OUT027,1985,Medium,Tier 3,Supermarket Type3,1621.8888 +FDI46,9.5,Low Fat,0.074460855,Snack Foods,253.6724,OUT049,1999,Medium,Tier 1,Supermarket Type1,5033.448 +FDD11,12.85,Low Fat,0.030789914,Starchy Foods,254.904,OUT017,2007,,Tier 2,Supermarket Type1,3036.048 +FDA32,14,Low Fat,0.030216783,Fruits and Vegetables,216.6192,OUT018,2009,Medium,Tier 3,Supermarket Type2,3020.0688 +FDW32,18.35,Regular,0.094279004,Fruits and Vegetables,86.3882,OUT035,2004,Small,Tier 2,Supermarket Type1,1545.9876 +FDX22,,Regular,0.04022593,Snack Foods,210.9928,OUT019,1985,Small,Tier 1,Grocery Store,210.3928 +FDQ47,7.155,Regular,0.168527463,Breads,33.6874,OUT045,2002,,Tier 2,Supermarket Type1,1023.3346 +FDT07,5.82,Regular,0.077304459,Fruits and Vegetables,257.633,OUT035,2004,Small,Tier 2,Supermarket Type1,4613.994 +NCQ43,17.75,Low Fat,0,Others,108.6912,OUT018,2009,Medium,Tier 3,Supermarket Type2,1201.1032 +FDW07,18,Regular,0.142570104,Fruits and Vegetables,88.2514,OUT013,1987,High,Tier 3,Supermarket Type1,1505.3738 +FDE35,7.06,Regular,0.043968652,Starchy Foods,57.6904,OUT049,1999,Medium,Tier 1,Supermarket Type1,585.904 +FDC04,15.6,Low Fat,0.045076878,Dairy,241.3854,OUT045,2002,,Tier 2,Supermarket Type1,2900.2248 +NCW53,,Low Fat,0.030347404,Health and Hygiene,192.5162,OUT027,1985,Medium,Tier 3,Supermarket Type3,3078.6592 +NCG07,12.3,Low Fat,0.052492122,Household,191.053,OUT035,2004,Small,Tier 2,Supermarket Type1,3415.554 +FDQ03,15,Regular,0.077999504,Meat,238.0248,OUT035,2004,Small,Tier 2,Supermarket Type1,1896.1984 +FDV46,18.2,Low Fat,0.012597384,Snack Foods,141.218,OUT013,1987,High,Tier 3,Supermarket Type1,2936.178 +NCM26,20.5,LF,0.023179181,Others,154.034,OUT049,1999,Medium,Tier 1,Supermarket Type1,2450.144 +DRA59,8.27,Regular,0.128126825,Soft Drinks,183.6924,OUT049,1999,Medium,Tier 1,Supermarket Type1,1295.6468 +FDW13,,Low Fat,0.097410707,Canned,52.7324,OUT027,1985,Medium,Tier 3,Supermarket Type3,2492.7552 +DRF27,8.93,Low Fat,0.028417272,Dairy,154.534,OUT046,1997,Small,Tier 1,Supermarket Type1,2603.278 +FDT12,6.215,Regular,0.049902382,Baking Goods,225.8062,OUT017,2007,,Tier 2,Supermarket Type1,3159.8868 +FDD40,20.25,Regular,0.014823358,Dairy,190.7162,OUT045,2002,,Tier 2,Supermarket Type1,1154.4972 +FDN25,7.895,Regular,0.061424738,Breakfast,57.7588,OUT018,2009,Medium,Tier 3,Supermarket Type2,1145.176 +FDE33,19.35,Regular,0.049594299,Fruits and Vegetables,77.0644,OUT013,1987,High,Tier 3,Supermarket Type1,2278.3676 +NCL29,9.695,Low Fat,0.113939434,Health and Hygiene,160.2604,OUT046,1997,Small,Tier 1,Supermarket Type1,1901.5248 +NCO30,,Low Fat,0.027532258,Household,185.0608,OUT019,1985,Small,Tier 1,Grocery Store,551.2824 +FDB16,8.21,Low Fat,0.045016894,Dairy,87.6198,OUT045,2002,,Tier 2,Supermarket Type1,1133.8574 +FDF16,7.3,Low Fat,0.086307051,Frozen Foods,146.8076,OUT045,2002,,Tier 2,Supermarket Type1,1330.2684 +FDL02,20,Regular,0.104083376,Canned,107.4622,OUT046,1997,Small,Tier 1,Supermarket Type1,3705.177 +FDO13,7.865,Low Fat,0.061154604,Breakfast,165.3526,OUT049,1999,Medium,Tier 1,Supermarket Type1,1151.1682 +DRG27,,Low Fat,0.184035253,Dairy,42.2138,OUT019,1985,Small,Tier 1,Grocery Store,40.6138 +FDX31,20.35,Regular,0.024815024,Fruits and Vegetables,234.0958,OUT010,1998,,Tier 3,Grocery Store,467.3916 +FDX11,16,Regular,0.106918052,Baking Goods,183.5634,OUT049,1999,Medium,Tier 1,Supermarket Type1,4725.8484 +NCW41,18,Low Fat,0,Health and Hygiene,158.0604,OUT049,1999,Medium,Tier 1,Supermarket Type1,3327.6684 +FDI52,18.7,Low Fat,0.105104552,Frozen Foods,121.7072,OUT018,2009,Medium,Tier 3,Supermarket Type2,1347.5792 +FDN08,,Regular,0.087936752,Fruits and Vegetables,115.9466,OUT027,1985,Medium,Tier 3,Supermarket Type3,4124.631 +DRD15,10.6,Low Fat,0.056795923,Dairy,232.8642,OUT046,1997,Small,Tier 1,Supermarket Type1,3485.463 +DRF01,5.655,LF,0.176070535,Soft Drinks,144.0102,OUT017,2007,,Tier 2,Supermarket Type1,1749.7224 +DRH15,,Low Fat,0.19244045,Dairy,43.9428,OUT019,1985,Small,Tier 1,Grocery Store,131.8284 +FDX59,10.195,Low Fat,0.051871718,Breads,35.3558,OUT018,2009,Medium,Tier 3,Supermarket Type2,237.6906 +FDO37,8.06,Low Fat,0.035780177,Breakfast,230.2326,OUT010,1998,,Tier 3,Grocery Store,693.0978 +FDY56,16.35,Regular,0.104463896,Fruits and Vegetables,227.1062,OUT010,1998,,Tier 3,Grocery Store,225.7062 +FDR31,6.46,Regular,0.049162885,Fruits and Vegetables,146.9102,OUT046,1997,Small,Tier 1,Supermarket Type1,1895.5326 +NCH54,13.5,Low Fat,0.072655379,Household,157.792,OUT035,2004,Small,Tier 2,Supermarket Type1,3994.8 +NCW06,16.2,Low Fat,0.050442528,Household,190.8162,OUT045,2002,,Tier 2,Supermarket Type1,2693.8268 +NCC18,19.1,Low Fat,0.177992139,Household,173.1422,OUT018,2009,Medium,Tier 3,Supermarket Type2,2931.5174 +DRJ23,,Low Fat,0,Hard Drinks,188.1872,OUT027,1985,Medium,Tier 3,Supermarket Type3,3214.4824 +FDO16,5.48,Low Fat,0.015131684,Frozen Foods,83.025,OUT049,1999,Medium,Tier 1,Supermarket Type1,1414.825 +FDB08,6.055,Low Fat,0.031151714,Fruits and Vegetables,158.7578,OUT049,1999,Medium,Tier 1,Supermarket Type1,2085.9514 +NCZ53,9.6,Low Fat,0.024456797,Health and Hygiene,186.6214,OUT013,1987,High,Tier 3,Supermarket Type1,3203.1638 +DRJ01,6.135,Low Fat,0.192540665,Soft Drinks,160.2236,OUT010,1998,,Tier 3,Grocery Store,322.2472 +DRE48,8.43,Low Fat,0.01732573,Soft Drinks,197.9768,OUT046,1997,Small,Tier 1,Supermarket Type1,1182.4608 +DRA59,8.27,Regular,0.127821472,Soft Drinks,185.9924,OUT013,1987,High,Tier 3,Supermarket Type1,555.2772 +FDS27,10.195,Regular,0.012477512,Meat,197.111,OUT049,1999,Medium,Tier 1,Supermarket Type1,785.644 +NCW29,14,Low Fat,0.028980533,Health and Hygiene,129.531,OUT018,2009,Medium,Tier 3,Supermarket Type2,2077.296 +DRN35,8.01,Low Fat,0.070356805,Hard Drinks,36.8532,OUT049,1999,Medium,Tier 1,Supermarket Type1,755.0172 +FDB09,16.25,Low Fat,0.057396092,Fruits and Vegetables,125.8046,OUT046,1997,Small,Tier 1,Supermarket Type1,747.0276 +FDV59,13.35,Low Fat,0.048017962,Breads,219.6166,OUT035,2004,Small,Tier 2,Supermarket Type1,3483.4656 +FDD26,,Regular,0.071806046,Canned,186.5924,OUT027,1985,Medium,Tier 3,Supermarket Type3,5182.5872 +FDV55,17.75,Low Fat,0.05507343,Fruits and Vegetables,145.1444,OUT046,1997,Small,Tier 1,Supermarket Type1,1886.8772 +FDH48,13.5,Low Fat,0,Baking Goods,88.054,OUT013,1987,High,Tier 3,Supermarket Type1,1211.756 +FDM51,11.8,Regular,0,Meat,102.4674,OUT010,1998,,Tier 3,Grocery Store,203.7348 +DRG48,5.78,Low Fat,0.014577695,Soft Drinks,147.2102,OUT049,1999,Medium,Tier 1,Supermarket Type1,1895.5326 +FDP49,9,Regular,0,Breakfast,55.2614,OUT018,2009,Medium,Tier 3,Supermarket Type2,552.614 +FDB03,17.75,Regular,0.156831826,Dairy,241.0538,OUT046,1997,Small,Tier 1,Supermarket Type1,1201.769 +FDL10,8.395,Low Fat,0,Snack Foods,98.7042,OUT013,1987,High,Tier 3,Supermarket Type1,892.8378 +FDJ32,,Low Fat,0.057512481,Fruits and Vegetables,62.5536,OUT027,1985,Medium,Tier 3,Supermarket Type3,1592.5936 +FDD11,12.85,LF,0,Starchy Foods,253.004,OUT018,2009,Medium,Tier 3,Supermarket Type2,3795.06 +FDW13,8.5,Low Fat,0.098036903,Canned,51.5324,OUT049,1999,Medium,Tier 1,Supermarket Type1,882.8508 +FDA32,14,LF,0,Fruits and Vegetables,216.9192,OUT017,2007,,Tier 2,Supermarket Type1,6471.576 +DRQ35,9.3,low fat,0.042377219,Hard Drinks,123.7388,OUT045,2002,,Tier 2,Supermarket Type1,1609.9044 +DRI37,15.85,Low Fat,0.107597879,Soft Drinks,58.7904,OUT046,1997,Small,Tier 1,Supermarket Type1,585.904 +FDU38,10.8,Low Fat,0.082549896,Dairy,193.7504,OUT046,1997,Small,Tier 1,Supermarket Type1,4602.0096 +FDJ07,7.26,Low Fat,0.02414202,Meat,117.415,OUT010,1998,,Tier 3,Grocery Store,466.06 +FDT38,18.7,Low Fat,0.057771828,Dairy,85.3566,OUT018,2009,Medium,Tier 3,Supermarket Type2,591.8962 +FDX02,16,Low Fat,0.057292529,Dairy,224.3404,OUT018,2009,Medium,Tier 3,Supermarket Type2,4500.808 +NCN18,8.895,Low Fat,0.124610886,Household,113.1544,OUT013,1987,High,Tier 3,Supermarket Type1,4250.4672 +FDQ13,11.1,Low Fat,0.010663189,Canned,82.3908,OUT045,2002,,Tier 2,Supermarket Type1,1342.2528 +DRP35,18.85,Low Fat,0.091237452,Hard Drinks,128.9336,OUT018,2009,Medium,Tier 3,Supermarket Type2,1278.336 +DRK47,7.905,Low Fat,0.064325351,Hard Drinks,230.2694,OUT018,2009,Medium,Tier 3,Supermarket Type2,3197.1716 +DRI47,14.7,Low Fat,0.020920179,Hard Drinks,143.8128,OUT046,1997,Small,Tier 1,Supermarket Type1,3020.0688 +FDK20,12.6,Regular,0.041641933,Fruits and Vegetables,121.1072,OUT045,2002,,Tier 2,Supermarket Type1,980.0576 +FDC34,16,Regular,0.173462841,Snack Foods,157.6972,OUT018,2009,Medium,Tier 3,Supermarket Type2,2960.1468 +FDI15,,Low Fat,0.24749009,Dairy,263.1884,OUT019,1985,Small,Tier 1,Grocery Store,529.9768 +FDG05,,Regular,0.087421738,Frozen Foods,154.463,OUT027,1985,Medium,Tier 3,Supermarket Type3,2972.797 +FDK34,13.35,Low Fat,0.038744606,Snack Foods,239.3564,OUT017,2007,,Tier 2,Supermarket Type1,3098.6332 +FDX50,20.1,Low Fat,0.124910635,Dairy,109.6228,OUT010,1998,,Tier 3,Grocery Store,110.5228 +FDP56,8.185,Low Fat,0.046673494,Fruits and Vegetables,48.4692,OUT018,2009,Medium,Tier 3,Supermarket Type2,591.2304 +NCX54,9.195,Low Fat,0.048134591,Household,107.7622,OUT049,1999,Medium,Tier 1,Supermarket Type1,529.311 +FDI20,19.1,Low Fat,0.038720852,Fruits and Vegetables,210.8586,OUT018,2009,Medium,Tier 3,Supermarket Type2,6331.758 +FDH33,12.85,Low Fat,0.12241394,Snack Foods,42.9428,OUT017,2007,,Tier 2,Supermarket Type1,703.0848 +NCO29,11.15,Low Fat,0.032321608,Health and Hygiene,165.6526,OUT045,2002,,Tier 2,Supermarket Type1,1315.6208 +FDK22,9.8,Low Fat,0.026139404,Snack Foods,216.785,OUT045,2002,,Tier 2,Supermarket Type1,1947.465 +DRO47,10.195,Low Fat,0,Hard Drinks,114.086,OUT046,1997,Small,Tier 1,Supermarket Type1,1810.976 +FDT19,,Regular,0.144338493,Fruits and Vegetables,172.108,OUT027,1985,Medium,Tier 3,Supermarket Type3,4327.7 +FDY25,12,Low Fat,0.034166609,Canned,181.2976,OUT017,2007,,Tier 2,Supermarket Type1,5070.7328 +FDS44,,Regular,0.27321283,Fruits and Vegetables,240.9538,OUT019,1985,Small,Tier 1,Grocery Store,480.7076 +FDJ21,16.7,Regular,0.03858813,Snack Foods,144.6102,OUT049,1999,Medium,Tier 1,Supermarket Type1,3353.6346 +FDO40,17.1,LF,0.032628111,Frozen Foods,148.7392,OUT046,1997,Small,Tier 1,Supermarket Type1,1640.5312 +FDL36,,Low Fat,0.133198355,Baking Goods,91.083,OUT019,1985,Small,Tier 1,Grocery Store,89.883 +FDJ21,16.7,Regular,0.038528228,Snack Foods,143.9102,OUT046,1997,Small,Tier 1,Supermarket Type1,1749.7224 +FDD05,19.35,Low Fat,0.016705436,Frozen Foods,120.8098,OUT017,2007,,Tier 2,Supermarket Type1,3374.2744 +FDS10,19.2,Low Fat,0.058893461,Snack Foods,178.9318,OUT010,1998,,Tier 3,Grocery Store,180.4318 +FDG14,,Regular,0.050256161,Canned,150.9024,OUT027,1985,Medium,Tier 3,Supermarket Type3,4857.6768 +FDN57,18.25,Low Fat,0.054234197,Snack Foods,142.0154,OUT046,1997,Small,Tier 1,Supermarket Type1,2269.0464 +FDS47,16.75,Low Fat,0.12961476,Breads,86.1856,OUT017,2007,,Tier 2,Supermarket Type1,1406.1696 +FDO40,17.1,Low Fat,0.054612768,Frozen Foods,150.2392,OUT010,1998,,Tier 3,Grocery Store,596.5568 +FDM50,13,Regular,0.030150193,Canned,61.422,OUT045,2002,,Tier 2,Supermarket Type1,539.298 +FDF44,7.17,Regular,0.059849153,Fruits and Vegetables,129.4968,OUT045,2002,,Tier 2,Supermarket Type1,3392.9168 +FDS21,19.85,reg,0.034942397,Snack Foods,61.9194,OUT010,1998,,Tier 3,Grocery Store,123.8388 +NCJ06,,Low Fat,0.060672263,Household,119.8782,OUT019,1985,Small,Tier 1,Grocery Store,238.3564 +FDX49,4.615,Regular,0.102038294,Canned,231.93,OUT045,2002,,Tier 2,Supermarket Type1,2563.33 +FDU33,7.63,Regular,0.135258515,Snack Foods,47.2402,OUT018,2009,Medium,Tier 3,Supermarket Type2,918.804 +NCN06,8.39,Low Fat,0.120396991,Household,163.4868,OUT013,1987,High,Tier 3,Supermarket Type1,4586.0304 +NCN53,5.175,Low Fat,0.030527166,Health and Hygiene,33.5874,OUT017,2007,,Tier 2,Supermarket Type1,635.1732 +NCE30,16,Low Fat,0.099053537,Household,212.6902,OUT013,1987,High,Tier 3,Supermarket Type1,637.1706 +FDN21,,Low Fat,0.134564284,Snack Foods,159.8236,OUT019,1985,Small,Tier 1,Grocery Store,322.2472 +FDB52,,Low Fat,0.030288215,Dairy,256.7672,OUT027,1985,Medium,Tier 3,Supermarket Type3,4346.3424 +FDA26,,Regular,0.073562475,Dairy,217.6482,OUT027,1985,Medium,Tier 3,Supermarket Type3,3285.723 +FDD23,9.5,Regular,0.048883854,Starchy Foods,185.7898,OUT018,2009,Medium,Tier 3,Supermarket Type2,2619.2572 +FDH57,10.895,Low Fat,0.035893143,Fruits and Vegetables,131.3284,OUT018,2009,Medium,Tier 3,Supermarket Type2,1318.284 +FDO15,,Regular,0.014998914,Meat,72.4038,OUT019,1985,Small,Tier 1,Grocery Store,221.7114 +FDY49,17.2,Regular,0.012012071,Canned,163.1184,OUT046,1997,Small,Tier 1,Supermarket Type1,4623.3152 +FDP20,19.85,Low Fat,0.045855273,Fruits and Vegetables,127.102,OUT018,2009,Medium,Tier 3,Supermarket Type2,1771.028 +DRG11,6.385,Low Fat,0.14032811,Hard Drinks,109.1596,OUT010,1998,,Tier 3,Grocery Store,107.8596 +DRJ59,11.65,Low Fat,0.019402371,Hard Drinks,38.7164,OUT049,1999,Medium,Tier 1,Supermarket Type1,579.246 +FDP34,12.85,Low Fat,0,Snack Foods,155.463,OUT035,2004,Small,Tier 2,Supermarket Type1,4068.038 +FDY04,17.7,Regular,0.042716709,Frozen Foods,163.221,OUT017,2007,,Tier 2,Supermarket Type1,1794.331 +FDV11,9.1,Regular,0.081794766,Breads,173.6054,OUT049,1999,Medium,Tier 1,Supermarket Type1,700.4216 +FDG20,15.5,Regular,0.125942816,Fruits and Vegetables,176.0028,OUT045,2002,,Tier 2,Supermarket Type1,1239.7196 +NCH55,16.35,Low Fat,0,Household,127.902,OUT017,2007,,Tier 2,Supermarket Type1,2150.534 +FDV34,10.695,Regular,0.011472001,Snack Foods,75.2038,OUT018,2009,Medium,Tier 3,Supermarket Type2,517.3266 +FDT44,16.6,Low Fat,0.103146658,Fruits and Vegetables,117.2466,OUT049,1999,Medium,Tier 1,Supermarket Type1,2239.0854 +FDG35,,Regular,0.012327847,Starchy Foods,173.8738,OUT019,1985,Small,Tier 1,Grocery Store,347.5476 +FDG08,13.15,Regular,0.166032929,Fruits and Vegetables,170.8764,OUT018,2009,Medium,Tier 3,Supermarket Type2,2233.0932 +FDX52,11.5,Regular,0.04224015,Frozen Foods,194.982,OUT017,2007,,Tier 2,Supermarket Type1,3089.312 +NCH54,,Low Fat,0.072317217,Household,160.792,OUT027,1985,Medium,Tier 3,Supermarket Type3,3675.216 +FDU24,,Regular,0.139484292,Baking Goods,94.312,OUT027,1985,Medium,Tier 3,Supermarket Type3,2516.724 +FDW03,5.63,Regular,0.024536636,Meat,106.1306,OUT035,2004,Small,Tier 2,Supermarket Type1,2090.612 +FDV01,19.2,Regular,0.085296625,Canned,153.4314,OUT018,2009,Medium,Tier 3,Supermarket Type2,1861.5768 +FDQ39,,Low Fat,0.080649685,Meat,189.9846,OUT027,1985,Medium,Tier 3,Supermarket Type3,6114.7072 +FDA16,6.695,Low Fat,0,Frozen Foods,219.4456,OUT046,1997,Small,Tier 1,Supermarket Type1,3094.6384 +FDO12,15.75,Low Fat,0.054930533,Baking Goods,194.4452,OUT046,1997,Small,Tier 1,Supermarket Type1,5089.3752 +FDM44,12.5,Low Fat,0.031097948,Fruits and Vegetables,103.899,OUT049,1999,Medium,Tier 1,Supermarket Type1,1960.781 +FDT03,21.25,Low Fat,0.016735879,Meat,185.2608,OUT010,1998,,Tier 3,Grocery Store,183.7608 +NCQ18,,Low Fat,0.134418705,Household,99.67,OUT027,1985,Medium,Tier 3,Supermarket Type3,2596.62 +NCL18,18.85,Low Fat,0.168266556,Household,195.5136,OUT018,2009,Medium,Tier 3,Supermarket Type2,1749.7224 +NCJ06,20.1,Low Fat,0.034646067,Household,120.6782,OUT035,2004,Small,Tier 2,Supermarket Type1,1310.9602 +NCQ05,11.395,Low Fat,0.021639678,Health and Hygiene,150.1708,OUT049,1999,Medium,Tier 1,Supermarket Type1,2708.4744 +FDS35,9.3,Low Fat,0.11144608,Breads,64.6826,OUT045,2002,,Tier 2,Supermarket Type1,1097.9042 +NCI18,,Low Fat,0.013956116,Household,222.3746,OUT027,1985,Medium,Tier 3,Supermarket Type3,5609.365 +NCO55,12.8,Low Fat,0.152377658,Others,108.1938,OUT010,1998,,Tier 3,Grocery Store,428.7752 +FDW24,6.8,Low Fat,0.037465846,Baking Goods,47.5034,OUT013,1987,High,Tier 3,Supermarket Type1,534.6374 +NCS05,,low fat,0.020876485,Health and Hygiene,133.7942,OUT027,1985,Medium,Tier 3,Supermarket Type3,1722.4246 +FDO48,15,Regular,0.0268952,Baking Goods,220.3456,OUT045,2002,,Tier 2,Supermarket Type1,1989.4104 +FDT35,19.85,Regular,0.081916124,Breads,167.6816,OUT017,2007,,Tier 2,Supermarket Type1,1845.5976 +DRN11,7.85,Low Fat,0.163233667,Hard Drinks,144.6444,OUT049,1999,Medium,Tier 1,Supermarket Type1,2467.4548 +FDY57,20.2,Regular,0.121748174,Snack Foods,96.9752,OUT018,2009,Medium,Tier 3,Supermarket Type2,1725.7536 +DRE27,11.85,Low Fat,0.132939639,Dairy,98.0726,OUT045,2002,,Tier 2,Supermarket Type1,1761.7068 +FDM24,6.135,Regular,0.079327367,Baking Goods,152.8366,OUT046,1997,Small,Tier 1,Supermarket Type1,2871.5954 +FDX09,9,LF,0.065194971,Snack Foods,177.737,OUT013,1987,High,Tier 3,Supermarket Type1,2117.244 +FDY45,17.5,Low Fat,0.026248606,Snack Foods,255.1356,OUT018,2009,Medium,Tier 3,Supermarket Type2,3815.034 +FDF41,12.15,Low Fat,0.131921819,Frozen Foods,246.346,OUT017,2007,,Tier 2,Supermarket Type1,739.038 +FDG05,11,Regular,0,Frozen Foods,155.263,OUT049,1999,Medium,Tier 1,Supermarket Type1,625.852 +FDF05,17.5,Low Fat,0.026865809,Frozen Foods,261.691,OUT035,2004,Small,Tier 2,Supermarket Type1,4207.856 +FDU19,,Regular,0.046544984,Fruits and Vegetables,172.0422,OUT027,1985,Medium,Tier 3,Supermarket Type3,4828.3816 +DRH39,,Low Fat,0.092241348,Dairy,75.867,OUT027,1985,Medium,Tier 3,Supermarket Type3,2450.144 +FDP57,17.5,Low Fat,0.052740763,Snack Foods,103.799,OUT017,2007,,Tier 2,Supermarket Type1,1135.189 +FDE58,,Low Fat,0,Snack Foods,119.8124,OUT027,1985,Medium,Tier 3,Supermarket Type3,1659.1736 +DRD15,10.6,Low Fat,0.056748659,Dairy,233.6642,OUT013,1987,High,Tier 3,Supermarket Type1,3950.1914 +FDJ52,7.145,Low Fat,0.017822936,Frozen Foods,161.3578,OUT045,2002,,Tier 2,Supermarket Type1,1123.2046 +FDS01,,Low Fat,0.017659068,Canned,175.9686,OUT027,1985,Medium,Tier 3,Supermarket Type3,5866.3638 +FDZ47,20.7,Regular,0.07929647,Baking Goods,97.2042,OUT046,1997,Small,Tier 1,Supermarket Type1,1686.4714 +FDG35,,reg,0.007006883,Starchy Foods,173.5738,OUT027,1985,Medium,Tier 3,Supermarket Type3,1216.4166 +FDY45,17.5,Low Fat,0.026195131,Snack Foods,252.6356,OUT045,2002,,Tier 2,Supermarket Type1,2543.356 +FDY04,17.7,Regular,0.042542484,Frozen Foods,161.921,OUT049,1999,Medium,Tier 1,Supermarket Type1,2120.573 +FDY47,8.6,Regular,0.054474158,Breads,131.031,OUT035,2004,Small,Tier 2,Supermarket Type1,1038.648 +FDE28,9.5,Regular,0,Frozen Foods,228.4668,OUT049,1999,Medium,Tier 1,Supermarket Type1,3916.2356 +FDJ27,17.7,Regular,0.122372504,Meat,101.5674,OUT018,2009,Medium,Tier 3,Supermarket Type2,1629.8784 +FDH58,12.3,low fat,0.037148619,Snack Foods,116.8834,OUT017,2007,,Tier 2,Supermarket Type1,2649.2182 +NCV42,6.26,Low Fat,0.052593952,Household,111.0228,OUT010,1998,,Tier 3,Grocery Store,221.0456 +NCQ54,17.7,Low Fat,0.012593467,Household,167.6474,OUT018,2009,Medium,Tier 3,Supermarket Type2,3874.2902 +FDL44,18.25,Low Fat,0.012325122,Fruits and Vegetables,162.8894,OUT018,2009,Medium,Tier 3,Supermarket Type2,647.1576 +FDY50,5.8,LF,0.131489269,Dairy,89.7172,OUT018,2009,Medium,Tier 3,Supermarket Type2,1605.9096 +FDR59,14.5,Regular,0.064224789,Breads,262.7594,OUT017,2007,,Tier 2,Supermarket Type1,7064.8038 +FDH35,18.25,Low Fat,0.060589424,Starchy Foods,162.5526,OUT017,2007,,Tier 2,Supermarket Type1,986.7156 +FDX08,12.85,Low Fat,0.022649893,Fruits and Vegetables,179.3318,OUT045,2002,,Tier 2,Supermarket Type1,1263.0226 +FDL20,17.1,Low Fat,0.128390273,Fruits and Vegetables,111.9886,OUT035,2004,Small,Tier 2,Supermarket Type1,1445.4518 +FDB27,7.575,Low Fat,0.055476238,Dairy,196.8768,OUT049,1999,Medium,Tier 1,Supermarket Type1,1182.4608 +FDA56,9.21,Low Fat,0.008757492,Fruits and Vegetables,120.8414,OUT013,1987,High,Tier 3,Supermarket Type1,2071.3038 +FDV39,11.3,Low Fat,0.007273831,Meat,196.6426,OUT013,1987,High,Tier 3,Supermarket Type1,5141.3076 +FDU38,,LF,0.144534212,Dairy,190.6504,OUT019,1985,Small,Tier 1,Grocery Store,575.2512 +FDT55,13.6,Regular,0.043743689,Fruits and Vegetables,157.7946,OUT045,2002,,Tier 2,Supermarket Type1,1104.5622 +FDS24,20.85,Regular,0.062477955,Baking Goods,87.2514,OUT018,2009,Medium,Tier 3,Supermarket Type2,1505.3738 +FDS15,9.195,Regular,0.078060601,Meat,106.3596,OUT046,1997,Small,Tier 1,Supermarket Type1,2912.2092 +FDF05,,Low Fat,0.026740767,Frozen Foods,261.291,OUT027,1985,Medium,Tier 3,Supermarket Type3,5522.811 +DRP47,15.75,Low Fat,0.140821917,Hard Drinks,252.9382,OUT049,1999,Medium,Tier 1,Supermarket Type1,2775.7202 +FDA25,16.5,Regular,0.068403271,Canned,101.999,OUT018,2009,Medium,Tier 3,Supermarket Type2,619.194 +FDA19,,Low Fat,0,Fruits and Vegetables,126.6994,OUT019,1985,Small,Tier 1,Grocery Store,256.9988 +NCM26,20.5,LF,0.02312394,Others,154.634,OUT013,1987,High,Tier 3,Supermarket Type1,2297.01 +FDS46,17.6,Regular,0.047449835,Snack Foods,118.1782,OUT018,2009,Medium,Tier 3,Supermarket Type2,2621.9204 +DRH15,8.775,Low Fat,0.110359004,Dairy,42.7428,OUT018,2009,Medium,Tier 3,Supermarket Type2,790.9704 +NCR05,10.1,Low Fat,0.054620504,Health and Hygiene,197.5084,OUT035,2004,Small,Tier 2,Supermarket Type1,2976.126 +NCY17,18.2,Low Fat,0,Health and Hygiene,44.1086,OUT045,2002,,Tier 2,Supermarket Type1,1115.215 +FDZ01,8.975,Regular,0.009051307,Canned,103.099,OUT013,1987,High,Tier 3,Supermarket Type1,309.597 +FDP31,,Regular,0.160722863,Fruits and Vegetables,65.7168,OUT027,1985,Medium,Tier 3,Supermarket Type3,2237.088 +FDE57,9.6,Low Fat,0.03625493,Fruits and Vegetables,141.0154,OUT013,1987,High,Tier 3,Supermarket Type1,2694.4926 +FDZ44,8.185,Low Fat,0.064824502,Fruits and Vegetables,116.0808,OUT010,1998,,Tier 3,Grocery Store,234.3616 +NCP53,14.75,Low Fat,0.033024328,Health and Hygiene,236.6906,OUT018,2009,Medium,Tier 3,Supermarket Type2,3089.9778 +NCA06,20.5,Low Fat,0.143574191,Household,37.219,OUT045,2002,,Tier 2,Supermarket Type1,476.047 +FDP22,14.65,Regular,0.099333217,Snack Foods,51.3666,OUT045,2002,,Tier 2,Supermarket Type1,1076.5986 +FDW37,19.2,Low Fat,0.12475207,Canned,90.9488,OUT017,2007,,Tier 2,Supermarket Type1,633.8416 +NCS30,5.945,Low Fat,0.093170838,Household,127.3652,OUT049,1999,Medium,Tier 1,Supermarket Type1,1549.9824 +FDB40,17.5,Regular,0.007538459,Dairy,144.2102,OUT035,2004,Small,Tier 2,Supermarket Type1,4082.6856 +FDC51,10.895,Regular,0.009676286,Dairy,122.873,OUT017,2007,,Tier 2,Supermarket Type1,3448.844 +FDC11,20.5,LF,0.141792841,Starchy Foods,89.7172,OUT046,1997,Small,Tier 1,Supermarket Type1,1159.8236 +FDC59,,Regular,0.05436436,Starchy Foods,63.8168,OUT027,1985,Medium,Tier 3,Supermarket Type3,958.752 +FDE14,13.65,Regular,0.031573246,Canned,99.47,OUT018,2009,Medium,Tier 3,Supermarket Type2,299.61 +NCT41,15.7,LF,0.055943697,Health and Hygiene,150.6024,OUT013,1987,High,Tier 3,Supermarket Type1,2428.8384 +FDP52,18.7,Regular,0,Frozen Foods,229.201,OUT035,2004,Small,Tier 2,Supermarket Type1,3215.814 +DRA24,19.35,Regular,0.066831682,Soft Drinks,163.8868,OUT010,1998,,Tier 3,Grocery Store,327.5736 +FDC40,16,Regular,0.065165046,Dairy,79.3986,OUT049,1999,Medium,Tier 1,Supermarket Type1,856.8846 +NCA42,6.965,Low Fat,0,Household,159.4604,OUT013,1987,High,Tier 3,Supermarket Type1,3169.208 +FDT27,11.395,Regular,0.069728296,Meat,233.9616,OUT045,2002,,Tier 2,Supermarket Type1,1406.1696 +NCW54,7.5,Low Fat,0.09660879,Household,56.9588,OUT045,2002,,Tier 2,Supermarket Type1,744.3644 +DRB13,6.115,Regular,0.007038478,Soft Drinks,189.253,OUT013,1987,High,Tier 3,Supermarket Type1,3605.307 +FDY02,,Regular,0.153456703,Dairy,264.091,OUT019,1985,Small,Tier 1,Grocery Store,262.991 +FDS59,14.8,Regular,0.043982464,Breads,110.657,OUT045,2002,,Tier 2,Supermarket Type1,2966.139 +FDR49,8.71,Low Fat,0.139202085,Canned,46.1376,OUT035,2004,Small,Tier 2,Supermarket Type1,383.5008 +FDY40,15.5,Regular,0.086184647,Frozen Foods,50.9692,OUT018,2009,Medium,Tier 3,Supermarket Type2,394.1536 +FDL48,19.35,Regular,0.082250863,Baking Goods,48.7034,OUT035,2004,Small,Tier 2,Supermarket Type1,534.6374 +DRI01,,Low Fat,0.034286109,Soft Drinks,173.1422,OUT027,1985,Medium,Tier 3,Supermarket Type3,5000.8238 +FDZ52,19.2,Low Fat,0.100482186,Frozen Foods,111.8886,OUT018,2009,Medium,Tier 3,Supermarket Type2,1667.829 +FDK32,16.25,Regular,0.049051717,Fruits and Vegetables,152.4682,OUT049,1999,Medium,Tier 1,Supermarket Type1,2439.4912 +FDK51,19.85,Low Fat,0.005230786,Dairy,265.1884,OUT013,1987,High,Tier 3,Supermarket Type1,5034.7796 +FDP28,13.65,Regular,0.08062523,Frozen Foods,259.6936,OUT035,2004,Small,Tier 2,Supermarket Type1,2087.9488 +DRZ24,7.535,Low Fat,0.081787519,Soft Drinks,120.844,OUT046,1997,Small,Tier 1,Supermarket Type1,2157.192 +FDG04,,Low Fat,0.010615026,Frozen Foods,185.1898,OUT019,1985,Small,Tier 1,Grocery Store,374.1796 +FDF58,,Low Fat,0.009534758,Snack Foods,64.551,OUT027,1985,Medium,Tier 3,Supermarket Type3,1201.769 +FDI21,5.59,Regular,0.056602818,Snack Foods,63.2168,OUT046,1997,Small,Tier 1,Supermarket Type1,1725.7536 +FDZ43,11,Regular,0.057047756,Fruits and Vegetables,240.4512,OUT035,2004,Small,Tier 2,Supermarket Type1,7028.1848 +FDI57,19.85,Low Fat,0.05410964,Seafood,195.0768,OUT049,1999,Medium,Tier 1,Supermarket Type1,1970.768 +FDV03,17.6,Low Fat,0.058209079,Meat,153.6314,OUT045,2002,,Tier 2,Supermarket Type1,5274.4676 +FDT12,6.215,Regular,0.083056555,Baking Goods,224.4062,OUT010,1998,,Tier 3,Grocery Store,225.7062 +FDF29,15.1,Regular,0.020015391,Frozen Foods,128.831,OUT018,2009,Medium,Tier 3,Supermarket Type2,1817.634 +FDU02,13.35,low fat,0.102426197,Dairy,230.6352,OUT013,1987,High,Tier 3,Supermarket Type1,5725.88 +FDD23,9.5,Regular,0.048761223,Starchy Foods,186.5898,OUT049,1999,Medium,Tier 1,Supermarket Type1,5238.5144 +FDN04,11.8,Regular,0,Frozen Foods,179.2344,OUT035,2004,Small,Tier 2,Supermarket Type1,2141.2128 +FDG29,17.6,Low Fat,0.056281276,Frozen Foods,40.3454,OUT035,2004,Small,Tier 2,Supermarket Type1,796.9626 +FDK51,19.85,Low Fat,0.008762556,Dairy,266.6884,OUT010,1998,,Tier 3,Grocery Store,264.9884 +FDB53,13.35,Low Fat,0.139669224,Frozen Foods,147.6392,OUT049,1999,Medium,Tier 1,Supermarket Type1,1938.8096 +DRI23,18.85,Low Fat,0.137972993,Hard Drinks,158.4578,OUT017,2007,,Tier 2,Supermarket Type1,1444.1202 +FDP57,17.5,Low Fat,0,Snack Foods,102.999,OUT046,1997,Small,Tier 1,Supermarket Type1,2992.771 +FDY57,20.2,reg,0.121940099,Snack Foods,95.3752,OUT017,2007,,Tier 2,Supermarket Type1,1150.5024 +NCT42,5.88,Low Fat,0.024926013,Household,149.9392,OUT049,1999,Medium,Tier 1,Supermarket Type1,1491.392 +FDZ21,,Regular,0.039031927,Snack Foods,95.641,OUT027,1985,Medium,Tier 3,Supermarket Type3,1737.738 +FDC50,15.85,Low Fat,0.13727,Canned,94.4094,OUT017,2007,,Tier 2,Supermarket Type1,1904.188 +FDT40,5.985,Low Fat,0.095989602,Frozen Foods,127.3678,OUT045,2002,,Tier 2,Supermarket Type1,508.6712 +FDD50,18.85,Low Fat,0.142443405,Canned,170.4132,OUT017,2007,,Tier 2,Supermarket Type1,4396.9432 +DRI23,18.85,Low Fat,0.137410256,Hard Drinks,161.7578,OUT049,1999,Medium,Tier 1,Supermarket Type1,1604.578 +FDQ46,7.51,Low Fat,0.104400238,Snack Foods,113.5544,OUT017,2007,,Tier 2,Supermarket Type1,894.8352 +NCW06,16.2,Low Fat,0,Household,190.8162,OUT035,2004,Small,Tier 2,Supermarket Type1,3271.0754 +NCX06,17.6,Low Fat,0.015750947,Household,182.5976,OUT018,2009,Medium,Tier 3,Supermarket Type2,1629.8784 +NCE19,8.97,Low Fat,0.092937216,Household,54.6956,OUT013,1987,High,Tier 3,Supermarket Type1,764.3384 +FDI60,7.22,Regular,0.03828933,Baking Goods,64.751,OUT013,1987,High,Tier 3,Supermarket Type1,126.502 +FDC47,,Low Fat,0.208162156,Snack Foods,228.1694,OUT019,1985,Small,Tier 1,Grocery Store,228.3694 +FDE02,8.71,Low Fat,0.121936216,Canned,94.4778,OUT017,2007,,Tier 2,Supermarket Type1,2628.5784 +FDE11,17.7,Regular,0.135646297,Starchy Foods,186.0924,OUT018,2009,Medium,Tier 3,Supermarket Type2,3516.7556 +FDP11,15.85,Low Fat,0.069240685,Breads,217.5166,OUT045,2002,,Tier 2,Supermarket Type1,653.1498 +FDB08,6.055,Low Fat,0.03127929,Fruits and Vegetables,160.3578,OUT017,2007,,Tier 2,Supermarket Type1,2406.867 +FDL48,,Regular,0.08186804,Baking Goods,46.8034,OUT027,1985,Medium,Tier 3,Supermarket Type3,1069.2748 +FDH26,19.25,Regular,0.034753686,Canned,141.5496,OUT049,1999,Medium,Tier 1,Supermarket Type1,1976.0944 +FDI33,16.5,Low Fat,0.028476451,Snack Foods,91.0146,OUT045,2002,,Tier 2,Supermarket Type1,1368.219 +FDQ26,13.5,Regular,0.067872402,Dairy,57.8562,OUT046,1997,Small,Tier 1,Supermarket Type1,355.5372 +FDN03,,Regular,0.026420581,Meat,250.9408,OUT019,1985,Small,Tier 1,Grocery Store,1001.3632 +FDO13,7.865,Low Fat,0.061183503,Breakfast,164.5526,OUT045,2002,,Tier 2,Supermarket Type1,1644.526 +NCJ29,10.6,Low Fat,0.035247642,Health and Hygiene,84.7224,OUT049,1999,Medium,Tier 1,Supermarket Type1,1619.2256 +FDE52,,Regular,0.02974207,Dairy,88.9514,OUT027,1985,Medium,Tier 3,Supermarket Type3,3453.5046 +FDA52,16.2,Regular,0.128397995,Frozen Foods,178.337,OUT035,2004,Small,Tier 2,Supermarket Type1,1411.496 +FDF57,14.5,Regular,0.058918844,Fruits and Vegetables,169.7448,OUT049,1999,Medium,Tier 1,Supermarket Type1,3238.4512 +NCO26,7.235,Low Fat,0.076791671,Household,116.4492,OUT013,1987,High,Tier 3,Supermarket Type1,2316.984 +DRL59,16.75,Low Fat,0.021220113,Hard Drinks,55.1298,OUT035,2004,Small,Tier 2,Supermarket Type1,1240.3854 +FDC60,,Regular,0.2004264,Baking Goods,88.8514,OUT019,1985,Small,Tier 1,Grocery Store,265.6542 +DRD25,,Low Fat,0.078589629,Soft Drinks,113.286,OUT027,1985,Medium,Tier 3,Supermarket Type3,2716.464 +FDB26,14,Regular,0.031261583,Canned,52.564,OUT035,2004,Small,Tier 2,Supermarket Type1,639.168 +FDK51,19.85,Low Fat,0.005235143,Dairy,265.8884,OUT046,1997,Small,Tier 1,Supermarket Type1,2649.884 +FDE53,10.895,Low Fat,0.027032204,Frozen Foods,106.328,OUT017,2007,,Tier 2,Supermarket Type1,852.224 +FDV24,5.635,Low Fat,0.172856719,Baking Goods,148.205,OUT010,1998,,Tier 3,Grocery Store,449.415 +FDI34,10.65,Regular,0.085617517,Snack Foods,229.3668,OUT017,2007,,Tier 2,Supermarket Type1,2303.668 +FDL36,15.1,Low Fat,0.127334766,Baking Goods,88.283,OUT010,1998,,Tier 3,Grocery Store,89.883 +NCA54,16.5,Low Fat,0.036641597,Household,178.7318,OUT046,1997,Small,Tier 1,Supermarket Type1,1263.0226 +FDI38,13.35,Regular,0.014656564,Canned,208.5638,OUT045,2002,,Tier 2,Supermarket Type1,2277.7018 +FDG31,12.15,Low Fat,0.037864854,Meat,63.0826,OUT013,1987,High,Tier 3,Supermarket Type1,322.913 +FDA21,13.65,Low Fat,0.036016619,Snack Foods,186.3924,OUT049,1999,Medium,Tier 1,Supermarket Type1,1295.6468 +FDI09,20.75,Regular,0.12953868,Seafood,240.288,OUT049,1999,Medium,Tier 1,Supermarket Type1,2396.88 +FDI20,19.1,Low Fat,0.038531668,Fruits and Vegetables,210.6586,OUT013,1987,High,Tier 3,Supermarket Type1,5487.5236 +DRI51,17.25,LF,0,Dairy,171.5764,OUT045,2002,,Tier 2,Supermarket Type1,4637.9628 +DRZ11,,Regular,0.112119359,Soft Drinks,123.0388,OUT027,1985,Medium,Tier 3,Supermarket Type3,1981.4208 +FDY07,,Low Fat,0,Fruits and Vegetables,45.9402,OUT027,1985,Medium,Tier 3,Supermarket Type3,872.8638 +FDC58,10.195,Low Fat,0.041907414,Snack Foods,43.8428,OUT013,1987,High,Tier 3,Supermarket Type1,175.7712 +NCC30,16.6,Low Fat,0.027556247,Household,176.6344,OUT013,1987,High,Tier 3,Supermarket Type1,1962.7784 +FDY03,17.6,Regular,0.076058484,Meat,111.8202,OUT013,1987,High,Tier 3,Supermarket Type1,2025.3636 +FDZ44,8.185,Low Fat,0.038729057,Fruits and Vegetables,117.1808,OUT046,1997,Small,Tier 1,Supermarket Type1,1874.8928 +FDP28,13.65,Regular,0.080804019,Frozen Foods,261.1936,OUT045,2002,,Tier 2,Supermarket Type1,2348.9424 +DRD15,10.6,Low Fat,0.056884225,Dairy,231.9642,OUT049,1999,Medium,Tier 1,Supermarket Type1,3020.7346 +FDL08,10.8,Low Fat,0.050000257,Fruits and Vegetables,243.9144,OUT017,2007,,Tier 2,Supermarket Type1,4655.2736 +FDP25,15.2,Low Fat,0.021207519,Canned,219.4824,OUT046,1997,Small,Tier 1,Supermarket Type1,1747.0592 +DRK59,8.895,Low Fat,0,Hard Drinks,232.9616,OUT045,2002,,Tier 2,Supermarket Type1,2812.3392 +DRJ24,11.8,Low Fat,0.113307794,Soft Drinks,187.0924,OUT035,2004,Small,Tier 2,Supermarket Type1,1850.924 +FDU33,7.63,Regular,0.225476528,Snack Foods,45.1402,OUT010,1998,,Tier 3,Grocery Store,45.9402 +FDX47,6.55,Regular,0.034800079,Breads,157.5288,OUT017,2007,,Tier 2,Supermarket Type1,1571.288 +FDR46,16.85,Low Fat,0.139301634,Snack Foods,144.976,OUT013,1987,High,Tier 3,Supermarket Type1,2783.044 +FDZ56,,Low Fat,0.025612348,Fruits and Vegetables,168.2474,OUT027,1985,Medium,Tier 3,Supermarket Type3,3200.5006 +NCO26,7.235,Low Fat,0.077290355,Household,116.9492,OUT017,2007,,Tier 2,Supermarket Type1,2316.984 +FDV38,19.25,Low Fat,0.1017546,Dairy,55.1956,OUT035,2004,Small,Tier 2,Supermarket Type1,491.3604 +FDL13,13.85,Regular,0.094265737,Breakfast,233.93,OUT010,1998,,Tier 3,Grocery Store,233.03 +FDD57,18.1,LF,0.022380952,Fruits and Vegetables,93.6094,OUT013,1987,High,Tier 3,Supermarket Type1,476.047 +FDE46,18.6,Low Fat,0.01575657,Snack Foods,153.1366,OUT013,1987,High,Tier 3,Supermarket Type1,3173.8686 +FDB28,6.615,Low Fat,0.156307983,Dairy,196.3426,OUT010,1998,,Tier 3,Grocery Store,790.9704 +FDC41,15.6,Low Fat,0.195688803,Frozen Foods,77.367,OUT010,1998,,Tier 3,Grocery Store,153.134 +DRI23,18.85,Low Fat,0.13747519,Hard Drinks,158.6578,OUT045,2002,,Tier 2,Supermarket Type1,3369.6138 +FDL33,7.235,Low Fat,0,Snack Foods,197.2452,OUT035,2004,Small,Tier 2,Supermarket Type1,2348.9424 +FDS03,7.825,Low Fat,0.07962861,Meat,63.4826,OUT046,1997,Small,Tier 1,Supermarket Type1,2002.0606 +NCY18,,Low Fat,0.03100078,Household,177.0054,OUT027,1985,Medium,Tier 3,Supermarket Type3,2101.2648 +FDE50,19.7,Regular,0.016202582,Canned,188.2556,OUT035,2004,Small,Tier 2,Supermarket Type1,3379.6008 +FDT02,12.6,Low Fat,0.024190156,Dairy,34.4874,OUT035,2004,Small,Tier 2,Supermarket Type1,494.0236 +FDI34,10.65,Regular,0.085308611,Snack Foods,230.2668,OUT045,2002,,Tier 2,Supermarket Type1,5759.17 +FDO15,16.75,Regular,0.008564925,Meat,73.2038,OUT035,2004,Small,Tier 2,Supermarket Type1,1404.1722 +DRI39,13.8,LF,0.097457483,Dairy,55.393,OUT018,2009,Medium,Tier 3,Supermarket Type2,1018.674 +NCO14,9.6,Low Fat,0.029619203,Household,43.6086,OUT013,1987,High,Tier 3,Supermarket Type1,624.5204 +NCN19,13.1,Low Fat,0,Others,189.253,OUT046,1997,Small,Tier 1,Supermarket Type1,1518.024 +DRJ25,14.6,Low Fat,0.150872868,Soft Drinks,47.5692,OUT045,2002,,Tier 2,Supermarket Type1,1379.5376 +FDE10,6.67,Regular,0.09031453,Snack Foods,130.5626,OUT018,2009,Medium,Tier 3,Supermarket Type2,1180.4634 +FDQ08,15.7,Regular,0.018930352,Fruits and Vegetables,59.4536,OUT046,1997,Small,Tier 1,Supermarket Type1,857.5504 +NCQ43,17.75,LF,0.111209003,Others,107.7912,OUT013,1987,High,Tier 3,Supermarket Type1,982.7208 +FDY57,20.2,reg,0.121153331,Snack Foods,97.3752,OUT013,1987,High,Tier 3,Supermarket Type1,958.752 +FDQ34,10.85,Low Fat,0.163160327,Snack Foods,107.4622,OUT017,2007,,Tier 2,Supermarket Type1,1693.7952 +NCG19,20.25,Low Fat,0.148163564,Household,232.7616,OUT049,1999,Medium,Tier 1,Supermarket Type1,1874.8928 +FDI33,,Low Fat,0.028281197,Snack Foods,90.2146,OUT027,1985,Medium,Tier 3,Supermarket Type3,3648.584 +FDW27,5.86,Regular,0.150853308,Meat,156.0314,OUT046,1997,Small,Tier 1,Supermarket Type1,2016.7082 +FDH04,6.115,Regular,0.011437302,Frozen Foods,92.4488,OUT017,2007,,Tier 2,Supermarket Type1,1358.232 +FDZ39,19.7,Regular,0.018024769,Meat,104.499,OUT046,1997,Small,Tier 1,Supermarket Type1,1031.99 +NCK19,9.8,Low Fat,0.090448534,Others,194.5478,OUT035,2004,Small,Tier 2,Supermarket Type1,774.9912 +FDY20,12.5,Regular,0.08175276,Fruits and Vegetables,89.0488,OUT046,1997,Small,Tier 1,Supermarket Type1,1267.6832 +FDN39,19.35,Regular,0.109667698,Meat,166.0816,OUT010,1998,,Tier 3,Grocery Store,671.1264 +NCY41,16.75,Low Fat,0.075735621,Health and Hygiene,34.5532,OUT046,1997,Small,Tier 1,Supermarket Type1,323.5788 +NCN14,19.1,Low Fat,0.091917786,Others,182.7608,OUT046,1997,Small,Tier 1,Supermarket Type1,1837.608 +FDR07,21.35,Low Fat,0.130127365,Fruits and Vegetables,96.2094,OUT010,1998,,Tier 3,Grocery Store,190.4188 +FDW49,19.5,LF,0.082483516,Canned,179.2002,OUT013,1987,High,Tier 3,Supermarket Type1,2865.6032 +FDN23,6.575,Regular,0.075507758,Breads,146.4444,OUT046,1997,Small,Tier 1,Supermarket Type1,1596.5884 +FDS33,6.67,Regular,0.124126756,Snack Foods,88.9514,OUT017,2007,,Tier 2,Supermarket Type1,2125.2336 +FDY36,12.3,Low Fat,0.009425158,Baking Goods,74.838,OUT049,1999,Medium,Tier 1,Supermarket Type1,1537.998 +FDH20,16.1,Regular,0.024999711,Fruits and Vegetables,97.841,OUT045,2002,,Tier 2,Supermarket Type1,1255.033 +FDR15,,Regular,0.058545606,Meat,155.8314,OUT019,1985,Small,Tier 1,Grocery Store,310.2628 +NCP50,17.35,Low Fat,0.020676141,Others,80.6618,OUT017,2007,,Tier 2,Supermarket Type1,1208.427 +FDS40,15.35,Low Fat,0.02346559,Frozen Foods,35.219,OUT010,1998,,Tier 3,Grocery Store,36.619 +FDG38,8.975,Regular,0.05272914,Canned,86.4224,OUT046,1997,Small,Tier 1,Supermarket Type1,1022.6688 +NCO18,13.15,Low Fat,0.024630755,Household,178.2686,OUT013,1987,High,Tier 3,Supermarket Type1,2666.529 +NCO54,19.5,LF,0.014274292,Household,55.6614,OUT046,1997,Small,Tier 1,Supermarket Type1,718.3982 +NCW18,15.1,Low Fat,0.059313603,Household,238.1248,OUT035,2004,Small,Tier 2,Supermarket Type1,4266.4464 +FDB36,5.465,Regular,0.048518008,Baking Goods,132.9626,OUT035,2004,Small,Tier 2,Supermarket Type1,2360.9268 +FDJ45,17.75,Low Fat,0.073349552,Seafood,34.2216,OUT013,1987,High,Tier 3,Supermarket Type1,934.7832 +FDP60,,Low Fat,0.055648052,Baking Goods,100.3016,OUT027,1985,Medium,Tier 3,Supermarket Type3,2833.6448 +DRD12,6.96,Low Fat,0.077129323,Soft Drinks,92.7146,OUT013,1987,High,Tier 3,Supermarket Type1,1733.0774 +FDR47,17.85,Low Fat,0.087824967,Breads,196.0794,OUT018,2009,Medium,Tier 3,Supermarket Type2,1755.7146 +FDJ10,5.095,Regular,0.130031207,Snack Foods,142.4838,OUT018,2009,Medium,Tier 3,Supermarket Type2,561.9352 +DRC25,5.73,Low Fat,0.045334098,Soft Drinks,87.0882,OUT013,1987,High,Tier 3,Supermarket Type1,1803.6522 +NCW54,7.5,Low Fat,0.096333029,Household,57.8588,OUT013,1987,High,Tier 3,Supermarket Type1,1145.176 +FDA26,7.855,Regular,0.073858923,Dairy,218.6482,OUT013,1987,High,Tier 3,Supermarket Type1,3723.8194 +DRF01,5.655,LF,0.175047104,Soft Drinks,146.9102,OUT035,2004,Small,Tier 2,Supermarket Type1,1895.5326 +NCZ17,12.15,Low Fat,0.132952286,Health and Hygiene,37.6506,OUT010,1998,,Tier 3,Grocery Store,37.9506 +FDK46,9.6,Low Fat,0.086145867,Snack Foods,258.362,OUT010,1998,,Tier 3,Grocery Store,259.662 +NCU41,18.85,Low Fat,0.0520115,Health and Hygiene,190.3846,OUT013,1987,High,Tier 3,Supermarket Type1,3630.6074 +FDV20,20.2,Regular,0.059790095,Fruits and Vegetables,127.4678,OUT035,2004,Small,Tier 2,Supermarket Type1,3560.6984 +FDT15,12.15,Regular,0.071440118,Meat,182.295,OUT010,1998,,Tier 3,Grocery Store,549.285 +DRI25,19.6,Low Fat,0.03395415,Soft Drinks,56.4614,OUT049,1999,Medium,Tier 1,Supermarket Type1,773.6596 +FDA40,16,Regular,0.099271209,Frozen Foods,88.5856,OUT046,1997,Small,Tier 1,Supermarket Type1,878.856 +FDZ15,,Low Fat,0.020769677,Dairy,117.5782,OUT027,1985,Medium,Tier 3,Supermarket Type3,2741.0986 +FDM13,6.425,Low Fat,0.06316338,Breakfast,132.2626,OUT035,2004,Small,Tier 2,Supermarket Type1,2098.6016 +NCM05,6.825,Low Fat,0.059846975,Health and Hygiene,262.5226,OUT046,1997,Small,Tier 1,Supermarket Type1,9779.9362 +FDD38,,reg,0.014342659,Canned,103.7674,OUT019,1985,Small,Tier 1,Grocery Store,203.7348 +DRI01,7.97,Low Fat,0.057667173,Soft Drinks,172.1422,OUT010,1998,,Tier 3,Grocery Store,517.3266 +DRG13,17.25,Low Fat,0.037155206,Soft Drinks,166.4526,OUT013,1987,High,Tier 3,Supermarket Type1,3782.4098 +NCT30,9.1,Low Fat,0.080417724,Household,48.8718,OUT049,1999,Medium,Tier 1,Supermarket Type1,425.4462 +NCG42,19.2,Low Fat,0.041227831,Household,129.831,OUT046,1997,Small,Tier 1,Supermarket Type1,1947.465 +FDB14,,Regular,0.102226474,Canned,91.312,OUT027,1985,Medium,Tier 3,Supermarket Type3,3075.996 +FDO27,,Regular,0.178210285,Meat,95.7752,OUT027,1985,Medium,Tier 3,Supermarket Type3,3930.8832 +FDC14,14.5,Regular,0.06904249,Canned,41.4454,OUT010,1998,,Tier 3,Grocery Store,41.9454 +FDB49,,Regular,0.052791124,Baking Goods,98.5384,OUT019,1985,Small,Tier 1,Grocery Store,591.2304 +FDZ23,17.75,Regular,0.067607749,Baking Goods,188.024,OUT049,1999,Medium,Tier 1,Supermarket Type1,2796.36 +FDJ52,7.145,Low Fat,0.017887474,Frozen Foods,160.6578,OUT017,2007,,Tier 2,Supermarket Type1,1765.0358 +FDJ56,8.985,Low Fat,0.184440421,Fruits and Vegetables,99.67,OUT017,2007,,Tier 2,Supermarket Type1,3295.71 +NCR54,16.35,low fat,0.091074449,Household,196.811,OUT017,2007,,Tier 2,Supermarket Type1,3338.987 +DRF01,5.655,Low Fat,0,Soft Drinks,147.5102,OUT046,1997,Small,Tier 1,Supermarket Type1,1166.4816 +DRK12,9.5,Low Fat,0.041951439,Soft Drinks,32.49,OUT049,1999,Medium,Tier 1,Supermarket Type1,865.54 +FDL58,5.78,Regular,0.074087369,Snack Foods,264.9568,OUT013,1987,High,Tier 3,Supermarket Type1,6855.0768 +FDD44,8.05,Regular,0,Fruits and Vegetables,257.5646,OUT013,1987,High,Tier 3,Supermarket Type1,5153.292 +FDT50,6.75,Regular,0.108679906,Dairy,95.6752,OUT018,2009,Medium,Tier 3,Supermarket Type2,1246.3776 +DRM23,16.6,Low Fat,0.136500981,Hard Drinks,173.3422,OUT017,2007,,Tier 2,Supermarket Type1,4138.6128 +NCM31,6.095,Low Fat,0.081361288,Others,141.9154,OUT045,2002,,Tier 2,Supermarket Type1,2694.4926 +FDY21,15.1,Low Fat,0,Snack Foods,197.211,OUT010,1998,,Tier 3,Grocery Store,196.411 +FDR22,19.35,Regular,0.018591464,Snack Foods,112.9544,OUT049,1999,Medium,Tier 1,Supermarket Type1,1342.2528 +NCV06,11.3,Low Fat,0.066952965,Household,192.0478,OUT018,2009,Medium,Tier 3,Supermarket Type2,3099.9648 +FDR45,10.8,Low Fat,0.029107004,Snack Foods,240.5222,OUT017,2007,,Tier 2,Supermarket Type1,4541.4218 +FDH60,19.7,Regular,0,Baking Goods,194.411,OUT049,1999,Medium,Tier 1,Supermarket Type1,5106.686 +FDR08,,Low Fat,0.065872936,Fruits and Vegetables,113.1886,OUT019,1985,Small,Tier 1,Grocery Store,111.1886 +FDA47,10.5,Regular,0.117149075,Baking Goods,164.121,OUT018,2009,Medium,Tier 3,Supermarket Type2,1794.331 +FDS37,7.655,Low Fat,0.031994534,Canned,114.3492,OUT049,1999,Medium,Tier 1,Supermarket Type1,1853.5872 +FDF12,8.235,Low Fat,0.08276363,Baking Goods,146.5076,OUT018,2009,Medium,Tier 3,Supermarket Type2,1625.8836 +FDP24,20.6,Low Fat,0.083004078,Baking Goods,119.4756,OUT046,1997,Small,Tier 1,Supermarket Type1,1090.5804 +FDU20,19.35,Regular,0.021490911,Fruits and Vegetables,122.1098,OUT049,1999,Medium,Tier 1,Supermarket Type1,2892.2352 +FDW44,9.5,Regular,0.058835928,Fruits and Vegetables,170.2448,OUT010,1998,,Tier 3,Grocery Store,170.4448 +FDY39,5.305,Regular,0.07871639,Meat,183.5608,OUT010,1998,,Tier 3,Grocery Store,551.2824 +DRD37,9.8,Low Fat,0.013869809,Soft Drinks,47.406,OUT045,2002,,Tier 2,Supermarket Type1,978.726 +FDZ35,9.6,Regular,0.022274264,Breads,101.699,OUT035,2004,Small,Tier 2,Supermarket Type1,2992.771 +FDB50,13,LF,0.153618566,Canned,79.6986,OUT046,1997,Small,Tier 1,Supermarket Type1,1480.0734 +FDY10,17.6,Low Fat,0.049267759,Snack Foods,113.0176,OUT018,2009,Medium,Tier 3,Supermarket Type2,2862.94 +FDK41,14.3,Low Fat,0.12826315,Frozen Foods,83.4224,OUT017,2007,,Tier 2,Supermarket Type1,681.7792 +FDL24,10.3,Regular,0.02494708,Baking Goods,172.3422,OUT045,2002,,Tier 2,Supermarket Type1,5690.5926 +FDZ07,15.1,Regular,0.157154813,Fruits and Vegetables,62.2194,OUT010,1998,,Tier 3,Grocery Store,185.7582 +DRI03,6.03,Low Fat,0.022832115,Dairy,176.7028,OUT017,2007,,Tier 2,Supermarket Type1,1416.8224 +FDW56,7.68,Low Fat,0.070900282,Fruits and Vegetables,192.6162,OUT046,1997,Small,Tier 1,Supermarket Type1,5580.0698 +FDR20,20,Regular,0.028180789,Fruits and Vegetables,46.8744,OUT045,2002,,Tier 2,Supermarket Type1,905.488 +FDC50,15.85,Low Fat,0.136497913,Canned,96.3094,OUT046,1997,Small,Tier 1,Supermarket Type1,2856.282 +NCX05,15.2,Low Fat,0.162462044,Health and Hygiene,117.6492,OUT010,1998,,Tier 3,Grocery Store,347.5476 +FDU23,12.15,Low Fat,0,Breads,164.7184,OUT046,1997,Small,Tier 1,Supermarket Type1,3962.8416 +FDN45,19.35,Low Fat,0.118080437,Snack Foods,222.6088,OUT035,2004,Small,Tier 2,Supermarket Type1,6040.1376 +FDQ51,,Regular,0.017466284,Meat,45.4718,OUT027,1985,Medium,Tier 3,Supermarket Type3,1323.6104 +FDH21,,Low Fat,0.031073804,Seafood,157.5604,OUT027,1985,Medium,Tier 3,Supermarket Type3,5704.5744 +DRZ11,8.85,Regular,0.113302223,Soft Drinks,125.1388,OUT017,2007,,Tier 2,Supermarket Type1,1114.5492 +NCI43,19.85,Low Fat,0.025968706,Household,49.5376,OUT046,1997,Small,Tier 1,Supermarket Type1,1006.6896 +DRF03,19.1,Low Fat,0.045400017,Dairy,38.8138,OUT045,2002,,Tier 2,Supermarket Type1,690.4346 +NCF30,17,Low Fat,0.126958147,Household,125.8362,OUT017,2007,,Tier 2,Supermarket Type1,2516.724 +FDB12,11.15,Regular,0.105307659,Baking Goods,102.0648,OUT046,1997,Small,Tier 1,Supermarket Type1,1038.648 +FDW19,12.35,Regular,0.038500421,Fruits and Vegetables,110.757,OUT046,1997,Small,Tier 1,Supermarket Type1,1208.427 +FDB45,20.85,Low Fat,0.02137305,Fruits and Vegetables,103.3306,OUT045,2002,,Tier 2,Supermarket Type1,522.653 +FDY55,,Low Fat,0,Fruits and Vegetables,255.7988,OUT027,1985,Medium,Tier 3,Supermarket Type3,9251.9568 +FDK40,7.035,Low Fat,0,Frozen Foods,263.291,OUT010,1998,,Tier 3,Grocery Store,525.982 +FDU11,4.785,Low Fat,0.09297084,Breads,122.0098,OUT018,2009,Medium,Tier 3,Supermarket Type2,2048.6666 +FDP33,,Low Fat,0.088839949,Snack Foods,254.2672,OUT027,1985,Medium,Tier 3,Supermarket Type3,10993.6896 +FDN49,17.25,Regular,0.209600084,Breakfast,40.348,OUT010,1998,,Tier 3,Grocery Store,39.948 +FDR15,9.3,Regular,0.033505804,Meat,153.4314,OUT045,2002,,Tier 2,Supermarket Type1,2482.1024 +FDO38,17.25,Low Fat,0.072986772,Canned,78.8986,OUT045,2002,,Tier 2,Supermarket Type1,1635.8706 +DRC24,17.85,Low Fat,0.024961677,Soft Drinks,153.1998,OUT017,2007,,Tier 2,Supermarket Type1,3383.5956 +NCU17,,Low Fat,0.092433518,Health and Hygiene,101.6674,OUT027,1985,Medium,Tier 3,Supermarket Type3,1426.1436 +FDK22,9.8,Low Fat,0.026081567,Snack Foods,217.585,OUT035,2004,Small,Tier 2,Supermarket Type1,4327.7 +DRP35,18.85,Low Fat,0.09079168,Hard Drinks,127.1336,OUT013,1987,High,Tier 3,Supermarket Type1,3579.3408 +NCL29,9.695,Low Fat,0.113917889,Health and Hygiene,158.2604,OUT035,2004,Small,Tier 2,Supermarket Type1,2693.8268 +FDG53,10,Low Fat,0.045928229,Frozen Foods,138.118,OUT049,1999,Medium,Tier 1,Supermarket Type1,1957.452 +DRM23,16.6,Low Fat,0.135620265,Hard Drinks,172.9422,OUT013,1987,High,Tier 3,Supermarket Type1,2931.5174 +FDR09,18.25,Low Fat,0.077709902,Snack Foods,259.6962,OUT035,2004,Small,Tier 2,Supermarket Type1,5438.9202 +NCJ30,5.82,Low Fat,0.134975628,Household,170.579,OUT010,1998,,Tier 3,Grocery Store,509.337 +FDZ04,9.31,Low Fat,0.037955094,Frozen Foods,62.151,OUT046,1997,Small,Tier 1,Supermarket Type1,1201.769 +FDM10,18.25,Low Fat,0.076125668,Snack Foods,214.0218,OUT045,2002,,Tier 2,Supermarket Type1,2564.6616 +FDR21,19.7,Low Fat,0.067039526,Snack Foods,178.337,OUT049,1999,Medium,Tier 1,Supermarket Type1,1411.496 +DRJ49,6.865,Low Fat,0.014021626,Soft Drinks,127.1652,OUT045,2002,,Tier 2,Supermarket Type1,1291.652 +FDJ15,11.35,Regular,0.023358738,Dairy,184.4608,OUT049,1999,Medium,Tier 1,Supermarket Type1,4042.7376 +FDO34,17.7,Low Fat,0.029933275,Snack Foods,169.0816,OUT035,2004,Small,Tier 2,Supermarket Type1,5201.2296 +NCG30,,Low Fat,0.111777297,Household,124.6046,OUT027,1985,Medium,Tier 3,Supermarket Type3,2863.6058 +FDS60,20.85,Low Fat,0.032448523,Baking Goods,177.866,OUT046,1997,Small,Tier 1,Supermarket Type1,1078.596 +FDX57,17.25,Regular,0.047266211,Snack Foods,97.0068,OUT046,1997,Small,Tier 1,Supermarket Type1,1846.9292 +FDS40,15.35,Low Fat,0.01404119,Frozen Foods,38.419,OUT049,1999,Medium,Tier 1,Supermarket Type1,476.047 +FDT08,13.65,LF,0.04917754,Fruits and Vegetables,151.805,OUT013,1987,High,Tier 3,Supermarket Type1,2696.49 +NCN29,15.2,Low Fat,0.020280476,Health and Hygiene,49.1034,OUT010,1998,,Tier 3,Grocery Store,194.4136 +FDY27,6.38,Low Fat,0.031962866,Dairy,178.0344,OUT045,2002,,Tier 2,Supermarket Type1,535.3032 +NCR29,,Low Fat,0.054376275,Health and Hygiene,56.293,OUT027,1985,Medium,Tier 3,Supermarket Type3,2546.685 +FDZ02,6.905,Regular,0.063850971,Dairy,97.2726,OUT010,1998,,Tier 3,Grocery Store,195.7452 +FDP40,,Regular,0.060154968,Frozen Foods,110.1544,OUT019,1985,Small,Tier 1,Grocery Store,111.8544 +FDE11,,Regular,0.134441765,Starchy Foods,183.9924,OUT027,1985,Medium,Tier 3,Supermarket Type3,6478.234 +DRL35,15.7,Low Fat,0.03067808,Hard Drinks,44.777,OUT013,1987,High,Tier 3,Supermarket Type1,605.878 +FDD56,15.2,Regular,0.103758647,Fruits and Vegetables,177.0054,OUT035,2004,Small,Tier 2,Supermarket Type1,2976.7918 +FDO39,,Regular,0.136701678,Meat,182.1608,OUT027,1985,Medium,Tier 3,Supermarket Type3,5880.3456 +FDG32,,Low Fat,0.308145448,Fruits and Vegetables,222.0772,OUT019,1985,Small,Tier 1,Grocery Store,889.5088 +FDU50,,Regular,0.074806196,Dairy,112.9176,OUT027,1985,Medium,Tier 3,Supermarket Type3,3435.528 +FDX24,8.355,low fat,0.013926425,Baking Goods,93.0462,OUT035,2004,Small,Tier 2,Supermarket Type1,1110.5544 +NCN43,12.15,Low Fat,0.006754117,Others,122.173,OUT013,1987,High,Tier 3,Supermarket Type1,2586.633 +FDK34,13.35,Low Fat,0,Snack Foods,238.7564,OUT018,2009,Medium,Tier 3,Supermarket Type2,1906.8512 +NCN41,17,Low Fat,0.052209303,Health and Hygiene,122.373,OUT046,1997,Small,Tier 1,Supermarket Type1,2586.633 +FDW16,17.35,Regular,0.041538713,Frozen Foods,93.1804,OUT049,1999,Medium,Tier 1,Supermarket Type1,1378.206 +FDP46,,Low Fat,0.13064231,Snack Foods,88.383,OUT019,1985,Small,Tier 1,Grocery Store,89.883 +NCD07,9.1,Low Fat,0.055382616,Household,115.0518,OUT013,1987,High,Tier 3,Supermarket Type1,683.1108 +FDG44,6.13,Low Fat,0,Fruits and Vegetables,54.1298,OUT046,1997,Small,Tier 1,Supermarket Type1,1348.245 +FDC20,,low fat,0.041970938,Fruits and Vegetables,55.4272,OUT019,1985,Small,Tier 1,Grocery Store,111.8544 +FDB23,19.2,reg,0.005583951,Starchy Foods,226.9062,OUT013,1987,High,Tier 3,Supermarket Type1,4514.124 +DRK59,8.895,Low Fat,0.075757177,Hard Drinks,233.8616,OUT018,2009,Medium,Tier 3,Supermarket Type2,937.4464 +FDT31,19.75,Low Fat,0.012467648,Fruits and Vegetables,188.1872,OUT049,1999,Medium,Tier 1,Supermarket Type1,2458.1336 +FDB15,10.895,Low Fat,0.137368051,Dairy,264.3568,OUT018,2009,Medium,Tier 3,Supermarket Type2,4745.8224 +FDI56,,Low Fat,0.092933158,Fruits and Vegetables,91.0146,OUT027,1985,Medium,Tier 3,Supermarket Type3,3466.1548 +NCQ17,10.3,LF,0.117593973,Health and Hygiene,154.463,OUT017,2007,,Tier 2,Supermarket Type1,2503.408 +FDH44,19.1,Regular,0.026018497,Fruits and Vegetables,148.2418,OUT017,2007,,Tier 2,Supermarket Type1,3089.9778 +FDP40,4.555,Regular,0.034410585,Frozen Foods,111.3544,OUT049,1999,Medium,Tier 1,Supermarket Type1,1342.2528 +NCR17,,Low Fat,0.02426524,Health and Hygiene,114.0492,OUT027,1985,Medium,Tier 3,Supermarket Type3,3938.8728 +NCO53,16.2,Low Fat,0.176175402,Health and Hygiene,184.0608,OUT017,2007,,Tier 2,Supermarket Type1,2021.3688 +FDG38,8.975,Regular,0.088257771,Canned,84.1224,OUT010,1998,,Tier 3,Grocery Store,170.4448 +FDO01,21.1,Regular,0.020750867,Breakfast,128.7994,OUT049,1999,Medium,Tier 1,Supermarket Type1,1927.491 +NCQ43,17.75,Low Fat,0.111527348,Others,110.2912,OUT045,2002,,Tier 2,Supermarket Type1,873.5296 +FDU47,12.8,Regular,0.114318263,Breads,142.2838,OUT018,2009,Medium,Tier 3,Supermarket Type2,421.4514 +FDZ02,6.905,Regular,0.038363204,Dairy,98.1726,OUT017,2007,,Tier 2,Supermarket Type1,587.2356 +FDS04,10.195,Regular,0.245483691,Frozen Foods,141.8838,OUT010,1998,,Tier 3,Grocery Store,280.9676 +FDQ31,5.785,Regular,0.053930934,Fruits and Vegetables,87.3856,OUT049,1999,Medium,Tier 1,Supermarket Type1,878.856 +FDT57,,Low Fat,0.018942606,Snack Foods,236.0248,OUT027,1985,Medium,Tier 3,Supermarket Type3,6636.6944 +FDK50,7.96,Low Fat,0.028339599,Canned,162.4894,OUT013,1987,High,Tier 3,Supermarket Type1,1779.6834 +FDB49,8.3,Regular,0.030151351,Baking Goods,98.7384,OUT046,1997,Small,Tier 1,Supermarket Type1,492.692 +FDN56,5.46,Regular,0.107274301,Fruits and Vegetables,145.5786,OUT045,2002,,Tier 2,Supermarket Type1,3900.9222 +FDU02,13.35,Low Fat,0.102670882,Dairy,228.6352,OUT049,1999,Medium,Tier 1,Supermarket Type1,3435.528 +FDK26,5.46,reg,0.032177405,Canned,185.424,OUT046,1997,Small,Tier 1,Supermarket Type1,5219.872 +DRA24,,Regular,0.039734882,Soft Drinks,165.7868,OUT027,1985,Medium,Tier 3,Supermarket Type3,4913.604 +FDF53,20.75,Regular,0.083536989,Frozen Foods,180.3318,OUT013,1987,High,Tier 3,Supermarket Type1,4149.9314 +NCZ30,6.59,Low Fat,0.026225693,Household,119.0098,OUT049,1999,Medium,Tier 1,Supermarket Type1,2530.7058 +FDF14,7.55,Low Fat,0.0273235,Canned,151.934,OUT017,2007,,Tier 2,Supermarket Type1,1837.608 +FDU40,20.85,Low Fat,0.03747983,Frozen Foods,192.7478,OUT045,2002,,Tier 2,Supermarket Type1,2131.2258 +NCL18,18.85,Low Fat,0.168531813,Household,192.5136,OUT017,2007,,Tier 2,Supermarket Type1,2916.204 +FDP25,15.2,Low Fat,0.021293909,Canned,218.4824,OUT018,2009,Medium,Tier 3,Supermarket Type2,1528.6768 +NCV05,10.1,Low Fat,0.030269774,Health and Hygiene,152.4656,OUT045,2002,,Tier 2,Supermarket Type1,2934.8464 +FDV49,10,Low Fat,0.025822315,Canned,262.7226,OUT035,2004,Small,Tier 2,Supermarket Type1,3171.8712 +FDJ56,8.985,LF,0.183688161,Fruits and Vegetables,100.27,OUT049,1999,Medium,Tier 1,Supermarket Type1,998.7 +FDI40,11.5,Regular,0.125579201,Frozen Foods,99.7358,OUT035,2004,Small,Tier 2,Supermarket Type1,1105.8938 +NCK05,,Low Fat,0.077079177,Health and Hygiene,61.5536,OUT027,1985,Medium,Tier 3,Supermarket Type3,918.804 +NCI43,19.85,Low Fat,0.026074491,Household,48.6376,OUT018,2009,Medium,Tier 3,Supermarket Type2,575.2512 +NCE42,21.1,Low Fat,0.010593469,Household,234.2958,OUT013,1987,High,Tier 3,Supermarket Type1,3739.1328 +FDP40,4.555,Regular,0.034357169,Frozen Foods,112.6544,OUT046,1997,Small,Tier 1,Supermarket Type1,2684.5056 +FDU40,20.85,Low Fat,0.037396901,Frozen Foods,193.8478,OUT035,2004,Small,Tier 2,Supermarket Type1,2712.4692 +DRK47,7.905,Low Fat,0.064011067,Hard Drinks,230.2694,OUT013,1987,High,Tier 3,Supermarket Type1,4567.388 +FDR32,6.78,Regular,0.085981978,Fruits and Vegetables,228.4694,OUT045,2002,,Tier 2,Supermarket Type1,5480.8656 +FDS43,,Low Fat,0.040318693,Fruits and Vegetables,186.224,OUT027,1985,Medium,Tier 3,Supermarket Type3,5033.448 +FDH50,15,Regular,0.161762835,Canned,185.9266,OUT045,2002,,Tier 2,Supermarket Type1,2581.9724 +FDZ09,17.6,Low Fat,0.104878967,Snack Foods,164.8868,OUT046,1997,Small,Tier 1,Supermarket Type1,2456.802 +FDS19,13.8,Regular,0.107469819,Fruits and Vegetables,77.8012,OUT010,1998,,Tier 3,Grocery Store,227.7036 +NCU30,5.11,Low Fat,0.034868095,Household,163.821,OUT035,2004,Small,Tier 2,Supermarket Type1,2120.573 +FDI27,8.71,Regular,0.046079575,Dairy,43.5744,OUT045,2002,,Tier 2,Supermarket Type1,407.4696 +FDQ09,7.235,Low Fat,0.058083831,Snack Foods,113.6834,OUT013,1987,High,Tier 3,Supermarket Type1,230.3668 +FDB35,12.3,Regular,0.064618976,Starchy Foods,89.8804,OUT046,1997,Small,Tier 1,Supermarket Type1,1286.3256 +DRD12,6.96,Low Fat,0.077178965,Soft Drinks,93.1146,OUT035,2004,Small,Tier 2,Supermarket Type1,2189.1504 +FDW07,18,Regular,0.142910689,Fruits and Vegetables,89.6514,OUT049,1999,Medium,Tier 1,Supermarket Type1,1859.5794 +DRE13,6.28,Low Fat,0.027682047,Soft Drinks,85.5198,OUT013,1987,High,Tier 3,Supermarket Type1,1744.396 +FDR11,10.5,Regular,0.142511272,Breads,158.7578,OUT035,2004,Small,Tier 2,Supermarket Type1,2246.4092 +DRG36,14.15,low fat,0.09557165,Soft Drinks,171.0106,OUT045,2002,,Tier 2,Supermarket Type1,4106.6544 +DRD37,9.8,LF,0.02316823,Soft Drinks,47.506,OUT010,1998,,Tier 3,Grocery Store,186.424 +FDX03,15.85,Regular,0.061045133,Meat,44.7744,OUT013,1987,High,Tier 3,Supermarket Type1,181.0976 +FDU46,10.3,Regular,0.011148865,Snack Foods,84.854,OUT045,2002,,Tier 2,Supermarket Type1,778.986 +FDV03,17.6,Low Fat,0.058091269,Meat,156.2314,OUT046,1997,Small,Tier 1,Supermarket Type1,2947.4966 +FDZ37,,Regular,0.019672774,Canned,86.4198,OUT027,1985,Medium,Tier 3,Supermarket Type3,1918.8356 +FDI24,10.3,Low Fat,0.078678276,Baking Goods,177.037,OUT013,1987,High,Tier 3,Supermarket Type1,3705.177 +FDX33,9.195,Regular,0.117667492,Snack Foods,159.5578,OUT049,1999,Medium,Tier 1,Supermarket Type1,1283.6624 +FDG47,12.8,Low Fat,0.069902438,Starchy Foods,261.3252,OUT018,2009,Medium,Tier 3,Supermarket Type2,3410.2276 +FDZ57,10,Regular,0.037757166,Snack Foods,126.7994,OUT035,2004,Small,Tier 2,Supermarket Type1,1284.994 +FDT04,17.25,Low Fat,0.107021498,Frozen Foods,40.5822,OUT035,2004,Small,Tier 2,Supermarket Type1,785.644 +FDO49,,Regular,0.032892112,Breakfast,49.3008,OUT027,1985,Medium,Tier 3,Supermarket Type3,1518.024 +NCB43,20.2,Low Fat,0.100477461,Household,187.7898,OUT017,2007,,Tier 2,Supermarket Type1,2245.0776 +NCL53,7.5,Low Fat,0.036228067,Health and Hygiene,175.2028,OUT035,2004,Small,Tier 2,Supermarket Type1,4427.57 +FDM01,7.895,Regular,0.094488485,Breakfast,100.7332,OUT013,1987,High,Tier 3,Supermarket Type1,1230.3984 +FDO12,15.75,Low Fat,0.055154296,Baking Goods,195.5452,OUT018,2009,Medium,Tier 3,Supermarket Type2,1174.4712 +FDO13,,Low Fat,0.106907604,Breakfast,162.8526,OUT019,1985,Small,Tier 1,Grocery Store,493.3578 +FDI04,13.65,reg,0.073060301,Frozen Foods,196.2426,OUT045,2002,,Tier 2,Supermarket Type1,2570.6538 +NCK05,20.1,Low Fat,0.077439606,Health and Hygiene,60.6536,OUT035,2004,Small,Tier 2,Supermarket Type1,980.0576 +FDP28,13.65,Regular,0.080968973,Frozen Foods,259.7936,OUT018,2009,Medium,Tier 3,Supermarket Type2,2609.936 +FDJ44,12.3,Regular,0.106492562,Fruits and Vegetables,176.3396,OUT049,1999,Medium,Tier 1,Supermarket Type1,1395.5168 +FDS25,,Regular,0.139330557,Canned,109.5228,OUT027,1985,Medium,Tier 3,Supermarket Type3,3426.2068 +FDC02,21.35,Low Fat,0.068822477,Canned,258.3278,OUT046,1997,Small,Tier 1,Supermarket Type1,7028.8506 +FDT23,7.72,Regular,0.074669288,Breads,76.3986,OUT013,1987,High,Tier 3,Supermarket Type1,1402.1748 +NCD31,12.1,Low Fat,0.025834128,Household,165.1526,OUT010,1998,,Tier 3,Grocery Store,164.4526 +FDV19,14.85,Regular,0.035227697,Fruits and Vegetables,159.5578,OUT013,1987,High,Tier 3,Supermarket Type1,2085.9514 +NCQ30,,Low Fat,0.050901814,Household,120.5414,OUT019,1985,Small,Tier 1,Grocery Store,365.5242 +NCD18,16,Low Fat,0.072965144,Household,231.3668,OUT018,2009,Medium,Tier 3,Supermarket Type2,4607.336 +FDL10,8.395,Low Fat,0.039492207,Snack Foods,97.3042,OUT046,1997,Small,Tier 1,Supermarket Type1,1091.2462 +FDX20,7.365,Low Fat,0.042552205,Fruits and Vegetables,225.172,OUT035,2004,Small,Tier 2,Supermarket Type1,3395.58 +FDM32,20.5,Low Fat,0.020587886,Fruits and Vegetables,89.583,OUT013,1987,High,Tier 3,Supermarket Type1,1797.66 +FDR09,18.25,Low Fat,0.130095044,Snack Foods,257.2962,OUT010,1998,,Tier 3,Grocery Store,517.9924 +FDL34,,Low Fat,0.040747616,Snack Foods,140.2496,OUT027,1985,Medium,Tier 3,Supermarket Type3,4093.3384 +NCK42,7.475,LF,0.013146636,Household,214.5192,OUT045,2002,,Tier 2,Supermarket Type1,2804.3496 +FDU23,12.15,Low Fat,0.02176755,Breads,164.6184,OUT045,2002,,Tier 2,Supermarket Type1,3797.7232 +DRI01,7.97,Low Fat,0,Soft Drinks,172.0422,OUT018,2009,Medium,Tier 3,Supermarket Type2,5690.5926 +FDG16,15.25,Low Fat,0.08995645,Frozen Foods,217.1192,OUT049,1999,Medium,Tier 1,Supermarket Type1,3235.788 +FDY56,16.35,Regular,0.062665642,Fruits and Vegetables,225.6062,OUT018,2009,Medium,Tier 3,Supermarket Type2,1579.9434 +FDO24,11.1,Low Fat,0.176182345,Baking Goods,158.1604,OUT035,2004,Small,Tier 2,Supermarket Type1,1901.5248 +NCV29,11.8,Low Fat,0.022843501,Health and Hygiene,177.8686,OUT046,1997,Small,Tier 1,Supermarket Type1,4621.9836 +FDQ48,14.3,Regular,0.034411238,Baking Goods,98.6726,OUT046,1997,Small,Tier 1,Supermarket Type1,782.9808 +FDU15,13.65,Regular,0,Meat,36.6532,OUT017,2007,,Tier 2,Supermarket Type1,755.0172 +FDS47,16.75,Low Fat,0.128861359,Breads,86.2856,OUT035,2004,Small,Tier 2,Supermarket Type1,1406.1696 +FDO50,16.25,Low Fat,0.078290271,Canned,93.1804,OUT049,1999,Medium,Tier 1,Supermarket Type1,1194.4452 +FDW48,18,Low Fat,0.008539208,Baking Goods,81.2618,OUT035,2004,Small,Tier 2,Supermarket Type1,402.809 +FDV20,20.2,Regular,0.100095288,Fruits and Vegetables,125.2678,OUT010,1998,,Tier 3,Grocery Store,127.1678 +FDW47,15,Low Fat,0.046447328,Breads,121.5414,OUT049,1999,Medium,Tier 1,Supermarket Type1,2436.828 +FDA07,,Regular,0.030794774,Fruits and Vegetables,122.9072,OUT027,1985,Medium,Tier 3,Supermarket Type3,4532.7664 +FDZ16,,Regular,0.159081735,Frozen Foods,193.5478,OUT027,1985,Medium,Tier 3,Supermarket Type3,4649.9472 +FDN09,,low fat,0.034705807,Snack Foods,241.6828,OUT027,1985,Medium,Tier 3,Supermarket Type3,4873.656 +FDB50,13,Low Fat,0.154487495,Canned,77.2986,OUT017,2007,,Tier 2,Supermarket Type1,1246.3776 +NCL06,14.65,Low Fat,0.072178679,Household,262.9594,OUT049,1999,Medium,Tier 1,Supermarket Type1,5233.188 +DRG03,,Low Fat,0.061686402,Dairy,153.9998,OUT027,1985,Medium,Tier 3,Supermarket Type3,5229.1932 +DRM59,5.88,Low Fat,0.003599378,Hard Drinks,152.2998,OUT045,2002,,Tier 2,Supermarket Type1,3075.996 +FDU25,12.35,Low Fat,0.026832182,Canned,57.3246,OUT017,2007,,Tier 2,Supermarket Type1,1332.2658 +NCU42,9,Low Fat,0.019616991,Household,169.6474,OUT017,2007,,Tier 2,Supermarket Type1,2526.711 +FDH21,10.395,LF,0.05226427,Seafood,158.4604,OUT010,1998,,Tier 3,Grocery Store,158.4604 +DRO47,10.195,Low Fat,0.112203445,Hard Drinks,111.786,OUT035,2004,Small,Tier 2,Supermarket Type1,1697.79 +FDC44,,Low Fat,0.171761077,Fruits and Vegetables,115.7518,OUT027,1985,Medium,Tier 3,Supermarket Type3,5351.0346 +NCL29,9.695,Low Fat,0.114170506,Health and Hygiene,158.9604,OUT045,2002,,Tier 2,Supermarket Type1,1743.0644 +FDL48,19.35,Regular,0.082266419,Baking Goods,48.8034,OUT046,1997,Small,Tier 1,Supermarket Type1,340.2238 +FDJ21,16.7,Regular,0.038685176,Snack Foods,146.6102,OUT018,2009,Medium,Tier 3,Supermarket Type2,2770.3938 +FDT40,5.985,LF,0.095795326,Frozen Foods,128.4678,OUT046,1997,Small,Tier 1,Supermarket Type1,508.6712 +NCD43,8.85,Low Fat,0.026814124,Household,103.7964,OUT010,1998,,Tier 3,Grocery Store,210.3928 +FDM28,15.7,Low Fat,0.045203854,Frozen Foods,180.266,OUT046,1997,Small,Tier 1,Supermarket Type1,1617.894 +FDR35,12.5,Low Fat,0.020697723,Breads,198.8742,OUT046,1997,Small,Tier 1,Supermarket Type1,5773.1518 +NCP17,19.35,Low Fat,0.027827268,Health and Hygiene,65.6168,OUT018,2009,Medium,Tier 3,Supermarket Type2,383.5008 +FDT23,7.72,Regular,0.074883035,Breads,79.8986,OUT045,2002,,Tier 2,Supermarket Type1,1090.5804 +FDX15,17.2,Low Fat,0.156298858,Meat,162.1578,OUT046,1997,Small,Tier 1,Supermarket Type1,1283.6624 +NCU42,,Low Fat,0.019412192,Household,166.5474,OUT027,1985,Medium,Tier 3,Supermarket Type3,4379.6324 +FDV23,,Low Fat,0.105324246,Breads,125.7046,OUT027,1985,Medium,Tier 3,Supermarket Type3,3237.1196 +FDY34,,Regular,0.019227816,Snack Foods,163.9842,OUT019,1985,Small,Tier 1,Grocery Store,331.5684 +FDE16,8.895,Low Fat,0.044093978,Frozen Foods,208.3954,OUT010,1998,,Tier 3,Grocery Store,1041.977 +FDV60,20.2,Regular,0.117599259,Baking Goods,195.311,OUT045,2002,,Tier 2,Supermarket Type1,3338.987 +FDQ44,20.5,Low Fat,0.036140297,Fruits and Vegetables,120.0756,OUT046,1997,Small,Tier 1,Supermarket Type1,2302.3364 +FDZ09,17.6,Low Fat,0.104791689,Snack Foods,165.2868,OUT013,1987,High,Tier 3,Supermarket Type1,3111.9492 +FDW36,11.15,Low Fat,0.057021156,Baking Goods,106.8622,OUT049,1999,Medium,Tier 1,Supermarket Type1,2011.3818 +NCZ30,,LF,0.026058181,Household,121.9098,OUT027,1985,Medium,Tier 3,Supermarket Type3,3374.2744 +FDL09,19.6,Regular,0.12829573,Snack Foods,167.2816,OUT045,2002,,Tier 2,Supermarket Type1,2013.3792 +FDE05,10.895,Regular,0.03263762,Frozen Foods,147.7102,OUT017,2007,,Tier 2,Supermarket Type1,1895.5326 +DRO35,13.85,LF,0.034765901,Hard Drinks,114.2492,OUT017,2007,,Tier 2,Supermarket Type1,1853.5872 +FDN60,15.1,Low Fat,0.095696334,Baking Goods,159.7604,OUT017,2007,,Tier 2,Supermarket Type1,2693.8268 +NCZ29,15,Low Fat,0.071371458,Health and Hygiene,125.2362,OUT046,1997,Small,Tier 1,Supermarket Type1,1384.1982 +FDX08,12.85,Low Fat,0.022696131,Fruits and Vegetables,179.9318,OUT018,2009,Medium,Tier 3,Supermarket Type2,2706.477 +FDZ16,16.85,Regular,0.267565911,Frozen Foods,194.1478,OUT010,1998,,Tier 3,Grocery Store,1162.4868 +DRL37,15.5,Low Fat,0.053327763,Soft Drinks,44.477,OUT013,1987,High,Tier 3,Supermarket Type1,865.54 +FDL21,15.85,Regular,0.007145063,Snack Foods,41.048,OUT035,2004,Small,Tier 2,Supermarket Type1,479.376 +FDW10,21.2,Low Fat,0.071076055,Snack Foods,174.837,OUT017,2007,,Tier 2,Supermarket Type1,5469.547 +FDB53,13.35,Low Fat,0.139426044,Frozen Foods,148.3392,OUT035,2004,Small,Tier 2,Supermarket Type1,3877.6192 +DRM49,6.11,Regular,0.151925271,Soft Drinks,46.6086,OUT035,2004,Small,Tier 2,Supermarket Type1,624.5204 +NCD06,13,Low Fat,0.099479703,Household,44.906,OUT049,1999,Medium,Tier 1,Supermarket Type1,652.484 +FDN10,,Low Fat,0.045900448,Snack Foods,118.9124,OUT027,1985,Medium,Tier 3,Supermarket Type3,2844.2976 +FDS13,,Low Fat,0.21799414,Canned,266.5884,OUT019,1985,Small,Tier 1,Grocery Store,1324.942 +FDH38,6.425,Low Fat,0.010454459,Canned,115.6808,OUT049,1999,Medium,Tier 1,Supermarket Type1,1406.1696 +FDY21,,Low Fat,0.172641213,Snack Foods,195.111,OUT027,1985,Medium,Tier 3,Supermarket Type3,5303.097 +FDT60,12,Low Fat,0.075701524,Baking Goods,124.6388,OUT045,2002,,Tier 2,Supermarket Type1,2105.2596 +DRZ24,7.535,Low Fat,0.081914677,Soft Drinks,120.344,OUT049,1999,Medium,Tier 1,Supermarket Type1,3835.008 +FDW56,7.68,Low Fat,0.071010513,Fruits and Vegetables,190.9162,OUT049,1999,Medium,Tier 1,Supermarket Type1,5195.2374 +FDG57,14.7,Low Fat,0.072444983,Fruits and Vegetables,48.6034,OUT045,2002,,Tier 2,Supermarket Type1,194.4136 +FDY14,10.3,Low Fat,0.069981909,Dairy,263.0226,OUT013,1987,High,Tier 3,Supermarket Type1,6079.4198 +FDS19,13.8,Regular,0.06457046,Fruits and Vegetables,76.2012,OUT017,2007,,Tier 2,Supermarket Type1,1669.8264 +FDX01,10.1,Low Fat,0.024159767,Canned,114.715,OUT035,2004,Small,Tier 2,Supermarket Type1,815.605 +FDV32,7.785,Low Fat,0.089210159,Fruits and Vegetables,64.251,OUT017,2007,,Tier 2,Supermarket Type1,1328.271 +DRI39,13.8,Low Fat,0.097611115,Dairy,54.893,OUT017,2007,,Tier 2,Supermarket Type1,679.116 +NCU05,11.8,Low Fat,0.058975504,Health and Hygiene,81.7618,OUT018,2009,Medium,Tier 3,Supermarket Type2,966.7416 +NCA29,10.5,Low Fat,0.027430696,Household,171.1106,OUT017,2007,,Tier 2,Supermarket Type1,3593.3226 +FDO10,,Regular,0,Snack Foods,58.7588,OUT019,1985,Small,Tier 1,Grocery Store,400.8116 +DRL47,19.7,LF,0.038815341,Hard Drinks,124.2362,OUT045,2002,,Tier 2,Supermarket Type1,1887.543 +FDA50,,Low Fat,0.152632413,Dairy,98.441,OUT019,1985,Small,Tier 1,Grocery Store,96.541 +FDU23,,LF,0.021618297,Breads,167.1184,OUT027,1985,Medium,Tier 3,Supermarket Type3,2476.776 +FDR27,15.1,Regular,0.096491904,Meat,134.4942,OUT018,2009,Medium,Tier 3,Supermarket Type2,1854.9188 +DRH36,16.2,Low Fat,0.033568871,Soft Drinks,74.9696,OUT017,2007,,Tier 2,Supermarket Type1,2162.5184 +FDZ51,11.3,Regular,0.054507422,Meat,96.3094,OUT013,1987,High,Tier 3,Supermarket Type1,666.4658 +FDQ40,,Regular,0.063079544,Frozen Foods,175.7712,OUT019,1985,Small,Tier 1,Grocery Store,351.5424 +FDB17,,Low Fat,0.064208126,Frozen Foods,180.1976,OUT019,1985,Small,Tier 1,Grocery Store,181.0976 +FDQ16,19.7,Low Fat,0.041974489,Frozen Foods,108.6912,OUT017,2007,,Tier 2,Supermarket Type1,2183.824 +FDG09,20.6,Regular,0.048207431,Fruits and Vegetables,188.0556,OUT017,2007,,Tier 2,Supermarket Type1,2065.3116 +DRI59,9.5,Low Fat,0.041065647,Hard Drinks,223.5088,OUT017,2007,,Tier 2,Supermarket Type1,4697.8848 +FDH47,13.5,Regular,0.128709014,Starchy Foods,96.1068,OUT013,1987,High,Tier 3,Supermarket Type1,1846.9292 +FDA21,13.65,Low Fat,0.03596071,Snack Foods,186.3924,OUT046,1997,Small,Tier 1,Supermarket Type1,1665.8316 +NCO05,7.27,Low Fat,0.046520703,Health and Hygiene,97.7384,OUT013,1987,High,Tier 3,Supermarket Type1,591.2304 +NCL31,,Low Fat,0.210596485,Others,144.747,OUT019,1985,Small,Tier 1,Grocery Store,143.147 +NCH42,6.86,Low Fat,0.03674399,Household,231.201,OUT017,2007,,Tier 2,Supermarket Type1,6201.927 +FDG57,14.7,Low Fat,0.072238195,Fruits and Vegetables,47.5034,OUT013,1987,High,Tier 3,Supermarket Type1,972.068 +NCQ50,,Low Fat,0.034141213,Household,211.9218,OUT027,1985,Medium,Tier 3,Supermarket Type3,3419.5488 +FDK24,9.195,Low Fat,0.101500374,Baking Goods,45.2744,OUT045,2002,,Tier 2,Supermarket Type1,679.116 +DRG39,14.15,Low Fat,0.042246575,Dairy,54.2982,OUT049,1999,Medium,Tier 1,Supermarket Type1,1104.5622 +FDX46,12.3,Regular,0.058105769,Snack Foods,60.4562,OUT035,2004,Small,Tier 2,Supermarket Type1,1777.686 +FDY01,11.8,Regular,0.170141787,Canned,116.7834,OUT013,1987,High,Tier 3,Supermarket Type1,2303.668 +FDJ40,13.6,Regular,0.049579883,Frozen Foods,110.0912,OUT035,2004,Small,Tier 2,Supermarket Type1,1965.4416 +FDS01,11.6,Low Fat,0,Canned,178.2686,OUT049,1999,Medium,Tier 1,Supermarket Type1,1955.4546 +FDJ09,15,Low Fat,0.058725134,Snack Foods,43.6744,OUT017,2007,,Tier 2,Supermarket Type1,407.4696 +FDT49,7,Low Fat,0,Canned,105.628,OUT049,1999,Medium,Tier 1,Supermarket Type1,1384.864 +FDW50,13.1,Low Fat,0.075695552,Dairy,168.4158,OUT049,1999,Medium,Tier 1,Supermarket Type1,1504.0422 +FDV39,11.3,Low Fat,0.007321067,Meat,197.7426,OUT017,2007,,Tier 2,Supermarket Type1,2570.6538 +FDY36,12.3,Low Fat,0.009463757,Baking Goods,73.838,OUT017,2007,,Tier 2,Supermarket Type1,1245.046 +NCE18,10,Low Fat,0.021407511,Household,248.175,OUT013,1987,High,Tier 3,Supermarket Type1,3495.45 +FDB05,,Low Fat,0.145669556,Frozen Foods,247.2776,OUT019,1985,Small,Tier 1,Grocery Store,743.0328 +FDK14,6.98,Low Fat,0.041273236,Canned,82.4934,OUT018,2009,Medium,Tier 3,Supermarket Type2,982.7208 +FDP10,19,Low Fat,0.128090139,Snack Foods,107.0622,OUT046,1997,Small,Tier 1,Supermarket Type1,1376.2086 +FDC45,17,Low Fat,0.135707553,Fruits and Vegetables,172.5106,OUT035,2004,Small,Tier 2,Supermarket Type1,2053.3272 +FDS48,15.15,Low Fat,0.027774002,Baking Goods,152.3708,OUT035,2004,Small,Tier 2,Supermarket Type1,3159.8868 +FDX04,,Regular,0.07278643,Frozen Foods,49.4376,OUT019,1985,Small,Tier 1,Grocery Store,191.7504 +FDQ20,,low fat,0.029640604,Fruits and Vegetables,40.8138,OUT027,1985,Medium,Tier 3,Supermarket Type3,1543.3244 +FDU13,8.355,Low Fat,0.187939003,Canned,146.9418,OUT045,2002,,Tier 2,Supermarket Type1,1029.9926 +NCR53,12.15,Low Fat,0.14492016,Health and Hygiene,224.4404,OUT013,1987,High,Tier 3,Supermarket Type1,1800.3232 +FDN49,17.25,Regular,0.125419157,Breakfast,40.048,OUT049,1999,Medium,Tier 1,Supermarket Type1,399.48 +FDR31,6.46,Regular,0.049121972,Fruits and Vegetables,144.6102,OUT013,1987,High,Tier 3,Supermarket Type1,2916.204 +DRI03,,Low Fat,0,Dairy,175.3028,OUT027,1985,Medium,Tier 3,Supermarket Type3,3719.1588 +FDL58,5.78,Regular,0.074149074,Snack Foods,262.2568,OUT046,1997,Small,Tier 1,Supermarket Type1,5273.136 +NCJ05,18.7,Low Fat,0.04604992,Health and Hygiene,151.9682,OUT013,1987,High,Tier 3,Supermarket Type1,3354.3004 +FDS10,19.2,Low Fat,0.035384612,Snack Foods,180.3318,OUT017,2007,,Tier 2,Supermarket Type1,3428.2042 +FDK34,,Low Fat,0.038340116,Snack Foods,240.1564,OUT027,1985,Medium,Tier 3,Supermarket Type3,7150.692 +FDW48,,Low Fat,0,Baking Goods,81.8618,OUT019,1985,Small,Tier 1,Grocery Store,161.1236 +FDE08,,Low Fat,0.049080853,Fruits and Vegetables,147.7734,OUT027,1985,Medium,Tier 3,Supermarket Type3,4602.6754 +NCH06,,Low Fat,0.076183667,Household,245.646,OUT027,1985,Medium,Tier 3,Supermarket Type3,3695.19 +FDV08,7.35,Low Fat,0.028711412,Fruits and Vegetables,39.9454,OUT018,2009,Medium,Tier 3,Supermarket Type2,377.5086 +FDQ15,20.35,Regular,0,Meat,81.6276,OUT046,1997,Small,Tier 1,Supermarket Type1,1787.0072 +FDL56,,Low Fat,0.12517151,Fruits and Vegetables,88.9198,OUT027,1985,Medium,Tier 3,Supermarket Type3,3139.9128 +DRC12,17.85,Low Fat,0.037826873,Soft Drinks,189.7188,OUT046,1997,Small,Tier 1,Supermarket Type1,2285.0256 +FDX49,4.615,Regular,0.101747034,Canned,231.33,OUT013,1987,High,Tier 3,Supermarket Type1,4660.6 +FDJ09,15,low fat,0,Snack Foods,47.2744,OUT035,2004,Small,Tier 2,Supermarket Type1,679.116 +FDN23,,Regular,0.075142108,Breads,145.8444,OUT027,1985,Medium,Tier 3,Supermarket Type3,3773.7544 +DRD01,12.1,Regular,0.061424738,Soft Drinks,56.7614,OUT018,2009,Medium,Tier 3,Supermarket Type2,1049.9666 +FDS43,11.65,Low Fat,0.040597054,Fruits and Vegetables,187.324,OUT045,2002,,Tier 2,Supermarket Type1,1864.24 +FDY48,,Low Fat,0.041556697,Baking Goods,104.4332,OUT019,1985,Small,Tier 1,Grocery Store,307.5996 +FDU12,15.5,Regular,0.126791761,Baking Goods,262.1568,OUT010,1998,,Tier 3,Grocery Store,527.3136 +FDX33,9.195,Regular,0.117484834,Snack Foods,158.5578,OUT046,1997,Small,Tier 1,Supermarket Type1,2406.867 +FDH45,15.1,Regular,0.106097275,Fruits and Vegetables,43.2796,OUT018,2009,Medium,Tier 3,Supermarket Type2,123.8388 +FDJ10,5.095,Regular,0.129395895,Snack Foods,140.3838,OUT013,1987,High,Tier 3,Supermarket Type1,1826.2894 +FDX32,15.1,Regular,0.100265027,Fruits and Vegetables,142.5786,OUT018,2009,Medium,Tier 3,Supermarket Type2,3323.0078 +DRG51,12.1,Low Fat,0.011557563,Dairy,165.3526,OUT049,1999,Medium,Tier 1,Supermarket Type1,3453.5046 +NCB31,6.235,Low Fat,0.119157788,Household,263.791,OUT018,2009,Medium,Tier 3,Supermarket Type2,2103.928 +FDW47,15,Low Fat,0.077622622,Breads,121.8414,OUT010,1998,,Tier 3,Grocery Store,243.6828 +FDT20,,Low Fat,0.041194986,Fruits and Vegetables,39.1164,OUT027,1985,Medium,Tier 3,Supermarket Type3,1235.7248 +FDI34,10.65,Regular,0.085135953,Snack Foods,232.3668,OUT046,1997,Small,Tier 1,Supermarket Type1,3685.8688 +FDH56,9.8,Regular,0.106816919,Fruits and Vegetables,114.2492,OUT010,1998,,Tier 3,Grocery Store,463.3968 +DRJ47,18.25,Low Fat,0.04421348,Hard Drinks,173.408,OUT013,1987,High,Tier 3,Supermarket Type1,1038.648 +FDP04,,Low Fat,0.013745883,Frozen Foods,62.0168,OUT027,1985,Medium,Tier 3,Supermarket Type3,1534.0032 +NCZ06,19.6,Low Fat,0.094308058,Household,251.8698,OUT049,1999,Medium,Tier 1,Supermarket Type1,3551.3772 +FDY37,17,Regular,0.026622757,Canned,144.247,OUT045,2002,,Tier 2,Supermarket Type1,3149.234 +FDO46,9.6,Regular,0.014234595,Snack Foods,190.2872,OUT049,1999,Medium,Tier 1,Supermarket Type1,4727.18 +FDI10,8.51,Regular,0.078526225,Snack Foods,173.5422,OUT049,1999,Medium,Tier 1,Supermarket Type1,5000.8238 +NCT42,5.88,Low Fat,0.0249887,Household,150.3392,OUT018,2009,Medium,Tier 3,Supermarket Type2,447.4176 +FDE29,8.905,LF,0.143712172,Frozen Foods,60.2878,OUT018,2009,Medium,Tier 3,Supermarket Type2,1151.1682 +FDQ11,,Regular,0.067373081,Breads,258.8988,OUT027,1985,Medium,Tier 3,Supermarket Type3,3083.9856 +FDS20,8.85,Low Fat,0.053822086,Fruits and Vegetables,183.8292,OUT013,1987,High,Tier 3,Supermarket Type1,2554.0088 +FDR26,20.7,Low Fat,0.043011277,Dairy,177.2028,OUT018,2009,Medium,Tier 3,Supermarket Type2,3364.9532 +NCH43,,Low Fat,0.123557061,Household,216.6192,OUT019,1985,Small,Tier 1,Grocery Store,215.7192 +FDO25,6.3,Low Fat,0.127968205,Canned,209.627,OUT018,2009,Medium,Tier 3,Supermarket Type2,3984.813 +FDB40,17.5,Regular,0.007570599,Dairy,144.6102,OUT018,2009,Medium,Tier 3,Supermarket Type2,2187.153 +FDB14,,Regular,0,Canned,92.312,OUT019,1985,Small,Tier 1,Grocery Store,372.848 +FDW23,5.765,Low Fat,0.081996785,Baking Goods,40.1164,OUT035,2004,Small,Tier 2,Supermarket Type1,540.6296 +FDZ23,17.75,Regular,0.067777778,Baking Goods,186.924,OUT018,2009,Medium,Tier 3,Supermarket Type2,3169.208 +FDX35,5.035,Regular,0.080362549,Breads,229.0036,OUT017,2007,,Tier 2,Supermarket Type1,4326.3684 +FDX24,8.355,Low Fat,0.013929059,Baking Goods,94.1462,OUT046,1997,Small,Tier 1,Supermarket Type1,2221.1088 +DRG15,6.13,Low Fat,0.077169953,Dairy,63.0536,OUT017,2007,,Tier 2,Supermarket Type1,1225.072 +FDY60,10.5,Regular,0,Baking Goods,143.3128,OUT046,1997,Small,Tier 1,Supermarket Type1,1438.128 +FDK02,12.5,Low Fat,0.112681821,Canned,119.144,OUT018,2009,Medium,Tier 3,Supermarket Type2,3235.788 +FDK24,,Low Fat,0.10080442,Baking Goods,45.4744,OUT027,1985,Medium,Tier 3,Supermarket Type3,1041.3112 +NCA05,20.75,Low Fat,0.02512588,Health and Hygiene,150.4734,OUT035,2004,Small,Tier 2,Supermarket Type1,890.8404 +FDN33,,Regular,0.122519571,Snack Foods,93.0436,OUT027,1985,Medium,Tier 3,Supermarket Type3,2363.59 +FDA09,13.35,Regular,0.15021128,Snack Foods,179.066,OUT017,2007,,Tier 2,Supermarket Type1,2696.49 +FDK50,7.96,Low Fat,0.028357839,Canned,163.2894,OUT035,2004,Small,Tier 2,Supermarket Type1,4530.1032 +NCE55,8.92,Low Fat,0.130663423,Household,175.237,OUT017,2007,,Tier 2,Supermarket Type1,2117.244 +FDG12,6.635,Regular,0.006335942,Baking Goods,121.8098,OUT049,1999,Medium,Tier 1,Supermarket Type1,2048.6666 +FDC37,15.5,Low Fat,0.032845997,Baking Goods,106.7938,OUT013,1987,High,Tier 3,Supermarket Type1,3215.814 +DRG15,6.13,Low Fat,0.076735903,Dairy,62.4536,OUT046,1997,Small,Tier 1,Supermarket Type1,1225.072 +FDQ58,7.315,Low Fat,0.01530184,Snack Foods,154.434,OUT046,1997,Small,Tier 1,Supermarket Type1,1378.206 +FDQ51,16,Regular,0.029377239,Meat,46.1718,OUT010,1998,,Tier 3,Grocery Store,94.5436 +FDR46,16.85,Low Fat,0.233356571,Snack Foods,146.576,OUT010,1998,,Tier 3,Grocery Store,439.428 +FDC50,15.85,Low Fat,0.137053947,Canned,94.4094,OUT018,2009,Medium,Tier 3,Supermarket Type2,1047.3034 +FDJ09,15,Low Fat,0,Snack Foods,43.4744,OUT046,1997,Small,Tier 1,Supermarket Type1,543.2928 +NCC18,19.1,Low Fat,0.177236497,Household,172.3422,OUT035,2004,Small,Tier 2,Supermarket Type1,2586.633 +FDL04,19,Low Fat,0.111830282,Frozen Foods,105.4622,OUT013,1987,High,Tier 3,Supermarket Type1,952.7598 +FDH48,13.5,Low Fat,0,Baking Goods,84.654,OUT049,1999,Medium,Tier 1,Supermarket Type1,1211.756 +FDD38,16.75,Regular,0.008204465,Canned,99.8674,OUT049,1999,Medium,Tier 1,Supermarket Type1,2342.9502 +FDT47,,Regular,0.02439015,Breads,95.9068,OUT027,1985,Medium,Tier 3,Supermarket Type3,3207.8244 +FDE41,9.195,Regular,0.064143995,Frozen Foods,85.9566,OUT045,2002,,Tier 2,Supermarket Type1,1691.132 +FDH19,19.35,Low Fat,0.033275634,Meat,173.8738,OUT017,2007,,Tier 2,Supermarket Type1,2432.8332 +FDW26,11.8,Regular,0.107662745,Dairy,224.1772,OUT017,2007,,Tier 2,Supermarket Type1,2890.9036 +FDW35,10.6,Low Fat,0.01115195,Breads,40.6454,OUT017,2007,,Tier 2,Supermarket Type1,167.7816 +FDQ55,13.65,Regular,0.013064516,Fruits and Vegetables,115.5834,OUT045,2002,,Tier 2,Supermarket Type1,1382.2008 +FDV22,14.85,Regular,0.009954237,Snack Foods,158.263,OUT049,1999,Medium,Tier 1,Supermarket Type1,2659.871 +NCN29,,Low Fat,0.021214364,Health and Hygiene,48.2034,OUT019,1985,Small,Tier 1,Grocery Store,97.2068 +FDQ26,13.5,Regular,0.067859568,Dairy,60.1562,OUT035,2004,Small,Tier 2,Supermarket Type1,1599.9174 +FDV24,5.635,Low Fat,0.103481775,Baking Goods,150.005,OUT045,2002,,Tier 2,Supermarket Type1,1797.66 +FDG50,7.405,Low Fat,0.015358176,Canned,92.4146,OUT017,2007,,Tier 2,Supermarket Type1,1459.4336 +NCF42,,Low Fat,0.293066133,Household,177.0712,OUT019,1985,Small,Tier 1,Grocery Store,351.5424 +FDT46,11.35,Low Fat,0.030981392,Snack Foods,51.9008,OUT017,2007,,Tier 2,Supermarket Type1,708.4112 +DRE49,,Low Fat,0,Soft Drinks,153.8024,OUT027,1985,Medium,Tier 3,Supermarket Type3,7741.9224 +FDV56,16.1,Regular,0.013623294,Fruits and Vegetables,109.3596,OUT045,2002,,Tier 2,Supermarket Type1,1186.4556 +FDD32,17.7,Regular,0.041098734,Fruits and Vegetables,80.9276,OUT018,2009,Medium,Tier 3,Supermarket Type2,487.3656 +NCN19,13.1,Low Fat,0.01209726,Others,188.853,OUT035,2004,Small,Tier 2,Supermarket Type1,3225.801 +FDQ48,14.3,reg,0.034382602,Baking Goods,96.5726,OUT013,1987,High,Tier 3,Supermarket Type1,2251.0698 +FDW34,,Low Fat,0.035406842,Snack Foods,244.317,OUT027,1985,Medium,Tier 3,Supermarket Type3,8262.578 +NCS38,8.6,Low Fat,0.090374342,Household,114.3176,OUT045,2002,,Tier 2,Supermarket Type1,1946.7992 +FDL58,5.78,Regular,0.074451126,Snack Foods,264.5568,OUT018,2009,Medium,Tier 3,Supermarket Type2,6327.7632 +FDY59,8.195,Low Fat,0.031467128,Baking Goods,91.8462,OUT045,2002,,Tier 2,Supermarket Type1,2313.655 +FDZ03,13.65,Regular,0.078786674,Dairy,184.824,OUT046,1997,Small,Tier 1,Supermarket Type1,3355.632 +FDP60,17.35,Low Fat,0.056032247,Baking Goods,102.3016,OUT045,2002,,Tier 2,Supermarket Type1,1619.2256 +NCI30,20.25,Low Fat,0.058935522,Household,246.646,OUT046,1997,Small,Tier 1,Supermarket Type1,2463.46 +FDO03,,Regular,0.064577332,Meat,230.5352,OUT019,1985,Small,Tier 1,Grocery Store,687.1056 +FDZ20,16.1,Low Fat,0.034306962,Fruits and Vegetables,252.3356,OUT046,1997,Small,Tier 1,Supermarket Type1,3815.034 +FDQ31,,Regular,0.053586458,Fruits and Vegetables,89.7856,OUT027,1985,Medium,Tier 3,Supermarket Type3,966.7416 +FDY03,17.6,Regular,0.076431919,Meat,113.2202,OUT018,2009,Medium,Tier 3,Supermarket Type2,2025.3636 +FDW45,18,Low Fat,0.039090105,Snack Foods,148.4418,OUT045,2002,,Tier 2,Supermarket Type1,4119.9704 +NCO41,12.5,Low Fat,0.031549131,Health and Hygiene,99.0384,OUT010,1998,,Tier 3,Grocery Store,197.0768 +FDK16,9.065,Low Fat,0.115233813,Frozen Foods,94.4094,OUT013,1987,High,Tier 3,Supermarket Type1,2856.282 +FDZ16,16.85,Regular,0.159825617,Frozen Foods,195.5478,OUT035,2004,Small,Tier 2,Supermarket Type1,4262.4516 +NCD18,16,Low Fat,0.073080167,Household,228.4668,OUT017,2007,,Tier 2,Supermarket Type1,2534.0348 +FDF52,9.3,Low Fat,0.066727717,Frozen Foods,181.6292,OUT013,1987,High,Tier 3,Supermarket Type1,2371.5796 +FDF09,6.215,Low Fat,0.012146608,Fruits and Vegetables,37.9848,OUT035,2004,Small,Tier 2,Supermarket Type1,782.9808 +FDW43,20.1,Regular,0.022552083,Fruits and Vegetables,226.6036,OUT017,2007,,Tier 2,Supermarket Type1,6831.108 +FDU19,8.77,Regular,0.047036036,Fruits and Vegetables,170.5422,OUT017,2007,,Tier 2,Supermarket Type1,2759.0752 +FDA50,16.25,Low Fat,0.087158654,Dairy,95.141,OUT035,2004,Small,Tier 2,Supermarket Type1,2220.443 +FDS48,15.15,Low Fat,0.027756137,Baking Goods,150.4708,OUT013,1987,High,Tier 3,Supermarket Type1,2106.5912 +NCH07,13.15,Low Fat,0.092589917,Household,159.5604,OUT013,1987,High,Tier 3,Supermarket Type1,1901.5248 +NCK54,12.15,Low Fat,0,Household,117.615,OUT013,1987,High,Tier 3,Supermarket Type1,1514.695 +FDD53,,Low Fat,0.077427883,Frozen Foods,41.8454,OUT019,1985,Small,Tier 1,Grocery Store,41.9454 +FDV58,20.85,Low Fat,0.121227447,Snack Foods,197.5452,OUT035,2004,Small,Tier 2,Supermarket Type1,4306.3944 +FDI08,18.2,Regular,0.066284519,Fruits and Vegetables,247.2092,OUT035,2004,Small,Tier 2,Supermarket Type1,3486.1288 +FDD08,8.3,Low Fat,0.03549838,Fruits and Vegetables,36.6506,OUT018,2009,Medium,Tier 3,Supermarket Type2,455.4072 +FDX34,6.195,Low Fat,0.072131519,Snack Foods,120.1098,OUT045,2002,,Tier 2,Supermarket Type1,2892.2352 +FDX55,15.1,Low Fat,0,Fruits and Vegetables,216.4166,OUT045,2002,,Tier 2,Supermarket Type1,2830.3158 +NCS05,11.5,Low Fat,0.021020616,Health and Hygiene,130.7942,OUT045,2002,,Tier 2,Supermarket Type1,2782.3782 +FDL04,19,Low Fat,0.111902259,Frozen Foods,105.4622,OUT035,2004,Small,Tier 2,Supermarket Type1,1905.5196 +FDJ53,10.5,Low Fat,0.071548187,Frozen Foods,120.2098,OUT018,2009,Medium,Tier 3,Supermarket Type2,602.549 +FDB47,8.8,Low Fat,0.071540443,Snack Foods,210.6612,OUT049,1999,Medium,Tier 1,Supermarket Type1,2508.7344 +NCS29,,Low Fat,0.121765124,Health and Hygiene,264.1884,OUT019,1985,Small,Tier 1,Grocery Store,264.9884 +FDB33,17.75,Low Fat,0.014609738,Fruits and Vegetables,160.4262,OUT045,2002,,Tier 2,Supermarket Type1,3182.524 +FDL52,,Regular,0.080697998,Frozen Foods,39.8506,OUT019,1985,Small,Tier 1,Grocery Store,37.9506 +FDB03,17.75,Regular,0.156802171,Dairy,242.1538,OUT035,2004,Small,Tier 2,Supermarket Type1,4326.3684 +FDW20,20.75,Low Fat,0.024144862,Fruits and Vegetables,123.373,OUT035,2004,Small,Tier 2,Supermarket Type1,2093.941 +FDT10,16.7,Regular,0.062297249,Snack Foods,60.6562,OUT018,2009,Medium,Tier 3,Supermarket Type2,592.562 +FDK04,,Low Fat,0.052058711,Frozen Foods,55.5588,OUT027,1985,Medium,Tier 3,Supermarket Type3,1145.176 +NCL07,13.85,Low Fat,0.031402114,Others,40.248,OUT045,2002,,Tier 2,Supermarket Type1,319.584 +FDZ31,15.35,Regular,0.113217223,Fruits and Vegetables,191.1504,OUT046,1997,Small,Tier 1,Supermarket Type1,1725.7536 +FDE45,12.1,Low Fat,0,Fruits and Vegetables,177.3002,OUT035,2004,Small,Tier 2,Supermarket Type1,3044.7034 +NCK54,12.15,Low Fat,0,Household,118.515,OUT018,2009,Medium,Tier 3,Supermarket Type2,1398.18 +DRE15,,Low Fat,0.031139933,Dairy,74.8012,OUT019,1985,Small,Tier 1,Grocery Store,303.6048 +NCQ38,16.35,Low Fat,0.013363902,Others,106.128,OUT035,2004,Small,Tier 2,Supermarket Type1,1917.504 +FDB08,,Low Fat,0.030952737,Fruits and Vegetables,160.1578,OUT027,1985,Medium,Tier 3,Supermarket Type3,3048.6982 +DRF49,7.27,Low Fat,0.07136748,Soft Drinks,111.8518,OUT018,2009,Medium,Tier 3,Supermarket Type2,2277.036 +DRC27,13.8,Low Fat,0.058192802,Dairy,246.9802,OUT049,1999,Medium,Tier 1,Supermarket Type1,5896.3248 +FDB37,20.25,Regular,0.022976493,Baking Goods,240.3538,OUT049,1999,Medium,Tier 1,Supermarket Type1,4086.0146 +FDS35,9.3,low fat,0.111220521,Breads,65.7826,OUT046,1997,Small,Tier 1,Supermarket Type1,968.739 +FDE47,14.15,Low Fat,0.037967687,Starchy Foods,125.6046,OUT049,1999,Medium,Tier 1,Supermarket Type1,1618.5598 +NCT53,,low fat,0,Health and Hygiene,164.5526,OUT027,1985,Medium,Tier 3,Supermarket Type3,2302.3364 +FDL14,8.115,Regular,0.032158866,Canned,154.8972,OUT046,1997,Small,Tier 1,Supermarket Type1,1713.7692 +FDP21,,Regular,0.045068892,Snack Foods,190.8872,OUT019,1985,Small,Tier 1,Grocery Store,945.436 +NCV54,11.1,Low Fat,0.033176087,Household,120.1124,OUT045,2002,,Tier 2,Supermarket Type1,1896.1984 +NCO41,12.5,Low Fat,0.018845298,Health and Hygiene,96.7384,OUT035,2004,Small,Tier 2,Supermarket Type1,2759.0752 +FDQ59,9.8,Regular,0.056375879,Breads,84.6908,OUT035,2004,Small,Tier 2,Supermarket Type1,1006.6896 +FDQ01,19.7,Regular,0.161356273,Canned,253.1014,OUT018,2009,Medium,Tier 3,Supermarket Type2,2805.0154 +FDQ48,14.3,Regular,0.034605882,Baking Goods,95.9726,OUT017,2007,,Tier 2,Supermarket Type1,2153.1972 +FDP09,19.75,Low Fat,0.033942546,Snack Foods,213.5902,OUT049,1999,Medium,Tier 1,Supermarket Type1,4460.1942 +FDK55,18.5,Low Fat,0.025740259,Meat,89.4172,OUT013,1987,High,Tier 3,Supermarket Type1,1605.9096 +NCJ43,,Low Fat,0.026938317,Household,174.1396,OUT027,1985,Medium,Tier 3,Supermarket Type3,4012.1108 +FDI07,12.35,Regular,0.033754478,Meat,199.0426,OUT035,2004,Small,Tier 2,Supermarket Type1,3361.6242 +NCW41,,Low Fat,0.015375557,Health and Hygiene,156.9604,OUT027,1985,Medium,Tier 3,Supermarket Type3,4278.4308 +FDG33,5.365,Regular,0.140458316,Seafood,169.7764,OUT049,1999,Medium,Tier 1,Supermarket Type1,3263.7516 +NCO05,,Low Fat,0.046333982,Health and Hygiene,97.2384,OUT027,1985,Medium,Tier 3,Supermarket Type3,2660.5368 +FDH53,20.5,Regular,0,Frozen Foods,82.8592,OUT035,2004,Small,Tier 2,Supermarket Type1,908.1512 +FDR49,8.71,Low Fat,0.139228412,Canned,49.5376,OUT046,1997,Small,Tier 1,Supermarket Type1,1198.44 +FDF33,,Low Fat,0,Seafood,109.4596,OUT027,1985,Medium,Tier 3,Supermarket Type3,1833.6132 +FDQ51,16,Regular,0,Meat,48.1718,OUT017,2007,,Tier 2,Supermarket Type1,756.3488 +FDZ38,17.6,Low Fat,0.00799436,Dairy,171.6422,OUT013,1987,High,Tier 3,Supermarket Type1,3793.7284 +FDV52,20.7,Regular,0.121767168,Frozen Foods,118.9466,OUT045,2002,,Tier 2,Supermarket Type1,353.5398 +FDM50,13,Regular,0.030083482,Canned,61.922,OUT035,2004,Small,Tier 2,Supermarket Type1,1557.972 +FDV60,20.2,Regular,0.118025091,Baking Goods,195.811,OUT017,2007,,Tier 2,Supermarket Type1,2553.343 +FDG60,20.35,Low Fat,0.060649213,Baking Goods,232.7616,OUT013,1987,High,Tier 3,Supermarket Type1,2812.3392 +FDN13,18.6,LF,0.151931742,Breakfast,101.1358,OUT013,1987,High,Tier 3,Supermarket Type1,1105.8938 +DRN59,,Low Fat,0.063831013,Hard Drinks,46.206,OUT027,1985,Medium,Tier 3,Supermarket Type3,1304.968 +FDU02,13.35,low fat,0.103091351,Dairy,229.9352,OUT017,2007,,Tier 2,Supermarket Type1,2519.3872 +FDZ58,17.85,Low Fat,0.052389407,Snack Foods,120.9072,OUT018,2009,Medium,Tier 3,Supermarket Type2,2817.6656 +NCQ38,16.35,Low Fat,0.013355306,Others,105.528,OUT013,1987,High,Tier 3,Supermarket Type1,2024.032 +FDF39,14.85,Regular,0.019550858,Dairy,263.791,OUT045,2002,,Tier 2,Supermarket Type1,4207.856 +FDT03,21.25,Low Fat,0.01005532,Meat,183.1608,OUT017,2007,,Tier 2,Supermarket Type1,2756.412 +FDN09,14.15,Low Fat,0.034845668,Snack Foods,242.7828,OUT013,1987,High,Tier 3,Supermarket Type1,3167.8764 +FDJ02,17.2,Regular,0.025162022,Canned,145.9418,OUT035,2004,Small,Tier 2,Supermarket Type1,1765.7016 +FDN44,,Low Fat,0.022685222,Fruits and Vegetables,161.592,OUT027,1985,Medium,Tier 3,Supermarket Type3,4314.384 +FDQ34,10.85,Low Fat,0.162571649,Snack Foods,107.4622,OUT045,2002,,Tier 2,Supermarket Type1,529.311 +FDX31,20.35,Regular,0.014825605,Fruits and Vegetables,233.2958,OUT046,1997,Small,Tier 1,Supermarket Type1,4206.5244 +NCH55,16.35,Low Fat,0.058034349,Household,124.802,OUT010,1998,,Tier 3,Grocery Store,253.004 +DRM47,9.3,Low Fat,0.043785694,Hard Drinks,191.6846,OUT046,1997,Small,Tier 1,Supermarket Type1,3057.3536 +DRL01,,Regular,0.076798609,Soft Drinks,231.8958,OUT027,1985,Medium,Tier 3,Supermarket Type3,8413.0488 +FDO12,15.75,Low Fat,0.055241242,Baking Goods,196.5452,OUT017,2007,,Tier 2,Supermarket Type1,3131.9232 +NCK30,14.85,Low Fat,0.061102235,Household,253.2698,OUT045,2002,,Tier 2,Supermarket Type1,2283.0282 +FDP16,18.6,Low Fat,0.039517121,Frozen Foods,243.6802,OUT017,2007,,Tier 2,Supermarket Type1,5896.3248 +NCG06,16.35,Low Fat,0.029565309,Household,256.4646,OUT018,2009,Medium,Tier 3,Supermarket Type2,515.3292 +FDX36,9.695,Regular,0.128283243,Baking Goods,226.1404,OUT046,1997,Small,Tier 1,Supermarket Type1,3375.606 +FDT09,15.15,Regular,0.012332667,Snack Foods,130.0284,OUT017,2007,,Tier 2,Supermarket Type1,3559.3668 +FDF08,14.3,Regular,0.065195229,Fruits and Vegetables,88.9856,OUT035,2004,Small,Tier 2,Supermarket Type1,1669.8264 +FDA43,10.895,Low Fat,0.108253944,Fruits and Vegetables,194.8794,OUT010,1998,,Tier 3,Grocery Store,585.2382 +NCN06,8.39,Low Fat,0.121178848,Household,165.1868,OUT017,2007,,Tier 2,Supermarket Type1,2784.3756 +DRF15,18.35,LF,0,Dairy,151.934,OUT013,1987,High,Tier 3,Supermarket Type1,306.268 +NCX05,15.2,Low Fat,0.09698132,Health and Hygiene,116.3492,OUT013,1987,High,Tier 3,Supermarket Type1,2548.6824 +FDM21,20.2,Low Fat,0.064351908,Snack Foods,259.4646,OUT035,2004,Small,Tier 2,Supermarket Type1,2061.3168 +NCG54,,Low Fat,0.079419801,Household,172.3106,OUT027,1985,Medium,Tier 3,Supermarket Type3,5475.5392 +FDD26,8.71,Regular,0.072301795,Canned,185.6924,OUT045,2002,,Tier 2,Supermarket Type1,3331.6632 +FDU23,12.15,Low Fat,0.021719387,Breads,163.1184,OUT035,2004,Small,Tier 2,Supermarket Type1,3467.4864 +FDO37,8.06,Low Fat,0.021420031,Breakfast,232.0326,OUT045,2002,,Tier 2,Supermarket Type1,3003.4238 +FDP19,11.5,LF,0.290430317,Fruits and Vegetables,130.6652,OUT010,1998,,Tier 3,Grocery Store,258.3304 +FDT13,14.85,Low Fat,0.018571641,Canned,187.3214,OUT046,1997,Small,Tier 1,Supermarket Type1,4333.6922 +FDY07,11.8,Low Fat,0,Fruits and Vegetables,45.2402,OUT018,2009,Medium,Tier 3,Supermarket Type2,1148.505 +DRI47,14.7,Low Fat,0.020952705,Hard Drinks,143.5128,OUT049,1999,Medium,Tier 1,Supermarket Type1,2444.8176 +NCW42,,Low Fat,0.102371638,Household,221.2456,OUT019,1985,Small,Tier 1,Grocery Store,663.1368 +NCQ50,18.75,LF,0.034278798,Household,214.1218,OUT013,1987,High,Tier 3,Supermarket Type1,4488.1578 +FDQ09,7.235,Low Fat,0,Snack Foods,115.1834,OUT045,2002,,Tier 2,Supermarket Type1,1382.2008 +FDI20,,LF,0.038377013,Fruits and Vegetables,211.5586,OUT027,1985,Medium,Tier 3,Supermarket Type3,4432.2306 +NCP05,19.6,Low Fat,0.025325897,Health and Hygiene,150.9024,OUT049,1999,Medium,Tier 1,Supermarket Type1,3795.06 +FDH02,7.27,Regular,0.020898691,Canned,92.2488,OUT017,2007,,Tier 2,Supermarket Type1,814.9392 +FDH45,15.1,Regular,0.105881129,Fruits and Vegetables,42.0796,OUT045,2002,,Tier 2,Supermarket Type1,454.0756 +DRG49,7.81,Low Fat,0.112906337,Soft Drinks,243.5486,OUT010,1998,,Tier 3,Grocery Store,488.6972 +FDA37,7.81,Regular,0.055216312,Canned,125.5046,OUT035,2004,Small,Tier 2,Supermarket Type1,3237.1196 +FDS13,6.465,Low Fat,0.125210375,Canned,266.8884,OUT017,2007,,Tier 2,Supermarket Type1,1059.9536 +NCW42,,Low Fat,0.058185842,Household,220.8456,OUT027,1985,Medium,Tier 3,Supermarket Type3,4199.8664 +FDK15,10.8,Low Fat,0.098814721,Meat,100.5042,OUT018,2009,Medium,Tier 3,Supermarket Type2,1884.8798 +FDX51,9.5,Regular,0.022058724,Meat,196.8452,OUT046,1997,Small,Tier 1,Supermarket Type1,3523.4136 +FDJ20,20.7,Regular,0.100091576,Fruits and Vegetables,125.5388,OUT013,1987,High,Tier 3,Supermarket Type1,2105.2596 +DRK59,8.895,Low Fat,0.075876602,Hard Drinks,235.9616,OUT017,2007,,Tier 2,Supermarket Type1,1874.8928 +FDL45,15.6,Low Fat,0.037841362,Snack Foods,125.2704,OUT018,2009,Medium,Tier 3,Supermarket Type2,2628.5784 +FDH41,9,Low Fat,0.081943273,Frozen Foods,214.5534,OUT013,1987,High,Tier 3,Supermarket Type1,3440.8544 +FDD05,19.35,Low Fat,0.016645164,Frozen Foods,120.9098,OUT045,2002,,Tier 2,Supermarket Type1,1687.1372 +FDZ39,19.7,Regular,0.018061324,Meat,102.599,OUT045,2002,,Tier 2,Supermarket Type1,2063.98 +FDY35,,Regular,0.028062401,Breads,44.0402,OUT019,1985,Small,Tier 1,Grocery Store,91.8804 +NCE06,5.825,Low Fat,0.091857904,Household,160.7894,OUT018,2009,Medium,Tier 3,Supermarket Type2,1617.894 +FDE57,,Low Fat,0.036109413,Fruits and Vegetables,140.6154,OUT027,1985,Medium,Tier 3,Supermarket Type3,4538.0928 +FDD33,12.85,Low Fat,0.108633372,Fruits and Vegetables,233.8642,OUT018,2009,Medium,Tier 3,Supermarket Type2,2323.642 +FDQ10,12.85,Low Fat,0.03324652,Snack Foods,172.4422,OUT045,2002,,Tier 2,Supermarket Type1,4483.4972 +FDN15,17.5,Low Fat,0.016720132,Meat,139.918,OUT013,1987,High,Tier 3,Supermarket Type1,419.454 +FDS50,17,Low Fat,0.055433377,Dairy,221.1114,OUT046,1997,Small,Tier 1,Supermarket Type1,4434.228 +FDX21,7.05,Low Fat,0.084966021,Snack Foods,111.1912,OUT046,1997,Small,Tier 1,Supermarket Type1,1965.4416 +FDL58,5.78,Regular,0.074135053,Snack Foods,264.0568,OUT035,2004,Small,Tier 2,Supermarket Type1,2109.2544 +FDK09,15.2,Low Fat,0.091745951,Snack Foods,229.0352,OUT035,2004,Small,Tier 2,Supermarket Type1,2290.352 +FDS08,,Low Fat,0.056685383,Fruits and Vegetables,178.437,OUT027,1985,Medium,Tier 3,Supermarket Type3,3175.866 +FDE20,11.35,Regular,0.00552947,Fruits and Vegetables,169.279,OUT035,2004,Small,Tier 2,Supermarket Type1,2376.906 +FDF04,17.5,Low Fat,0.013664703,Frozen Foods,257.7304,OUT045,2002,,Tier 2,Supermarket Type1,5683.2688 +FDA50,16.25,Low Fat,0.087310672,Dairy,95.541,OUT049,1999,Medium,Tier 1,Supermarket Type1,1544.656 +FDX08,12.85,Low Fat,0.022639195,Fruits and Vegetables,179.7318,OUT049,1999,Medium,Tier 1,Supermarket Type1,2165.1816 +FDD05,,Low Fat,0.016531033,Frozen Foods,122.4098,OUT027,1985,Medium,Tier 3,Supermarket Type3,3012.745 +FDG41,8.84,Regular,0.076873991,Frozen Foods,109.9228,OUT018,2009,Medium,Tier 3,Supermarket Type2,1547.3192 +FDU39,,Low Fat,0.035863436,Meat,58.3562,OUT027,1985,Medium,Tier 3,Supermarket Type3,1125.8678 +NCQ43,17.75,Low Fat,0.111301625,Others,107.5912,OUT046,1997,Small,Tier 1,Supermarket Type1,1528.6768 +NCY42,6.38,Low Fat,0.015193323,Household,143.347,OUT045,2002,,Tier 2,Supermarket Type1,858.882 +FDF26,,Regular,0.046408928,Canned,153.2998,OUT027,1985,Medium,Tier 3,Supermarket Type3,3998.7948 +FDC20,10.65,Low Fat,0,Fruits and Vegetables,57.1272,OUT035,2004,Small,Tier 2,Supermarket Type1,279.636 +FDX14,13.1,Low Fat,0.07494003,Dairy,75.0354,OUT046,1997,Small,Tier 1,Supermarket Type1,902.8248 +DRC49,,LF,0.065119701,Soft Drinks,145.7128,OUT027,1985,Medium,Tier 3,Supermarket Type3,4026.7584 +FDM40,10.195,Low Fat,0,Frozen Foods,143.1154,OUT017,2007,,Tier 2,Supermarket Type1,2410.8618 +FDE10,6.67,Regular,0.090456903,Snack Foods,131.2626,OUT017,2007,,Tier 2,Supermarket Type1,2098.6016 +NCU17,5.32,Low Fat,0.093071679,Health and Hygiene,103.8674,OUT045,2002,,Tier 2,Supermarket Type1,509.337 +FDB36,,Regular,0.048292189,Baking Goods,133.1626,OUT027,1985,Medium,Tier 3,Supermarket Type3,2492.0894 +DRF13,12.1,Low Fat,0.029902679,Soft Drinks,144.3444,OUT018,2009,Medium,Tier 3,Supermarket Type2,1161.1552 +FDL13,13.85,Regular,0.056547986,Breakfast,232.73,OUT018,2009,Medium,Tier 3,Supermarket Type2,6291.81 +NCH55,16.35,Low Fat,0.034726222,Household,125.602,OUT049,1999,Medium,Tier 1,Supermarket Type1,3036.048 +NCF18,18.35,Low Fat,0.088908547,Household,192.8504,OUT013,1987,High,Tier 3,Supermarket Type1,2876.256 +FDC09,15.5,Regular,0.044024163,Fruits and Vegetables,102.0332,OUT010,1998,,Tier 3,Grocery Store,102.5332 +FDV09,12.1,Low Fat,0.020568574,Snack Foods,150.4734,OUT046,1997,Small,Tier 1,Supermarket Type1,2078.6276 +FDV09,12.1,Low Fat,0.020564685,Snack Foods,148.2734,OUT035,2004,Small,Tier 2,Supermarket Type1,3266.4148 +FDU16,19.25,Regular,0.058226609,Frozen Foods,85.2908,OUT013,1987,High,Tier 3,Supermarket Type1,671.1264 +FDD26,8.71,Regular,0.072155462,Canned,183.3924,OUT046,1997,Small,Tier 1,Supermarket Type1,3146.5708 +NCA29,10.5,Low Fat,0.027253711,Household,170.9106,OUT013,1987,High,Tier 3,Supermarket Type1,3251.1014 +FDZ26,11.6,Regular,0.144604071,Dairy,240.8222,OUT018,2009,Medium,Tier 3,Supermarket Type2,3585.333 +FDT56,16,Regular,0.193477995,Fruits and Vegetables,55.9246,OUT010,1998,,Tier 3,Grocery Store,405.4722 +FDF22,6.865,Low Fat,0.056945936,Snack Foods,214.6218,OUT045,2002,,Tier 2,Supermarket Type1,1923.4962 +FDH21,10.395,Low Fat,0.031288338,Seafood,159.5604,OUT045,2002,,Tier 2,Supermarket Type1,2852.2872 +FDD44,8.05,Regular,0.078400465,Fruits and Vegetables,259.0646,OUT046,1997,Small,Tier 1,Supermarket Type1,4380.2982 +FDS56,5.785,Regular,0.038976089,Fruits and Vegetables,264.2252,OUT017,2007,,Tier 2,Supermarket Type1,3934.878 +FDF21,10.3,Regular,0.058918844,Fruits and Vegetables,191.653,OUT049,1999,Medium,Tier 1,Supermarket Type1,5313.084 +FDM44,12.5,Low Fat,0.031176157,Fruits and Vegetables,103.099,OUT018,2009,Medium,Tier 3,Supermarket Type2,722.393 +DRK01,7.63,Low Fat,0.061159246,Soft Drinks,92.5436,OUT049,1999,Medium,Tier 1,Supermarket Type1,1607.2412 +FDO22,13.5,Regular,0,Snack Foods,78.396,OUT035,2004,Small,Tier 2,Supermarket Type1,1438.128 +FDP57,17.5,Low Fat,0.052550476,Snack Foods,101.299,OUT045,2002,,Tier 2,Supermarket Type1,722.393 +DRF49,,Low Fat,0.124448295,Soft Drinks,112.0518,OUT019,1985,Small,Tier 1,Grocery Store,113.8518 +DRK11,8.21,low fat,0.010808272,Hard Drinks,150.5392,OUT018,2009,Medium,Tier 3,Supermarket Type2,1043.9744 +FDT51,11.65,Regular,0.010963269,Meat,110.9544,OUT018,2009,Medium,Tier 3,Supermarket Type2,335.5632 +FDE58,18.5,LF,0,Snack Foods,119.8124,OUT017,2007,,Tier 2,Supermarket Type1,4029.4216 +FDT23,7.72,reg,0.075035902,Breads,78.7986,OUT018,2009,Medium,Tier 3,Supermarket Type2,856.8846 +NCT42,5.88,Low Fat,0.024882614,Household,149.4392,OUT035,2004,Small,Tier 2,Supermarket Type1,1640.5312 +FDJ41,6.85,Low Fat,0.022878953,Frozen Foods,262.3594,OUT035,2004,Small,Tier 2,Supermarket Type1,3924.891 +NCF42,,Low Fat,0.166572501,Household,176.1712,OUT027,1985,Medium,Tier 3,Supermarket Type3,3691.1952 +FDA19,7.52,LF,0.055081623,Fruits and Vegetables,128.8994,OUT013,1987,High,Tier 3,Supermarket Type1,2055.9904 +FDW09,13.65,Regular,0.025920816,Snack Foods,81.2302,OUT046,1997,Small,Tier 1,Supermarket Type1,2059.9852 +NCO14,,Low Fat,0.029500321,Household,46.2086,OUT027,1985,Medium,Tier 3,Supermarket Type3,802.9548 +FDO39,6.985,Regular,0.137645467,Meat,185.2608,OUT045,2002,,Tier 2,Supermarket Type1,2940.1728 +FDR45,,Low Fat,0,Snack Foods,240.6222,OUT027,1985,Medium,Tier 3,Supermarket Type3,4302.3996 +FDA15,9.3,Low Fat,0.026818196,Dairy,248.9092,OUT010,1998,,Tier 3,Grocery Store,498.0184 +FDY13,12.1,Low Fat,0.030102335,Canned,74.767,OUT013,1987,High,Tier 3,Supermarket Type1,2220.443 +FDY31,5.98,Low Fat,0.043740308,Fruits and Vegetables,145.3418,OUT018,2009,Medium,Tier 3,Supermarket Type2,2354.2688 +NCS29,9,Low Fat,0.069653585,Health and Hygiene,266.2884,OUT049,1999,Medium,Tier 1,Supermarket Type1,2914.8724 +FDJ52,7.145,Low Fat,0.01785932,Frozen Foods,160.6578,OUT018,2009,Medium,Tier 3,Supermarket Type2,2246.4092 +NCX41,19,Low Fat,0.017755213,Health and Hygiene,211.7244,OUT045,2002,,Tier 2,Supermarket Type1,2752.4172 +FDQ36,7.855,Regular,0.161875063,Baking Goods,35.6848,OUT045,2002,,Tier 2,Supermarket Type1,335.5632 +FDV35,19.5,Low Fat,0.128181759,Breads,156.1314,OUT035,2004,Small,Tier 2,Supermarket Type1,2792.3652 +FDE02,8.71,Low Fat,0.121250374,Canned,92.7778,OUT046,1997,Small,Tier 1,Supermarket Type1,1032.6558 +FDA34,11.5,Low Fat,0.014921093,Starchy Foods,173.908,OUT018,2009,Medium,Tier 3,Supermarket Type2,1211.756 +NCL42,18.85,Low Fat,0.040434372,Household,244.3144,OUT049,1999,Medium,Tier 1,Supermarket Type1,5635.3312 +FDE14,13.65,Regular,0.031508924,Canned,98.77,OUT045,2002,,Tier 2,Supermarket Type1,1697.79 +DRD25,6.135,Low Fat,0.079094835,Soft Drinks,114.386,OUT049,1999,Medium,Tier 1,Supermarket Type1,1018.674 +DRF01,5.655,Low Fat,0.175793413,Soft Drinks,146.9102,OUT018,2009,Medium,Tier 3,Supermarket Type2,1749.7224 +FDF39,14.85,Regular,0.019495051,Dairy,261.291,OUT013,1987,High,Tier 3,Supermarket Type1,10256.649 +FDP01,20.75,Regular,0.063313974,Breakfast,153.7682,OUT035,2004,Small,Tier 2,Supermarket Type1,1829.6184 +FDB10,10,Low Fat,0.0674819,Snack Foods,234.859,OUT018,2009,Medium,Tier 3,Supermarket Type2,1181.795 +FDY14,10.3,Low Fat,0.070026951,Dairy,263.6226,OUT035,2004,Small,Tier 2,Supermarket Type1,6608.065 +FDR57,5.675,Regular,0.023496967,Snack Foods,156.1288,OUT046,1997,Small,Tier 1,Supermarket Type1,2828.3184 +NCH29,5.51,Low Fat,0,Health and Hygiene,98.9726,OUT018,2009,Medium,Tier 3,Supermarket Type2,1565.9616 +FDJ45,17.75,low fat,0.073559521,Seafood,33.9216,OUT045,2002,,Tier 2,Supermarket Type1,830.9184 +FDZ48,17.75,Low Fat,0.07626905,Baking Goods,113.1544,OUT018,2009,Medium,Tier 3,Supermarket Type2,1006.6896 +FDV44,8.365,Regular,0.039925235,Fruits and Vegetables,189.2188,OUT045,2002,,Tier 2,Supermarket Type1,4570.0512 +FDR01,,Regular,0.093883945,Canned,200.4742,OUT019,1985,Small,Tier 1,Grocery Store,398.1484 +FDZ57,10,Regular,0.03773288,Snack Foods,128.2994,OUT013,1987,High,Tier 3,Supermarket Type1,1413.4934 +FDI08,18.2,Regular,0.066400129,Fruits and Vegetables,250.1092,OUT049,1999,Medium,Tier 1,Supermarket Type1,5727.2116 +DRA24,19.35,Regular,0.039920687,Soft Drinks,163.3868,OUT035,2004,Small,Tier 2,Supermarket Type1,3439.5228 +FDS39,,Low Fat,0.022351808,Meat,143.7812,OUT027,1985,Medium,Tier 3,Supermarket Type3,4986.842 +NCL31,7.39,Low Fat,0.120180894,Others,141.447,OUT013,1987,High,Tier 3,Supermarket Type1,2290.352 +FDD34,7.945,Low Fat,0.015900971,Snack Foods,163.821,OUT049,1999,Medium,Tier 1,Supermarket Type1,1794.331 +FDC34,16,Regular,0.172759093,Snack Foods,157.0972,OUT046,1997,Small,Tier 1,Supermarket Type1,4673.916 +NCK05,20.1,Low Fat,0.077454252,Health and Hygiene,59.2536,OUT046,1997,Small,Tier 1,Supermarket Type1,735.0432 +FDB32,20.6,Low Fat,0.039255412,Fruits and Vegetables,94.4778,OUT010,1998,,Tier 3,Grocery Store,93.8778 +FDC03,8.575,Regular,0.072252888,Dairy,196.5794,OUT017,2007,,Tier 2,Supermarket Type1,5267.1438 +FDO19,17.7,Regular,0.016664252,Fruits and Vegetables,47.9034,OUT018,2009,Medium,Tier 3,Supermarket Type2,729.051 +FDZ28,20,Regular,0.086187886,Frozen Foods,125.4678,OUT010,1998,,Tier 3,Grocery Store,127.1678 +FDK28,5.695,Low Fat,0.109784056,Frozen Foods,256.0646,OUT010,1998,,Tier 3,Grocery Store,1288.323 +NCU30,5.11,Low Fat,0,Household,164.721,OUT018,2009,Medium,Tier 3,Supermarket Type2,3588.662 +FDV57,15.25,Regular,0,Snack Foods,178.166,OUT045,2002,,Tier 2,Supermarket Type1,4853.682 +FDB02,,Regular,0.029023048,Canned,177.837,OUT027,1985,Medium,Tier 3,Supermarket Type3,6704.606 +FDD52,18.25,Regular,0.183142346,Dairy,110.357,OUT013,1987,High,Tier 3,Supermarket Type1,2087.283 +FDN34,15.6,Regular,0,Snack Foods,170.6132,OUT013,1987,High,Tier 3,Supermarket Type1,6595.4148 +FDB50,13,Low Fat,0.153857402,Canned,76.3986,OUT049,1999,Medium,Tier 1,Supermarket Type1,778.986 +FDS55,7.02,Low Fat,0.081290366,Fruits and Vegetables,147.3734,OUT049,1999,Medium,Tier 1,Supermarket Type1,2524.0478 +FDR21,19.7,Low Fat,0.066935459,Snack Foods,177.537,OUT046,1997,Small,Tier 1,Supermarket Type1,3175.866 +NCD07,9.1,Low Fat,0.055514919,Household,112.5518,OUT049,1999,Medium,Tier 1,Supermarket Type1,341.5554 +FDO11,8,Regular,0.050657232,Breads,249.9092,OUT010,1998,,Tier 3,Grocery Store,249.0092 +NCC54,17.75,Low Fat,0.098108957,Health and Hygiene,240.9196,OUT018,2009,Medium,Tier 3,Supermarket Type2,4579.3724 +FDV35,19.5,Low Fat,0.128405328,Breads,156.4314,OUT049,1999,Medium,Tier 1,Supermarket Type1,2326.971 +NCU29,7.685,Low Fat,0.025477448,Health and Hygiene,145.276,OUT046,1997,Small,Tier 1,Supermarket Type1,3515.424 +NCZ53,9.6,Low Fat,0.040969757,Health and Hygiene,188.7214,OUT010,1998,,Tier 3,Grocery Store,376.8428 +DRE03,19.6,Low Fat,0.040550868,Dairy,45.5718,OUT010,1998,,Tier 3,Grocery Store,47.2718 +FDZ09,17.6,Low Fat,0.175545889,Snack Foods,163.6868,OUT010,1998,,Tier 3,Grocery Store,163.7868 +FDE40,15.6,Regular,0.099344826,Dairy,63.6194,OUT045,2002,,Tier 2,Supermarket Type1,743.0328 +NCS18,12.65,Low Fat,0.042276746,Household,108.4938,OUT049,1999,Medium,Tier 1,Supermarket Type1,1500.7132 +FDX24,,Low Fat,0.013861607,Baking Goods,94.4462,OUT027,1985,Medium,Tier 3,Supermarket Type3,2036.0164 +FDS34,,Regular,0.076387367,Snack Foods,112.1518,OUT027,1985,Medium,Tier 3,Supermarket Type3,3870.9612 +NCS53,14.5,Low Fat,0.08996026,Health and Hygiene,159.5604,OUT045,2002,,Tier 2,Supermarket Type1,1426.1436 +FDH38,6.425,Low Fat,0.010480751,Canned,116.5808,OUT018,2009,Medium,Tier 3,Supermarket Type2,2460.7968 +DRM35,9.695,LF,0.070587419,Hard Drinks,176.9344,OUT045,2002,,Tier 2,Supermarket Type1,5888.3352 +DRI25,19.6,Low Fat,0.03387323,Soft Drinks,56.1614,OUT013,1987,High,Tier 3,Supermarket Type1,828.921 +NCP06,20.7,LF,0.039238384,Household,152.8366,OUT035,2004,Small,Tier 2,Supermarket Type1,2569.3222 +FDT02,12.6,Low Fat,0.024331586,Dairy,34.9874,OUT017,2007,,Tier 2,Supermarket Type1,529.311 +NCP14,8.275,Low Fat,0.110197977,Household,104.2306,OUT013,1987,High,Tier 3,Supermarket Type1,3658.571 +NCD43,,Low Fat,0.028048877,Household,106.1964,OUT019,1985,Small,Tier 1,Grocery Store,210.3928 +FDP20,19.85,Low Fat,0.045631231,Fruits and Vegetables,128.102,OUT013,1987,High,Tier 3,Supermarket Type1,1265.02 +FDK04,7.36,Low Fat,0.087559621,Frozen Foods,55.2588,OUT010,1998,,Tier 3,Grocery Store,229.0352 +FDQ15,20.35,Regular,0.252865979,Meat,82.7276,OUT010,1998,,Tier 3,Grocery Store,162.4552 +FDE11,17.7,Regular,0.135306012,Starchy Foods,183.7924,OUT049,1999,Medium,Tier 1,Supermarket Type1,2221.1088 +FDN01,,Low Fat,0.126760908,Breakfast,176.937,OUT019,1985,Small,Tier 1,Grocery Store,352.874 +FDC29,8.39,Regular,0.024201084,Frozen Foods,112.6176,OUT035,2004,Small,Tier 2,Supermarket Type1,2175.8344 +FDC48,9.195,Low Fat,0.015856295,Baking Goods,81.6592,OUT035,2004,Small,Tier 2,Supermarket Type1,1403.5064 +DRF27,8.93,Low Fat,0.028411899,Dairy,152.334,OUT035,2004,Small,Tier 2,Supermarket Type1,2143.876 +NCB55,15.7,Low Fat,0.160529322,Household,59.2562,OUT013,1987,High,Tier 3,Supermarket Type1,296.281 +NCX30,16.7,Low Fat,0.026771204,Household,246.3776,OUT017,2007,,Tier 2,Supermarket Type1,1981.4208 +DRN36,,Low Fat,0.049934854,Soft Drinks,95.0752,OUT027,1985,Medium,Tier 3,Supermarket Type3,2588.6304 +FDP08,20.5,Regular,0.113045883,Fruits and Vegetables,194.1478,OUT017,2007,,Tier 2,Supermarket Type1,2906.217 +NCD31,,Low Fat,0.015359722,Household,163.7526,OUT027,1985,Medium,Tier 3,Supermarket Type3,1973.4312 +FDK45,11.65,Low Fat,0.034049703,Seafood,112.286,OUT017,2007,,Tier 2,Supermarket Type1,452.744 +DRE49,20.75,Low Fat,0.02128304,Soft Drinks,153.5024,OUT049,1999,Medium,Tier 1,Supermarket Type1,2428.8384 +FDU52,,Low Fat,0.063462048,Frozen Foods,157.563,OUT027,1985,Medium,Tier 3,Supermarket Type3,1721.093 +FDD53,16.2,Low Fat,0.074019393,Frozen Foods,41.7454,OUT010,1998,,Tier 3,Grocery Store,83.8908 +FDF11,10.195,Regular,0.017666978,Starchy Foods,239.4538,OUT045,2002,,Tier 2,Supermarket Type1,4566.7222 +NCR30,,Low Fat,0.124299531,Household,73.4696,OUT019,1985,Small,Tier 1,Grocery Store,298.2784 +FDD03,13.3,Low Fat,0.079739853,Dairy,233.03,OUT013,1987,High,Tier 3,Supermarket Type1,5359.69 +FDF09,6.215,Low Fat,0.012167793,Fruits and Vegetables,37.4848,OUT049,1999,Medium,Tier 1,Supermarket Type1,111.8544 +FDS33,6.67,Regular,0,Snack Foods,90.5514,OUT018,2009,Medium,Tier 3,Supermarket Type2,974.0654 +FDK03,12.6,Regular,0.074338562,Dairy,255.5356,OUT017,2007,,Tier 2,Supermarket Type1,9664.7528 +FDD29,12.15,Low Fat,0.018407033,Frozen Foods,254.7698,OUT035,2004,Small,Tier 2,Supermarket Type1,5834.4054 +FDD02,16.6,Low Fat,0.050369191,Canned,117.2124,OUT049,1999,Medium,Tier 1,Supermarket Type1,1422.1488 +FDF29,,Regular,0.019837655,Frozen Foods,128.131,OUT027,1985,Medium,Tier 3,Supermarket Type3,1687.803 +FDP59,20.85,Regular,0.056465714,Breads,103.6648,OUT046,1997,Small,Tier 1,Supermarket Type1,2285.0256 +NCN17,11,Low Fat,0.054928641,Health and Hygiene,101.7358,OUT035,2004,Small,Tier 2,Supermarket Type1,1508.037 +NCM55,15.6,Low Fat,0.066829875,Others,185.5924,OUT049,1999,Medium,Tier 1,Supermarket Type1,3146.5708 +FDD39,,Low Fat,0.122832172,Dairy,217.685,OUT019,1985,Small,Tier 1,Grocery Store,432.77 +FDS02,10.195,Regular,0.146692433,Dairy,194.5794,OUT017,2007,,Tier 2,Supermarket Type1,4096.6674 +FDN16,12.6,Regular,0.062827447,Frozen Foods,105.099,OUT045,2002,,Tier 2,Supermarket Type1,1444.786 +FDM21,20.2,LF,0.064464147,Snack Foods,255.7646,OUT049,1999,Medium,Tier 1,Supermarket Type1,5410.9566 +FDJ04,18,Low Fat,0.124959013,Frozen Foods,116.5124,OUT018,2009,Medium,Tier 3,Supermarket Type2,355.5372 +FDT50,6.75,Regular,0,Dairy,96.7752,OUT049,1999,Medium,Tier 1,Supermarket Type1,1342.2528 +FDM27,12.35,Regular,0.15911489,Meat,158.1946,OUT018,2009,Medium,Tier 3,Supermarket Type2,1104.5622 +FDT19,7.59,Regular,0.145335007,Fruits and Vegetables,173.108,OUT045,2002,,Tier 2,Supermarket Type1,2077.296 +FDQ39,14.8,Low Fat,0.081168135,Meat,190.5846,OUT049,1999,Medium,Tier 1,Supermarket Type1,3630.6074 +NCU30,5.11,Low Fat,0.034874689,Household,161.721,OUT046,1997,Small,Tier 1,Supermarket Type1,2446.815 +FDY27,6.38,LF,0.031898175,Dairy,177.4344,OUT046,1997,Small,Tier 1,Supermarket Type1,1784.344 +FDW14,8.3,Regular,0.038211537,Dairy,87.7198,OUT046,1997,Small,Tier 1,Supermarket Type1,1569.9564 +FDJ21,16.7,Regular,0.03874616,Snack Foods,143.8102,OUT017,2007,,Tier 2,Supermarket Type1,4811.7366 +FDX47,,Regular,0.03443677,Breads,156.5288,OUT027,1985,Medium,Tier 3,Supermarket Type3,4870.9928 +FDK56,9.695,Low Fat,0.130261652,Fruits and Vegetables,185.2898,OUT045,2002,,Tier 2,Supermarket Type1,3367.6164 +NCN05,8.235,Low Fat,0.014456938,Health and Hygiene,184.795,OUT035,2004,Small,Tier 2,Supermarket Type1,1464.76 +FDC26,10.195,Low Fat,0.126383094,Canned,112.1886,OUT046,1997,Small,Tier 1,Supermarket Type1,667.1316 +FDT14,10.695,Regular,0.127620811,Dairy,119.244,OUT013,1987,High,Tier 3,Supermarket Type1,3475.476 +FDS36,8.38,Regular,0.046878474,Baking Goods,109.857,OUT035,2004,Small,Tier 2,Supermarket Type1,2306.997 +FDR48,11.65,Low Fat,0.220111117,Baking Goods,153.0024,OUT010,1998,,Tier 3,Grocery Store,455.4072 +FDM04,9.195,Regular,0.0471117,Frozen Foods,52.0666,OUT035,2004,Small,Tier 2,Supermarket Type1,615.1992 +FDZ37,8.1,Regular,0.019768503,Canned,88.6198,OUT046,1997,Small,Tier 1,Supermarket Type1,1569.9564 +FDE46,18.6,Low Fat,0.015858893,Snack Foods,152.9366,OUT017,2007,,Tier 2,Supermarket Type1,453.4098 +NCQ53,17.6,Low Fat,0.018905326,Health and Hygiene,234.659,OUT046,1997,Small,Tier 1,Supermarket Type1,8508.924 +NCN42,20.25,Low Fat,0.014280554,Household,148.0418,OUT018,2009,Medium,Tier 3,Supermarket Type2,1177.1344 +DRH11,5.98,Low Fat,0.075675438,Hard Drinks,53.3614,OUT049,1999,Medium,Tier 1,Supermarket Type1,331.5684 +NCI42,18.75,Low Fat,0.010381661,Household,207.8954,OUT049,1999,Medium,Tier 1,Supermarket Type1,2292.3494 +FDT07,5.82,Regular,0.077475884,Fruits and Vegetables,255.333,OUT045,2002,,Tier 2,Supermarket Type1,4870.327 +DRL60,8.52,Low Fat,0.02705936,Soft Drinks,153.3682,OUT046,1997,Small,Tier 1,Supermarket Type1,914.8092 +FDG20,15.5,Regular,0.126199917,Fruits and Vegetables,178.4028,OUT018,2009,Medium,Tier 3,Supermarket Type2,1239.7196 +FDF56,16.7,Regular,0.119462225,Fruits and Vegetables,182.7976,OUT046,1997,Small,Tier 1,Supermarket Type1,1810.976 +FDV33,9.6,Regular,0.027454997,Snack Foods,258.1304,OUT018,2009,Medium,Tier 3,Supermarket Type2,2324.9736 +NCF31,9.13,Low Fat,0.051928034,Household,151.4024,OUT049,1999,Medium,Tier 1,Supermarket Type1,1973.4312 +FDD59,10.5,Regular,0,Starchy Foods,78.296,OUT046,1997,Small,Tier 1,Supermarket Type1,1438.128 +FDQ52,17,Low Fat,0.119570595,Frozen Foods,249.7434,OUT049,1999,Medium,Tier 1,Supermarket Type1,4221.8378 +FDP09,,Low Fat,0.033725743,Snack Foods,211.6902,OUT027,1985,Medium,Tier 3,Supermarket Type3,4247.804 +FDK24,9.195,Low Fat,0.101275792,Baking Goods,46.4744,OUT035,2004,Small,Tier 2,Supermarket Type1,950.7624 +NCA18,10.1,Low Fat,0.056077574,Household,117.8492,OUT046,1997,Small,Tier 1,Supermarket Type1,1621.8888 +NCE07,8.18,Low Fat,0,Household,140.5154,OUT045,2002,,Tier 2,Supermarket Type1,1701.7848 +FDM45,8.655,Regular,0.088178053,Snack Foods,122.6756,OUT035,2004,Small,Tier 2,Supermarket Type1,2302.3364 +FDQ32,17.85,Regular,0.046608497,Fruits and Vegetables,122.9388,OUT046,1997,Small,Tier 1,Supermarket Type1,3095.97 +FDI34,10.65,Regular,0.085119855,Snack Foods,229.8668,OUT035,2004,Small,Tier 2,Supermarket Type1,4146.6024 +FDE14,13.65,Regular,0.031418984,Canned,99.27,OUT013,1987,High,Tier 3,Supermarket Type1,2596.62 +DRF37,17.25,Low Fat,0.084809658,Soft Drinks,261.191,OUT017,2007,,Tier 2,Supermarket Type1,3155.892 +FDW44,9.5,Regular,0.035350045,Fruits and Vegetables,169.7448,OUT017,2007,,Tier 2,Supermarket Type1,3579.3408 +FDC59,16.7,Regular,0,Starchy Foods,63.6168,OUT049,1999,Medium,Tier 1,Supermarket Type1,1342.2528 +NCI29,8.6,Low Fat,0.054601779,Health and Hygiene,141.1154,OUT010,1998,,Tier 3,Grocery Store,425.4462 +FDV38,19.25,Low Fat,0.102188428,Dairy,54.3956,OUT018,2009,Medium,Tier 3,Supermarket Type2,1201.1032 +FDZ49,11,Regular,0.133034816,Canned,222.0798,OUT013,1987,High,Tier 3,Supermarket Type1,2864.9374 +DRD49,9.895,Low Fat,0.16817143,Soft Drinks,237.7564,OUT045,2002,,Tier 2,Supermarket Type1,3813.7024 +FDA02,14,Regular,0.029722659,Dairy,143.4786,OUT046,1997,Small,Tier 1,Supermarket Type1,1589.2646 +FDX20,7.365,Low Fat,0.042733625,Fruits and Vegetables,226.972,OUT018,2009,Medium,Tier 3,Supermarket Type2,3848.324 +FDS24,20.85,Regular,0.062172698,Baking Goods,90.2514,OUT013,1987,High,Tier 3,Supermarket Type1,619.8598 +FDI58,7.64,Regular,0.070704474,Snack Foods,93.412,OUT046,1997,Small,Tier 1,Supermarket Type1,1491.392 +FDQ60,,Regular,0.191500528,Baking Goods,121.2098,OUT019,1985,Small,Tier 1,Grocery Store,120.5098 +FDJ27,17.7,Regular,0.122065518,Meat,103.3674,OUT049,1999,Medium,Tier 1,Supermarket Type1,2546.685 +FDV27,7.97,Regular,0.04021623,Meat,90.4514,OUT017,2007,,Tier 2,Supermarket Type1,1328.271 +NCL41,12.35,Low Fat,0.041737627,Health and Hygiene,33.1216,OUT046,1997,Small,Tier 1,Supermarket Type1,519.324 +NCP29,8.42,Low Fat,0.11227101,Health and Hygiene,63.2168,OUT046,1997,Small,Tier 1,Supermarket Type1,703.0848 +FDC45,,Low Fat,0.135075924,Fruits and Vegetables,170.3106,OUT027,1985,Medium,Tier 3,Supermarket Type3,3422.212 +FDN33,6.305,Regular,0.12301331,Snack Foods,93.2436,OUT013,1987,High,Tier 3,Supermarket Type1,2079.9592 +DRC01,5.92,Regular,0.019238942,Soft Drinks,49.8692,OUT045,2002,,Tier 2,Supermarket Type1,1133.1916 +FDL57,15.1,Regular,0.067212845,Snack Foods,260.2304,OUT045,2002,,Tier 2,Supermarket Type1,4908.2776 +NCF42,17.35,Low Fat,0.280164929,Household,177.5712,OUT010,1998,,Tier 3,Grocery Store,527.3136 +FDG50,7.405,Low Fat,0.015271793,Canned,89.9146,OUT046,1997,Small,Tier 1,Supermarket Type1,1550.6482 +FDH22,6.405,Low Fat,0.136512858,Snack Foods,128.7678,OUT049,1999,Medium,Tier 1,Supermarket Type1,3052.0272 +FDO36,19.7,Low Fat,0.078034976,Baking Goods,178.066,OUT049,1999,Medium,Tier 1,Supermarket Type1,3954.852 +FDY04,17.7,Regular,0.042649476,Frozen Foods,162.721,OUT018,2009,Medium,Tier 3,Supermarket Type2,978.726 +FDZ09,17.6,Low Fat,0.104859135,Snack Foods,161.8868,OUT035,2004,Small,Tier 2,Supermarket Type1,4094.67 +FDH28,15.85,Regular,0.110202066,Frozen Foods,39.7506,OUT049,1999,Medium,Tier 1,Supermarket Type1,721.0614 +FDN32,17.5,Low Fat,0.01558456,Fruits and Vegetables,185.1266,OUT049,1999,Medium,Tier 1,Supermarket Type1,4795.0916 +DRJ37,,Low Fat,0.060805497,Soft Drinks,150.8024,OUT027,1985,Medium,Tier 3,Supermarket Type3,3339.6528 +FDE57,9.6,Low Fat,0.036490369,Fruits and Vegetables,140.8154,OUT017,2007,,Tier 2,Supermarket Type1,1843.6002 +FDG05,11,Regular,0.088025298,Frozen Foods,158.063,OUT045,2002,,Tier 2,Supermarket Type1,2659.871 +FDI09,20.75,Regular,0.129864461,Seafood,240.188,OUT018,2009,Medium,Tier 3,Supermarket Type2,5992.2 +DRD12,,Low Fat,0,Soft Drinks,89.4146,OUT027,1985,Medium,Tier 3,Supermarket Type3,2645.2234 +FDD02,16.6,Low Fat,0.084176826,Canned,118.0124,OUT010,1998,,Tier 3,Grocery Store,592.562 +FDI36,12.5,Regular,0.062343432,Baking Goods,199.7426,OUT046,1997,Small,Tier 1,Supermarket Type1,593.2278 +DRK39,7.02,Low Fat,0.049942926,Dairy,82.425,OUT049,1999,Medium,Tier 1,Supermarket Type1,1414.825 +FDH44,19.1,reg,0.025867261,Fruits and Vegetables,147.6418,OUT035,2004,Small,Tier 2,Supermarket Type1,1471.418 +FDS56,5.785,Regular,0.038817121,Fruits and Vegetables,262.6252,OUT049,1999,Medium,Tier 1,Supermarket Type1,524.6504 +DRJ59,11.65,Low Fat,0.01941154,Hard Drinks,40.3164,OUT045,2002,,Tier 2,Supermarket Type1,502.0132 +NCA30,19,Low Fat,0.216478153,Household,190.1872,OUT010,1998,,Tier 3,Grocery Store,567.2616 +FDF17,5.19,Low Fat,0.042707323,Frozen Foods,197.811,OUT045,2002,,Tier 2,Supermarket Type1,2946.165 +NCX18,14.15,Low Fat,0,Household,196.311,OUT046,1997,Small,Tier 1,Supermarket Type1,3338.987 +NCO53,16.2,Low Fat,0.175898114,Health and Hygiene,183.7608,OUT018,2009,Medium,Tier 3,Supermarket Type2,2940.1728 +FDT23,7.72,reg,0.074847665,Breads,78.8986,OUT049,1999,Medium,Tier 1,Supermarket Type1,623.1888 +NCJ19,18.6,Low Fat,0.118180011,Others,56.2588,OUT046,1997,Small,Tier 1,Supermarket Type1,1030.6584 +FDI05,8.35,Regular,0.127587344,Frozen Foods,76.5354,OUT017,2007,,Tier 2,Supermarket Type1,1805.6496 +NCJ19,18.6,Low Fat,0.19780911,Others,55.6588,OUT010,1998,,Tier 3,Grocery Store,114.5176 +NCS29,,LF,0.069208684,Health and Hygiene,264.0884,OUT027,1985,Medium,Tier 3,Supermarket Type3,4504.8028 +NCC06,19,Low Fat,0.026963909,Household,129.8336,OUT013,1987,High,Tier 3,Supermarket Type1,3451.5072 +FDJ12,8.895,Regular,0.039261947,Baking Goods,207.4296,OUT017,2007,,Tier 2,Supermarket Type1,2492.7552 +FDW48,18,Low Fat,0.008533716,Baking Goods,78.5618,OUT013,1987,High,Tier 3,Supermarket Type1,402.809 +FDX32,15.1,Regular,0.100423086,Fruits and Vegetables,144.7786,OUT017,2007,,Tier 2,Supermarket Type1,2600.6148 +FDH02,,Regular,0,Canned,91.8488,OUT027,1985,Medium,Tier 3,Supermarket Type3,2716.464 +FDD16,20.5,Low Fat,0.036353098,Frozen Foods,75.8696,OUT046,1997,Small,Tier 1,Supermarket Type1,2386.2272 +FDR09,,Low Fat,0.077348214,Snack Foods,259.7962,OUT027,1985,Medium,Tier 3,Supermarket Type3,8028.8822 +FDB32,20.6,Low Fat,0.023548476,Fruits and Vegetables,93.3778,OUT018,2009,Medium,Tier 3,Supermarket Type2,1314.2892 +FDP11,15.85,Low Fat,0.069043044,Breads,218.7166,OUT013,1987,High,Tier 3,Supermarket Type1,4136.6154 +FDG09,20.6,Regular,0.048010812,Fruits and Vegetables,187.7556,OUT049,1999,Medium,Tier 1,Supermarket Type1,3004.0896 +FDF21,10.3,Regular,0.058778429,Fruits and Vegetables,187.853,OUT013,1987,High,Tier 3,Supermarket Type1,2656.542 +NCJ19,,Low Fat,0.117607719,Others,55.2588,OUT027,1985,Medium,Tier 3,Supermarket Type3,2748.4224 +FDY03,17.6,Regular,0.127412338,Meat,111.3202,OUT010,1998,,Tier 3,Grocery Store,337.5606 +FDK58,11.35,Regular,0.044945123,Snack Foods,101.0016,OUT013,1987,High,Tier 3,Supermarket Type1,2631.2416 +FDC26,10.195,Low Fat,0.126579586,Canned,112.2886,OUT049,1999,Medium,Tier 1,Supermarket Type1,2557.3378 +FDN15,17.5,Low Fat,0.016802225,Meat,138.518,OUT018,2009,Medium,Tier 3,Supermarket Type2,2376.906 +DRH11,,Low Fat,0.075192072,Hard Drinks,56.0614,OUT027,1985,Medium,Tier 3,Supermarket Type3,2597.2858 +NCK17,11,Low Fat,0.03786331,Health and Hygiene,40.948,OUT013,1987,High,Tier 3,Supermarket Type1,319.584 +DRC01,5.92,Regular,0.019200003,Soft Drinks,47.7692,OUT046,1997,Small,Tier 1,Supermarket Type1,492.692 +FDD03,13.3,Low Fat,0.079791176,Dairy,232.73,OUT035,2004,Small,Tier 2,Supermarket Type1,2796.36 +NCY17,18.2,Low Fat,0.16334971,Health and Hygiene,45.1086,OUT049,1999,Medium,Tier 1,Supermarket Type1,669.129 +DRY23,9.395,Regular,0.109265987,Soft Drinks,42.3112,OUT049,1999,Medium,Tier 1,Supermarket Type1,980.0576 +FDT50,6.75,Regular,0.10821852,Dairy,96.3752,OUT035,2004,Small,Tier 2,Supermarket Type1,1342.2528 +FDC38,15.7,Low Fat,0.122392031,Canned,133.1942,OUT013,1987,High,Tier 3,Supermarket Type1,2782.3782 +NCN06,8.39,Low Fat,0.20168772,Household,162.8868,OUT010,1998,,Tier 3,Grocery Store,327.5736 +FDP56,,Low Fat,0.046259036,Fruits and Vegetables,47.4692,OUT027,1985,Medium,Tier 3,Supermarket Type3,1576.6144 +FDW34,9.6,Low Fat,0.035651291,Snack Foods,244.917,OUT045,2002,,Tier 2,Supermarket Type1,2916.204 +FDU07,11.1,Low Fat,0.059835659,Fruits and Vegetables,151.3366,OUT035,2004,Small,Tier 2,Supermarket Type1,3022.732 +NCO55,12.8,LF,0.091408076,Others,108.9938,OUT018,2009,Medium,Tier 3,Supermarket Type2,1071.938 +FDL16,12.85,Low Fat,0.169405699,Frozen Foods,46.106,OUT017,2007,,Tier 2,Supermarket Type1,792.302 +FDT59,13.65,Low Fat,0.015943701,Breads,231.9668,OUT045,2002,,Tier 2,Supermarket Type1,3225.1352 +DRF01,,Low Fat,0.174232377,Soft Drinks,146.6102,OUT027,1985,Medium,Tier 3,Supermarket Type3,1895.5326 +NCS06,7.935,Low Fat,0.031801103,Household,261.591,OUT045,2002,,Tier 2,Supermarket Type1,3155.892 +FDY13,,Low Fat,0.052749199,Canned,74.967,OUT019,1985,Small,Tier 1,Grocery Store,229.701 +DRF36,16.1,Low Fat,0.039463564,Soft Drinks,189.9846,OUT010,1998,,Tier 3,Grocery Store,191.0846 +FDV10,7.645,Regular,0,Snack Foods,41.8112,OUT046,1997,Small,Tier 1,Supermarket Type1,894.8352 +FDE09,8.775,Low Fat,0.036159635,Fruits and Vegetables,110.7228,OUT010,1998,,Tier 3,Grocery Store,331.5684 +FDC20,10.65,Low Fat,0.024020078,Fruits and Vegetables,57.2272,OUT045,2002,,Tier 2,Supermarket Type1,1174.4712 +FDI58,7.64,Regular,0.071104408,Snack Foods,95.012,OUT017,2007,,Tier 2,Supermarket Type1,1864.24 +FDI56,7.325,Low Fat,0.093913607,Fruits and Vegetables,93.2146,OUT017,2007,,Tier 2,Supermarket Type1,1733.0774 +NCI17,8.645,low fat,0.144006886,Health and Hygiene,94.741,OUT018,2009,Medium,Tier 3,Supermarket Type2,1061.951 +NCE19,8.97,Low Fat,0.093159233,Household,55.7956,OUT049,1999,Medium,Tier 1,Supermarket Type1,1037.3164 +FDA26,,Regular,0.129425145,Dairy,219.3482,OUT019,1985,Small,Tier 1,Grocery Store,219.0482 +FDR01,5.405,Regular,0.053839714,Canned,198.6742,OUT018,2009,Medium,Tier 3,Supermarket Type2,2388.8904 +FDC32,,Low Fat,0.098629062,Fruits and Vegetables,90.6462,OUT027,1985,Medium,Tier 3,Supermarket Type3,2406.2012 +FDF11,10.195,Regular,0.017658634,Starchy Foods,240.1538,OUT049,1999,Medium,Tier 1,Supermarket Type1,1442.1228 +FDH46,6.935,Regular,0.041282286,Snack Foods,103.5332,OUT046,1997,Small,Tier 1,Supermarket Type1,1230.3984 +FDY33,,Regular,0.170186628,Snack Foods,159.0262,OUT019,1985,Small,Tier 1,Grocery Store,159.1262 +DRG23,8.88,Low Fat,0.086781204,Hard Drinks,152.2682,OUT046,1997,Small,Tier 1,Supermarket Type1,1829.6184 +FDY04,,Regular,0.042270751,Frozen Foods,162.521,OUT027,1985,Medium,Tier 3,Supermarket Type3,4567.388 +FDE26,9.3,Low Fat,0.089186275,Canned,145.3786,OUT045,2002,,Tier 2,Supermarket Type1,2745.0934 +NCU42,9,Low Fat,0.019502965,Household,169.4474,OUT035,2004,Small,Tier 2,Supermarket Type1,4211.185 +NCO42,21.25,LF,0.024650932,Household,146.0102,OUT035,2004,Small,Tier 2,Supermarket Type1,2916.204 +FDU25,12.35,Low Fat,0.026722744,Canned,59.2246,OUT049,1999,Medium,Tier 1,Supermarket Type1,984.7182 +FDW02,,Regular,0.037516862,Dairy,124.3704,OUT027,1985,Medium,Tier 3,Supermarket Type3,3004.0896 +FDS22,16.85,Regular,0.023154399,Snack Foods,43.9428,OUT046,1997,Small,Tier 1,Supermarket Type1,351.5424 +FDG57,14.7,Low Fat,0.072284689,Fruits and Vegetables,49.8034,OUT035,2004,Small,Tier 2,Supermarket Type1,631.8442 +FDQ25,8.63,Regular,0.028391879,Canned,173.9422,OUT018,2009,Medium,Tier 3,Supermarket Type2,4138.6128 +NCS06,7.935,Low Fat,0.031866022,Household,261.291,OUT018,2009,Medium,Tier 3,Supermarket Type2,2892.901 +FDC29,,Regular,0.024088444,Frozen Foods,112.7176,OUT027,1985,Medium,Tier 3,Supermarket Type3,1832.2816 +NCZ41,19.85,Low Fat,0.064409056,Health and Hygiene,126.7704,OUT035,2004,Small,Tier 2,Supermarket Type1,1752.3856 +FDW23,5.765,Low Fat,0.082012293,Baking Goods,37.5164,OUT046,1997,Small,Tier 1,Supermarket Type1,656.4788 +FDB03,17.75,Regular,0.157075658,Dairy,240.5538,OUT049,1999,Medium,Tier 1,Supermarket Type1,3845.6608 +FDN25,,Regular,0.107110465,Breakfast,55.5588,OUT019,1985,Small,Tier 1,Grocery Store,229.0352 +NCN05,8.235,Low Fat,0.014459672,Health and Hygiene,181.895,OUT046,1997,Small,Tier 1,Supermarket Type1,732.38 +FDV43,,Low Fat,0.076483451,Fruits and Vegetables,43.4086,OUT027,1985,Medium,Tier 3,Supermarket Type3,847.5634 +FDG44,6.13,Low Fat,0.10234983,Fruits and Vegetables,55.0298,OUT049,1999,Medium,Tier 1,Supermarket Type1,539.298 +FDS12,9.1,Low Fat,0.174827835,Baking Goods,127.2362,OUT018,2009,Medium,Tier 3,Supermarket Type2,1635.8706 +FDI52,18.7,Low Fat,0.104591027,Frozen Foods,121.4072,OUT013,1987,High,Tier 3,Supermarket Type1,2450.144 +FDU12,15.5,Regular,0.075868843,Baking Goods,261.7568,OUT049,1999,Medium,Tier 1,Supermarket Type1,1845.5976 +FDG58,10.695,Regular,0.086764795,Snack Foods,156.7972,OUT035,2004,Small,Tier 2,Supermarket Type1,3427.5384 +FDA16,6.695,Low Fat,0.03408026,Frozen Foods,220.8456,OUT018,2009,Medium,Tier 3,Supermarket Type2,5084.0488 +NCD18,16,Low Fat,0.072655379,Household,229.8668,OUT035,2004,Small,Tier 2,Supermarket Type1,4837.7028 +FDI21,5.59,Regular,0.056555715,Snack Foods,62.6168,OUT013,1987,High,Tier 3,Supermarket Type1,639.168 +FDW31,11.35,reg,0.043402224,Fruits and Vegetables,197.0742,OUT017,2007,,Tier 2,Supermarket Type1,2587.9646 +FDB35,12.3,Regular,0.064882207,Starchy Foods,93.8804,OUT018,2009,Medium,Tier 3,Supermarket Type2,1470.0864 +FDK58,,Regular,0.044764726,Snack Foods,102.4016,OUT027,1985,Medium,Tier 3,Supermarket Type3,2428.8384 +FDU14,17.75,Low Fat,0.034752647,Dairy,248.775,OUT046,1997,Small,Tier 1,Supermarket Type1,3745.125 +NCP43,17.75,Low Fat,0.030631323,Others,178.566,OUT018,2009,Medium,Tier 3,Supermarket Type2,2516.724 +FDM20,,LF,0,Fruits and Vegetables,245.0144,OUT027,1985,Medium,Tier 3,Supermarket Type3,3185.1872 +FDT36,,Low Fat,0.110735739,Baking Goods,35.2874,OUT027,1985,Medium,Tier 3,Supermarket Type3,988.0472 +FDW19,12.35,Regular,0.038657256,Fruits and Vegetables,110.257,OUT018,2009,Medium,Tier 3,Supermarket Type2,1757.712 +FDB29,16.7,Regular,0.052493162,Frozen Foods,113.9176,OUT049,1999,Medium,Tier 1,Supermarket Type1,2519.3872 +FDN39,19.35,Regular,0.065890998,Meat,167.0816,OUT017,2007,,Tier 2,Supermarket Type1,1510.0344 +FDI02,15.7,Regular,0.114565093,Canned,112.0202,OUT046,1997,Small,Tier 1,Supermarket Type1,337.5606 +FDA46,,Low Fat,0.117065801,Snack Foods,196.1136,OUT027,1985,Medium,Tier 3,Supermarket Type3,6026.8216 +FDV36,18.7,Low Fat,0.026450779,Baking Goods,124.902,OUT017,2007,,Tier 2,Supermarket Type1,2909.546 +FDE35,7.06,reg,0.043863865,Starchy Foods,59.5904,OUT013,1987,High,Tier 3,Supermarket Type1,761.6752 +FDT46,11.35,Low Fat,0,Snack Foods,52.4008,OUT035,2004,Small,Tier 2,Supermarket Type1,809.6128 +FDS21,,Regular,0.036551446,Snack Foods,62.7194,OUT019,1985,Small,Tier 1,Grocery Store,123.8388 +DRD12,6.96,Low Fat,0.077630199,Soft Drinks,90.9146,OUT017,2007,,Tier 2,Supermarket Type1,1459.4336 +FDR14,,Low Fat,0.304737387,Dairy,54.7298,OUT019,1985,Small,Tier 1,Grocery Store,107.8596 +FDG22,,Regular,0.041180766,Snack Foods,37.919,OUT027,1985,Medium,Tier 3,Supermarket Type3,768.999 +FDX58,13.15,Low Fat,0.043831721,Snack Foods,184.195,OUT049,1999,Medium,Tier 1,Supermarket Type1,2746.425 +FDB40,,Regular,0.007503372,Dairy,146.7102,OUT027,1985,Medium,Tier 3,Supermarket Type3,4374.306 +FDJ36,14.5,Regular,0.214681063,Baking Goods,102.7332,OUT010,1998,,Tier 3,Grocery Store,205.0664 +NCL53,7.5,LF,0.060649825,Health and Hygiene,177.4028,OUT010,1998,,Tier 3,Grocery Store,354.2056 +NCX05,15.2,Low Fat,0.097258937,Health and Hygiene,114.8492,OUT045,2002,,Tier 2,Supermarket Type1,1506.0396 +FDO21,11.6,Regular,0.009763021,Snack Foods,226.2404,OUT046,1997,Small,Tier 1,Supermarket Type1,1800.3232 +NCF07,9,Low Fat,0.032152981,Household,102.0016,OUT018,2009,Medium,Tier 3,Supermarket Type2,1518.024 +FDU20,19.35,Regular,0.021439694,Fruits and Vegetables,119.7098,OUT013,1987,High,Tier 3,Supermarket Type1,1325.6078 +FDK09,15.2,Low Fat,0.153592956,Snack Foods,228.0352,OUT010,1998,,Tier 3,Grocery Store,458.0704 +FDY57,20.2,Regular,0.121231308,Snack Foods,97.5752,OUT035,2004,Small,Tier 2,Supermarket Type1,1534.0032 +FDD51,,Low Fat,0.119371835,Dairy,45.2744,OUT027,1985,Medium,Tier 3,Supermarket Type3,905.488 +FDA49,,Low Fat,0.064607378,Canned,87.4198,OUT027,1985,Medium,Tier 3,Supermarket Type3,2267.7148 +FDG33,5.365,Regular,0.14024028,Seafood,171.0764,OUT046,1997,Small,Tier 1,Supermarket Type1,3263.7516 +FDG35,21.2,Regular,0,Starchy Foods,173.6738,OUT049,1999,Medium,Tier 1,Supermarket Type1,2954.1546 +FDC52,11.15,Regular,0.008296692,Dairy,150.6708,OUT045,2002,,Tier 2,Supermarket Type1,2106.5912 +FDS34,19.35,Regular,0.077193256,Snack Foods,112.7518,OUT017,2007,,Tier 2,Supermarket Type1,683.1108 +NCY05,13.5,Low Fat,0.055075504,Health and Hygiene,33.3874,OUT049,1999,Medium,Tier 1,Supermarket Type1,282.2992 +FDO46,9.6,Regular,0.014209811,Snack Foods,188.1872,OUT035,2004,Small,Tier 2,Supermarket Type1,1701.7848 +FDY20,12.5,Regular,0.081879864,Fruits and Vegetables,91.7488,OUT049,1999,Medium,Tier 1,Supermarket Type1,1358.232 +FDA13,15.85,Low Fat,0.078540095,Canned,36.3506,OUT035,2004,Small,Tier 2,Supermarket Type1,607.2096 +FDS04,10.195,Regular,0.146540889,Frozen Foods,141.7838,OUT013,1987,High,Tier 3,Supermarket Type1,1685.8056 +FDU51,20.2,Regular,0.097059596,Meat,178.6028,OUT017,2007,,Tier 2,Supermarket Type1,2302.3364 +FDK50,7.96,Low Fat,0.028478742,Canned,161.8894,OUT018,2009,Medium,Tier 3,Supermarket Type2,2750.4198 +FDO60,20,Low Fat,0.034340926,Baking Goods,45.4086,OUT013,1987,High,Tier 3,Supermarket Type1,981.3892 +FDM13,6.425,Low Fat,0.063532672,Breakfast,133.0626,OUT017,2007,,Tier 2,Supermarket Type1,1442.7886 +FDU12,,Regular,0.075384242,Baking Goods,262.7568,OUT027,1985,Medium,Tier 3,Supermarket Type3,7646.0472 +NCG54,12.1,Low Fat,0.080131363,Household,170.9106,OUT018,2009,Medium,Tier 3,Supermarket Type2,1539.9954 +FDH40,11.6,Regular,0.132111921,Frozen Foods,82.2276,OUT010,1998,,Tier 3,Grocery Store,243.6828 +NCI06,,Low Fat,0.083547515,Household,179.166,OUT019,1985,Small,Tier 1,Grocery Store,359.532 +FDA58,9.395,Low Fat,0.103731617,Snack Foods,236.9932,OUT035,2004,Small,Tier 2,Supermarket Type1,4242.4776 +FDJ02,17.2,Regular,0.025309134,Canned,147.0418,OUT017,2007,,Tier 2,Supermarket Type1,2354.2688 +FDP21,7.42,Regular,0.0258457,Snack Foods,188.9872,OUT018,2009,Medium,Tier 3,Supermarket Type2,2458.1336 +FDN57,18.25,Low Fat,0.054223942,Snack Foods,142.0154,OUT035,2004,Small,Tier 2,Supermarket Type1,2127.231 +FDV26,,Regular,0.075791641,Dairy,193.3794,OUT027,1985,Medium,Tier 3,Supermarket Type3,8388.4142 +FDZ21,17.6,Regular,0.03928284,Snack Foods,94.641,OUT049,1999,Medium,Tier 1,Supermarket Type1,2799.689 +FDG21,,Regular,0.145591438,Seafood,148.705,OUT027,1985,Medium,Tier 3,Supermarket Type3,1797.66 +FDF26,6.825,Regular,0.046824729,Canned,155.1998,OUT018,2009,Medium,Tier 3,Supermarket Type2,2460.7968 +FDC39,7.405,Low Fat,0.159062948,Dairy,208.9296,OUT013,1987,High,Tier 3,Supermarket Type1,2700.4848 +FDQ24,15.7,Low Fat,0.073966786,Baking Goods,250.5724,OUT018,2009,Medium,Tier 3,Supermarket Type2,4026.7584 +FDC41,15.6,Low Fat,0.117574554,Frozen Foods,75.667,OUT017,2007,,Tier 2,Supermarket Type1,1301.639 +NCO14,9.6,Low Fat,0.049617765,Household,44.2086,OUT010,1998,,Tier 3,Grocery Store,44.6086 +FDE05,,Regular,0.032296886,Frozen Foods,144.0102,OUT027,1985,Medium,Tier 3,Supermarket Type3,5394.9774 +FDW52,,Regular,0.037340835,Frozen Foods,163.1526,OUT027,1985,Medium,Tier 3,Supermarket Type3,3946.8624 +FDL36,,Low Fat,0.075707087,Baking Goods,88.183,OUT027,1985,Medium,Tier 3,Supermarket Type3,1438.128 +FDS04,10.195,Regular,0.146635206,Frozen Foods,139.0838,OUT035,2004,Small,Tier 2,Supermarket Type1,3652.5788 +NCC18,19.1,LF,0.177545624,Household,172.4422,OUT049,1999,Medium,Tier 1,Supermarket Type1,3621.2862 +FDN01,8.895,LF,0.072693696,Breakfast,175.937,OUT018,2009,Medium,Tier 3,Supermarket Type2,529.311 +FDY02,8.945,Regular,0.146701312,Dairy,262.291,OUT010,1998,,Tier 3,Grocery Store,1314.955 +FDV15,10.3,Low Fat,0.146999264,Meat,103.7648,OUT017,2007,,Tier 2,Supermarket Type1,2804.3496 +FDC34,16,Regular,0.173109453,Snack Foods,155.2972,OUT045,2002,,Tier 2,Supermarket Type1,3894.93 +FDX10,6.385,reg,0.124410284,Snack Foods,34.3874,OUT017,2007,,Tier 2,Supermarket Type1,388.1614 +NCF19,13,Low Fat,0.035079516,Household,47.9034,OUT013,1987,High,Tier 3,Supermarket Type1,583.2408 +FDE17,20.1,Regular,0.054763518,Frozen Foods,150.9366,OUT017,2007,,Tier 2,Supermarket Type1,3476.1418 +FDJ08,11.1,Low Fat,0.111122936,Fruits and Vegetables,189.2846,OUT018,2009,Medium,Tier 3,Supermarket Type2,3630.6074 +NCN53,5.175,Low Fat,0.030330202,Health and Hygiene,35.4874,OUT013,1987,High,Tier 3,Supermarket Type1,388.1614 +FDC16,11.5,Regular,0,Dairy,88.254,OUT046,1997,Small,Tier 1,Supermarket Type1,1298.31 +FDO15,16.75,Regular,0.008601441,Meat,73.7038,OUT018,2009,Medium,Tier 3,Supermarket Type2,1404.1722 +FDQ23,,low fat,0.024407061,Breads,102.3332,OUT027,1985,Medium,Tier 3,Supermarket Type3,1948.1308 +DRF37,17.25,Low Fat,0.084262458,Soft Drinks,261.591,OUT013,1987,High,Tier 3,Supermarket Type1,3418.883 +FDN40,5.88,Low Fat,0.08644044,Frozen Foods,155.3998,OUT035,2004,Small,Tier 2,Supermarket Type1,2153.1972 +FDN24,,LF,0.112718928,Baking Goods,54.2956,OUT027,1985,Medium,Tier 3,Supermarket Type3,1310.2944 +FDF16,7.3,Low Fat,0.086619573,Frozen Foods,147.6076,OUT017,2007,,Tier 2,Supermarket Type1,3251.7672 +FDH27,7.075,Low Fat,0.058437653,Dairy,143.0128,OUT049,1999,Medium,Tier 1,Supermarket Type1,1150.5024 +FDY52,6.365,Low Fat,0,Frozen Foods,59.7536,OUT017,2007,,Tier 2,Supermarket Type1,980.0576 +NCH55,,Low Fat,0.034504414,Household,125.202,OUT027,1985,Medium,Tier 3,Supermarket Type3,2783.044 +NCH18,9.3,LF,0.044652785,Household,247.0802,OUT035,2004,Small,Tier 2,Supermarket Type1,1228.401 +DRC01,5.92,Regular,0.019184026,Soft Drinks,50.3692,OUT013,1987,High,Tier 3,Supermarket Type1,591.2304 +NCO14,9.6,Low Fat,0.029638267,Household,42.6086,OUT035,2004,Small,Tier 2,Supermarket Type1,133.8258 +DRG39,14.15,Low Fat,0.042180995,Dairy,52.0982,OUT046,1997,Small,Tier 1,Supermarket Type1,578.5802 +DRK13,11.8,Low Fat,0.11507174,Soft Drinks,198.2084,OUT013,1987,High,Tier 3,Supermarket Type1,3769.7596 +FDD41,6.765,Regular,0.087437069,Frozen Foods,106.1306,OUT045,2002,,Tier 2,Supermarket Type1,1672.4896 +FDQ19,,Regular,0.014295564,Fruits and Vegetables,242.6512,OUT027,1985,Medium,Tier 3,Supermarket Type3,12117.56 +FDX58,13.15,LF,0.073251428,Snack Foods,181.695,OUT010,1998,,Tier 3,Grocery Store,549.285 +FDK40,,Low Fat,0.021743592,Frozen Foods,263.191,OUT027,1985,Medium,Tier 3,Supermarket Type3,6574.775 +FDI52,18.7,Low Fat,0.10527024,Frozen Foods,122.9072,OUT017,2007,,Tier 2,Supermarket Type1,490.0288 +FDT28,13.3,Low Fat,0.063513272,Frozen Foods,149.9708,OUT013,1987,High,Tier 3,Supermarket Type1,2106.5912 +FDH52,9.42,Regular,0.044151435,Frozen Foods,61.5194,OUT017,2007,,Tier 2,Supermarket Type1,866.8716 +FDZ38,17.6,LF,0.008001018,Dairy,170.4422,OUT046,1997,Small,Tier 1,Supermarket Type1,2759.0752 +FDF12,8.235,Low Fat,0.0828941,Baking Goods,149.3076,OUT017,2007,,Tier 2,Supermarket Type1,1921.4988 +NCE06,,Low Fat,0.091042211,Household,162.6894,OUT027,1985,Medium,Tier 3,Supermarket Type3,2588.6304 +FDO45,13.15,Regular,0.038011783,Snack Foods,89.6856,OUT049,1999,Medium,Tier 1,Supermarket Type1,703.0848 +NCS18,12.65,Low Fat,0.042296724,Household,106.3938,OUT045,2002,,Tier 2,Supermarket Type1,3751.783 +NCE54,20.7,Low Fat,0.02695441,Household,73.2354,OUT045,2002,,Tier 2,Supermarket Type1,1504.708 +FDB50,13,Low Fat,0.153930108,Canned,76.7986,OUT045,2002,,Tier 2,Supermarket Type1,2648.5524 +FDZ20,16.1,Low Fat,0.034376537,Fruits and Vegetables,256.1356,OUT045,2002,,Tier 2,Supermarket Type1,6358.39 +FDB11,16,Low Fat,0.060971431,Starchy Foods,226.2404,OUT045,2002,,Tier 2,Supermarket Type1,4725.8484 +FDU22,12.35,Low Fat,0,Snack Foods,118.9124,OUT013,1987,High,Tier 3,Supermarket Type1,3199.8348 +FDY48,14,Low Fat,0.023831558,Baking Goods,103.1332,OUT018,2009,Medium,Tier 3,Supermarket Type2,1948.1308 +NCP30,20.5,Low Fat,0.032762495,Household,40.0822,OUT035,2004,Small,Tier 2,Supermarket Type1,1257.0304 +FDD08,8.3,Low Fat,0.035347676,Fruits and Vegetables,38.0506,OUT035,2004,Small,Tier 2,Supermarket Type1,531.3084 +NCG42,19.2,Low Fat,0.041291929,Household,130.131,OUT049,1999,Medium,Tier 1,Supermarket Type1,1038.648 +NCT30,9.1,Low Fat,0.080747059,Household,46.9718,OUT017,2007,,Tier 2,Supermarket Type1,850.8924 +FDT37,14.15,Low Fat,0.035240817,Canned,255.5014,OUT013,1987,High,Tier 3,Supermarket Type1,5355.0294 +FDU04,7.93,Low Fat,0.005557062,Frozen Foods,122.1414,OUT049,1999,Medium,Tier 1,Supermarket Type1,2924.1936 +NCH30,17.1,Low Fat,0.067154053,Household,114.386,OUT046,1997,Small,Tier 1,Supermarket Type1,1245.046 +DRG37,16.2,Low Fat,0.019362306,Soft Drinks,154.6972,OUT013,1987,High,Tier 3,Supermarket Type1,1713.7692 +FDS13,6.465,LF,0.124506117,Canned,264.7884,OUT046,1997,Small,Tier 1,Supermarket Type1,3709.8376 +FDQ47,7.155,Regular,0.168871496,Breads,34.3874,OUT018,2009,Medium,Tier 3,Supermarket Type2,670.4606 +FDY26,20.6,Regular,0.030504756,Dairy,212.6244,OUT035,2004,Small,Tier 2,Supermarket Type1,3599.3148 +FDB14,20.25,Regular,0.103142373,Canned,94.612,OUT018,2009,Medium,Tier 3,Supermarket Type2,652.484 +FDV45,,low fat,0.078872251,Snack Foods,189.5556,OUT019,1985,Small,Tier 1,Grocery Store,1126.5336 +FDR23,15.85,Low Fat,0.082120687,Breads,177.437,OUT018,2009,Medium,Tier 3,Supermarket Type2,5645.984 +NCS29,9,Low Fat,0.069487587,Health and Hygiene,266.6884,OUT013,1987,High,Tier 3,Supermarket Type1,3974.826 +FDK33,,Low Fat,0.011180843,Snack Foods,213.456,OUT027,1985,Medium,Tier 3,Supermarket Type3,4261.12 +FDW24,,low fat,0.037315469,Baking Goods,50.0034,OUT027,1985,Medium,Tier 3,Supermarket Type3,1992.7394 +FDR08,18.7,Low Fat,0.037835765,Fruits and Vegetables,111.1886,OUT017,2007,,Tier 2,Supermarket Type1,2334.9606 +FDB45,20.85,Low Fat,0.021312043,Fruits and Vegetables,104.9306,OUT013,1987,High,Tier 3,Supermarket Type1,2299.6732 +FDW32,18.35,Regular,0.094218363,Fruits and Vegetables,83.9882,OUT013,1987,High,Tier 3,Supermarket Type1,1202.4348 +FDN21,18.6,Low Fat,0.076841095,Snack Foods,162.2236,OUT035,2004,Small,Tier 2,Supermarket Type1,2900.2248 +FDH56,9.8,Regular,0.063805139,Fruits and Vegetables,117.3492,OUT035,2004,Small,Tier 2,Supermarket Type1,810.9444 +FDQ07,15.1,Regular,0.087542757,Fruits and Vegetables,219.8456,OUT049,1999,Medium,Tier 1,Supermarket Type1,6189.2768 +FDU58,,Regular,0.028871235,Snack Foods,188.7898,OUT027,1985,Medium,Tier 3,Supermarket Type3,2057.9878 +FDK36,7.09,LF,0.00720931,Baking Goods,48.1034,OUT013,1987,High,Tier 3,Supermarket Type1,1069.2748 +NCG18,,Low Fat,0.02286663,Household,102.8332,OUT027,1985,Medium,Tier 3,Supermarket Type3,2768.3964 +FDQ26,,Regular,0.067543727,Dairy,57.2562,OUT027,1985,Medium,Tier 3,Supermarket Type3,2073.967 +DRL47,,Low Fat,0.038549197,Hard Drinks,127.5362,OUT027,1985,Medium,Tier 3,Supermarket Type3,1006.6896 +DRJ11,9.5,Low Fat,0,Hard Drinks,188.9872,OUT017,2007,,Tier 2,Supermarket Type1,1323.6104 +FDB41,19,Regular,0.097709541,Frozen Foods,48.6718,OUT018,2009,Medium,Tier 3,Supermarket Type2,614.5334 +NCA06,20.5,Low Fat,0.143283608,Household,37.919,OUT046,1997,Small,Tier 1,Supermarket Type1,183.095 +NCZ41,19.85,Low Fat,0.064551885,Health and Hygiene,125.2704,OUT045,2002,,Tier 2,Supermarket Type1,2127.8968 +NCD54,21.1,Low Fat,0.029173031,Household,145.7786,OUT017,2007,,Tier 2,Supermarket Type1,1444.786 +FDM34,,Low Fat,0.067120954,Snack Foods,132.9626,OUT027,1985,Medium,Tier 3,Supermarket Type3,3279.065 +FDL57,15.1,Regular,0.067020992,Snack Foods,260.3304,OUT013,1987,High,Tier 3,Supermarket Type1,5424.9384 +NCD30,19.7,Low Fat,0.026826919,Household,98.7726,OUT013,1987,High,Tier 3,Supermarket Type1,1859.5794 +FDH17,16.2,Regular,0.01665334,Frozen Foods,97.3726,OUT046,1997,Small,Tier 1,Supermarket Type1,2055.3246 +FDD57,18.1,Low Fat,0.022395357,Fruits and Vegetables,96.5094,OUT035,2004,Small,Tier 2,Supermarket Type1,1332.9316 +FDC58,10.195,Low Fat,0.042113173,Snack Foods,42.5428,OUT018,2009,Medium,Tier 3,Supermarket Type2,878.856 +FDX47,6.55,Regular,0.034604343,Breads,157.8288,OUT046,1997,Small,Tier 1,Supermarket Type1,2514.0608 +FDC50,15.85,Low Fat,0.136774734,Canned,94.4094,OUT045,2002,,Tier 2,Supermarket Type1,1428.141 +NCS53,,Low Fat,0.089343433,Health and Hygiene,157.3604,OUT027,1985,Medium,Tier 3,Supermarket Type3,6021.4952 +FDY13,12.1,Low Fat,0.030250132,Canned,75.267,OUT018,2009,Medium,Tier 3,Supermarket Type2,612.536 +FDP44,16.5,Regular,0.079698503,Fruits and Vegetables,100.6332,OUT035,2004,Small,Tier 2,Supermarket Type1,1537.998 +FDH60,,Regular,0.141360118,Baking Goods,197.311,OUT019,1985,Small,Tier 1,Grocery Store,392.822 +FDR02,16.7,Low Fat,0.036933417,Dairy,109.1886,OUT010,1998,,Tier 3,Grocery Store,222.3772 +FDK48,,Low Fat,0.037449987,Baking Goods,76.7354,OUT027,1985,Medium,Tier 3,Supermarket Type3,2783.7098 +FDO24,11.1,Low Fat,0.294948897,Baking Goods,159.0604,OUT010,1998,,Tier 3,Grocery Store,792.302 +FDE20,11.35,Regular,0.005525913,Fruits and Vegetables,168.279,OUT013,1987,High,Tier 3,Supermarket Type1,2376.906 +FDM04,9.195,Regular,0.04712061,Frozen Foods,53.1666,OUT046,1997,Small,Tier 1,Supermarket Type1,768.999 +NCH07,,Low Fat,0.162248011,Household,160.4604,OUT019,1985,Small,Tier 1,Grocery Store,316.9208 +DRP35,18.85,Low Fat,0.090867297,Hard Drinks,127.3336,OUT046,1997,Small,Tier 1,Supermarket Type1,3962.8416 +FDO11,8,Regular,0.030264897,Breads,250.3092,OUT046,1997,Small,Tier 1,Supermarket Type1,6723.2484 +NCM30,19.1,Low Fat,0.067295406,Household,41.9796,OUT046,1997,Small,Tier 1,Supermarket Type1,701.7532 +DRF27,,Low Fat,0.02827966,Dairy,152.234,OUT027,1985,Medium,Tier 3,Supermarket Type3,1071.938 +NCR18,,Low Fat,0.020388413,Household,44.4112,OUT027,1985,Medium,Tier 3,Supermarket Type3,767.0016 +FDS48,,Low Fat,0.027644732,Baking Goods,149.4708,OUT027,1985,Medium,Tier 3,Supermarket Type3,3159.8868 +FDO32,6.36,Low Fat,0.120731024,Fruits and Vegetables,46.506,OUT049,1999,Medium,Tier 1,Supermarket Type1,652.484 +NCP05,19.6,Low Fat,0.025429614,Health and Hygiene,151.7024,OUT017,2007,,Tier 2,Supermarket Type1,2884.2456 +FDF44,,Regular,0.059438787,Fruits and Vegetables,130.9968,OUT027,1985,Medium,Tier 3,Supermarket Type3,4828.3816 +FDX56,17.1,Regular,0.074059474,Fruits and Vegetables,209.0638,OUT046,1997,Small,Tier 1,Supermarket Type1,3520.0846 +FDE46,,Low Fat,0.015693328,Snack Foods,150.7366,OUT027,1985,Medium,Tier 3,Supermarket Type3,906.8196 +FDQ09,,Low Fat,0.057850699,Snack Foods,113.2834,OUT027,1985,Medium,Tier 3,Supermarket Type3,4376.9692 +NCB54,8.76,Low Fat,0.050011058,Health and Hygiene,126.7336,OUT013,1987,High,Tier 3,Supermarket Type1,639.168 +NCV18,6.775,Low Fat,0.105225964,Household,84.225,OUT035,2004,Small,Tier 2,Supermarket Type1,3162.55 +NCG55,16.25,Low Fat,0.039207025,Household,116.1176,OUT049,1999,Medium,Tier 1,Supermarket Type1,2633.9048 +FDV14,19.85,Low Fat,0.044489064,Dairy,89.4856,OUT035,2004,Small,Tier 2,Supermarket Type1,1054.6272 +FDT31,19.75,Low Fat,0.012437935,Fruits and Vegetables,189.9872,OUT013,1987,High,Tier 3,Supermarket Type1,3781.744 +DRD12,6.96,Low Fat,0.077350112,Soft Drinks,91.4146,OUT045,2002,,Tier 2,Supermarket Type1,638.5022 +FDZ40,8.935,Low Fat,0.040346436,Frozen Foods,53.7298,OUT018,2009,Medium,Tier 3,Supermarket Type2,593.2278 +DRI11,8.26,Low Fat,0.057585723,Hard Drinks,113.7834,OUT010,1998,,Tier 3,Grocery Store,115.1834 +FDP23,6.71,Low Fat,0.03565903,Breads,218.3166,OUT045,2002,,Tier 2,Supermarket Type1,1959.4494 +FDY02,8.945,Regular,0.087629354,Dairy,263.491,OUT035,2004,Small,Tier 2,Supermarket Type1,1840.937 +FDM03,12.65,Low Fat,0,Meat,107.8938,OUT046,1997,Small,Tier 1,Supermarket Type1,750.3566 +FDF35,15,Low Fat,0.154228739,Starchy Foods,107.3938,OUT049,1999,Medium,Tier 1,Supermarket Type1,750.3566 +DRM37,15.35,Low Fat,0.096943078,Soft Drinks,196.5768,OUT017,2007,,Tier 2,Supermarket Type1,7685.9952 +NCV41,14.35,Low Fat,0.017065268,Health and Hygiene,109.5228,OUT049,1999,Medium,Tier 1,Supermarket Type1,1768.3648 +NCK53,,Low Fat,0,Health and Hygiene,100.8042,OUT027,1985,Medium,Tier 3,Supermarket Type3,3472.147 +FDW23,5.765,Low Fat,0.082178616,Baking Goods,37.0164,OUT045,2002,,Tier 2,Supermarket Type1,540.6296 +FDW12,8.315,Regular,0.035542581,Baking Goods,143.3444,OUT013,1987,High,Tier 3,Supermarket Type1,1596.5884 +FDG44,6.13,Low Fat,0.102171627,Fruits and Vegetables,53.8298,OUT035,2004,Small,Tier 2,Supermarket Type1,1024.6662 +FDJ36,14.5,Regular,0.128235818,Baking Goods,104.1332,OUT035,2004,Small,Tier 2,Supermarket Type1,205.0664 +FDX55,15.1,low fat,0.0552059,Fruits and Vegetables,219.4166,OUT046,1997,Small,Tier 1,Supermarket Type1,6096.0648 +DRG13,17.25,Low Fat,0.037337632,Soft Drinks,163.7526,OUT018,2009,Medium,Tier 3,Supermarket Type2,3289.052 +NCD06,13,low fat,0.099242622,Household,46.306,OUT013,1987,High,Tier 3,Supermarket Type1,699.09 +FDW22,,Regular,0.030143704,Snack Foods,222.0114,OUT027,1985,Medium,Tier 3,Supermarket Type3,6207.9192 +FDD33,12.85,Low Fat,0.108412059,Fruits and Vegetables,233.2642,OUT045,2002,,Tier 2,Supermarket Type1,3950.1914 +FDG24,7.975,Low Fat,0.014628382,Baking Goods,82.325,OUT035,2004,Small,Tier 2,Supermarket Type1,1331.6 +FDE05,10.895,Regular,0.032454046,Frozen Foods,144.8102,OUT046,1997,Small,Tier 1,Supermarket Type1,3062.0142 +FDZ12,9.17,Low Fat,0.102978817,Baking Goods,144.947,OUT046,1997,Small,Tier 1,Supermarket Type1,4294.41 +FDX37,16.2,Low Fat,0.105498192,Canned,101.47,OUT010,1998,,Tier 3,Grocery Store,399.48 +FDE44,14.65,Low Fat,0.171355643,Fruits and Vegetables,47.6692,OUT035,2004,Small,Tier 2,Supermarket Type1,739.038 +FDS52,,Low Fat,0.009585169,Frozen Foods,102.5016,OUT019,1985,Small,Tier 1,Grocery Store,101.2016 +FDO39,6.985,Regular,0.137926458,Meat,184.7608,OUT018,2009,Medium,Tier 3,Supermarket Type2,4042.7376 +FDI32,17.7,Low Fat,0,Fruits and Vegetables,115.0834,OUT045,2002,,Tier 2,Supermarket Type1,2764.4016 +FDV28,16.1,Regular,0,Frozen Foods,35.1558,OUT017,2007,,Tier 2,Supermarket Type1,339.558 +NCP53,14.75,Low Fat,0.033076388,Health and Hygiene,237.2906,OUT017,2007,,Tier 2,Supermarket Type1,3089.9778 +NCN43,12.15,Low Fat,0.006770252,Others,124.473,OUT049,1999,Medium,Tier 1,Supermarket Type1,1231.73 +NCI31,,Low Fat,0.142393355,Others,36.419,OUT019,1985,Small,Tier 1,Grocery Store,109.857 +FDK55,18.5,Low Fat,0.025813943,Meat,89.1172,OUT045,2002,,Tier 2,Supermarket Type1,892.172 +FDC17,12.15,Low Fat,0.015548178,Frozen Foods,211.2928,OUT017,2007,,Tier 2,Supermarket Type1,5049.4272 +FDV28,16.1,Regular,0.159698192,Frozen Foods,32.0558,OUT035,2004,Small,Tier 2,Supermarket Type1,1018.674 +FDY26,20.6,Regular,0.030634813,Dairy,212.9244,OUT018,2009,Medium,Tier 3,Supermarket Type2,2540.6928 +NCU06,17.6,Low Fat,0.074522745,Household,228.801,OUT049,1999,Medium,Tier 1,Supermarket Type1,3215.814 +FDV16,,Regular,0.145200948,Frozen Foods,35.4558,OUT019,1985,Small,Tier 1,Grocery Store,135.8232 +FDY31,5.98,Low Fat,0.043651198,Fruits and Vegetables,146.1418,OUT045,2002,,Tier 2,Supermarket Type1,3089.9778 +DRE37,13.5,Low Fat,0.094366079,Soft Drinks,190.9872,OUT049,1999,Medium,Tier 1,Supermarket Type1,2836.308 +FDH33,12.85,Low Fat,0.121702394,Snack Foods,42.7428,OUT035,2004,Small,Tier 2,Supermarket Type1,703.0848 +FDA46,13.6,Low Fat,0.117613212,Snack Foods,194.2136,OUT035,2004,Small,Tier 2,Supermarket Type1,2527.3768 +FDP12,9.8,Regular,0.045258247,Baking Goods,35.9874,OUT035,2004,Small,Tier 2,Supermarket Type1,282.2992 +FDJ09,15,Low Fat,0.058485617,Snack Foods,44.7744,OUT049,1999,Medium,Tier 1,Supermarket Type1,679.116 +NCS54,,Low Fat,0.00994477,Household,177.837,OUT027,1985,Medium,Tier 3,Supermarket Type3,6528.169 +FDJ33,,Regular,0.087894475,Snack Foods,121.173,OUT027,1985,Medium,Tier 3,Supermarket Type3,2586.633 +FDF32,16.35,Low Fat,0.113953562,Fruits and Vegetables,198.2426,OUT010,1998,,Tier 3,Grocery Store,790.9704 +FDN24,,Low Fat,0.198316649,Baking Goods,54.3956,OUT019,1985,Small,Tier 1,Grocery Store,272.978 +FDX21,7.05,LF,0.084949955,Snack Foods,109.7912,OUT035,2004,Small,Tier 2,Supermarket Type1,1091.912 +FDC57,20.1,Regular,0.054549098,Fruits and Vegetables,193.782,OUT013,1987,High,Tier 3,Supermarket Type1,1158.492 +NCZ06,19.6,Low Fat,0.094545236,Household,254.7698,OUT018,2009,Medium,Tier 3,Supermarket Type2,5327.0658 +FDY56,16.35,Regular,0.062359467,Fruits and Vegetables,224.0062,OUT013,1987,High,Tier 3,Supermarket Type1,4288.4178 +NCH07,13.15,Low Fat,0.092811105,Household,159.7604,OUT049,1999,Medium,Tier 1,Supermarket Type1,4119.9704 +FDS44,12.65,Regular,0.156679617,Fruits and Vegetables,238.8538,OUT018,2009,Medium,Tier 3,Supermarket Type2,4566.7222 +FDY33,14.5,Regular,0.09735225,Snack Foods,160.7262,OUT049,1999,Medium,Tier 1,Supermarket Type1,1750.3882 +FDZ48,17.75,Low Fat,0.076113671,Baking Goods,111.4544,OUT045,2002,,Tier 2,Supermarket Type1,1006.6896 +FDY48,14,Low Fat,0.023783007,Baking Goods,104.0332,OUT045,2002,,Tier 2,Supermarket Type1,1435.4648 +FDK16,,Low Fat,0.114771298,Frozen Foods,93.9094,OUT027,1985,Medium,Tier 3,Supermarket Type3,3903.5854 +FDT16,9.895,Regular,0.048662357,Frozen Foods,261.7278,OUT046,1997,Small,Tier 1,Supermarket Type1,4685.9004 +FDC26,10.195,Low Fat,0.211539389,Canned,110.9886,OUT010,1998,,Tier 3,Grocery Store,111.1886 +DRJ47,18.25,Low Fat,0.044430561,Hard Drinks,174.208,OUT018,2009,Medium,Tier 3,Supermarket Type2,2596.62 +FDQ04,6.4,Low Fat,0.141860161,Frozen Foods,41.0796,OUT010,1998,,Tier 3,Grocery Store,41.2796 +FDN40,5.88,Low Fat,0,Frozen Foods,154.2998,OUT046,1997,Small,Tier 1,Supermarket Type1,1999.3974 +FDS39,6.895,Low Fat,0.022441883,Meat,143.8812,OUT013,1987,High,Tier 3,Supermarket Type1,2707.1428 +FDC11,20.5,Low Fat,0.142370445,Starchy Foods,90.6172,OUT018,2009,Medium,Tier 3,Supermarket Type2,1427.4752 +FDQ39,14.8,Low Fat,0.13564792,Meat,190.8846,OUT010,1998,,Tier 3,Grocery Store,191.0846 +FDB33,17.75,Low Fat,0.014602837,Fruits and Vegetables,158.6262,OUT049,1999,Medium,Tier 1,Supermarket Type1,3819.0288 +FDU27,18.6,Regular,0.28701714,Meat,48.8376,OUT010,1998,,Tier 3,Grocery Store,47.9376 +FDM44,12.5,low fat,0.031112643,Fruits and Vegetables,104.999,OUT045,2002,,Tier 2,Supermarket Type1,1444.786 +FDT32,19,Regular,0.065621523,Fruits and Vegetables,186.5214,OUT035,2004,Small,Tier 2,Supermarket Type1,5275.7992 +DRC13,8.26,Regular,0.032573725,Soft Drinks,125.073,OUT018,2009,Medium,Tier 3,Supermarket Type2,985.384 +NCO07,9.06,Low Fat,0.009776268,Others,213.756,OUT046,1997,Small,Tier 1,Supermarket Type1,1065.28 +FDJ16,9.195,Low Fat,0.115353642,Frozen Foods,58.9246,OUT018,2009,Medium,Tier 3,Supermarket Type2,926.7936 +FDB22,,Low Fat,0.110901004,Snack Foods,155.0998,OUT027,1985,Medium,Tier 3,Supermarket Type3,2768.3964 +NCS30,5.945,Low Fat,0.093214866,Household,129.1652,OUT045,2002,,Tier 2,Supermarket Type1,2841.6344 +FDQ59,,Regular,0,Breads,84.5908,OUT027,1985,Medium,Tier 3,Supermarket Type3,3020.0688 +FDI38,13.35,Regular,0.014649641,Canned,207.3638,OUT049,1999,Medium,Tier 1,Supermarket Type1,5797.7864 +FDR52,12.65,Regular,0.07603021,Frozen Foods,189.0846,OUT035,2004,Small,Tier 2,Supermarket Type1,4012.7766 +FDT15,12.15,Regular,0.042855388,Meat,181.695,OUT018,2009,Medium,Tier 3,Supermarket Type2,2929.52 +FDR52,,Regular,0.133144259,Frozen Foods,190.8846,OUT019,1985,Small,Tier 1,Grocery Store,191.0846 +FDS60,20.85,Low Fat,0.032580705,Baking Goods,180.066,OUT018,2009,Medium,Tier 3,Supermarket Type2,2157.192 +FDK52,18.25,Low Fat,0,Frozen Foods,224.1062,OUT018,2009,Medium,Tier 3,Supermarket Type2,4965.5364 +FDA04,11.3,Regular,0.066865326,Frozen Foods,260.1962,OUT045,2002,,Tier 2,Supermarket Type1,2848.9582 +NCQ53,17.6,Low Fat,0.018943666,Health and Hygiene,237.359,OUT045,2002,,Tier 2,Supermarket Type1,6145.334 +FDN28,5.88,Regular,0.030371121,Frozen Foods,101.799,OUT018,2009,Medium,Tier 3,Supermarket Type2,1960.781 +FDU12,,Regular,0.132630345,Baking Goods,263.8568,OUT019,1985,Small,Tier 1,Grocery Store,790.9704 +FDT03,21.25,Low Fat,0.01001904,Meat,184.6608,OUT045,2002,,Tier 2,Supermarket Type1,367.5216 +FDY57,20.2,Regular,0.121254236,Snack Foods,94.5752,OUT046,1997,Small,Tier 1,Supermarket Type1,1821.6288 +FDH56,9.8,Regular,0.063764099,Fruits and Vegetables,113.8492,OUT013,1987,High,Tier 3,Supermarket Type1,1737.738 +DRM23,16.6,Low Fat,0.136286138,Hard Drinks,171.4422,OUT018,2009,Medium,Tier 3,Supermarket Type2,2241.7486 +FDZ07,,Regular,0.164391573,Fruits and Vegetables,62.8194,OUT019,1985,Small,Tier 1,Grocery Store,61.9194 +FDK40,7.035,Low Fat,0.02189371,Frozen Foods,262.791,OUT045,2002,,Tier 2,Supermarket Type1,3681.874 +FDU04,7.93,Low Fat,0,Frozen Foods,121.8414,OUT046,1997,Small,Tier 1,Supermarket Type1,2802.3522 +DRL37,15.5,Low Fat,0,Soft Drinks,41.377,OUT017,2007,,Tier 2,Supermarket Type1,649.155 +FDT26,,reg,0.067624438,Dairy,120.944,OUT027,1985,Medium,Tier 3,Supermarket Type3,1078.596 +FDT24,12.35,Regular,0.186236236,Baking Goods,78.7328,OUT045,2002,,Tier 2,Supermarket Type1,1390.1904 +FDX57,,Regular,0.047037323,Snack Foods,96.4068,OUT027,1985,Medium,Tier 3,Supermarket Type3,2624.5836 +FDA55,,Regular,0.099780431,Fruits and Vegetables,225.2088,OUT019,1985,Small,Tier 1,Grocery Store,447.4176 +NCN05,8.235,Low Fat,0.014488997,Health and Hygiene,183.795,OUT045,2002,,Tier 2,Supermarket Type1,2929.52 +FDR58,6.675,Low Fat,0.04200648,Snack Foods,92.6462,OUT045,2002,,Tier 2,Supermarket Type1,1665.8316 +FDX47,6.55,Regular,0.034575546,Breads,156.5288,OUT013,1987,High,Tier 3,Supermarket Type1,1571.288 +NCH54,13.5,Low Fat,0.072965144,Household,160.692,OUT018,2009,Medium,Tier 3,Supermarket Type2,1917.504 +NCH42,6.86,Low Fat,0.036530411,Household,227.801,OUT035,2004,Small,Tier 2,Supermarket Type1,3904.917 +FDH56,9.8,Regular,0.063946629,Fruits and Vegetables,116.6492,OUT045,2002,,Tier 2,Supermarket Type1,2316.984 +FDQ48,14.3,Regular,0.034551415,Baking Goods,98.1726,OUT018,2009,Medium,Tier 3,Supermarket Type2,685.1082 +FDN20,19.35,Low Fat,0.026329989,Fruits and Vegetables,169.2474,OUT017,2007,,Tier 2,Supermarket Type1,3705.8428 +FDA15,9.3,Low Fat,0.016009057,Dairy,250.6092,OUT013,1987,High,Tier 3,Supermarket Type1,6474.2392 +FDS48,,Low Fat,0.048637888,Baking Goods,149.7708,OUT019,1985,Small,Tier 1,Grocery Store,150.4708 +FDW02,4.805,Regular,0.037852995,Dairy,126.2704,OUT018,2009,Medium,Tier 3,Supermarket Type2,3629.9416 +FDN03,,Regular,0.015016891,Meat,248.6408,OUT027,1985,Medium,Tier 3,Supermarket Type3,6759.2016 +FDF57,14.5,reg,0.059160135,Fruits and Vegetables,170.7448,OUT017,2007,,Tier 2,Supermarket Type1,2045.3376 +DRM37,15.35,Low Fat,0.096379585,Soft Drinks,196.5768,OUT035,2004,Small,Tier 2,Supermarket Type1,4729.8432 +NCD54,21.1,Low Fat,0.029008944,Household,143.3786,OUT046,1997,Small,Tier 1,Supermarket Type1,866.8716 +NCQ42,,Low Fat,0.039078047,Household,128.3678,OUT027,1985,Medium,Tier 3,Supermarket Type3,3179.195 +FDW49,19.5,Low Fat,0.082536604,Canned,177.2002,OUT035,2004,Small,Tier 2,Supermarket Type1,2149.2024 +DRI03,6.03,Low Fat,0.0226848,Dairy,178.1028,OUT013,1987,High,Tier 3,Supermarket Type1,4604.6728 +FDD14,20.7,Low Fat,0.170152831,Canned,182.6266,OUT045,2002,,Tier 2,Supermarket Type1,2581.9724 +FDN02,16.5,Low Fat,0.073827748,Canned,208.8638,OUT046,1997,Small,Tier 1,Supermarket Type1,2484.7656 +FDQ45,,Regular,0.010864186,Snack Foods,185.3608,OUT027,1985,Medium,Tier 3,Supermarket Type3,5329.0632 +FDX56,17.1,Regular,0.07436116,Fruits and Vegetables,206.1638,OUT018,2009,Medium,Tier 3,Supermarket Type2,4141.276 +FDE51,,Regular,0.168901843,Dairy,43.4086,OUT019,1985,Small,Tier 1,Grocery Store,44.6086 +FDT47,5.26,Regular,0.02455854,Breads,95.6068,OUT045,2002,,Tier 2,Supermarket Type1,2332.9632 +FDM22,14,Regular,0.041949832,Snack Foods,54.064,OUT035,2004,Small,Tier 2,Supermarket Type1,1118.544 +FDB27,7.575,Low Fat,0.055502454,Dairy,196.5768,OUT045,2002,,Tier 2,Supermarket Type1,1576.6144 +FDE02,,Low Fat,0.120663214,Canned,95.6778,OUT027,1985,Medium,Tier 3,Supermarket Type3,2910.2118 +FDD38,16.75,Regular,0.00819018,Canned,103.7674,OUT035,2004,Small,Tier 2,Supermarket Type1,2852.2872 +FDF34,9.3,Regular,0.014098693,Snack Foods,197.7084,OUT017,2007,,Tier 2,Supermarket Type1,3372.9428 +FDP15,15.2,Low Fat,0,Meat,256.033,OUT010,1998,,Tier 3,Grocery Store,1281.665 +NCI29,8.6,Low Fat,0.032806066,Health and Hygiene,143.6154,OUT017,2007,,Tier 2,Supermarket Type1,2127.231 +FDU27,18.6,Regular,0.172446822,Meat,47.1376,OUT017,2007,,Tier 2,Supermarket Type1,767.0016 +NCD55,,Low Fat,0.024213354,Household,42.4454,OUT027,1985,Medium,Tier 3,Supermarket Type3,293.6178 +FDU37,9.5,Regular,0,Canned,79.596,OUT046,1997,Small,Tier 1,Supermarket Type1,1038.648 +FDA01,15,Regular,0.054685839,Canned,60.2904,OUT017,2007,,Tier 2,Supermarket Type1,1581.9408 +FDS13,6.465,Low Fat,0.124758619,Canned,264.1884,OUT045,2002,,Tier 2,Supermarket Type1,3444.8492 +FDK55,18.5,Low Fat,0.02586664,Meat,88.9172,OUT018,2009,Medium,Tier 3,Supermarket Type2,1695.1268 +FDR36,6.715,Regular,0.121563385,Baking Goods,43.7454,OUT035,2004,Small,Tier 2,Supermarket Type1,545.2902 +DRK49,14.15,Low Fat,0.035999599,Soft Drinks,41.5138,OUT049,1999,Medium,Tier 1,Supermarket Type1,162.4552 +DRM23,,Low Fat,0,Hard Drinks,171.7422,OUT027,1985,Medium,Tier 3,Supermarket Type3,6207.9192 +FDH47,13.5,Regular,0.21561193,Starchy Foods,98.6068,OUT010,1998,,Tier 3,Grocery Store,97.2068 +FDZ21,17.6,Regular,0.039381633,Snack Foods,98.041,OUT018,2009,Medium,Tier 3,Supermarket Type2,675.787 +FDI57,19.85,Low Fat,0.054331235,Seafood,198.7768,OUT017,2007,,Tier 2,Supermarket Type1,4532.7664 +FDK26,,Regular,0.056338482,Canned,184.624,OUT019,1985,Small,Tier 1,Grocery Store,1304.968 +FDQ36,7.855,Regular,0.161516894,Baking Goods,37.0848,OUT035,2004,Small,Tier 2,Supermarket Type1,447.4176 +FDJ58,,Regular,0.184359831,Snack Foods,172.6764,OUT019,1985,Small,Tier 1,Grocery Store,858.882 +FDD45,8.615,Low Fat,0.116484721,Fruits and Vegetables,94.1436,OUT045,2002,,Tier 2,Supermarket Type1,1134.5232 +FDG50,7.405,Low Fat,0.015302764,Canned,89.9146,OUT045,2002,,Tier 2,Supermarket Type1,2189.1504 +FDO36,,Low Fat,0.136417078,Baking Goods,179.766,OUT019,1985,Small,Tier 1,Grocery Store,179.766 +NCW42,18.2,Low Fat,0.058707159,Household,220.5456,OUT018,2009,Medium,Tier 3,Supermarket Type2,3094.6384 +NCH18,9.3,Low Fat,0.074753743,Household,246.4802,OUT010,1998,,Tier 3,Grocery Store,982.7208 +FDY59,,Low Fat,0.031251369,Baking Goods,93.3462,OUT027,1985,Medium,Tier 3,Supermarket Type3,1018.0082 +NCO42,21.25,Low Fat,0.024705597,Household,145.1102,OUT045,2002,,Tier 2,Supermarket Type1,1603.9122 +FDM45,8.655,Regular,0.088693595,Snack Foods,122.5756,OUT017,2007,,Tier 2,Supermarket Type1,2181.1608 +NCV29,11.8,Low Fat,0.038235337,Health and Hygiene,177.5686,OUT010,1998,,Tier 3,Grocery Store,711.0744 +FDT08,,LF,0.048980156,Fruits and Vegetables,148.705,OUT027,1985,Medium,Tier 3,Supermarket Type3,2996.1 +NCQ43,,Low Fat,0.194874778,Others,110.2912,OUT019,1985,Small,Tier 1,Grocery Store,218.3824 +NCA54,16.5,Low Fat,0.036611104,Household,180.9318,OUT013,1987,High,Tier 3,Supermarket Type1,3247.7724 +FDW55,12.6,Regular,0,Fruits and Vegetables,248.8092,OUT035,2004,Small,Tier 2,Supermarket Type1,6723.2484 +FDI10,,Regular,0.07802465,Snack Foods,171.4422,OUT027,1985,Medium,Tier 3,Supermarket Type3,3448.844 +NCS53,,Low Fat,0.157190017,Health and Hygiene,156.8604,OUT019,1985,Small,Tier 1,Grocery Store,316.9208 +FDZ35,,Regular,0.022170592,Breads,105.199,OUT027,1985,Medium,Tier 3,Supermarket Type3,3199.169 +FDF10,15.5,reg,0.156797787,Snack Foods,148.6418,OUT013,1987,High,Tier 3,Supermarket Type1,3972.8286 +FDO38,17.25,Low Fat,0.07325106,Canned,76.4986,OUT017,2007,,Tier 2,Supermarket Type1,778.986 +FDY45,17.5,Low Fat,0.026289984,Snack Foods,253.7356,OUT017,2007,,Tier 2,Supermarket Type1,3815.034 +FDC40,16,Regular,0.065328932,Dairy,78.4986,OUT018,2009,Medium,Tier 3,Supermarket Type2,1791.6678 +NCO54,19.5,Low Fat,0.014296484,Household,53.7614,OUT049,1999,Medium,Tier 1,Supermarket Type1,1436.7964 +FDQ14,9.27,Low Fat,0.062038986,Dairy,148.005,OUT018,2009,Medium,Tier 3,Supermarket Type2,1797.66 +FDM10,18.25,Low Fat,0.075908374,Snack Foods,213.4218,OUT013,1987,High,Tier 3,Supermarket Type1,3846.9924 +DRK23,8.395,Low Fat,0.072383777,Hard Drinks,251.504,OUT017,2007,,Tier 2,Supermarket Type1,7084.112 +NCR17,9.8,Low Fat,0.024363026,Health and Hygiene,114.0492,OUT013,1987,High,Tier 3,Supermarket Type1,2085.2856 +FDG31,,Low Fat,0.066351687,Meat,65.0826,OUT019,1985,Small,Tier 1,Grocery Store,193.7478 +FDH02,7.27,Regular,0.020823289,Canned,92.4488,OUT045,2002,,Tier 2,Supermarket Type1,996.0368 +DRH37,17.6,Low Fat,0.041851756,Soft Drinks,162.7526,OUT017,2007,,Tier 2,Supermarket Type1,3124.5994 +DRC36,13,Regular,0.045239326,Soft Drinks,174.1054,OUT017,2007,,Tier 2,Supermarket Type1,4377.635 +FDB56,8.75,Regular,0.074778547,Fruits and Vegetables,186.3556,OUT045,2002,,Tier 2,Supermarket Type1,3567.3564 +NCK54,12.15,Low Fat,0.029583249,Household,114.715,OUT045,2002,,Tier 2,Supermarket Type1,1048.635 +NCQ17,10.3,Low Fat,0,Health and Hygiene,154.663,OUT013,1987,High,Tier 3,Supermarket Type1,2816.334 +FDM13,6.425,Low Fat,0.063432676,Breakfast,132.8626,OUT018,2009,Medium,Tier 3,Supermarket Type2,524.6504 +FDT44,16.6,Low Fat,0.103406065,Fruits and Vegetables,116.4466,OUT018,2009,Medium,Tier 3,Supermarket Type2,1178.466 +FDO28,,Low Fat,0.126585095,Frozen Foods,122.4098,OUT019,1985,Small,Tier 1,Grocery Store,120.5098 +NCK07,10.65,Low Fat,0.04896208,Others,165.8526,OUT017,2007,,Tier 2,Supermarket Type1,3946.8624 +NCP05,19.6,Low Fat,0.025286583,Health and Hygiene,151.8024,OUT046,1997,Small,Tier 1,Supermarket Type1,1366.2216 +FDX11,16,Regular,0.106752081,Baking Goods,181.4634,OUT046,1997,Small,Tier 1,Supermarket Type1,1090.5804 +FDS52,8.89,Low Fat,0.005485618,Frozen Foods,99.3016,OUT045,2002,,Tier 2,Supermarket Type1,607.2096 +FDB14,20.25,Regular,0.102932246,Canned,93.212,OUT045,2002,,Tier 2,Supermarket Type1,1304.968 +NCY06,,LF,0.060888514,Household,130.1968,OUT027,1985,Medium,Tier 3,Supermarket Type3,1565.9616 +FDS45,5.175,Regular,0.029662795,Snack Foods,105.2622,OUT017,2007,,Tier 2,Supermarket Type1,2328.9684 +DRF23,4.61,Low Fat,0,Hard Drinks,173.8396,OUT046,1997,Small,Tier 1,Supermarket Type1,1221.0772 +FDD33,,Low Fat,0,Fruits and Vegetables,231.9642,OUT027,1985,Medium,Tier 3,Supermarket Type3,6970.926 +NCA53,11.395,Low Fat,0.009918699,Health and Hygiene,49.4034,OUT018,2009,Medium,Tier 3,Supermarket Type2,777.6544 +FDC46,17.7,Low Fat,0.116520447,Snack Foods,186.0266,OUT035,2004,Small,Tier 2,Supermarket Type1,2950.8256 +NCW41,18,Low Fat,0.015447454,Health and Hygiene,159.2604,OUT035,2004,Small,Tier 2,Supermarket Type1,3961.51 +FDZ39,19.7,Regular,0.018098194,Meat,104.599,OUT018,2009,Medium,Tier 3,Supermarket Type2,309.597 +FDE51,5.925,Regular,0.097012989,Dairy,42.9086,OUT017,2007,,Tier 2,Supermarket Type1,758.3462 +FDG32,,low fat,0.17514326,Fruits and Vegetables,222.3772,OUT027,1985,Medium,Tier 3,Supermarket Type3,9562.2196 +NCK07,10.65,Low Fat,0.048785427,Others,163.9526,OUT045,2002,,Tier 2,Supermarket Type1,1644.526 +NCQ41,14.8,Low Fat,0.019476708,Health and Hygiene,193.0794,OUT035,2004,Small,Tier 2,Supermarket Type1,3901.588 +FDL36,15.1,Low Fat,0.076229769,Baking Goods,90.483,OUT045,2002,,Tier 2,Supermarket Type1,1617.894 +FDQ26,13.5,Regular,0,Dairy,57.8562,OUT049,1999,Medium,Tier 1,Supermarket Type1,711.0744 +FDR02,16.7,LF,0.022190488,Dairy,113.1886,OUT017,2007,,Tier 2,Supermarket Type1,3335.658 +FDV59,13.35,LF,0,Breads,217.6166,OUT018,2009,Medium,Tier 3,Supermarket Type2,3265.749 +FDZ33,10.195,Low Fat,0,Snack Foods,147.2076,OUT010,1998,,Tier 3,Grocery Store,739.038 +NCT41,15.7,Low Fat,0.05610384,Health and Hygiene,153.5024,OUT045,2002,,Tier 2,Supermarket Type1,2580.6408 +FDB17,13.15,Low Fat,0.061381589,Frozen Foods,179.9976,OUT010,1998,,Tier 3,Grocery Store,181.0976 +FDN44,13.15,Low Fat,0.022795611,Fruits and Vegetables,160.192,OUT046,1997,Small,Tier 1,Supermarket Type1,1597.92 +FDE45,12.1,Low Fat,0.040323731,Fruits and Vegetables,180.0002,OUT013,1987,High,Tier 3,Supermarket Type1,4656.6052 +FDG47,12.8,Low Fat,0.070012633,Starchy Foods,262.8252,OUT017,2007,,Tier 2,Supermarket Type1,2885.5772 +NCP02,,Low Fat,0.044591774,Household,59.6562,OUT027,1985,Medium,Tier 3,Supermarket Type3,2192.4794 +FDW02,4.805,Regular,0.037699423,Dairy,125.5704,OUT046,1997,Small,Tier 1,Supermarket Type1,3880.2824 +NCM53,18.75,Low Fat,0.052040915,Health and Hygiene,105.728,OUT046,1997,Small,Tier 1,Supermarket Type1,2024.032 +FDD47,7.6,Regular,0.142292265,Starchy Foods,171.3448,OUT013,1987,High,Tier 3,Supermarket Type1,3238.4512 +FDE28,9.5,Regular,0.132521929,Frozen Foods,228.6668,OUT035,2004,Small,Tier 2,Supermarket Type1,4146.6024 +FDV12,16.7,Regular,0.061122656,Baking Goods,100.0384,OUT018,2009,Medium,Tier 3,Supermarket Type2,2463.46 +FDE36,5.26,Regular,0.041942549,Baking Goods,165.4868,OUT018,2009,Medium,Tier 3,Supermarket Type2,2293.0152 +FDU45,15.6,Regular,0.035506142,Snack Foods,112.4518,OUT046,1997,Small,Tier 1,Supermarket Type1,3301.7022 +FDP28,13.65,Regular,0.080573371,Frozen Foods,260.1936,OUT013,1987,High,Tier 3,Supermarket Type1,3914.904 +FDH33,12.85,Low Fat,0.121972274,Snack Foods,43.1428,OUT045,2002,,Tier 2,Supermarket Type1,703.0848 +FDO44,12.6,Low Fat,0.087436672,Fruits and Vegetables,109.9228,OUT035,2004,Small,Tier 2,Supermarket Type1,663.1368 +FDR07,,Low Fat,0.136119549,Fruits and Vegetables,94.1094,OUT019,1985,Small,Tier 1,Grocery Store,190.4188 +FDJ45,17.75,Low Fat,0.073396761,Seafood,35.1216,OUT035,2004,Small,Tier 2,Supermarket Type1,830.9184 +FDS59,14.8,Regular,0.073468631,Breads,110.857,OUT010,1998,,Tier 3,Grocery Store,329.571 +FDU34,18.25,Low Fat,0.075132353,Snack Foods,125.9046,OUT013,1987,High,Tier 3,Supermarket Type1,2365.5874 +NCL06,14.65,Low Fat,0.120624771,Household,261.7594,OUT010,1998,,Tier 3,Grocery Store,523.3188 +FDR37,16.5,Regular,0.110888167,Breakfast,181.6292,OUT010,1998,,Tier 3,Grocery Store,1094.5752 +NCM53,18.75,Low Fat,0.052252908,Health and Hygiene,105.728,OUT018,2009,Medium,Tier 3,Supermarket Type2,1704.448 +DRG25,10.5,Low Fat,0.019046089,Soft Drinks,188.424,OUT035,2004,Small,Tier 2,Supermarket Type1,2237.088 +DRE25,15.35,Low Fat,0.073397129,Soft Drinks,91.912,OUT049,1999,Medium,Tier 1,Supermarket Type1,2609.936 +FDZ45,14.1,Low Fat,0.067011609,Snack Foods,197.1084,OUT045,2002,,Tier 2,Supermarket Type1,2182.4924 +NCV53,8.27,Low Fat,0.031490111,Health and Hygiene,239.088,OUT010,1998,,Tier 3,Grocery Store,719.064 +FDR55,12.15,Regular,0.132621594,Fruits and Vegetables,190.1872,OUT018,2009,Medium,Tier 3,Supermarket Type2,3781.744 +FDS47,,LF,0,Breads,87.6856,OUT027,1985,Medium,Tier 3,Supermarket Type3,1845.5976 +DRG27,8.895,Low Fat,0.105110692,Dairy,41.1138,OUT046,1997,Small,Tier 1,Supermarket Type1,690.4346 +FDA02,14,Regular,0.02976887,Dairy,145.4786,OUT049,1999,Medium,Tier 1,Supermarket Type1,1300.3074 +FDF45,18.2,reg,0.012229464,Fruits and Vegetables,56.8904,OUT045,2002,,Tier 2,Supermarket Type1,1406.1696 +FDZ58,17.85,Low Fat,0.052176861,Snack Foods,122.8072,OUT046,1997,Small,Tier 1,Supermarket Type1,857.5504 +NCH30,17.1,Low Fat,0.06725846,Household,115.186,OUT049,1999,Medium,Tier 1,Supermarket Type1,2490.092 +FDN03,9.8,Regular,0.025257508,Meat,248.5408,OUT010,1998,,Tier 3,Grocery Store,751.0224 +FDH12,9.6,Low Fat,0.085085743,Baking Goods,105.128,OUT049,1999,Medium,Tier 1,Supermarket Type1,1065.28 +NCH54,13.5,Low Fat,0.12163321,Household,161.692,OUT010,1998,,Tier 3,Grocery Store,159.792 +DRH01,17.5,Low Fat,0.098102581,Soft Drinks,172.9738,OUT045,2002,,Tier 2,Supermarket Type1,4344.345 +FDX01,,Low Fat,0.024047319,Canned,115.515,OUT027,1985,Medium,Tier 3,Supermarket Type3,1980.755 +FDD34,7.945,Low Fat,0.01596609,Snack Foods,163.521,OUT017,2007,,Tier 2,Supermarket Type1,1794.331 +FDC53,,Low Fat,0.008792907,Frozen Foods,96.7384,OUT027,1985,Medium,Tier 3,Supermarket Type3,2956.152 +FDO28,5.765,Low Fat,0.072238195,Frozen Foods,120.0098,OUT013,1987,High,Tier 3,Supermarket Type1,1687.1372 +DRJ51,14.1,Low Fat,0.08849163,Dairy,231.1668,OUT017,2007,,Tier 2,Supermarket Type1,7602.1044 +FDD14,20.7,Low Fat,0.170500183,Canned,184.1266,OUT018,2009,Medium,Tier 3,Supermarket Type2,1659.8394 +FDW35,10.6,LF,0.011134397,Breads,42.8454,OUT018,2009,Medium,Tier 3,Supermarket Type2,167.7816 +NCH18,9.3,Low Fat,0.044730667,Household,245.1802,OUT049,1999,Medium,Tier 1,Supermarket Type1,2456.802 +FDK20,12.6,Regular,0.04179272,Fruits and Vegetables,122.0072,OUT017,2007,,Tier 2,Supermarket Type1,1347.5792 +FDY47,8.6,Regular,0.054484461,Breads,130.131,OUT046,1997,Small,Tier 1,Supermarket Type1,1557.972 +FDG32,19.85,Low Fat,0.175849067,Fruits and Vegetables,222.0772,OUT013,1987,High,Tier 3,Supermarket Type1,2001.3948 +FDC20,10.65,Low Fat,0.024069113,Fruits and Vegetables,56.2272,OUT018,2009,Medium,Tier 3,Supermarket Type2,559.272 +NCS29,9,Low Fat,0.06953231,Health and Hygiene,266.5884,OUT035,2004,Small,Tier 2,Supermarket Type1,6624.71 +FDG53,10,Low Fat,0.045848263,Frozen Foods,138.518,OUT035,2004,Small,Tier 2,Supermarket Type1,2237.088 +FDV26,20.25,Regular,0.076160451,Dairy,196.2794,OUT046,1997,Small,Tier 1,Supermarket Type1,2731.1116 +FDE40,15.6,Regular,0.099704558,Dairy,63.1194,OUT017,2007,,Tier 2,Supermarket Type1,1300.3074 +FDM02,12.5,Regular,0.073735058,Canned,87.1198,OUT046,1997,Small,Tier 1,Supermarket Type1,1657.1762 +FDU11,4.785,Low Fat,0.0931174,Breads,118.6098,OUT017,2007,,Tier 2,Supermarket Type1,361.5294 +FDB51,6.92,Low Fat,0.038446805,Dairy,63.5852,OUT035,2004,Small,Tier 2,Supermarket Type1,751.0224 +FDQ03,15,Regular,0.078172471,Meat,238.8248,OUT045,2002,,Tier 2,Supermarket Type1,3555.372 +DRK35,8.365,Low Fat,0.071992202,Hard Drinks,38.3506,OUT045,2002,,Tier 2,Supermarket Type1,986.7156 +FDZ32,7.785,Regular,0.038210084,Fruits and Vegetables,103.8964,OUT045,2002,,Tier 2,Supermarket Type1,946.7676 +FDU38,10.8,Low Fat,0.0824812,Dairy,191.6504,OUT013,1987,High,Tier 3,Supermarket Type1,2492.7552 +DRM11,6.57,Low Fat,0.066069578,Hard Drinks,261.0278,OUT046,1997,Small,Tier 1,Supermarket Type1,4165.2448 +FDS36,8.38,Regular,0.046848322,Baking Goods,110.557,OUT013,1987,High,Tier 3,Supermarket Type1,3844.995 +FDO52,11.6,Regular,0.077164595,Frozen Foods,172.5106,OUT046,1997,Small,Tier 1,Supermarket Type1,2566.659 +FDA04,11.3,Regular,0.066833743,Frozen Foods,257.2962,OUT049,1999,Medium,Tier 1,Supermarket Type1,2330.9658 +NCE31,7.67,Low Fat,0.185596553,Household,35.7216,OUT018,2009,Medium,Tier 3,Supermarket Type2,69.2432 +FDC33,8.96,Regular,0.068925304,Fruits and Vegetables,196.9768,OUT035,2004,Small,Tier 2,Supermarket Type1,2759.0752 +FDS33,6.67,Regular,0.12367891,Snack Foods,88.9514,OUT045,2002,,Tier 2,Supermarket Type1,885.514 +NCJ05,18.7,Low Fat,0.046348967,Health and Hygiene,153.6682,OUT017,2007,,Tier 2,Supermarket Type1,1677.1502 +FDN51,17.85,reg,0.021065311,Meat,261.5936,OUT017,2007,,Tier 2,Supermarket Type1,6002.8528 +FDZ10,,Low Fat,0.077849833,Snack Foods,127.202,OUT019,1985,Small,Tier 1,Grocery Store,506.008 +NCQ30,7.725,Low Fat,0.029236727,Household,123.8414,OUT017,2007,,Tier 2,Supermarket Type1,1340.2554 +FDL09,19.6,Regular,0.127929521,Snack Foods,167.4816,OUT013,1987,High,Tier 3,Supermarket Type1,3691.1952 +FDU03,18.7,Regular,0.091560606,Meat,182.3292,OUT035,2004,Small,Tier 2,Supermarket Type1,3831.0132 +FDQ32,,Regular,0.081605462,Fruits and Vegetables,122.3388,OUT019,1985,Small,Tier 1,Grocery Store,371.5164 +FDI38,13.35,Regular,0.014626901,Canned,207.7638,OUT046,1997,Small,Tier 1,Supermarket Type1,3520.0846 +FDE36,5.26,Regular,0.041837331,Baking Goods,161.8868,OUT049,1999,Medium,Tier 1,Supermarket Type1,5077.3908 +FDY02,8.945,Regular,0.088002959,Dairy,261.391,OUT018,2009,Medium,Tier 3,Supermarket Type2,1840.937 +NCA17,20.6,Low Fat,0.04551031,Health and Hygiene,149.6392,OUT045,2002,,Tier 2,Supermarket Type1,894.8352 +DRJ25,14.6,Low Fat,0.150801606,Soft Drinks,48.7692,OUT049,1999,Medium,Tier 1,Supermarket Type1,1231.73 +FDI26,5.94,Low Fat,0.03495749,Canned,177.1344,OUT045,2002,,Tier 2,Supermarket Type1,2854.9504 +FDT50,6.75,Regular,0.108458498,Dairy,96.9752,OUT045,2002,,Tier 2,Supermarket Type1,958.752 +FDR02,16.7,LF,0.022155562,Dairy,109.5886,OUT018,2009,Medium,Tier 3,Supermarket Type2,1000.6974 +NCY05,13.5,LF,0.055301055,Health and Hygiene,34.6874,OUT017,2007,,Tier 2,Supermarket Type1,317.5866 +FDI50,8.42,Regular,0.030816999,Canned,230.8352,OUT013,1987,High,Tier 3,Supermarket Type1,3435.528 +FDW56,7.68,LF,0.0711891,Fruits and Vegetables,193.3162,OUT018,2009,Medium,Tier 3,Supermarket Type2,5772.486 +FDS32,17.75,Regular,0.029821648,Fruits and Vegetables,139.9838,OUT017,2007,,Tier 2,Supermarket Type1,1123.8704 +FDT48,4.92,Low Fat,0.046142232,Baking Goods,199.1084,OUT018,2009,Medium,Tier 3,Supermarket Type2,4761.8016 +FDU57,8.27,Regular,0.089735804,Snack Foods,148.7708,OUT045,2002,,Tier 2,Supermarket Type1,2708.4744 +FDL51,20.7,Regular,0.04745185,Dairy,214.6876,OUT013,1987,High,Tier 3,Supermarket Type1,3001.4264 +FDO52,11.6,Regular,0.077150004,Frozen Foods,170.2106,OUT035,2004,Small,Tier 2,Supermarket Type1,1882.2166 +FDS57,,Low Fat,0.181114059,Snack Foods,141.647,OUT019,1985,Small,Tier 1,Grocery Store,429.441 +FDR22,19.35,Regular,0.018562604,Snack Foods,110.5544,OUT046,1997,Small,Tier 1,Supermarket Type1,1565.9616 +FDB57,20.25,Regular,0.018789455,Fruits and Vegetables,222.0772,OUT013,1987,High,Tier 3,Supermarket Type1,3113.2808 +FDA04,11.3,Regular,0.066674465,Frozen Foods,259.1962,OUT013,1987,High,Tier 3,Supermarket Type1,5179.924 +FDM09,11.15,Regular,0.143831787,Snack Foods,169.979,OUT010,1998,,Tier 3,Grocery Store,169.779 +NCQ38,,LF,0.023402893,Others,108.228,OUT019,1985,Small,Tier 1,Grocery Store,213.056 +FDP52,18.7,Regular,0.070979698,Frozen Foods,229.501,OUT018,2009,Medium,Tier 3,Supermarket Type2,1607.907 +DRK11,,Low Fat,0.018847114,Hard Drinks,148.0392,OUT019,1985,Small,Tier 1,Grocery Store,447.4176 +FDN40,5.88,Low Fat,0.086945823,Frozen Foods,152.9998,OUT017,2007,,Tier 2,Supermarket Type1,3691.1952 +FDV58,20.85,Low Fat,0.121438886,Snack Foods,196.1452,OUT049,1999,Medium,Tier 1,Supermarket Type1,1565.9616 +DRA59,8.27,Regular,0,Soft Drinks,183.2924,OUT017,2007,,Tier 2,Supermarket Type1,2406.2012 +FDE23,17.6,Regular,0.053288857,Starchy Foods,47.306,OUT045,2002,,Tier 2,Supermarket Type1,605.878 +FDI08,18.2,reg,0.066431507,Fruits and Vegetables,250.1092,OUT045,2002,,Tier 2,Supermarket Type1,4233.1564 +FDE09,,Low Fat,0.037824735,Fruits and Vegetables,109.7228,OUT019,1985,Small,Tier 1,Grocery Store,331.5684 +FDG09,20.6,Regular,0.047936284,Fruits and Vegetables,185.7556,OUT046,1997,Small,Tier 1,Supermarket Type1,3942.8676 +FDS57,15.5,Low Fat,0.103356186,Snack Foods,142.847,OUT013,1987,High,Tier 3,Supermarket Type1,1574.617 +FDW15,15.35,Regular,0.055067732,Meat,146.5734,OUT013,1987,High,Tier 3,Supermarket Type1,2375.5744 +FDH56,9.8,Regular,0.063916425,Fruits and Vegetables,117.1492,OUT049,1999,Medium,Tier 1,Supermarket Type1,2780.3808 +FDM36,11.65,Regular,0.059063036,Baking Goods,172.0422,OUT017,2007,,Tier 2,Supermarket Type1,1379.5376 +NCQ38,16.35,Low Fat,0.013442036,Others,104.528,OUT017,2007,,Tier 2,Supermarket Type1,1065.28 +DRE48,,Low Fat,0.01724183,Soft Drinks,197.0768,OUT027,1985,Medium,Tier 3,Supermarket Type3,8868.456 +FDP33,18.7,LF,0.089777214,Snack Foods,256.4672,OUT017,2007,,Tier 2,Supermarket Type1,5369.0112 +FDI33,16.5,Low Fat,0.028418817,Snack Foods,92.8146,OUT046,1997,Small,Tier 1,Supermarket Type1,2097.9358 +FDO16,5.48,Low Fat,0.015108194,Frozen Foods,83.725,OUT046,1997,Small,Tier 1,Supermarket Type1,1165.15 +FDW34,9.6,Low Fat,0.035780385,Snack Foods,241.317,OUT017,2007,,Tier 2,Supermarket Type1,3645.255 +FDM22,,Regular,0.073462632,Snack Foods,52.364,OUT019,1985,Small,Tier 1,Grocery Store,53.264 +NCO07,9.06,Low Fat,0.009816092,Others,211.856,OUT018,2009,Medium,Tier 3,Supermarket Type2,3621.952 +FDC44,15.6,Low Fat,0.172946916,Fruits and Vegetables,114.1518,OUT045,2002,,Tier 2,Supermarket Type1,1821.6288 +DRB48,16.75,Regular,0.024892129,Soft Drinks,37.8822,OUT049,1999,Medium,Tier 1,Supermarket Type1,589.233 +NCV29,11.8,LF,0.022824491,Health and Hygiene,177.0686,OUT013,1987,High,Tier 3,Supermarket Type1,3022.0662 +FDE28,9.5,Regular,0,Frozen Foods,231.3668,OUT013,1987,High,Tier 3,Supermarket Type1,5759.17 +FDP49,9,Regular,0.069229076,Breakfast,55.9614,OUT045,2002,,Tier 2,Supermarket Type1,386.8298 +FDX59,10.195,Low Fat,0.051766042,Breads,34.5558,OUT045,2002,,Tier 2,Supermarket Type1,441.4254 +FDN60,15.1,Low Fat,0.095140088,Baking Goods,159.9604,OUT035,2004,Small,Tier 2,Supermarket Type1,2852.2872 +DRC36,13,reg,0.044976367,Soft Drinks,176.2054,OUT035,2004,Small,Tier 2,Supermarket Type1,1225.7378 +FDE02,,Low Fat,0.212293753,Canned,92.2778,OUT019,1985,Small,Tier 1,Grocery Store,469.389 +NCU29,,Low Fat,0.025354072,Health and Hygiene,144.476,OUT027,1985,Medium,Tier 3,Supermarket Type3,3661.9 +NCQ17,10.3,Low Fat,0.195721125,Health and Hygiene,156.463,OUT010,1998,,Tier 3,Grocery Store,312.926 +DRD12,6.96,LF,0.077508015,Soft Drinks,92.3146,OUT018,2009,Medium,Tier 3,Supermarket Type2,1094.5752 +FDV45,16.75,Low Fat,0.045009952,Snack Foods,186.8556,OUT013,1987,High,Tier 3,Supermarket Type1,2440.8228 +FDZ02,,Regular,0.037962696,Dairy,97.5726,OUT027,1985,Medium,Tier 3,Supermarket Type3,978.726 +FDW26,,Regular,0.187443314,Dairy,220.4772,OUT019,1985,Small,Tier 1,Grocery Store,444.7544 +FDN40,5.88,Low Fat,0.086384841,Frozen Foods,153.2998,OUT013,1987,High,Tier 3,Supermarket Type1,2153.1972 +FDR19,,Regular,0.158947217,Fruits and Vegetables,145.5102,OUT027,1985,Medium,Tier 3,Supermarket Type3,5978.2182 +FDD50,18.85,Low Fat,0.141615436,Canned,169.0132,OUT035,2004,Small,Tier 2,Supermarket Type1,1860.2452 +NCD18,16,Low Fat,0,Household,228.8668,OUT046,1997,Small,Tier 1,Supermarket Type1,1612.5676 +FDA34,11.5,Low Fat,0.01484819,Starchy Foods,172.108,OUT013,1987,High,Tier 3,Supermarket Type1,2077.296 +FDR33,7.31,Low Fat,0.026843265,Snack Foods,109.757,OUT045,2002,,Tier 2,Supermarket Type1,1208.427 +FDD39,16.7,Low Fat,0.070154899,Dairy,218.185,OUT046,1997,Small,Tier 1,Supermarket Type1,5193.24 +FDR13,9.895,Regular,0.028765486,Canned,115.3492,OUT049,1999,Medium,Tier 1,Supermarket Type1,1274.3412 +FDA39,,LF,0.012656359,Meat,37.8822,OUT027,1985,Medium,Tier 3,Supermarket Type3,1021.3372 +FDN01,8.895,Low Fat,0,Breakfast,178.437,OUT046,1997,Small,Tier 1,Supermarket Type1,1235.059 +FDU04,7.93,Low Fat,0.005547386,Frozen Foods,121.5414,OUT035,2004,Small,Tier 2,Supermarket Type1,1340.2554 +FDV10,7.645,Regular,0,Snack Foods,41.7112,OUT045,2002,,Tier 2,Supermarket Type1,852.224 +NCB30,14.6,Low Fat,0.02575512,Household,199.6084,OUT045,2002,,Tier 2,Supermarket Type1,3769.7596 +FDB38,,Regular,0.027214272,Canned,159.692,OUT027,1985,Medium,Tier 3,Supermarket Type3,3515.424 +FDB22,8.02,Low Fat,0.111666665,Snack Foods,155.2998,OUT045,2002,,Tier 2,Supermarket Type1,1230.3984 +NCS30,5.945,Low Fat,0.093026207,Household,128.7652,OUT046,1997,Small,Tier 1,Supermarket Type1,516.6608 +FDK14,6.98,Low Fat,0.041189152,Canned,82.8934,OUT045,2002,,Tier 2,Supermarket Type1,818.934 +DRJ35,10.1,Low Fat,0.046584552,Hard Drinks,61.2878,OUT046,1997,Small,Tier 1,Supermarket Type1,1272.3438 +FDX19,19.1,Low Fat,0.097280981,Fruits and Vegetables,232.6958,OUT017,2007,,Tier 2,Supermarket Type1,5375.0034 +FDX60,14.35,Low Fat,0.080922439,Baking Goods,80.096,OUT018,2009,Medium,Tier 3,Supermarket Type2,1278.336 +FDS01,11.6,Low Fat,0.017780986,Canned,177.3686,OUT045,2002,,Tier 2,Supermarket Type1,1777.686 +NCT41,15.7,Low Fat,0.055979703,Health and Hygiene,151.9024,OUT035,2004,Small,Tier 2,Supermarket Type1,1062.6168 +DRE27,11.85,Low Fat,0.132645493,Dairy,96.9726,OUT035,2004,Small,Tier 2,Supermarket Type1,1174.4712 +FDY45,17.5,Low Fat,0.026182758,Snack Foods,253.6356,OUT049,1999,Medium,Tier 1,Supermarket Type1,5086.712 +FDB56,,Regular,0,Fruits and Vegetables,188.2556,OUT027,1985,Medium,Tier 3,Supermarket Type3,4693.89 +FDS36,8.38,Regular,0.04688734,Baking Goods,107.957,OUT046,1997,Small,Tier 1,Supermarket Type1,2966.139 +FDF59,12.5,Low Fat,0.071354774,Starchy Foods,125.702,OUT049,1999,Medium,Tier 1,Supermarket Type1,2530.04 +FDD11,12.85,LF,0,Starchy Foods,254.704,OUT035,2004,Small,Tier 2,Supermarket Type1,2530.04 +FDY40,15.5,Regular,0.086320509,Frozen Foods,48.1692,OUT017,2007,,Tier 2,Supermarket Type1,985.384 +FDA13,,Low Fat,0.137539574,Canned,38.8506,OUT019,1985,Small,Tier 1,Grocery Store,37.9506 +NCX42,,Low Fat,0.010467749,Household,162.9526,OUT019,1985,Small,Tier 1,Grocery Store,822.263 +FDJ46,11.1,Low Fat,0.044814962,Snack Foods,174.4054,OUT035,2004,Small,Tier 2,Supermarket Type1,4027.4242 +FDH05,14.35,Regular,0.090913642,Frozen Foods,231.2984,OUT046,1997,Small,Tier 1,Supermarket Type1,3243.7776 +NCP50,17.35,Low Fat,0.020559846,Others,78.7618,OUT046,1997,Small,Tier 1,Supermarket Type1,1288.9888 +FDF28,,Regular,0.037681359,Frozen Foods,125.1046,OUT027,1985,Medium,Tier 3,Supermarket Type3,3859.6426 +FDN60,15.1,Low Fat,0.095545715,Baking Goods,157.3604,OUT018,2009,Medium,Tier 3,Supermarket Type2,4436.8912 +FDD29,12.15,Low Fat,0.018395194,Frozen Foods,251.6698,OUT013,1987,High,Tier 3,Supermarket Type1,6088.0752 +FDG58,10.695,Regular,0.087272074,Snack Foods,153.7972,OUT017,2007,,Tier 2,Supermarket Type1,2025.3636 +FDV15,,Low Fat,0.145464606,Meat,105.7648,OUT027,1985,Medium,Tier 3,Supermarket Type3,2596.62 +FDV04,7.825,Regular,0.149890395,Frozen Foods,159.0288,OUT013,1987,High,Tier 3,Supermarket Type1,1257.0304 +DRJ23,18.35,Low Fat,0.041634206,Hard Drinks,188.1872,OUT013,1987,High,Tier 3,Supermarket Type1,3781.744 +FDA11,,low fat,0.043029436,Baking Goods,94.7436,OUT027,1985,Medium,Tier 3,Supermarket Type3,1701.7848 +FDX16,17.85,Low Fat,0.06594351,Frozen Foods,149.105,OUT045,2002,,Tier 2,Supermarket Type1,4643.955 +NCA41,16.75,Low Fat,0.032637373,Health and Hygiene,191.6162,OUT049,1999,Medium,Tier 1,Supermarket Type1,3463.4916 +FDP36,10.395,Regular,0.091096531,Baking Goods,52.3008,OUT013,1987,High,Tier 3,Supermarket Type1,2226.4352 +FDK16,9.065,Low Fat,0.115307979,Frozen Foods,97.0094,OUT035,2004,Small,Tier 2,Supermarket Type1,856.8846 +FDD34,7.945,Low Fat,0.015873285,Snack Foods,161.321,OUT035,2004,Small,Tier 2,Supermarket Type1,2773.057 +FDI56,7.325,Low Fat,0.156307983,Fruits and Vegetables,92.2146,OUT010,1998,,Tier 3,Grocery Store,91.2146 +NCO18,13.15,Low Fat,0.024790707,Household,177.5686,OUT017,2007,,Tier 2,Supermarket Type1,3910.9092 +FDB46,10.5,Regular,0.093746136,Snack Foods,211.9244,OUT035,2004,Small,Tier 2,Supermarket Type1,4869.6612 +FDN38,6.615,Regular,0.092158377,Canned,251.1408,OUT045,2002,,Tier 2,Supermarket Type1,3254.4304 +FDW47,15,Low Fat,0.046469277,Breads,123.8414,OUT045,2002,,Tier 2,Supermarket Type1,1340.2554 +FDQ08,,Regular,0.033144603,Fruits and Vegetables,62.7536,OUT019,1985,Small,Tier 1,Grocery Store,61.2536 +FDR44,6.11,Regular,0.102901425,Fruits and Vegetables,128.4968,OUT035,2004,Small,Tier 2,Supermarket Type1,1435.4648 +DRH23,14.65,Low Fat,0.170663661,Hard Drinks,56.4614,OUT045,2002,,Tier 2,Supermarket Type1,1436.7964 +FDX01,10.1,Low Fat,0.024213342,Canned,116.715,OUT045,2002,,Tier 2,Supermarket Type1,1281.665 +FDB05,,Low Fat,0.08279545,Frozen Foods,245.8776,OUT027,1985,Medium,Tier 3,Supermarket Type3,4705.8744 +FDR08,18.7,Low Fat,0.037622954,Fruits and Vegetables,110.7886,OUT046,1997,Small,Tier 1,Supermarket Type1,1334.2632 +FDZ36,6.035,Regular,0.066155883,Baking Goods,184.424,OUT017,2007,,Tier 2,Supermarket Type1,4660.6 +FDI05,8.35,Regular,0.126869718,Frozen Foods,74.4354,OUT046,1997,Small,Tier 1,Supermarket Type1,1128.531 +FDF24,15.5,Regular,0.025409912,Baking Goods,83.2934,OUT049,1999,Medium,Tier 1,Supermarket Type1,1883.5482 +FDZ48,17.75,Low Fat,0.076389281,Baking Goods,111.1544,OUT017,2007,,Tier 2,Supermarket Type1,1118.544 +DRL37,,Low Fat,0.053113721,Soft Drinks,44.377,OUT027,1985,Medium,Tier 3,Supermarket Type3,1211.756 +FDM10,18.25,Low Fat,0.07595723,Snack Foods,214.1218,OUT035,2004,Small,Tier 2,Supermarket Type1,1282.3308 +FDP11,,Low Fat,0.120986139,Breads,216.1166,OUT019,1985,Small,Tier 1,Grocery Store,435.4332 +FDQ04,6.4,Low Fat,0.084885375,Frozen Foods,39.2796,OUT049,1999,Medium,Tier 1,Supermarket Type1,701.7532 +FDR49,8.71,Low Fat,0.139795569,Canned,47.2376,OUT018,2009,Medium,Tier 3,Supermarket Type2,910.8144 +FDD35,,Low Fat,0.02573918,Starchy Foods,120.744,OUT027,1985,Medium,Tier 3,Supermarket Type3,3954.852 +FDH41,,LF,0.143591586,Frozen Foods,213.5534,OUT019,1985,Small,Tier 1,Grocery Store,430.1068 +FDO34,17.7,Low Fat,0.029999653,Snack Foods,169.7816,OUT045,2002,,Tier 2,Supermarket Type1,2013.3792 +FDL45,15.6,Low Fat,0.037901015,Snack Foods,124.1704,OUT017,2007,,Tier 2,Supermarket Type1,1877.556 +NCC19,6.57,Low Fat,0.096799953,Household,192.382,OUT013,1987,High,Tier 3,Supermarket Type1,4247.804 +FDY10,,Low Fat,0.048830264,Snack Foods,113.1176,OUT027,1985,Medium,Tier 3,Supermarket Type3,2404.8696 +NCV29,11.8,Low Fat,0.022879017,Health and Hygiene,176.0686,OUT049,1999,Medium,Tier 1,Supermarket Type1,533.3058 +FDC22,6.89,Regular,0.136314863,Snack Foods,195.082,OUT013,1987,High,Tier 3,Supermarket Type1,2703.148 +NCP42,8.51,Low Fat,0.016143389,Household,194.2478,OUT045,2002,,Tier 2,Supermarket Type1,2324.9736 +NCX17,21.25,Low Fat,0.114246019,Health and Hygiene,231.23,OUT017,2007,,Tier 2,Supermarket Type1,3029.39 +NCO26,7.235,Low Fat,0.076975118,Household,116.6492,OUT049,1999,Medium,Tier 1,Supermarket Type1,2664.5316 +FDU45,,Regular,0.06216667,Snack Foods,112.3518,OUT019,1985,Small,Tier 1,Grocery Store,683.1108 +FDR34,17,Regular,0.01599013,Snack Foods,228.8352,OUT049,1999,Medium,Tier 1,Supermarket Type1,4351.6688 +FDV35,19.5,Low Fat,0.128728258,Breads,155.3314,OUT018,2009,Medium,Tier 3,Supermarket Type2,3412.8908 +FDS55,,Low Fat,0.080771137,Fruits and Vegetables,146.4734,OUT027,1985,Medium,Tier 3,Supermarket Type3,4157.2552 +FDS28,8.18,Regular,0.082568705,Frozen Foods,56.1588,OUT045,2002,,Tier 2,Supermarket Type1,458.0704 +FDK15,10.8,Low Fat,0.098395216,Meat,100.8042,OUT035,2004,Small,Tier 2,Supermarket Type1,1488.063 +NCP17,19.35,Low Fat,0.027714371,Health and Hygiene,65.6168,OUT046,1997,Small,Tier 1,Supermarket Type1,830.9184 +NCE42,21.1,low fat,0,Household,233.2958,OUT018,2009,Medium,Tier 3,Supermarket Type2,2103.2622 +FDA14,16.1,Low Fat,0.06528457,Dairy,145.076,OUT049,1999,Medium,Tier 1,Supermarket Type1,1904.188 +FDF57,,Regular,0.102999154,Fruits and Vegetables,169.9448,OUT019,1985,Small,Tier 1,Grocery Store,170.4448 +NCV54,,Low Fat,0.057969482,Household,119.3124,OUT019,1985,Small,Tier 1,Grocery Store,474.0496 +FDR10,17.6,Low Fat,0.016804724,Snack Foods,163.4552,OUT010,1998,,Tier 3,Grocery Store,649.8208 +FDT58,9,Low Fat,0.086440911,Snack Foods,167.0816,OUT017,2007,,Tier 2,Supermarket Type1,1342.2528 +FDC34,,Regular,0.302478871,Snack Foods,155.4972,OUT019,1985,Small,Tier 1,Grocery Store,311.5944 +FDU44,12.15,Regular,0.058663727,Fruits and Vegetables,164.1552,OUT018,2009,Medium,Tier 3,Supermarket Type2,3249.104 +FDY08,9.395,Regular,0.286344848,Fruits and Vegetables,139.1838,OUT010,1998,,Tier 3,Grocery Store,280.9676 +FDK20,,Regular,0.072762086,Fruits and Vegetables,120.9072,OUT019,1985,Small,Tier 1,Grocery Store,122.5072 +FDV50,14.3,Low Fat,0.123264522,Dairy,123.273,OUT017,2007,,Tier 2,Supermarket Type1,1108.557 +FDO25,6.3,Low Fat,0.127647181,Canned,207.927,OUT049,1999,Medium,Tier 1,Supermarket Type1,2097.27 +FDR14,,Low Fat,0.173206192,Dairy,53.3298,OUT027,1985,Medium,Tier 3,Supermarket Type3,1078.596 +FDP27,8.155,Low Fat,0.119937231,Meat,189.153,OUT018,2009,Medium,Tier 3,Supermarket Type2,2087.283 +FDB27,7.575,Low Fat,0.055379648,Dairy,198.1768,OUT035,2004,Small,Tier 2,Supermarket Type1,5321.0736 +FDW26,11.8,Regular,0.107223632,Dairy,223.5772,OUT049,1999,Medium,Tier 1,Supermarket Type1,2668.5264 +NCQ50,18.75,Low Fat,0,Household,213.3218,OUT035,2004,Small,Tier 2,Supermarket Type1,3419.5488 +NCL55,12.15,Low Fat,0.06464846,Others,253.404,OUT035,2004,Small,Tier 2,Supermarket Type1,4807.076 +FDG28,9.285,Regular,0.049280292,Frozen Foods,245.6144,OUT046,1997,Small,Tier 1,Supermarket Type1,3920.2304 +FDO31,,Regular,0.028842332,Fruits and Vegetables,81.496,OUT027,1985,Medium,Tier 3,Supermarket Type3,1997.4 +FDP27,,Low Fat,0.118872194,Meat,188.353,OUT027,1985,Medium,Tier 3,Supermarket Type3,5313.084 +FDR01,5.405,Regular,0.053924587,Canned,198.2742,OUT017,2007,,Tier 2,Supermarket Type1,4379.6324 +FDI08,18.2,Regular,0.066297055,Fruits and Vegetables,247.1092,OUT046,1997,Small,Tier 1,Supermarket Type1,2241.0828 +DRE03,19.6,Low Fat,0.024264569,Dairy,46.5718,OUT049,1999,Medium,Tier 1,Supermarket Type1,1607.2412 +FDV26,20.25,Regular,0.076470697,Dairy,196.1794,OUT018,2009,Medium,Tier 3,Supermarket Type2,2731.1116 +DRM49,6.11,Regular,0.151827552,Soft Drinks,43.0086,OUT013,1987,High,Tier 3,Supermarket Type1,490.6946 +FDI15,13.8,Low Fat,0.141325834,Dairy,265.0884,OUT035,2004,Small,Tier 2,Supermarket Type1,8479.6288 +FDM15,11.8,Regular,0.057538034,Meat,149.8366,OUT045,2002,,Tier 2,Supermarket Type1,1662.5026 +FDH47,13.5,Regular,0.128791854,Starchy Foods,95.4068,OUT035,2004,Small,Tier 2,Supermarket Type1,1944.136 +NCT54,8.695,Low Fat,0.119436131,Household,94.7094,OUT013,1987,High,Tier 3,Supermarket Type1,1047.3034 +DRN11,7.85,Low Fat,0.163310805,Hard Drinks,143.5444,OUT045,2002,,Tier 2,Supermarket Type1,3628.61 +FDU10,10.1,Regular,0.045878153,Snack Foods,38.5848,OUT018,2009,Medium,Tier 3,Supermarket Type2,484.7024 +FDU50,5.75,Regular,0.075322658,Dairy,116.3176,OUT045,2002,,Tier 2,Supermarket Type1,2519.3872 +FDS26,20.35,Low Fat,0.149753132,Dairy,259.7594,OUT010,1998,,Tier 3,Grocery Store,784.9782 +FDC14,14.5,Regular,0,Canned,41.0454,OUT018,2009,Medium,Tier 3,Supermarket Type2,545.2902 +FDB17,,Low Fat,0.036494521,Frozen Foods,179.0976,OUT027,1985,Medium,Tier 3,Supermarket Type3,5976.2208 +DRD25,6.135,Low Fat,0.132183029,Soft Drinks,115.086,OUT010,1998,,Tier 3,Grocery Store,452.744 +DRI39,,Low Fat,0.096592065,Dairy,54.893,OUT027,1985,Medium,Tier 3,Supermarket Type3,3112.615 +NCQ06,13,Low Fat,0.04188955,Household,255.9014,OUT049,1999,Medium,Tier 1,Supermarket Type1,3315.0182 +FDX11,16,Regular,0.106663245,Baking Goods,179.7634,OUT013,1987,High,Tier 3,Supermarket Type1,4180.5582 +NCT29,,Low Fat,0.112249603,Health and Hygiene,123.3414,OUT019,1985,Small,Tier 1,Grocery Store,243.6828 +FDS07,12.35,Low Fat,0.100322104,Fruits and Vegetables,113.7518,OUT017,2007,,Tier 2,Supermarket Type1,2049.3324 +NCQ05,11.395,LF,0.021602001,Health and Hygiene,149.1708,OUT035,2004,Small,Tier 2,Supermarket Type1,2708.4744 +FDC35,7.435,Low Fat,0.123338082,Starchy Foods,206.1638,OUT018,2009,Medium,Tier 3,Supermarket Type2,1656.5104 +FDU47,12.8,Regular,0.114085368,Breads,141.3838,OUT045,2002,,Tier 2,Supermarket Type1,2388.2246 +FDE22,9.695,Low Fat,0.049498821,Snack Foods,158.792,OUT010,1998,,Tier 3,Grocery Store,319.584 +FDA03,18.5,Regular,0.045425939,Dairy,144.9102,OUT013,1987,High,Tier 3,Supermarket Type1,1895.5326 +FDY26,20.6,Regular,0.051068365,Dairy,213.0244,OUT010,1998,,Tier 3,Grocery Store,423.4488 +FDZ26,11.6,Regular,0.144241314,Dairy,239.4222,OUT049,1999,Medium,Tier 1,Supermarket Type1,3346.3108 +FDQ24,15.7,Low Fat,0.073605395,Baking Goods,249.6724,OUT013,1987,High,Tier 3,Supermarket Type1,6543.4824 +FDT14,10.695,Regular,0.12770295,Dairy,120.444,OUT035,2004,Small,Tier 2,Supermarket Type1,2516.724 +FDX04,19.6,Regular,0.041655865,Frozen Foods,48.5376,OUT045,2002,,Tier 2,Supermarket Type1,335.5632 +FDC48,9.195,Low Fat,0.015859294,Baking Goods,84.5592,OUT046,1997,Small,Tier 1,Supermarket Type1,2559.3352 +FDC56,7.72,Low Fat,0.121497742,Fruits and Vegetables,119.744,OUT035,2004,Small,Tier 2,Supermarket Type1,3355.632 +FDU19,8.77,Regular,0.046844194,Fruits and Vegetables,174.2422,OUT049,1999,Medium,Tier 1,Supermarket Type1,1379.5376 +FDT55,13.6,Regular,0,Fruits and Vegetables,156.4946,OUT049,1999,Medium,Tier 1,Supermarket Type1,2998.0974 +FDA45,21.25,Low Fat,0.155250377,Snack Foods,175.737,OUT013,1987,High,Tier 3,Supermarket Type1,2117.244 +FDR51,9.035,Regular,0.174450933,Meat,151.0708,OUT017,2007,,Tier 2,Supermarket Type1,2708.4744 +FDF56,16.7,reg,0.199955274,Fruits and Vegetables,182.3976,OUT010,1998,,Tier 3,Grocery Store,724.3904 +FDK45,11.65,Low Fat,0.033830011,Seafood,111.686,OUT013,1987,High,Tier 3,Supermarket Type1,1584.604 +DRN37,9.6,Low Fat,0.096217262,Soft Drinks,168.5158,OUT013,1987,High,Tier 3,Supermarket Type1,3342.316 +NCN26,10.85,LF,0.028674471,Household,115.1808,OUT035,2004,Small,Tier 2,Supermarket Type1,3866.9664 +FDA19,7.52,Low Fat,0.055213208,Fruits and Vegetables,129.5994,OUT049,1999,Medium,Tier 1,Supermarket Type1,642.497 +NCR06,12.5,Low Fat,0.00676387,Household,40.8112,OUT035,2004,Small,Tier 2,Supermarket Type1,553.9456 +FDJ48,11.3,Low Fat,0.094460314,Baking Goods,245.3118,OUT010,1998,,Tier 3,Grocery Store,247.0118 +NCA05,20.75,Low Fat,0.025130632,Health and Hygiene,150.0734,OUT046,1997,Small,Tier 1,Supermarket Type1,2524.0478 +FDP04,15.35,Low Fat,0.013812772,Frozen Foods,64.7168,OUT046,1997,Small,Tier 1,Supermarket Type1,1022.6688 +FDA47,10.5,Regular,0.116673795,Baking Goods,161.721,OUT046,1997,Small,Tier 1,Supermarket Type1,3588.662 +FDI09,20.75,Regular,0,Seafood,239.988,OUT045,2002,,Tier 2,Supermarket Type1,2636.568 +FDU24,,Regular,0.245407386,Baking Goods,92.812,OUT019,1985,Small,Tier 1,Grocery Store,93.212 +FDI36,12.5,Regular,0.062597392,Baking Goods,196.9426,OUT018,2009,Medium,Tier 3,Supermarket Type2,5339.0502 +FDC11,20.5,Low Fat,0.141674844,Starchy Foods,90.7172,OUT013,1987,High,Tier 3,Supermarket Type1,1605.9096 +FDY38,13.6,Regular,0.119361718,Dairy,231.63,OUT049,1999,Medium,Tier 1,Supermarket Type1,2563.33 +FDF56,,Regular,0.118883724,Fruits and Vegetables,180.3976,OUT027,1985,Medium,Tier 3,Supermarket Type3,7425.0016 +FDB44,,Low Fat,0.016876708,Fruits and Vegetables,210.0586,OUT027,1985,Medium,Tier 3,Supermarket Type3,6964.9338 +FDI15,13.8,Low Fat,0.141352562,Dairy,264.1884,OUT046,1997,Small,Tier 1,Supermarket Type1,3179.8608 +FDY59,8.195,Low Fat,0.031397503,Baking Goods,91.3462,OUT035,2004,Small,Tier 2,Supermarket Type1,1388.193 +FDX34,6.195,Low Fat,0.072278769,Snack Foods,120.6098,OUT018,2009,Medium,Tier 3,Supermarket Type2,1807.647 +FDC52,,Regular,0.014497036,Dairy,150.8708,OUT019,1985,Small,Tier 1,Grocery Store,150.4708 +NCW29,14,Low Fat,0.028838938,Health and Hygiene,129.331,OUT013,1987,High,Tier 3,Supermarket Type1,259.662 +FDS40,,Low Fat,0.013951504,Frozen Foods,36.719,OUT027,1985,Medium,Tier 3,Supermarket Type3,622.523 +FDI40,11.5,Regular,0.126114605,Frozen Foods,99.3358,OUT018,2009,Medium,Tier 3,Supermarket Type2,804.2864 +FDN48,13.35,Low Fat,0.064938448,Baking Goods,90.0804,OUT035,2004,Small,Tier 2,Supermarket Type1,1561.9668 +FDN46,7.21,Regular,0.144511119,Snack Foods,100.5332,OUT013,1987,High,Tier 3,Supermarket Type1,2460.7968 +FDB41,19,Regular,0.097294728,Frozen Foods,47.7718,OUT035,2004,Small,Tier 2,Supermarket Type1,1039.9796 +FDT55,13.6,Regular,0.043646901,Fruits and Vegetables,155.7946,OUT035,2004,Small,Tier 2,Supermarket Type1,3471.4812 +FDI22,,Low Fat,0.095746519,Snack Foods,208.6612,OUT027,1985,Medium,Tier 3,Supermarket Type3,7317.142 +FDY16,18.35,Regular,0.092413792,Frozen Foods,183.6266,OUT045,2002,,Tier 2,Supermarket Type1,1844.266 +FDN33,6.305,Regular,0.123307177,Snack Foods,93.5436,OUT049,1999,Medium,Tier 1,Supermarket Type1,283.6308 +FDT57,15.2,Low Fat,0.019031184,Snack Foods,235.5248,OUT035,2004,Small,Tier 2,Supermarket Type1,4740.496 +FDZ31,,Regular,0.112668963,Fruits and Vegetables,191.0504,OUT027,1985,Medium,Tier 3,Supermarket Type3,5752.512 +DRM48,15.2,Low Fat,0.113072194,Soft Drinks,35.8848,OUT049,1999,Medium,Tier 1,Supermarket Type1,596.5568 +NCL19,15.35,Low Fat,0.015708023,Others,143.447,OUT045,2002,,Tier 2,Supermarket Type1,2576.646 +FDG50,7.405,Low Fat,0.015259084,Canned,91.0146,OUT013,1987,High,Tier 3,Supermarket Type1,729.7168 +DRH25,18.7,Low Fat,0.014622625,Soft Drinks,52.0324,OUT045,2002,,Tier 2,Supermarket Type1,1090.5804 +FDB37,,Regular,0.022829734,Baking Goods,241.0538,OUT027,1985,Medium,Tier 3,Supermarket Type3,4566.7222 +FDW59,13.15,Low Fat,0.020833091,Breads,86.5566,OUT017,2007,,Tier 2,Supermarket Type1,1860.2452 +NCR30,20.6,Low Fat,0.071103348,Household,75.4696,OUT049,1999,Medium,Tier 1,Supermarket Type1,1416.8224 +FDY22,16.5,Regular,0.159720671,Snack Foods,144.5128,OUT046,1997,Small,Tier 1,Supermarket Type1,3595.32 +FDB45,,Low Fat,0.037345714,Fruits and Vegetables,106.5306,OUT019,1985,Small,Tier 1,Grocery Store,104.5306 +FDC08,,Regular,0.102949031,Fruits and Vegetables,225.272,OUT027,1985,Medium,Tier 3,Supermarket Type3,4753.812 +NCK53,11.6,Low Fat,0.062903297,Health and Hygiene,100.4042,OUT010,1998,,Tier 3,Grocery Store,595.2252 +FDM27,12.35,Regular,0.158715731,Meat,157.2946,OUT049,1999,Medium,Tier 1,Supermarket Type1,1577.946 +FDG17,6.865,Regular,0.03598621,Frozen Foods,244.1486,OUT018,2009,Medium,Tier 3,Supermarket Type2,2687.8346 +NCT17,10.8,Low Fat,0.042102658,Health and Hygiene,189.7214,OUT017,2007,,Tier 2,Supermarket Type1,1695.7926 +FDZ14,7.71,Regular,0.047857877,Dairy,119.7756,OUT017,2007,,Tier 2,Supermarket Type1,3029.39 +FDJ28,12.3,Low Fat,0.036590807,Frozen Foods,193.3162,OUT010,1998,,Tier 3,Grocery Store,192.4162 +FDV21,11.5,LF,0.171779865,Snack Foods,126.0704,OUT018,2009,Medium,Tier 3,Supermarket Type2,1627.2152 +DRD24,13.85,Low Fat,0.051544658,Soft Drinks,142.5154,OUT010,1998,,Tier 3,Grocery Store,141.8154 +DRF25,9,Low Fat,0.03898577,Soft Drinks,34.619,OUT049,1999,Medium,Tier 1,Supermarket Type1,732.38 +FDN22,18.85,Regular,0.138868769,Snack Foods,251.8724,OUT018,2009,Medium,Tier 3,Supermarket Type2,3271.7412 +FDV04,7.825,Regular,0.251094747,Frozen Foods,156.6288,OUT010,1998,,Tier 3,Grocery Store,628.5152 +FDL34,16,Low Fat,0.041112694,Snack Foods,139.9496,OUT018,2009,Medium,Tier 3,Supermarket Type2,3105.2912 +FDX58,13.15,Low Fat,0.043755405,Snack Foods,182.895,OUT035,2004,Small,Tier 2,Supermarket Type1,3112.615 +FDG12,6.635,Regular,0.006351876,Baking Goods,120.3098,OUT018,2009,Medium,Tier 3,Supermarket Type2,1446.1176 +NCL53,7.5,Low Fat,0.036308404,Health and Hygiene,175.4028,OUT045,2002,,Tier 2,Supermarket Type1,2833.6448 +FDV47,17.1,Low Fat,0.054428368,Breads,84.9566,OUT018,2009,Medium,Tier 3,Supermarket Type2,1014.6792 +FDA43,,Low Fat,0.064362554,Fruits and Vegetables,193.7794,OUT027,1985,Medium,Tier 3,Supermarket Type3,4876.985 +NCM17,7.93,Low Fat,0.071538243,Health and Hygiene,44.5086,OUT017,2007,,Tier 2,Supermarket Type1,1249.0408 +NCQ02,12.6,Low Fat,0.007468056,Household,186.9556,OUT049,1999,Medium,Tier 1,Supermarket Type1,3379.6008 +FDN12,15.6,Low Fat,0.081562686,Baking Goods,112.7544,OUT017,2007,,Tier 2,Supermarket Type1,1118.544 +NCX06,,LF,0.02746599,Household,181.5976,OUT019,1985,Small,Tier 1,Grocery Store,543.2928 +FDE24,14.85,Low Fat,0.093652168,Baking Goods,141.5812,OUT045,2002,,Tier 2,Supermarket Type1,427.4436 +FDQ58,7.315,Low Fat,0.015364173,Snack Foods,154.334,OUT018,2009,Medium,Tier 3,Supermarket Type2,4287.752 +FDH31,12,Regular,0.020442889,Meat,98.0042,OUT049,1999,Medium,Tier 1,Supermarket Type1,1587.2672 +NCH55,16.35,Low Fat,0.034813556,Household,128.402,OUT018,2009,Medium,Tier 3,Supermarket Type2,1265.02 +NCC54,17.75,Low Fat,0.097862839,Health and Hygiene,239.3196,OUT049,1999,Medium,Tier 1,Supermarket Type1,3615.294 +NCT06,,Low Fat,0.067824456,Household,167.7842,OUT019,1985,Small,Tier 1,Grocery Store,165.7842 +FDH56,,Regular,0.11173569,Fruits and Vegetables,115.9492,OUT019,1985,Small,Tier 1,Grocery Store,115.8492 +FDY46,18.6,Low Fat,0.048160824,Snack Foods,188.9898,OUT017,2007,,Tier 2,Supermarket Type1,3554.7062 +NCM19,12.65,Low Fat,0.047197936,Others,114.1202,OUT013,1987,High,Tier 3,Supermarket Type1,3488.1262 +FDB04,,Regular,0.06292013,Dairy,88.9856,OUT027,1985,Medium,Tier 3,Supermarket Type3,3515.424 +FDB09,16.25,Low Fat,0.057385239,Fruits and Vegetables,126.2046,OUT035,2004,Small,Tier 2,Supermarket Type1,1369.5506 +FDK51,,Low Fat,0.005209791,Dairy,265.2884,OUT027,1985,Medium,Tier 3,Supermarket Type3,3179.8608 +FDB33,,Low Fat,0.025527994,Fruits and Vegetables,157.5262,OUT019,1985,Small,Tier 1,Grocery Store,477.3786 +FDU51,20.2,Regular,0.096495426,Meat,175.6028,OUT035,2004,Small,Tier 2,Supermarket Type1,3364.9532 +NCE30,,Low Fat,0.173574402,Household,214.0902,OUT019,1985,Small,Tier 1,Grocery Store,1061.951 +DRI13,15.35,Low Fat,0.020409765,Soft Drinks,218.3508,OUT018,2009,Medium,Tier 3,Supermarket Type2,2387.5588 +FDV32,7.785,LF,0.088888291,Fruits and Vegetables,64.751,OUT045,2002,,Tier 2,Supermarket Type1,1201.769 +DRH51,17.6,Low Fat,0.097367722,Dairy,89.3856,OUT049,1999,Medium,Tier 1,Supermarket Type1,878.856 +NCW18,15.1,Low Fat,0.059275452,Household,238.9248,OUT013,1987,High,Tier 3,Supermarket Type1,6636.6944 +FDI12,9.395,Regular,0.100555034,Baking Goods,88.8856,OUT049,1999,Medium,Tier 1,Supermarket Type1,439.428 +FDQ14,9.27,LF,0.061775607,Dairy,150.105,OUT035,2004,Small,Tier 2,Supermarket Type1,2696.49 +FDQ55,,Regular,0.012974937,Fruits and Vegetables,115.9834,OUT027,1985,Medium,Tier 3,Supermarket Type3,2994.7684 +FDG26,18.85,Low Fat,0.042614361,Canned,255.333,OUT013,1987,High,Tier 3,Supermarket Type1,1794.331 +NCW29,,Low Fat,0.050535312,Health and Hygiene,130.031,OUT019,1985,Small,Tier 1,Grocery Store,129.831 +FDK27,11,Low Fat,0.008944844,Meat,122.3756,OUT035,2004,Small,Tier 2,Supermarket Type1,2059.9852 +DRL49,13.15,Low Fat,0.056418354,Soft Drinks,142.4812,OUT035,2004,Small,Tier 2,Supermarket Type1,2422.1804 +FDK26,5.46,Regular,0.032227432,Canned,186.824,OUT049,1999,Medium,Tier 1,Supermarket Type1,1864.24 +FDT14,,Regular,0.127108578,Dairy,120.744,OUT027,1985,Medium,Tier 3,Supermarket Type3,2756.412 +FDW19,12.35,Regular,0.064441812,Fruits and Vegetables,110.957,OUT010,1998,,Tier 3,Grocery Store,219.714 +FDF22,6.865,Low Fat,0.057152139,Snack Foods,211.8218,OUT017,2007,,Tier 2,Supermarket Type1,4915.6014 +NCQ43,17.75,Low Fat,0.11147467,Others,108.0912,OUT049,1999,Medium,Tier 1,Supermarket Type1,1637.868 +NCA42,,Low Fat,0.028410335,Household,158.0604,OUT027,1985,Medium,Tier 3,Supermarket Type3,4595.3516 +FDG08,,Regular,0.289522833,Fruits and Vegetables,172.0764,OUT019,1985,Small,Tier 1,Grocery Store,171.7764 +NCP17,19.35,Low Fat,0,Health and Hygiene,65.3168,OUT010,1998,,Tier 3,Grocery Store,191.7504 +FDS19,13.8,Regular,0.064207277,Fruits and Vegetables,76.0012,OUT046,1997,Small,Tier 1,Supermarket Type1,1214.4192 +DRQ35,9.3,Low Fat,0.042463728,Hard Drinks,121.9388,OUT018,2009,Medium,Tier 3,Supermarket Type2,1114.5492 +FDR25,17,Regular,0.139521931,Canned,266.8884,OUT046,1997,Small,Tier 1,Supermarket Type1,5034.7796 +NCB43,20.2,Low Fat,0,Household,187.1898,OUT013,1987,High,Tier 3,Supermarket Type1,2993.4368 +FDQ28,14,Regular,0.060768862,Frozen Foods,154.8656,OUT017,2007,,Tier 2,Supermarket Type1,1390.1904 +FDK24,9.195,Low Fat,0.101294945,Baking Goods,46.2744,OUT046,1997,Small,Tier 1,Supermarket Type1,1086.5856 +NCN06,8.39,Low Fat,0.120474481,Household,165.5868,OUT035,2004,Small,Tier 2,Supermarket Type1,1965.4416 +FDS08,5.735,Low Fat,0.05695045,Fruits and Vegetables,177.937,OUT035,2004,Small,Tier 2,Supermarket Type1,1587.933 +FDP27,8.155,LF,0.119351235,Meat,190.153,OUT013,1987,High,Tier 3,Supermarket Type1,4933.578 +FDE11,17.7,Regular,0.226122963,Starchy Foods,185.7924,OUT010,1998,,Tier 3,Grocery Store,370.1848 +NCX30,16.7,Low Fat,0.026620627,Household,249.2776,OUT046,1997,Small,Tier 1,Supermarket Type1,4210.5192 +DRI51,17.25,Low Fat,0.042480566,Dairy,173.4764,OUT017,2007,,Tier 2,Supermarket Type1,2404.8696 +FDH31,,Regular,0,Meat,98.2042,OUT019,1985,Small,Tier 1,Grocery Store,198.4084 +FDR19,13.5,Regular,0.159720671,Fruits and Vegetables,147.6102,OUT046,1997,Small,Tier 1,Supermarket Type1,4082.6856 +FDJ04,18,Low Fat,0.124348482,Frozen Foods,118.3124,OUT013,1987,High,Tier 3,Supermarket Type1,948.0992 +FDP01,20.75,Regular,0.063684145,Breakfast,151.7682,OUT017,2007,,Tier 2,Supermarket Type1,1372.2138 +FDY35,17.6,Regular,0.016092971,Breads,45.8402,OUT018,2009,Medium,Tier 3,Supermarket Type2,1102.5648 +DRC36,13,Regular,0,Soft Drinks,173.6054,OUT013,1987,High,Tier 3,Supermarket Type1,1751.054 +FDZ55,6.055,Low Fat,0.025552424,Fruits and Vegetables,158.492,OUT017,2007,,Tier 2,Supermarket Type1,3994.8 +FDD11,12.85,Low Fat,0.030591255,Starchy Foods,251.404,OUT013,1987,High,Tier 3,Supermarket Type1,2277.036 +NCJ29,10.6,Low Fat,0.035336287,Health and Hygiene,87.0224,OUT018,2009,Medium,Tier 3,Supermarket Type2,1193.1136 +FDI52,18.7,Low Fat,0.104658344,Frozen Foods,121.2072,OUT035,2004,Small,Tier 2,Supermarket Type1,1470.0864 +NCF06,6.235,Low Fat,0.020198354,Household,257.9962,OUT046,1997,Small,Tier 1,Supermarket Type1,517.9924 +FDG16,15.25,Low Fat,0.089816808,Frozen Foods,217.3192,OUT046,1997,Small,Tier 1,Supermarket Type1,5608.6992 +FDX07,19.2,Regular,0.022954444,Fruits and Vegetables,184.495,OUT049,1999,Medium,Tier 1,Supermarket Type1,4028.09 +FDR14,11.65,Low Fat,0.174049032,Dairy,52.9298,OUT046,1997,Small,Tier 1,Supermarket Type1,647.1576 +FDV36,18.7,Low Fat,0.044024163,Baking Goods,125.902,OUT010,1998,,Tier 3,Grocery Store,126.502 +NCP14,8.275,Low Fat,0.110739031,Household,103.3306,OUT018,2009,Medium,Tier 3,Supermarket Type2,2404.2038 +FDJ12,8.895,Regular,0.039008625,Baking Goods,209.0296,OUT013,1987,High,Tier 3,Supermarket Type1,2285.0256 +FDL46,20.35,Low Fat,0.054277132,Snack Foods,117.3466,OUT018,2009,Medium,Tier 3,Supermarket Type2,824.9262 +FDL21,15.85,Regular,0.007160908,Snack Foods,39.348,OUT045,2002,,Tier 2,Supermarket Type1,719.064 +NCA30,19,Low Fat,0.129226104,Household,190.5872,OUT013,1987,High,Tier 3,Supermarket Type1,1890.872 +NCN26,10.85,Low Fat,0,Household,119.0808,OUT013,1987,High,Tier 3,Supermarket Type1,2343.616 +FDJ10,5.095,Regular,0.129479176,Snack Foods,139.7838,OUT035,2004,Small,Tier 2,Supermarket Type1,1264.3542 +NCE18,10,Low Fat,0.021512619,Household,247.775,OUT018,2009,Medium,Tier 3,Supermarket Type2,3745.125 +FDW21,5.34,Regular,0.005958918,Snack Foods,101.6358,OUT013,1987,High,Tier 3,Supermarket Type1,1709.1086 +FDA55,17.2,Regular,0.056941603,Fruits and Vegetables,222.5088,OUT013,1987,High,Tier 3,Supermarket Type1,5369.0112 +NCX30,,Low Fat,0.026491715,Household,247.2776,OUT027,1985,Medium,Tier 3,Supermarket Type3,6191.94 +FDA20,,Low Fat,0.066298469,Fruits and Vegetables,186.824,OUT027,1985,Medium,Tier 3,Supermarket Type3,6338.416 +FDT20,10.5,Low Fat,0.041360997,Fruits and Vegetables,39.5164,OUT013,1987,High,Tier 3,Supermarket Type1,926.7936 +FDR11,10.5,Regular,0.142759833,Breads,159.3578,OUT049,1999,Medium,Tier 1,Supermarket Type1,3048.6982 +FDU26,16.7,Regular,0.042792568,Dairy,118.6782,OUT018,2009,Medium,Tier 3,Supermarket Type2,1549.3166 +NCY54,8.43,Low Fat,0.177694846,Household,171.1422,OUT046,1997,Small,Tier 1,Supermarket Type1,2586.633 +FDP26,7.785,Low Fat,0.139552827,Dairy,105.6306,OUT046,1997,Small,Tier 1,Supermarket Type1,418.1224 +FDK58,11.35,Regular,0.045052492,Snack Foods,102.6016,OUT049,1999,Medium,Tier 1,Supermarket Type1,3137.2496 +NCK53,11.6,Low Fat,0.037581243,Health and Hygiene,98.9042,OUT046,1997,Small,Tier 1,Supermarket Type1,1488.063 +FDY52,6.365,Low Fat,0.007342171,Frozen Foods,59.9536,OUT013,1987,High,Tier 3,Supermarket Type1,980.0576 +NCU30,5.11,Low Fat,0.034945416,Household,161.121,OUT045,2002,,Tier 2,Supermarket Type1,2609.936 +NCA18,10.1,Low Fat,0.056030907,Household,115.1492,OUT013,1987,High,Tier 3,Supermarket Type1,1737.738 +FDX40,12.85,Low Fat,0.099553084,Frozen Foods,40.0164,OUT017,2007,,Tier 2,Supermarket Type1,1312.9576 +FDX13,7.725,Low Fat,0.047782959,Canned,249.1092,OUT046,1997,Small,Tier 1,Supermarket Type1,2490.092 +FDK36,,Low Fat,0.007180374,Baking Goods,47.4034,OUT027,1985,Medium,Tier 3,Supermarket Type3,631.8442 +NCP55,,low fat,0.019592289,Others,56.9614,OUT019,1985,Small,Tier 1,Grocery Store,221.0456 +FDO56,,Regular,0.078758649,Fruits and Vegetables,116.3808,OUT019,1985,Small,Tier 1,Grocery Store,234.3616 +NCT06,17.1,Low Fat,0,Household,167.0842,OUT018,2009,Medium,Tier 3,Supermarket Type2,1326.2736 +FDX45,,Low Fat,0.18358896,Snack Foods,154.663,OUT019,1985,Small,Tier 1,Grocery Store,312.926 +NCJ06,20.1,Low Fat,0.034623782,Household,118.9782,OUT013,1987,High,Tier 3,Supermarket Type1,1549.3166 +NCA41,16.75,Low Fat,0.032586709,Health and Hygiene,191.9162,OUT046,1997,Small,Tier 1,Supermarket Type1,4040.7402 +NCB42,,Low Fat,0.008519718,Health and Hygiene,116.9492,OUT027,1985,Medium,Tier 3,Supermarket Type3,2780.3808 +FDE29,8.905,Low Fat,0.143010016,Frozen Foods,61.6878,OUT013,1987,High,Tier 3,Supermarket Type1,1029.9926 +FDU24,6.78,Regular,0,Baking Goods,94.012,OUT013,1987,High,Tier 3,Supermarket Type1,1211.756 +FDM58,16.85,Regular,0.079624087,Snack Foods,111.6544,OUT013,1987,High,Tier 3,Supermarket Type1,2125.2336 +FDE44,14.65,Low Fat,0.17138805,Fruits and Vegetables,50.7692,OUT046,1997,Small,Tier 1,Supermarket Type1,1034.6532 +DRH39,20.7,Low Fat,0,Dairy,78.467,OUT046,1997,Small,Tier 1,Supermarket Type1,1607.907 +FDU33,,Regular,0.235859408,Snack Foods,46.1402,OUT019,1985,Small,Tier 1,Grocery Store,45.9402 +FDW08,12.1,Low Fat,0.148612263,Fruits and Vegetables,104.528,OUT049,1999,Medium,Tier 1,Supermarket Type1,1384.864 +NCT30,9.1,Low Fat,0.134393836,Household,48.0718,OUT010,1998,,Tier 3,Grocery Store,47.2718 +NCI54,15.2,Low Fat,0.033599041,Household,107.7912,OUT046,1997,Small,Tier 1,Supermarket Type1,1091.912 +FDS16,15.15,Regular,0.066311153,Frozen Foods,145.776,OUT045,2002,,Tier 2,Supermarket Type1,3954.852 +DRK39,,Low Fat,0.049623924,Dairy,83.225,OUT027,1985,Medium,Tier 3,Supermarket Type3,1498.05 +FDP24,20.6,Low Fat,0.13893181,Baking Goods,119.5756,OUT010,1998,,Tier 3,Grocery Store,121.1756 +NCG18,15.3,Low Fat,0,Household,103.5332,OUT035,2004,Small,Tier 2,Supermarket Type1,3383.5956 +DRI59,,Low Fat,0.040636926,Hard Drinks,224.6088,OUT027,1985,Medium,Tier 3,Supermarket Type3,4474.176 +NCO06,19.25,Low Fat,0.107940533,Household,35.5558,OUT013,1987,High,Tier 3,Supermarket Type1,305.6022 +FDR15,9.3,Regular,0.03362713,Meat,156.1314,OUT017,2007,,Tier 2,Supermarket Type1,620.5256 +FDE29,,Low Fat,0.142436015,Frozen Foods,62.3878,OUT027,1985,Medium,Tier 3,Supermarket Type3,1514.695 +FDN49,17.25,Regular,0.125200788,Breakfast,41.648,OUT035,2004,Small,Tier 2,Supermarket Type1,679.116 +FDQ21,21.25,low fat,0.019407069,Snack Foods,119.3756,OUT013,1987,High,Tier 3,Supermarket Type1,3271.7412 +FDE17,20.1,Regular,0.054445198,Frozen Foods,151.7366,OUT035,2004,Small,Tier 2,Supermarket Type1,4836.3712 +NCI42,18.75,Low Fat,0.01040777,Household,209.4954,OUT018,2009,Medium,Tier 3,Supermarket Type2,2500.7448 +FDZ21,17.6,Regular,0.039443715,Snack Foods,95.841,OUT017,2007,,Tier 2,Supermarket Type1,1641.197 +FDX48,17.75,Regular,0.038042233,Baking Goods,154.2656,OUT018,2009,Medium,Tier 3,Supermarket Type2,3398.2432 +FDH26,19.25,Regular,0.034770109,Canned,141.9496,OUT045,2002,,Tier 2,Supermarket Type1,988.0472 +FDD50,18.85,Low Fat,0.141862435,Canned,171.0132,OUT049,1999,Medium,Tier 1,Supermarket Type1,4396.9432 +FDL40,17.7,Low Fat,0.019438042,Frozen Foods,95.541,OUT010,1998,,Tier 3,Grocery Store,96.541 +NCO02,,Low Fat,0.073012871,Others,67.5142,OUT027,1985,Medium,Tier 3,Supermarket Type3,2306.997 +FDF05,17.5,Low Fat,0.026848529,Frozen Foods,264.891,OUT013,1987,High,Tier 3,Supermarket Type1,4996.829 +DRG25,10.5,Low Fat,0.019033838,Soft Drinks,185.624,OUT013,1987,High,Tier 3,Supermarket Type1,6897.688 +NCA41,16.75,Low Fat,0.032771033,Health and Hygiene,192.3162,OUT017,2007,,Tier 2,Supermarket Type1,2308.9944 +FDZ40,8.935,Low Fat,0.04026424,Frozen Foods,52.6298,OUT045,2002,,Tier 2,Supermarket Type1,808.947 +FDT15,,Regular,0.074729835,Meat,183.795,OUT019,1985,Small,Tier 1,Grocery Store,549.285 +FDP46,15.35,Low Fat,0.074601506,Snack Foods,90.983,OUT035,2004,Small,Tier 2,Supermarket Type1,1348.245 +DRG01,,Low Fat,0.078576075,Soft Drinks,78.467,OUT019,1985,Small,Tier 1,Grocery Store,229.701 +FDR23,15.85,Low Fat,0.081719458,Breads,178.037,OUT013,1987,High,Tier 3,Supermarket Type1,2646.555 +FDF09,6.215,Low Fat,0.012173543,Fruits and Vegetables,36.4848,OUT045,2002,,Tier 2,Supermarket Type1,447.4176 +FDK09,,Low Fat,0.091318935,Snack Foods,230.7352,OUT027,1985,Medium,Tier 3,Supermarket Type3,8474.3024 +DRJ11,9.5,Low Fat,0.085075063,Hard Drinks,189.0872,OUT035,2004,Small,Tier 2,Supermarket Type1,3970.8312 +FDI32,17.7,Low Fat,0.174644552,Fruits and Vegetables,113.2834,OUT049,1999,Medium,Tier 1,Supermarket Type1,1727.751 +NCG42,19.2,Low Fat,0.041395775,Household,129.731,OUT018,2009,Medium,Tier 3,Supermarket Type2,1298.31 +FDA51,8.05,Regular,0.164679597,Dairy,112.1518,OUT046,1997,Small,Tier 1,Supermarket Type1,1252.3698 +FDG57,14.7,Low Fat,0.121012632,Fruits and Vegetables,49.4034,OUT010,1998,,Tier 3,Grocery Store,194.4136 +FDG34,11.5,Regular,0.037563325,Snack Foods,109.5254,OUT035,2004,Small,Tier 2,Supermarket Type1,1627.881 +NCI43,19.85,Low Fat,0.026115595,Household,49.0376,OUT017,2007,,Tier 2,Supermarket Type1,143.8128 +NCY53,20,Low Fat,0.05848134,Health and Hygiene,113.3544,OUT046,1997,Small,Tier 1,Supermarket Type1,2572.6512 +FDC33,8.96,Regular,0.068880971,Fruits and Vegetables,195.3768,OUT013,1987,High,Tier 3,Supermarket Type1,2759.0752 +NCK29,5.615,Low Fat,0.125964559,Health and Hygiene,124.773,OUT049,1999,Medium,Tier 1,Supermarket Type1,2956.152 +FDS50,17,Low Fat,0.055746931,Dairy,220.0114,OUT017,2007,,Tier 2,Supermarket Type1,2217.114 +NCJ30,5.82,Low Fat,0.080804019,Household,171.479,OUT045,2002,,Tier 2,Supermarket Type1,4074.696 +FDQ07,,Regular,0.086983591,Fruits and Vegetables,219.8456,OUT027,1985,Medium,Tier 3,Supermarket Type3,1547.3192 +FDI20,19.1,Low Fat,0.064547828,Fruits and Vegetables,212.8586,OUT010,1998,,Tier 3,Grocery Store,422.1172 +NCM06,,Low Fat,0.075361182,Household,155.6656,OUT027,1985,Medium,Tier 3,Supermarket Type3,3243.7776 +FDL15,,Low Fat,0.081651443,Meat,152.5682,OUT019,1985,Small,Tier 1,Grocery Store,152.4682 +NCL29,9.695,Low Fat,0.190711254,Health and Hygiene,159.1604,OUT010,1998,,Tier 3,Grocery Store,633.8416 +FDB32,20.6,Low Fat,0.023585598,Fruits and Vegetables,94.7778,OUT017,2007,,Tier 2,Supermarket Type1,1314.2892 +FDJ16,9.195,Low Fat,0.115064263,Frozen Foods,58.6246,OUT049,1999,Medium,Tier 1,Supermarket Type1,868.869 +FDJ32,10.695,Low Fat,0.057909547,Fruits and Vegetables,60.4536,OUT045,2002,,Tier 2,Supermarket Type1,183.7608 +FDO12,15.75,Low Fat,0.054920146,Baking Goods,195.8452,OUT035,2004,Small,Tier 2,Supermarket Type1,4893.63 +NCB18,19.6,Low Fat,0.041291169,Household,86.9514,OUT046,1997,Small,Tier 1,Supermarket Type1,1416.8224 +FDO37,,Low Fat,0.021273161,Breakfast,229.1326,OUT027,1985,Medium,Tier 3,Supermarket Type3,7393.0432 +FDV13,17.35,Regular,0.02758789,Canned,86.1856,OUT013,1987,High,Tier 3,Supermarket Type1,703.0848 +FDF52,9.3,Low Fat,0.11178154,Frozen Foods,182.3292,OUT010,1998,,Tier 3,Grocery Store,182.4292 +FDY11,6.71,Regular,0.02960641,Baking Goods,65.4142,OUT049,1999,Medium,Tier 1,Supermarket Type1,1516.0266 +FDL20,17.1,Low Fat,0.129140919,Fruits and Vegetables,109.4886,OUT017,2007,,Tier 2,Supermarket Type1,1667.829 +FDS45,5.175,Regular,0.029555773,Snack Foods,105.9622,OUT045,2002,,Tier 2,Supermarket Type1,1693.7952 +DRJ13,12.65,Low Fat,0.063146492,Soft Drinks,159.6578,OUT018,2009,Medium,Tier 3,Supermarket Type2,962.7468 +FDR37,16.5,Regular,0.066352552,Breakfast,181.2292,OUT049,1999,Medium,Tier 1,Supermarket Type1,4195.8716 +FDS23,,Low Fat,0.246678647,Breads,129.7994,OUT019,1985,Small,Tier 1,Grocery Store,385.4982 +FDX13,7.725,Low Fat,0.047977607,Canned,249.5092,OUT018,2009,Medium,Tier 3,Supermarket Type2,2241.0828 +FDT49,7,Low Fat,0.151712642,Canned,104.828,OUT045,2002,,Tier 2,Supermarket Type1,1278.336 +FDY13,12.1,LF,0.030174246,Canned,76.667,OUT049,1999,Medium,Tier 1,Supermarket Type1,1531.34 +FDD47,7.6,Regular,0.238366442,Starchy Foods,171.8448,OUT010,1998,,Tier 3,Grocery Store,852.224 +FDF20,12.85,Low Fat,0.055603753,Fruits and Vegetables,195.6768,OUT010,1998,,Tier 3,Grocery Store,394.1536 +FDS32,17.75,Regular,0.029648306,Fruits and Vegetables,142.4838,OUT035,2004,Small,Tier 2,Supermarket Type1,1264.3542 +FDJ44,,Regular,0.105812357,Fruits and Vegetables,175.0396,OUT027,1985,Medium,Tier 3,Supermarket Type3,4012.1108 +NCY30,20.25,Low Fat,0.02593166,Household,182.5976,OUT013,1987,High,Tier 3,Supermarket Type1,3078.6592 +FDK33,,Low Fat,0.019671473,Snack Foods,214.756,OUT019,1985,Small,Tier 1,Grocery Store,213.056 +FDO31,6.76,Regular,0.028982682,Fruits and Vegetables,79.596,OUT046,1997,Small,Tier 1,Supermarket Type1,1438.128 +FDG10,,Regular,0.019153299,Snack Foods,57.6588,OUT019,1985,Small,Tier 1,Grocery Store,400.8116 +DRI49,14.15,Low Fat,0.184254826,Soft Drinks,82.4276,OUT018,2009,Medium,Tier 3,Supermarket Type2,1218.414 +NCA05,20.75,Low Fat,0.025169703,Health and Hygiene,150.4734,OUT049,1999,Medium,Tier 1,Supermarket Type1,1187.7872 +FDZ13,7.84,Regular,0.153494979,Canned,48.935,OUT046,1997,Small,Tier 1,Supermarket Type1,798.96 +DRI25,19.6,LF,0.034093203,Soft Drinks,56.6614,OUT017,2007,,Tier 2,Supermarket Type1,1492.0578 +NCA29,10.5,LF,0.045655118,Household,169.8106,OUT010,1998,,Tier 3,Grocery Store,171.1106 +FDX43,5.655,LF,0.142732848,Fruits and Vegetables,167.95,OUT010,1998,,Tier 3,Grocery Store,166.45 +FDZ08,12.5,Regular,0.110163385,Fruits and Vegetables,83.6592,OUT049,1999,Medium,Tier 1,Supermarket Type1,1320.9472 +FDC58,10.195,Low Fat,0.041934387,Snack Foods,44.6428,OUT035,2004,Small,Tier 2,Supermarket Type1,615.1992 +NCD54,,Low Fat,0.028868467,Household,146.3786,OUT027,1985,Medium,Tier 3,Supermarket Type3,5056.751 +FDM24,6.135,Regular,0.079312367,Baking Goods,151.7366,OUT035,2004,Small,Tier 2,Supermarket Type1,3325.0052 +FDS12,9.1,Low Fat,0.174085625,Baking Goods,124.6362,OUT035,2004,Small,Tier 2,Supermarket Type1,2390.8878 +NCN55,14.6,Low Fat,0.059732844,Others,241.2538,OUT018,2009,Medium,Tier 3,Supermarket Type2,5287.7836 +NCP06,20.7,Low Fat,0.039245805,Household,151.4366,OUT046,1997,Small,Tier 1,Supermarket Type1,1511.366 +FDB41,19,Regular,0.097510482,Frozen Foods,48.1718,OUT045,2002,,Tier 2,Supermarket Type1,709.077 +FDJ16,9.195,Low Fat,0.114885647,Frozen Foods,59.6246,OUT046,1997,Small,Tier 1,Supermarket Type1,1100.5674 +NCB18,,Low Fat,0.072295507,Household,89.7514,OUT019,1985,Small,Tier 1,Grocery Store,88.5514 +FDH38,6.425,Low Fat,0.010436256,Canned,115.5808,OUT035,2004,Small,Tier 2,Supermarket Type1,3749.7856 +FDE59,12.15,LF,0.104257037,Starchy Foods,34.0532,OUT010,1998,,Tier 3,Grocery Store,179.766 +NCF30,17,Low Fat,0.126440335,Household,125.2362,OUT049,1999,Medium,Tier 1,Supermarket Type1,1384.1982 +FDE35,,Regular,0,Starchy Foods,59.8904,OUT027,1985,Medium,Tier 3,Supermarket Type3,1757.712 +FDP49,,Regular,0.120965853,Breakfast,55.8614,OUT019,1985,Small,Tier 1,Grocery Store,110.5228 +NCQ05,,Low Fat,0,Health and Hygiene,152.0708,OUT027,1985,Medium,Tier 3,Supermarket Type3,2106.5912 +FDP49,9,Regular,0.069031467,Breakfast,55.0614,OUT013,1987,High,Tier 3,Supermarket Type1,442.0912 +FDT12,6.215,Regular,0.049823839,Baking Goods,226.6062,OUT018,2009,Medium,Tier 3,Supermarket Type2,677.1186 +NCM06,7.475,Low Fat,0.126752975,Household,154.2656,OUT010,1998,,Tier 3,Grocery Store,308.9312 +FDV23,11,LF,0.1062679,Breads,123.2046,OUT018,2009,Medium,Tier 3,Supermarket Type2,3237.1196 +FDA44,19.7,Low Fat,0.053305463,Fruits and Vegetables,58.193,OUT049,1999,Medium,Tier 1,Supermarket Type1,848.895 +DRD27,18.75,Low Fat,0.023820082,Dairy,97.6042,OUT013,1987,High,Tier 3,Supermarket Type1,1488.063 +NCK53,11.6,Low Fat,0.037549969,Health and Hygiene,101.2042,OUT013,1987,High,Tier 3,Supermarket Type1,2281.6966 +NCF19,13,Low Fat,0.03525175,Household,48.0034,OUT018,2009,Medium,Tier 3,Supermarket Type2,923.4646 +NCY18,7.285,Low Fat,0.031200065,Household,174.7054,OUT049,1999,Medium,Tier 1,Supermarket Type1,6303.7944 +FDN56,,Regular,0.106538757,Fruits and Vegetables,145.4786,OUT027,1985,Medium,Tier 3,Supermarket Type3,5779.144 +NCI55,18.6,Low Fat,0.012673238,Household,121.5414,OUT049,1999,Medium,Tier 1,Supermarket Type1,4020.7662 +FDB28,6.615,Low Fat,0.093307668,Dairy,195.9426,OUT013,1987,High,Tier 3,Supermarket Type1,2570.6538 +NCA18,10.1,Low Fat,0.056191301,Household,115.7492,OUT045,2002,,Tier 2,Supermarket Type1,579.246 +FDC46,17.7,Low Fat,0.116542484,Snack Foods,182.6266,OUT046,1997,Small,Tier 1,Supermarket Type1,3504.1054 +NCZ42,10.5,Low Fat,0.011285795,Household,235.8248,OUT035,2004,Small,Tier 2,Supermarket Type1,4266.4464 +DRA59,,Regular,0.127308434,Soft Drinks,186.6924,OUT027,1985,Medium,Tier 3,Supermarket Type3,7033.5112 +DRB25,12.3,Low Fat,0.069742672,Soft Drinks,106.2938,OUT018,2009,Medium,Tier 3,Supermarket Type2,1715.1008 +FDE24,,Low Fat,0.093010026,Baking Goods,143.0812,OUT027,1985,Medium,Tier 3,Supermarket Type3,3704.5112 +FDA57,18.85,Low Fat,0.03961061,Snack Foods,41.648,OUT013,1987,High,Tier 3,Supermarket Type1,759.012 +FDZ46,7.485,Low Fat,0.069514712,Snack Foods,108.7228,OUT017,2007,,Tier 2,Supermarket Type1,1326.2736 +FDX39,14.3,Regular,0.083147702,Meat,210.1586,OUT010,1998,,Tier 3,Grocery Store,422.1172 +FDW35,10.6,Low Fat,0.011106465,Breads,42.7454,OUT049,1999,Medium,Tier 1,Supermarket Type1,419.454 +FDZ55,,Low Fat,0.02528566,Fruits and Vegetables,158.792,OUT027,1985,Medium,Tier 3,Supermarket Type3,4474.176 +FDI04,13.65,Regular,0.072851756,Frozen Foods,197.1426,OUT013,1987,High,Tier 3,Supermarket Type1,3954.852 +FDU46,,Regular,0.011072421,Snack Foods,85.354,OUT027,1985,Medium,Tier 3,Supermarket Type3,2077.296 +FDE14,13.65,Regular,0.031494041,Canned,98.87,OUT049,1999,Medium,Tier 1,Supermarket Type1,2197.14 +FDX23,6.445,Low Fat,0.029667053,Baking Goods,94.4436,OUT013,1987,High,Tier 3,Supermarket Type1,1134.5232 +NCN18,8.895,Low Fat,0,Household,111.9544,OUT035,2004,Small,Tier 2,Supermarket Type1,1565.9616 +FDR02,16.7,Low Fat,0.022099982,Dairy,110.1886,OUT049,1999,Medium,Tier 1,Supermarket Type1,1334.2632 +FDH04,6.115,Regular,0.011372972,Frozen Foods,89.6488,OUT046,1997,Small,Tier 1,Supermarket Type1,1267.6832 +FDZ51,11.3,Regular,0.091310237,Meat,96.9094,OUT010,1998,,Tier 3,Grocery Store,190.4188 +FDR15,9.3,Regular,0.033437991,Meat,153.2314,OUT046,1997,Small,Tier 1,Supermarket Type1,2326.971 +NCQ30,7.725,Low Fat,0.029117482,Household,123.0414,OUT049,1999,Medium,Tier 1,Supermarket Type1,1583.9382 +FDW45,18,Low Fat,0.039071642,Snack Foods,145.3418,OUT049,1999,Medium,Tier 1,Supermarket Type1,882.8508 +FDQ52,17,Low Fat,0.119362409,Frozen Foods,249.4434,OUT035,2004,Small,Tier 2,Supermarket Type1,5960.2416 +FDM01,,Regular,0.094109236,Breakfast,102.9332,OUT027,1985,Medium,Tier 3,Supermarket Type3,3691.1952 +FDE21,12.8,Low Fat,0.02299122,Fruits and Vegetables,114.9492,OUT045,2002,,Tier 2,Supermarket Type1,1737.738 +FDH28,15.85,Regular,0.110010191,Frozen Foods,38.8506,OUT035,2004,Small,Tier 2,Supermarket Type1,341.5554 +FDQ56,6.59,Low Fat,0.176748258,Fruits and Vegetables,82.7908,OUT010,1998,,Tier 3,Grocery Store,83.8908 +DRM49,6.11,Regular,0,Soft Drinks,43.0086,OUT049,1999,Medium,Tier 1,Supermarket Type1,713.7376 +NCI29,,Low Fat,0.032463574,Health and Hygiene,139.9154,OUT027,1985,Medium,Tier 3,Supermarket Type3,4963.539 +FDW44,9.5,Regular,0.035222503,Fruits and Vegetables,170.1448,OUT045,2002,,Tier 2,Supermarket Type1,1874.8928 +FDR10,17.6,Low Fat,0.010055503,Snack Foods,163.7552,OUT049,1999,Medium,Tier 1,Supermarket Type1,1787.0072 +FDO60,20,Low Fat,0.034363029,Baking Goods,43.5086,OUT035,2004,Small,Tier 2,Supermarket Type1,401.4774 +FDG08,13.15,Regular,0,Fruits and Vegetables,171.9764,OUT017,2007,,Tier 2,Supermarket Type1,2404.8696 +FDP10,19,Low Fat,0.128349909,Snack Foods,106.5622,OUT045,2002,,Tier 2,Supermarket Type1,1482.0708 +FDG45,8.1,Low Fat,0.128760294,Fruits and Vegetables,213.7902,OUT017,2007,,Tier 2,Supermarket Type1,5946.9256 +DRM47,9.3,Low Fat,0.043964058,Hard Drinks,192.3846,OUT018,2009,Medium,Tier 3,Supermarket Type2,4586.0304 +FDO40,,Low Fat,0.032470108,Frozen Foods,148.9392,OUT027,1985,Medium,Tier 3,Supermarket Type3,3728.48 +DRE37,13.5,LF,0.094603404,Soft Drinks,187.0872,OUT018,2009,Medium,Tier 3,Supermarket Type2,3214.4824 +FDX13,7.725,Low Fat,0.047743195,Canned,248.3092,OUT013,1987,High,Tier 3,Supermarket Type1,6474.2392 +FDE21,,Low Fat,0,Fruits and Vegetables,115.3492,OUT027,1985,Medium,Tier 3,Supermarket Type3,3823.0236 +NCU53,5.485,Low Fat,0.071557769,Health and Hygiene,165.7842,OUT010,1998,,Tier 3,Grocery Store,165.7842 +NCH07,13.15,Low Fat,0.155105614,Household,157.2604,OUT010,1998,,Tier 3,Grocery Store,316.9208 +FDJ07,7.26,Low Fat,0.014505108,Meat,118.415,OUT017,2007,,Tier 2,Supermarket Type1,1747.725 +FDB46,10.5,Regular,0.093909644,Snack Foods,213.7244,OUT049,1999,Medium,Tier 1,Supermarket Type1,4022.7636 +DRL01,19.5,Regular,0.077157727,Soft Drinks,232.4958,OUT035,2004,Small,Tier 2,Supermarket Type1,2804.3496 +FDN57,,Low Fat,0.094957079,Snack Foods,143.5154,OUT019,1985,Small,Tier 1,Grocery Store,567.2616 +FDO38,,low fat,0.072486326,Canned,78.9986,OUT027,1985,Medium,Tier 3,Supermarket Type3,2259.0594 +FDA45,21.25,Low Fat,0.155694794,Snack Foods,177.637,OUT045,2002,,Tier 2,Supermarket Type1,2999.429 +FDP27,,Low Fat,0.20914265,Meat,190.953,OUT019,1985,Small,Tier 1,Grocery Store,379.506 +DRG36,14.15,Low Fat,0.095298849,Soft Drinks,171.8106,OUT013,1987,High,Tier 3,Supermarket Type1,3935.5438 +DRL47,19.7,Low Fat,0.038736781,Hard Drinks,127.4362,OUT046,1997,Small,Tier 1,Supermarket Type1,1510.0344 +NCA05,,Low Fat,0.044000492,Health and Hygiene,148.2734,OUT019,1985,Small,Tier 1,Grocery Store,296.9468 +FDL38,13.8,Regular,0.014720848,Canned,89.9172,OUT013,1987,High,Tier 3,Supermarket Type1,1516.6924 +FDC32,18.35,Low Fat,0.099090261,Fruits and Vegetables,94.0462,OUT035,2004,Small,Tier 2,Supermarket Type1,555.2772 +NCI06,11.3,Low Fat,0.047814463,Household,179.266,OUT045,2002,,Tier 2,Supermarket Type1,5033.448 +FDI05,8.35,Regular,0.127066966,Frozen Foods,76.5354,OUT049,1999,Medium,Tier 1,Supermarket Type1,1655.1788 +FDR52,12.65,Regular,0.076474728,Frozen Foods,191.8846,OUT017,2007,,Tier 2,Supermarket Type1,1146.5076 +FDU26,16.7,Regular,0.042860026,Dairy,120.3782,OUT017,2007,,Tier 2,Supermarket Type1,1668.4948 +FDG33,5.365,Regular,0.141033536,Seafood,173.6764,OUT017,2007,,Tier 2,Supermarket Type1,858.882 +FDE38,6.52,Low Fat,0.044607161,Canned,164.2842,OUT046,1997,Small,Tier 1,Supermarket Type1,2818.3314 +FDI35,14,Low Fat,0.041283361,Starchy Foods,182.4634,OUT035,2004,Small,Tier 2,Supermarket Type1,5452.902 +FDN23,6.575,Regular,0.075444922,Breads,146.0444,OUT013,1987,High,Tier 3,Supermarket Type1,2612.5992 +NCP54,15.35,Low Fat,0.035143024,Household,124.373,OUT035,2004,Small,Tier 2,Supermarket Type1,2093.941 +FDO39,6.985,Regular,0.13725257,Meat,183.7608,OUT013,1987,High,Tier 3,Supermarket Type1,2940.1728 +NCT17,10.8,LF,0.041831008,Health and Hygiene,186.6214,OUT013,1987,High,Tier 3,Supermarket Type1,2261.0568 +NCK30,14.85,Low Fat,0.060967038,Household,254.3698,OUT035,2004,Small,Tier 2,Supermarket Type1,4566.0564 +FDM24,,Regular,0.078943221,Baking Goods,152.7366,OUT027,1985,Medium,Tier 3,Supermarket Type3,1813.6392 +FDA35,14.85,Regular,0.053837561,Baking Goods,120.8072,OUT046,1997,Small,Tier 1,Supermarket Type1,4287.752 +NCM07,9.395,Low Fat,0.039928582,Others,83.2908,OUT013,1987,High,Tier 3,Supermarket Type1,1258.362 +FDD09,13.5,low fat,0.021617996,Fruits and Vegetables,179.6976,OUT017,2007,,Tier 2,Supermarket Type1,1810.976 +FDW07,18,Regular,0.143495952,Fruits and Vegetables,88.7514,OUT017,2007,,Tier 2,Supermarket Type1,1062.6168 +FDM27,,Regular,0.157701958,Meat,158.7946,OUT027,1985,Medium,Tier 3,Supermarket Type3,5522.811 +NCY53,20,Low Fat,0.058719568,Health and Hygiene,111.0544,OUT018,2009,Medium,Tier 3,Supermarket Type2,894.8352 +FDA10,20.35,Low Fat,0.142618182,Snack Foods,123.2072,OUT017,2007,,Tier 2,Supermarket Type1,1225.072 +DRB24,8.785,Low Fat,0.020573334,Soft Drinks,156.4656,OUT035,2004,Small,Tier 2,Supermarket Type1,2162.5184 +NCN53,,Low Fat,0.030208465,Health and Hygiene,35.4874,OUT027,1985,Medium,Tier 3,Supermarket Type3,1693.7952 +FDA31,7.1,Low Fat,0.110234793,Fruits and Vegetables,171.708,OUT045,2002,,Tier 2,Supermarket Type1,3115.944 +FDE24,14.85,Low Fat,0.093991286,Baking Goods,140.9812,OUT017,2007,,Tier 2,Supermarket Type1,3277.0676 +FDA04,11.3,reg,0.067001825,Frozen Foods,259.1962,OUT018,2009,Medium,Tier 3,Supermarket Type2,5438.9202 +FDV26,20.25,Regular,0.076314907,Dairy,196.7794,OUT045,2002,,Tier 2,Supermarket Type1,2731.1116 +FDF40,,Regular,0.022403117,Dairy,250.9092,OUT027,1985,Medium,Tier 3,Supermarket Type3,8217.3036 +FDH34,,Low Fat,0.030944666,Snack Foods,186.6582,OUT027,1985,Medium,Tier 3,Supermarket Type3,3715.164 +FDO16,5.48,Low Fat,0.02528802,Frozen Foods,83.325,OUT010,1998,,Tier 3,Grocery Store,416.125 +FDZ43,11,Regular,0.057058545,Fruits and Vegetables,241.7512,OUT046,1997,Small,Tier 1,Supermarket Type1,3635.268 +DRJ51,14.1,Low Fat,0,Dairy,231.9668,OUT049,1999,Medium,Tier 1,Supermarket Type1,1842.9344 +NCL07,,Low Fat,0.05486977,Others,40.548,OUT019,1985,Small,Tier 1,Grocery Store,39.948 +FDU58,6.61,Regular,0.029006239,Snack Foods,186.0898,OUT035,2004,Small,Tier 2,Supermarket Type1,2619.2572 +FDI26,5.94,Low Fat,0.034880143,Canned,177.9344,OUT035,2004,Small,Tier 2,Supermarket Type1,4460.86 +FDG24,7.975,LF,0.014713909,Baking Goods,83.125,OUT017,2007,,Tier 2,Supermarket Type1,2579.975 +NCM19,12.65,Low Fat,0.047237246,Others,112.5202,OUT046,1997,Small,Tier 1,Supermarket Type1,787.6414 +NCO29,11.15,Low Fat,0.032306341,Health and Hygiene,166.3526,OUT049,1999,Medium,Tier 1,Supermarket Type1,986.7156 +NCM05,6.825,Low Fat,0.100171568,Health and Hygiene,262.7226,OUT010,1998,,Tier 3,Grocery Store,264.3226 +NCE07,8.18,Low Fat,0.013130031,Household,142.6154,OUT046,1997,Small,Tier 1,Supermarket Type1,709.077 +FDR10,17.6,LF,0.010096684,Snack Foods,160.4552,OUT017,2007,,Tier 2,Supermarket Type1,2599.2832 +FDO12,15.75,Low Fat,0.055015935,Baking Goods,194.3452,OUT049,1999,Medium,Tier 1,Supermarket Type1,2740.4328 +FDC17,12.15,Low Fat,0.015460726,Frozen Foods,211.8928,OUT046,1997,Small,Tier 1,Supermarket Type1,5890.9984 +FDF34,9.3,Regular,0.02346559,Snack Foods,197.6084,OUT010,1998,,Tier 3,Grocery Store,595.2252 +FDO22,13.5,Regular,0.017932223,Snack Foods,78.796,OUT018,2009,Medium,Tier 3,Supermarket Type2,239.688 +FDT52,9.695,Regular,0.047420609,Frozen Foods,246.0144,OUT035,2004,Small,Tier 2,Supermarket Type1,4165.2448 +FDR24,,Regular,0.062547321,Baking Goods,88.383,OUT027,1985,Medium,Tier 3,Supermarket Type3,2067.309 +FDP08,20.5,Regular,0.112410046,Fruits and Vegetables,192.2478,OUT046,1997,Small,Tier 1,Supermarket Type1,3874.956 +FDF39,14.85,Regular,0.019511288,Dairy,262.591,OUT046,1997,Small,Tier 1,Supermarket Type1,4996.829 +NCQ06,13,Low Fat,0.041789718,Household,256.1014,OUT013,1987,High,Tier 3,Supermarket Type1,2550.014 +FDR04,7.075,Low Fat,0.022548195,Frozen Foods,95.7068,OUT013,1987,High,Tier 3,Supermarket Type1,583.2408 +FDQ32,17.85,Regular,0.046599684,Fruits and Vegetables,125.1388,OUT035,2004,Small,Tier 2,Supermarket Type1,1981.4208 +DRD15,10.6,Low Fat,0.095064731,Dairy,232.4642,OUT010,1998,,Tier 3,Grocery Store,697.0926 +FDB02,9.695,Regular,0.029283081,Canned,175.137,OUT018,2009,Medium,Tier 3,Supermarket Type2,3705.177 +NCS18,12.65,Low Fat,0.042383069,Household,108.0938,OUT018,2009,Medium,Tier 3,Supermarket Type2,1607.907 +NCS30,5.945,Low Fat,0.155706798,Household,127.9652,OUT010,1998,,Tier 3,Grocery Store,645.826 +FDN15,17.5,Low Fat,0.016767995,Meat,141.418,OUT045,2002,,Tier 2,Supermarket Type1,1957.452 +NCL31,7.39,Low Fat,0.120961347,Others,143.847,OUT017,2007,,Tier 2,Supermarket Type1,4866.998 +FDV31,9.8,Low Fat,0.178622919,Fruits and Vegetables,177.937,OUT010,1998,,Tier 3,Grocery Store,176.437 +FDF38,11.8,Regular,0.02633607,Canned,40.6138,OUT013,1987,High,Tier 3,Supermarket Type1,406.138 +DRK59,8.895,low fat,0.126287542,Hard Drinks,235.5616,OUT010,1998,,Tier 3,Grocery Store,468.7232 +DRJ24,11.8,Low Fat,0.11350542,Soft Drinks,186.8924,OUT049,1999,Medium,Tier 1,Supermarket Type1,2961.4784 +FDW51,,Regular,0.094201477,Meat,213.356,OUT027,1985,Medium,Tier 3,Supermarket Type3,6817.792 +FDN49,17.25,Regular,0.125224466,Breakfast,41.248,OUT046,1997,Small,Tier 1,Supermarket Type1,679.116 +FDE20,11.35,Regular,0.005561798,Fruits and Vegetables,168.379,OUT017,2007,,Tier 2,Supermarket Type1,3225.801 +FDV38,19.25,LF,0.101980245,Dairy,54.3956,OUT045,2002,,Tier 2,Supermarket Type1,873.5296 +FDH60,19.7,Regular,0.081193712,Baking Goods,198.411,OUT017,2007,,Tier 2,Supermarket Type1,2553.343 +NCD55,14,Low Fat,0.024369007,Household,40.2454,OUT049,1999,Medium,Tier 1,Supermarket Type1,922.7988 +FDU13,8.355,Low Fat,0.188619537,Canned,146.4418,OUT017,2007,,Tier 2,Supermarket Type1,3089.9778 +FDZ07,15.1,reg,0.094037291,Fruits and Vegetables,62.3194,OUT049,1999,Medium,Tier 1,Supermarket Type1,495.3552 +FDY13,12.1,Low Fat,0.030188505,Canned,77.367,OUT045,2002,,Tier 2,Supermarket Type1,612.536 +FDP56,8.185,low fat,0.046578409,Fruits and Vegetables,48.6692,OUT045,2002,,Tier 2,Supermarket Type1,1182.4608 +DRA59,,Regular,0.223985293,Soft Drinks,186.2924,OUT019,1985,Small,Tier 1,Grocery Store,555.2772 +FDY40,15.5,Regular,0.085763562,Frozen Foods,49.0692,OUT013,1987,High,Tier 3,Supermarket Type1,295.6152 +FDW40,14,Regular,0.105145451,Frozen Foods,144.2812,OUT046,1997,Small,Tier 1,Supermarket Type1,4844.3608 +NCW17,18,Low Fat,0.019382568,Health and Hygiene,129.3994,OUT035,2004,Small,Tier 2,Supermarket Type1,3340.9844 +DRN37,9.6,Low Fat,0,Soft Drinks,166.5158,OUT049,1999,Medium,Tier 1,Supermarket Type1,3509.4318 +FDZ19,,Low Fat,0.093002339,Fruits and Vegetables,177.7712,OUT027,1985,Medium,Tier 3,Supermarket Type3,4921.5936 +FDW34,9.6,Low Fat,0.035549527,Snack Foods,244.117,OUT013,1987,High,Tier 3,Supermarket Type1,5346.374 +FDC28,,Low Fat,0.054720642,Frozen Foods,107.8254,OUT027,1985,Medium,Tier 3,Supermarket Type3,2387.5588 +FDB29,16.7,Regular,0.052708138,Frozen Foods,114.7176,OUT017,2007,,Tier 2,Supermarket Type1,2404.8696 +FDE26,9.3,Low Fat,0.089144149,Canned,144.9786,OUT049,1999,Medium,Tier 1,Supermarket Type1,1011.3502 +FDG45,8.1,Low Fat,0.128011859,Fruits and Vegetables,210.9902,OUT035,2004,Small,Tier 2,Supermarket Type1,6371.706 +NCC18,19.1,Low Fat,0.178272728,Household,172.4422,OUT017,2007,,Tier 2,Supermarket Type1,1551.9798 +NCU54,8.88,Low Fat,0.099024124,Household,208.527,OUT018,2009,Medium,Tier 3,Supermarket Type2,3145.905 +FDF26,6.825,Regular,0.046898544,Canned,153.7998,OUT017,2007,,Tier 2,Supermarket Type1,922.7988 +FDX52,11.5,Regular,0.041994624,Frozen Foods,194.782,OUT035,2004,Small,Tier 2,Supermarket Type1,3475.476 +FDR04,7.075,Low Fat,0.022694623,Frozen Foods,98.8068,OUT017,2007,,Tier 2,Supermarket Type1,2527.3768 +NCP06,20.7,Low Fat,0.039467795,Household,151.7366,OUT017,2007,,Tier 2,Supermarket Type1,604.5464 +FDN25,7.895,Regular,0.061270647,Breakfast,56.7588,OUT049,1999,Medium,Tier 1,Supermarket Type1,343.5528 +NCH42,6.86,Low Fat,0.036686158,Household,229.601,OUT018,2009,Medium,Tier 3,Supermarket Type2,2526.711 +FDO46,9.6,Regular,0.014200671,Snack Foods,187.1872,OUT013,1987,High,Tier 3,Supermarket Type1,3214.4824 +NCG54,12.1,Low Fat,0.079806266,Household,172.1106,OUT046,1997,Small,Tier 1,Supermarket Type1,3422.212 +FDU07,11.1,Low Fat,0.059797172,Fruits and Vegetables,151.8366,OUT013,1987,High,Tier 3,Supermarket Type1,1057.9562 +DRJ11,9.5,Low Fat,0,Hard Drinks,190.9872,OUT045,2002,,Tier 2,Supermarket Type1,3025.3952 +FDH10,21,Low Fat,0.049381666,Snack Foods,193.0478,OUT049,1999,Medium,Tier 1,Supermarket Type1,1549.9824 +FDN56,5.46,Regular,0.107057186,Fruits and Vegetables,144.9786,OUT046,1997,Small,Tier 1,Supermarket Type1,2022.7004 +FDY56,,Regular,0.109274313,Fruits and Vegetables,225.3062,OUT019,1985,Small,Tier 1,Grocery Store,677.1186 +NCQ53,17.6,Low Fat,0.018889593,Health and Hygiene,236.259,OUT013,1987,High,Tier 3,Supermarket Type1,4727.18 +NCN54,20.35,Low Fat,0.021369722,Household,75.8328,OUT045,2002,,Tier 2,Supermarket Type1,154.4656 +NCC43,7.39,Low Fat,0.092927148,Household,249.5066,OUT049,1999,Medium,Tier 1,Supermarket Type1,4267.1122 +FDB35,,Regular,0.113139486,Starchy Foods,92.9804,OUT019,1985,Small,Tier 1,Grocery Store,183.7608 +FDX33,9.195,Regular,0.117387066,Snack Foods,160.2578,OUT013,1987,High,Tier 3,Supermarket Type1,4492.8184 +NCT06,17.1,Low Fat,0.038730229,Household,166.2842,OUT035,2004,Small,Tier 2,Supermarket Type1,4807.7418 +FDM50,13,Regular,0.030211742,Canned,59.322,OUT018,2009,Medium,Tier 3,Supermarket Type2,539.298 +FDC37,15.5,Low Fat,0.032924463,Baking Goods,107.2938,OUT049,1999,Medium,Tier 1,Supermarket Type1,2143.876 +NCT54,8.695,Low Fat,0.120022543,Household,94.8094,OUT018,2009,Medium,Tier 3,Supermarket Type2,1428.141 +FDG34,,Regular,0.037388493,Snack Foods,107.8254,OUT027,1985,Medium,Tier 3,Supermarket Type3,1410.8302 +NCW54,7.5,low fat,0.096413261,Household,55.3588,OUT046,1997,Small,Tier 1,Supermarket Type1,1030.6584 +FDZ46,7.485,Low Fat,0.069405301,Snack Foods,112.1228,OUT018,2009,Medium,Tier 3,Supermarket Type2,1105.228 +NCK19,9.8,Low Fat,0.090649107,Others,194.3478,OUT045,2002,,Tier 2,Supermarket Type1,4649.9472 +NCQ05,11.395,Low Fat,0.021649904,Health and Hygiene,150.8708,OUT045,2002,,Tier 2,Supermarket Type1,4363.6532 +NCE54,20.7,Low Fat,0.02689477,Household,76.7354,OUT035,2004,Small,Tier 2,Supermarket Type1,2482.7682 +FDH17,16.2,Regular,0.016679232,Frozen Foods,96.3726,OUT049,1999,Medium,Tier 1,Supermarket Type1,2740.4328 +FDB23,,Regular,0.00978492,Starchy Foods,225.9062,OUT019,1985,Small,Tier 1,Grocery Store,451.4124 +DRL49,13.15,Low Fat,0.056429024,Soft Drinks,144.2812,OUT046,1997,Small,Tier 1,Supermarket Type1,1282.3308 +FDT03,21.25,Low Fat,0.009998763,Meat,182.3608,OUT046,1997,Small,Tier 1,Supermarket Type1,551.2824 +FDW59,13.15,Low Fat,0.020757926,Breads,84.3566,OUT045,2002,,Tier 2,Supermarket Type1,761.0094 +NCB18,19.6,LF,0.041374909,Household,89.2514,OUT045,2002,,Tier 2,Supermarket Type1,1416.8224 +FDI22,12.6,Low Fat,0.096756649,Snack Foods,208.7612,OUT017,2007,,Tier 2,Supermarket Type1,5226.53 +FDZ50,12.8,Regular,0.079523619,Dairy,181.7608,OUT017,2007,,Tier 2,Supermarket Type1,4961.5416 +FDS14,7.285,Low Fat,0,Dairy,155.1288,OUT017,2007,,Tier 2,Supermarket Type1,1414.1592 +NCN19,13.1,Low Fat,0.012167988,Others,190.253,OUT017,2007,,Tier 2,Supermarket Type1,4174.566 +FDG46,8.63,Regular,0.032976399,Snack Foods,114.6518,OUT045,2002,,Tier 2,Supermarket Type1,2846.295 +FDS04,10.195,Regular,0.147492524,Frozen Foods,141.5838,OUT017,2007,,Tier 2,Supermarket Type1,1685.8056 +FDM58,16.85,Regular,0,Snack Foods,110.0544,OUT049,1999,Medium,Tier 1,Supermarket Type1,2572.6512 +FDB60,9.3,Low Fat,0.028566433,Baking Goods,193.0136,OUT049,1999,Medium,Tier 1,Supermarket Type1,4860.34 +FDH28,15.85,Regular,0.110479217,Frozen Foods,36.7506,OUT018,2009,Medium,Tier 3,Supermarket Type2,531.3084 +NCU53,5.485,Low Fat,0.042838514,Health and Hygiene,163.7842,OUT045,2002,,Tier 2,Supermarket Type1,1657.842 +FDL44,18.25,Low Fat,0.012264903,Fruits and Vegetables,162.8894,OUT013,1987,High,Tier 3,Supermarket Type1,3397.5774 +FDI22,12.6,Low Fat,0.096132367,Snack Foods,208.9612,OUT013,1987,High,Tier 3,Supermarket Type1,4181.224 +DRM37,,LF,0.168780127,Soft Drinks,197.8768,OUT019,1985,Small,Tier 1,Grocery Store,197.0768 +FDX40,12.85,Low Fat,0.099193899,Frozen Foods,38.1164,OUT045,2002,,Tier 2,Supermarket Type1,656.4788 +DRG15,6.13,Low Fat,0.076721393,Dairy,59.4536,OUT035,2004,Small,Tier 2,Supermarket Type1,2021.3688 +FDV19,,Regular,0.06173052,Fruits and Vegetables,159.1578,OUT019,1985,Small,Tier 1,Grocery Store,160.4578 +DRF01,5.655,Low Fat,0.174934513,Soft Drinks,145.0102,OUT013,1987,High,Tier 3,Supermarket Type1,1895.5326 +NCV54,11.1,Low Fat,0,Household,119.1124,OUT046,1997,Small,Tier 1,Supermarket Type1,1303.6364 +FDO21,11.6,Regular,0.009802791,Snack Foods,223.0404,OUT018,2009,Medium,Tier 3,Supermarket Type2,1125.202 +FDA40,16,Regular,0.09942555,Frozen Foods,87.0856,OUT049,1999,Medium,Tier 1,Supermarket Type1,527.3136 +FDE59,12.15,Low Fat,0.062384659,Starchy Foods,34.6532,OUT049,1999,Medium,Tier 1,Supermarket Type1,719.064 +FDX47,6.55,Regular,0.034745307,Breads,158.8288,OUT018,2009,Medium,Tier 3,Supermarket Type2,4399.6064 +FDW34,9.6,Low Fat,0.035579135,Snack Foods,244.417,OUT046,1997,Small,Tier 1,Supermarket Type1,1944.136 +NCM30,19.1,Low Fat,0.067569539,Household,43.0796,OUT018,2009,Medium,Tier 3,Supermarket Type2,619.194 +FDA02,14,Regular,0.029697925,Dairy,143.0786,OUT013,1987,High,Tier 3,Supermarket Type1,3178.5292 +FDV19,14.85,Regular,0.03525037,Fruits and Vegetables,160.9578,OUT035,2004,Small,Tier 2,Supermarket Type1,2246.4092 +FDT48,4.92,LF,0.045916788,Baking Goods,198.8084,OUT013,1987,High,Tier 3,Supermarket Type1,2976.126 +FDD09,13.5,Low Fat,0.021539999,Fruits and Vegetables,182.4976,OUT045,2002,,Tier 2,Supermarket Type1,1629.8784 +FDZ25,15.7,Regular,0.027673055,Canned,169.279,OUT045,2002,,Tier 2,Supermarket Type1,3735.138 +NCE19,8.97,Low Fat,0.092997032,Household,55.2956,OUT035,2004,Small,Tier 2,Supermarket Type1,873.5296 +DRE25,15.35,Low Fat,0.073283193,Soft Drinks,91.812,OUT046,1997,Small,Tier 1,Supermarket Type1,1771.028 +FDC14,,Regular,0.041049322,Canned,41.2454,OUT027,1985,Medium,Tier 3,Supermarket Type3,1342.2528 +FDO15,,Regular,0.008525061,Meat,72.5038,OUT027,1985,Medium,Tier 3,Supermarket Type3,2512.7292 +FDC46,17.7,Low Fat,0.117201696,Snack Foods,184.0266,OUT017,2007,,Tier 2,Supermarket Type1,2397.5458 +NCX42,6.36,Low Fat,0.005977465,Household,163.3526,OUT035,2004,Small,Tier 2,Supermarket Type1,2631.2416 +FDK52,,Low Fat,0,Frozen Foods,225.3062,OUT027,1985,Medium,Tier 3,Supermarket Type3,4288.4178 +FDD04,,Low Fat,0.157528118,Dairy,142.9154,OUT019,1985,Small,Tier 1,Grocery Store,141.8154 +FDF12,8.235,Low Fat,0.082427854,Baking Goods,149.3076,OUT046,1997,Small,Tier 1,Supermarket Type1,2808.3444 +NCL41,12.35,Low Fat,0.041802518,Health and Hygiene,34.8216,OUT049,1999,Medium,Tier 1,Supermarket Type1,311.5944 +NCW41,18,Low Fat,0.015450376,Health and Hygiene,158.9604,OUT046,1997,Small,Tier 1,Supermarket Type1,1584.604 +FDO60,20,Low Fat,0.057527544,Baking Goods,43.1086,OUT010,1998,,Tier 3,Grocery Store,89.2172 +FDZ55,6.055,Low Fat,0.025512207,Fruits and Vegetables,159.692,OUT018,2009,Medium,Tier 3,Supermarket Type2,5592.72 +FDZ59,6.63,reg,0.174110803,Baking Goods,166.85,OUT010,1998,,Tier 3,Grocery Store,499.35 +FDO24,,Low Fat,0.175362333,Baking Goods,158.9604,OUT027,1985,Medium,Tier 3,Supermarket Type3,4436.8912 +FDW14,8.3,Regular,0.038367194,Dairy,87.1198,OUT018,2009,Medium,Tier 3,Supermarket Type2,959.4178 +FDD40,20.25,Regular,0.014781046,Dairy,193.8162,OUT013,1987,High,Tier 3,Supermarket Type1,3463.4916 +FDJ38,8.6,Regular,0.040268044,Canned,191.453,OUT049,1999,Medium,Tier 1,Supermarket Type1,1707.777 +NCO54,19.5,Low Fat,0.014355033,Household,55.4614,OUT017,2007,,Tier 2,Supermarket Type1,552.614 +FDJ10,5.095,Regular,0.129766301,Snack Foods,141.6838,OUT045,2002,,Tier 2,Supermarket Type1,3231.1274 +FDK27,11,Low Fat,0.008997141,Meat,119.9756,OUT017,2007,,Tier 2,Supermarket Type1,1938.8096 +FDR09,18.25,Low Fat,0.07784544,Snack Foods,260.5962,OUT049,1999,Medium,Tier 1,Supermarket Type1,3884.943 +FDO60,20,Low Fat,0,Baking Goods,43.4086,OUT018,2009,Medium,Tier 3,Supermarket Type2,401.4774 +FDX50,,Low Fat,0.074265816,Dairy,109.5228,OUT027,1985,Medium,Tier 3,Supermarket Type3,3757.7752 +FDR44,,Regular,0.102422487,Fruits and Vegetables,131.4968,OUT027,1985,Medium,Tier 3,Supermarket Type3,1565.9616 +FDD17,7.5,Low Fat,0.032811503,Frozen Foods,239.6906,OUT017,2007,,Tier 2,Supermarket Type1,2614.5966 +FDI60,7.22,Regular,0.038477325,Baking Goods,62.951,OUT018,2009,Medium,Tier 3,Supermarket Type2,1138.518 +FDH31,12,Regular,0.020411155,Meat,98.6042,OUT046,1997,Small,Tier 1,Supermarket Type1,1091.2462 +FDL50,12.15,Regular,0.042552418,Canned,123.5046,OUT017,2007,,Tier 2,Supermarket Type1,1743.0644 +FDO21,11.6,Regular,0.009818244,Snack Foods,223.1404,OUT017,2007,,Tier 2,Supermarket Type1,5175.9292 +FDW12,8.315,Regular,0.035572183,Baking Goods,144.4444,OUT046,1997,Small,Tier 1,Supermarket Type1,2902.888 +FDT15,12.15,Regular,0.04274788,Meat,183.695,OUT049,1999,Medium,Tier 1,Supermarket Type1,2929.52 +FDV25,5.905,Low Fat,0.04572322,Canned,222.1456,OUT049,1999,Medium,Tier 1,Supermarket Type1,5747.1856 +DRH13,8.575,Low Fat,0.023934398,Soft Drinks,105.828,OUT045,2002,,Tier 2,Supermarket Type1,958.752 +FDG21,17.35,Regular,0.146527359,Seafood,147.905,OUT049,1999,Medium,Tier 1,Supermarket Type1,2247.075 +NCI55,18.6,Low Fat,0.012651172,Household,123.1414,OUT035,2004,Small,Tier 2,Supermarket Type1,2314.9866 +NCO06,,Low Fat,0.107507291,Household,34.8558,OUT027,1985,Medium,Tier 3,Supermarket Type3,441.4254 +FDR27,15.1,Regular,0.096295326,Meat,133.4942,OUT045,2002,,Tier 2,Supermarket Type1,1457.4362 +FDA22,,Low Fat,0,Starchy Foods,167.5158,OUT027,1985,Medium,Tier 3,Supermarket Type3,4345.0108 +FDS03,7.825,Low Fat,0.079613553,Meat,65.0826,OUT035,2004,Small,Tier 2,Supermarket Type1,1162.4868 +FDZ12,9.17,Low Fat,0.103398309,Baking Goods,143.947,OUT018,2009,Medium,Tier 3,Supermarket Type2,2576.646 +FDJ20,20.7,Regular,0.16767231,Fruits and Vegetables,124.2388,OUT010,1998,,Tier 3,Grocery Store,247.6776 +FDV09,12.1,Low Fat,0.020551458,Snack Foods,146.6734,OUT013,1987,High,Tier 3,Supermarket Type1,2227.101 +FDW09,13.65,Regular,0.025961116,Snack Foods,80.4302,OUT049,1999,Medium,Tier 1,Supermarket Type1,316.9208 +FDS36,8.38,Regular,0.046960237,Baking Goods,111.857,OUT049,1999,Medium,Tier 1,Supermarket Type1,2966.139 +FDY19,19.75,Low Fat,0.041533438,Fruits and Vegetables,119.8466,OUT018,2009,Medium,Tier 3,Supermarket Type2,2239.0854 +DRC49,8.67,Low Fat,0.065436581,Soft Drinks,142.9128,OUT046,1997,Small,Tier 1,Supermarket Type1,2013.3792 +FDN12,15.6,Low Fat,0.08126841,Baking Goods,110.2544,OUT045,2002,,Tier 2,Supermarket Type1,1789.6704 +FDJ03,12.35,Regular,0.072689818,Dairy,48.7692,OUT018,2009,Medium,Tier 3,Supermarket Type2,788.3072 +FDC46,17.7,Low Fat,0.116723677,Snack Foods,182.4266,OUT049,1999,Medium,Tier 1,Supermarket Type1,5163.9448 +FDM02,12.5,Regular,0.074035423,Canned,87.9198,OUT018,2009,Medium,Tier 3,Supermarket Type2,1133.8574 +FDV20,20.2,Regular,0.059751638,Fruits and Vegetables,129.1678,OUT013,1987,High,Tier 3,Supermarket Type1,1017.3424 +NCH07,13.15,Low Fat,0.092854963,Household,158.7604,OUT045,2002,,Tier 2,Supermarket Type1,3010.7476 +FDL28,,Regular,0,Frozen Foods,230.0668,OUT019,1985,Small,Tier 1,Grocery Store,691.1004 +FDJ46,,Low Fat,0.044606379,Snack Foods,174.2054,OUT027,1985,Medium,Tier 3,Supermarket Type3,4377.635 +FDQ34,10.85,Low Fat,0.162107603,Snack Foods,106.3622,OUT013,1987,High,Tier 3,Supermarket Type1,2117.244 +NCD42,,Low Fat,0,Health and Hygiene,37.3506,OUT027,1985,Medium,Tier 3,Supermarket Type3,1024.6662 +FDO34,17.7,Low Fat,0.030060895,Snack Foods,166.4816,OUT018,2009,Medium,Tier 3,Supermarket Type2,2013.3792 +FDX60,14.35,Low Fat,0.081050006,Baking Goods,79.196,OUT017,2007,,Tier 2,Supermarket Type1,1278.336 +FDZ28,20,Regular,0.051783761,Frozen Foods,125.8678,OUT017,2007,,Tier 2,Supermarket Type1,3433.5306 +FDT36,12.3,Low Fat,0,Baking Goods,37.2874,OUT013,1987,High,Tier 3,Supermarket Type1,705.748 +FDL24,10.3,Regular,0.024998007,Baking Goods,174.4422,OUT018,2009,Medium,Tier 3,Supermarket Type2,3448.844 +FDJ58,15.6,Regular,0.105208448,Snack Foods,170.5764,OUT013,1987,High,Tier 3,Supermarket Type1,4466.1864 +FDY12,9.8,Regular,0.14118383,Baking Goods,50.5008,OUT018,2009,Medium,Tier 3,Supermarket Type2,253.004 +FDP58,11.1,Low Fat,0.135692831,Snack Foods,220.0482,OUT018,2009,Medium,Tier 3,Supermarket Type2,2628.5784 +FDC41,,Low Fat,0.116347087,Frozen Foods,76.867,OUT027,1985,Medium,Tier 3,Supermarket Type3,2526.711 +FDY07,11.8,Low Fat,0.12150063,Fruits and Vegetables,46.8402,OUT013,1987,High,Tier 3,Supermarket Type1,413.4618 +FDN08,7.72,Regular,0.088864488,Fruits and Vegetables,119.3466,OUT017,2007,,Tier 2,Supermarket Type1,3064.0116 +FDJ53,,Low Fat,0.070912843,Frozen Foods,121.5098,OUT027,1985,Medium,Tier 3,Supermarket Type3,2410.196 +FDX04,19.6,Regular,0.041571557,Frozen Foods,49.9376,OUT046,1997,Small,Tier 1,Supermarket Type1,623.1888 +FDZ19,6.425,Low Fat,0.093454899,Fruits and Vegetables,175.3712,OUT046,1997,Small,Tier 1,Supermarket Type1,2988.1104 +FDB45,20.85,Low Fat,0.021329793,Fruits and Vegetables,105.5306,OUT046,1997,Small,Tier 1,Supermarket Type1,940.7754 +NCF54,18,Low Fat,0.079299474,Household,170.5422,OUT010,1998,,Tier 3,Grocery Store,344.8844 +FDX21,7.05,Low Fat,0.085138334,Snack Foods,108.6912,OUT045,2002,,Tier 2,Supermarket Type1,1310.2944 +FDA50,16.25,Low Fat,0.087175137,Dairy,98.341,OUT046,1997,Small,Tier 1,Supermarket Type1,1351.574 +DRH39,20.7,Low Fat,0.093214498,Dairy,74.667,OUT017,2007,,Tier 2,Supermarket Type1,2143.876 +FDA38,5.44,Low Fat,0.025458716,Dairy,241.2538,OUT013,1987,High,Tier 3,Supermarket Type1,3124.5994 +NCP30,20.5,Low Fat,0.032741422,Household,40.4822,OUT013,1987,High,Tier 3,Supermarket Type1,589.233 +FDW19,12.35,Regular,0.038560279,Fruits and Vegetables,109.857,OUT049,1999,Medium,Tier 1,Supermarket Type1,1208.427 +FDF41,,Low Fat,0.130544568,Frozen Foods,248.046,OUT027,1985,Medium,Tier 3,Supermarket Type3,7883.072 +DRF23,4.61,Low Fat,0.122629121,Hard Drinks,175.4396,OUT035,2004,Small,Tier 2,Supermarket Type1,2616.594 +NCP14,8.275,Low Fat,0.110913601,Household,106.3306,OUT017,2007,,Tier 2,Supermarket Type1,1254.3672 +FDK44,,Low Fat,0.121635591,Fruits and Vegetables,175.4738,OUT027,1985,Medium,Tier 3,Supermarket Type3,2954.1546 +DRA59,8.27,Regular,0.128449055,Soft Drinks,186.5924,OUT018,2009,Medium,Tier 3,Supermarket Type2,4442.2176 +FDC28,7.905,Low Fat,0.055098434,Frozen Foods,109.2254,OUT045,2002,,Tier 2,Supermarket Type1,976.7286 +NCO53,16.2,Low Fat,0,Health and Hygiene,182.1608,OUT049,1999,Medium,Tier 1,Supermarket Type1,3123.9336 +FDY55,,LF,0,Fruits and Vegetables,258.3988,OUT019,1985,Small,Tier 1,Grocery Store,256.9988 +NCS54,13.6,Low Fat,0.010013429,Household,176.437,OUT045,2002,,Tier 2,Supermarket Type1,4587.362 +NCM07,9.395,Low Fat,0.040187877,Others,85.6908,OUT017,2007,,Tier 2,Supermarket Type1,1593.9252 +FDQ19,7.35,reg,0.024044279,Fruits and Vegetables,241.0512,OUT010,1998,,Tier 3,Grocery Store,242.3512 +FDS40,15.35,Low Fat,0.014007727,Frozen Foods,38.319,OUT013,1987,High,Tier 3,Supermarket Type1,292.952 +FDC14,14.5,Regular,0.041214746,Canned,42.0454,OUT013,1987,High,Tier 3,Supermarket Type1,629.181 +FDR12,12.6,Regular,0.031663212,Baking Goods,173.2764,OUT018,2009,Medium,Tier 3,Supermarket Type2,1030.6584 +FDM60,10.8,Regular,0,Baking Goods,39.3138,OUT013,1987,High,Tier 3,Supermarket Type1,1015.345 +FDG26,18.85,Low Fat,0.042716162,Canned,257.833,OUT049,1999,Medium,Tier 1,Supermarket Type1,3332.329 +NCL55,12.15,Low Fat,0.06479182,Others,254.004,OUT045,2002,,Tier 2,Supermarket Type1,2277.036 +FDO21,11.6,Regular,0.009761175,Snack Foods,226.9404,OUT035,2004,Small,Tier 2,Supermarket Type1,1800.3232 +NCG18,15.3,Low Fat,0.02295878,Household,101.6332,OUT013,1987,High,Tier 3,Supermarket Type1,1845.5976 +FDA27,20.35,Regular,0.030927632,Dairy,256.8672,OUT046,1997,Small,Tier 1,Supermarket Type1,3579.3408 +DRG03,14.5,Low Fat,0.103752817,Dairy,155.1998,OUT010,1998,,Tier 3,Grocery Store,307.5996 +FDC22,6.89,Regular,0.136428395,Snack Foods,193.982,OUT046,1997,Small,Tier 1,Supermarket Type1,1737.738 +FDC21,14.6,Regular,0.071904258,Fruits and Vegetables,106.8254,OUT010,1998,,Tier 3,Grocery Store,108.5254 +FDN50,16.85,reg,0.026627857,Canned,93.712,OUT018,2009,Medium,Tier 3,Supermarket Type2,745.696 +DRF27,8.93,Low Fat,0.028393624,Dairy,153.434,OUT013,1987,High,Tier 3,Supermarket Type1,1378.206 +FDW57,8.31,Regular,0.116331694,Snack Foods,176.9028,OUT017,2007,,Tier 2,Supermarket Type1,3010.7476 +FDM34,19,Low Fat,0.112893408,Snack Foods,131.0626,OUT010,1998,,Tier 3,Grocery Store,524.6504 +FDZ39,,Regular,0.017937483,Meat,103.499,OUT027,1985,Medium,Tier 3,Supermarket Type3,1547.985 +FDU28,,Regular,0.164438907,Frozen Foods,188.4214,OUT019,1985,Small,Tier 1,Grocery Store,376.8428 +FDQ27,5.19,Regular,0.044252621,Meat,102.599,OUT046,1997,Small,Tier 1,Supermarket Type1,1651.184 +FDQ52,17,Low Fat,0.120060274,Frozen Foods,246.5434,OUT017,2007,,Tier 2,Supermarket Type1,4470.1812 +FDT51,11.65,Regular,0.010909704,Meat,110.8544,OUT013,1987,High,Tier 3,Supermarket Type1,1677.816 +NCI30,20.25,Low Fat,0.059055045,Household,247.346,OUT045,2002,,Tier 2,Supermarket Type1,1970.768 +NCX29,10,Low Fat,0.149223055,Health and Hygiene,145.8102,OUT010,1998,,Tier 3,Grocery Store,874.8612 +FDX38,,Regular,0.084404264,Dairy,49.5376,OUT019,1985,Small,Tier 1,Grocery Store,143.8128 +FDO08,11.1,Regular,0.054079556,Fruits and Vegetables,165.9526,OUT017,2007,,Tier 2,Supermarket Type1,2631.2416 +FDM15,11.8,reg,0.057655493,Meat,152.6366,OUT018,2009,Medium,Tier 3,Supermarket Type2,1662.5026 +FDW22,9.695,Regular,0.030413777,Snack Foods,221.3114,OUT018,2009,Medium,Tier 3,Supermarket Type2,2217.114 +FDT08,13.65,Low Fat,0.049496899,Fruits and Vegetables,151.505,OUT017,2007,,Tier 2,Supermarket Type1,2846.295 +FDS32,17.75,Regular,0.029653914,Fruits and Vegetables,140.5838,OUT046,1997,Small,Tier 1,Supermarket Type1,2669.1922 +NCI06,11.3,Low Fat,0.047912071,Household,179.866,OUT018,2009,Medium,Tier 3,Supermarket Type2,1258.362 +FDR21,,Low Fat,0.066611321,Snack Foods,178.237,OUT027,1985,Medium,Tier 3,Supermarket Type3,3705.177 +FDD05,19.35,Low Fat,0.016611475,Frozen Foods,122.0098,OUT046,1997,Small,Tier 1,Supermarket Type1,2651.2156 +FDZ02,6.905,Regular,0.03822479,Dairy,99.8726,OUT045,2002,,Tier 2,Supermarket Type1,587.2356 +FDH47,13.5,Regular,0.129016487,Starchy Foods,98.4068,OUT049,1999,Medium,Tier 1,Supermarket Type1,1846.9292 +FDM58,16.85,Regular,0.080141165,Snack Foods,111.4544,OUT017,2007,,Tier 2,Supermarket Type1,2013.3792 +FDG09,20.6,Regular,0.0480335,Fruits and Vegetables,188.2556,OUT045,2002,,Tier 2,Supermarket Type1,3755.112 +FDO27,6.175,Regular,0.179355893,Meat,94.1752,OUT049,1999,Medium,Tier 1,Supermarket Type1,575.2512 +FDI41,18.5,Regular,0.062510529,Frozen Foods,146.8418,OUT018,2009,Medium,Tier 3,Supermarket Type2,2059.9852 +FDK34,13.35,Low Fat,0.038519399,Snack Foods,236.8564,OUT035,2004,Small,Tier 2,Supermarket Type1,5005.4844 +NCX54,,Low Fat,0.047827139,Household,105.3622,OUT027,1985,Medium,Tier 3,Supermarket Type3,3387.5904 +FDL14,8.115,Regular,0.032208865,Canned,154.9972,OUT049,1999,Medium,Tier 1,Supermarket Type1,3739.1328 +FDA13,15.85,Low Fat,0.078874948,Canned,37.4506,OUT018,2009,Medium,Tier 3,Supermarket Type2,303.6048 +FDS11,,Regular,0.097275777,Breads,223.9088,OUT019,1985,Small,Tier 1,Grocery Store,223.7088 +FDT43,16.35,Low Fat,0.020664178,Fruits and Vegetables,50.8324,OUT017,2007,,Tier 2,Supermarket Type1,1298.31 +FDR07,21.35,Low Fat,0.078060605,Fruits and Vegetables,96.0094,OUT018,2009,Medium,Tier 3,Supermarket Type2,380.8376 +FDF41,12.15,Low Fat,0.131714183,Frozen Foods,245.846,OUT018,2009,Medium,Tier 3,Supermarket Type2,4434.228 +DRM23,16.6,Low Fat,0.135944247,Hard Drinks,172.0422,OUT049,1999,Medium,Tier 1,Supermarket Type1,2586.633 +FDO52,11.6,Regular,0.077478931,Frozen Foods,170.3106,OUT018,2009,Medium,Tier 3,Supermarket Type2,4277.765 +FDD10,20.6,Regular,0.046114018,Snack Foods,178.2344,OUT045,2002,,Tier 2,Supermarket Type1,1070.6064 +FDN38,,Regular,0.161030847,Canned,251.2408,OUT019,1985,Small,Tier 1,Grocery Store,1001.3632 +FDE17,20.1,Regular,0.054455495,Frozen Foods,149.5366,OUT046,1997,Small,Tier 1,Supermarket Type1,2871.5954 +FDZ03,13.65,Regular,0,Dairy,186.024,OUT018,2009,Medium,Tier 3,Supermarket Type2,4287.752 +FDD03,13.3,Low Fat,0.080257683,Dairy,232.63,OUT017,2007,,Tier 2,Supermarket Type1,1864.24 +NCW18,,Low Fat,0.059037538,Household,237.7248,OUT027,1985,Medium,Tier 3,Supermarket Type3,2607.2728 +DRG36,,LF,0.094916347,Soft Drinks,172.3106,OUT027,1985,Medium,Tier 3,Supermarket Type3,4277.765 +FDT43,16.35,Low Fat,0.034393057,Fruits and Vegetables,50.8324,OUT010,1998,,Tier 3,Grocery Store,155.7972 +NCU17,5.32,Low Fat,0.093261677,Health and Hygiene,100.9674,OUT018,2009,Medium,Tier 3,Supermarket Type2,1222.4088 +FDH50,15,Regular,0.16143544,Canned,185.1266,OUT046,1997,Small,Tier 1,Supermarket Type1,2766.399 +FDU57,8.27,Regular,0.089479661,Snack Foods,148.6708,OUT013,1987,High,Tier 3,Supermarket Type1,2106.5912 +FDA56,,Low Fat,0.008722342,Fruits and Vegetables,123.5414,OUT027,1985,Medium,Tier 3,Supermarket Type3,4508.1318 +FDZ15,13.1,Low Fat,0.020988798,Dairy,117.7782,OUT017,2007,,Tier 2,Supermarket Type1,1191.782 +FDY51,12.5,Low Fat,0.081260969,Meat,221.7798,OUT049,1999,Medium,Tier 1,Supermarket Type1,3085.3172 +DRF03,19.1,Low Fat,0.045308131,Dairy,42.5138,OUT046,1997,Small,Tier 1,Supermarket Type1,649.8208 +NCV06,11.3,Low Fat,0.06705851,Household,194.0478,OUT017,2007,,Tier 2,Supermarket Type1,3293.7126 +FDA21,13.65,Low Fat,0.035930784,Snack Foods,184.4924,OUT013,1987,High,Tier 3,Supermarket Type1,9069.5276 +NCQ53,,low fat,0.018813776,Health and Hygiene,235.259,OUT027,1985,Medium,Tier 3,Supermarket Type3,5672.616 +NCO29,,Low Fat,0.032099989,Health and Hygiene,164.1526,OUT027,1985,Medium,Tier 3,Supermarket Type3,2960.1468 +FDT26,18.85,Regular,0.06823032,Dairy,121.044,OUT018,2009,Medium,Tier 3,Supermarket Type2,1557.972 +FDI21,5.59,Regular,0.056592115,Snack Foods,65.0168,OUT035,2004,Small,Tier 2,Supermarket Type1,447.4176 +NCI55,18.6,Low Fat,0.012643035,Household,119.8414,OUT013,1987,High,Tier 3,Supermarket Type1,365.5242 +FDZ04,9.31,Low Fat,0.063529046,Frozen Foods,63.751,OUT010,1998,,Tier 3,Grocery Store,126.502 +FDL27,6.17,Low Fat,0.010630949,Meat,65.9826,OUT046,1997,Small,Tier 1,Supermarket Type1,1162.4868 +FDS45,5.175,Regular,0.029490377,Snack Foods,107.6622,OUT035,2004,Small,Tier 2,Supermarket Type1,2858.2794 +NCG43,,Low Fat,0.129983688,Household,93.0462,OUT019,1985,Small,Tier 1,Grocery Store,185.0924 +FDU28,19.2,Regular,0.094300933,Frozen Foods,187.5214,OUT018,2009,Medium,Tier 3,Supermarket Type2,1695.7926 +FDO20,12.85,Regular,0.152001201,Fruits and Vegetables,252.3382,OUT013,1987,High,Tier 3,Supermarket Type1,6056.1168 +NCG55,16.25,Low Fat,0.039113587,Household,116.0176,OUT013,1987,High,Tier 3,Supermarket Type1,1488.7288 +NCM42,6.13,Low Fat,0.02848169,Household,110.4912,OUT017,2007,,Tier 2,Supermarket Type1,1310.2944 +NCG07,12.3,Low Fat,0.05271592,Household,189.653,OUT018,2009,Medium,Tier 3,Supermarket Type2,569.259 +NCQ29,,Low Fat,0.182493512,Health and Hygiene,258.8278,OUT019,1985,Small,Tier 1,Grocery Store,1041.3112 +NCV05,10.1,Low Fat,0.050562853,Health and Hygiene,153.3656,OUT010,1998,,Tier 3,Grocery Store,463.3968 +NCO02,11.15,Low Fat,0.07366703,Others,66.2142,OUT018,2009,Medium,Tier 3,Supermarket Type2,131.8284 +FDH19,19.35,Low Fat,0.03322326,Meat,172.0738,OUT018,2009,Medium,Tier 3,Supermarket Type2,3301.7022 +DRG13,17.25,Low Fat,0.037396492,Soft Drinks,165.6526,OUT017,2007,,Tier 2,Supermarket Type1,1808.9786 +FDI57,19.85,Low Fat,0.054015429,Seafood,196.3768,OUT035,2004,Small,Tier 2,Supermarket Type1,4138.6128 +FDX51,9.5,Regular,0.02210346,Meat,194.7452,OUT045,2002,,Tier 2,Supermarket Type1,1370.2164 +FDW33,9.395,Low Fat,0.099274694,Snack Foods,104.528,OUT049,1999,Medium,Tier 1,Supermarket Type1,852.224 +DRE12,4.59,Low Fat,0.070721656,Soft Drinks,113.286,OUT013,1987,High,Tier 3,Supermarket Type1,1471.418 +FDY31,5.98,Low Fat,0.043554614,Fruits and Vegetables,148.2418,OUT035,2004,Small,Tier 2,Supermarket Type1,2354.2688 +FDR31,6.46,Regular,0.04923932,Fruits and Vegetables,144.4102,OUT049,1999,Medium,Tier 1,Supermarket Type1,4374.306 +FDS55,7.02,Low Fat,0.08114883,Fruits and Vegetables,146.8734,OUT035,2004,Small,Tier 2,Supermarket Type1,3563.3616 +DRL60,8.52,Low Fat,0.027054244,Soft Drinks,151.5682,OUT035,2004,Small,Tier 2,Supermarket Type1,3506.7686 +FDW55,12.6,Regular,0.036773101,Fruits and Vegetables,250.3092,OUT010,1998,,Tier 3,Grocery Store,249.0092 +FDT11,5.94,Regular,0.049163321,Breads,186.4556,OUT010,1998,,Tier 3,Grocery Store,563.2668 +FDO50,16.25,Low Fat,0.078168739,Canned,91.3804,OUT046,1997,Small,Tier 1,Supermarket Type1,1653.8472 +FDD28,10.695,Low Fat,0.05337973,Frozen Foods,56.7904,OUT049,1999,Medium,Tier 1,Supermarket Type1,1113.2176 +FDN28,5.88,Regular,0.030418998,Frozen Foods,103.099,OUT017,2007,,Tier 2,Supermarket Type1,1341.587 +FDS35,9.3,LF,0.111673587,Breads,65.7826,OUT018,2009,Medium,Tier 3,Supermarket Type2,968.739 +FDB38,19.5,Regular,0.027341529,Canned,158.292,OUT035,2004,Small,Tier 2,Supermarket Type1,3994.8 +FDT07,5.82,Regular,0.077634044,Fruits and Vegetables,256.433,OUT018,2009,Medium,Tier 3,Supermarket Type2,3844.995 +FDC53,8.68,Low Fat,0.008835694,Frozen Foods,96.5384,OUT046,1997,Small,Tier 1,Supermarket Type1,1182.4608 +NCT41,15.7,Low Fat,0.055990291,Health and Hygiene,153.2024,OUT046,1997,Small,Tier 1,Supermarket Type1,3795.06 +FDR40,,Regular,0.00799548,Frozen Foods,78.5618,OUT027,1985,Medium,Tier 3,Supermarket Type3,2255.7304 +FDH32,12.8,Low Fat,0.076369874,Fruits and Vegetables,97.241,OUT018,2009,Medium,Tier 3,Supermarket Type2,1448.115 +FDN60,15.1,Low Fat,0.095351065,Baking Goods,158.6604,OUT045,2002,,Tier 2,Supermarket Type1,2535.3664 +FDR33,7.31,Low Fat,0.026783871,Snack Foods,108.157,OUT035,2004,Small,Tier 2,Supermarket Type1,1098.57 +FDB59,,Low Fat,0.01520491,Snack Foods,197.2084,OUT027,1985,Medium,Tier 3,Supermarket Type3,4166.5764 +FDS07,12.35,Low Fat,0.099757833,Fruits and Vegetables,113.9518,OUT046,1997,Small,Tier 1,Supermarket Type1,910.8144 +FDD02,16.6,LF,0,Canned,117.3124,OUT013,1987,High,Tier 3,Supermarket Type1,2014.7108 +FDH05,14.35,Regular,0.090896452,Frozen Foods,231.2984,OUT035,2004,Small,Tier 2,Supermarket Type1,6024.1584 +FDR04,7.075,Low Fat,0.022602061,Frozen Foods,98.1068,OUT049,1999,Medium,Tier 1,Supermarket Type1,1458.102 +DRJ47,18.25,Low Fat,0.044250304,Hard Drinks,174.708,OUT046,1997,Small,Tier 1,Supermarket Type1,2423.512 +FDW50,13.1,Low Fat,0.075885921,Dairy,165.1158,OUT018,2009,Medium,Tier 3,Supermarket Type2,1504.0422 +NCJ17,7.68,Low Fat,0.153177941,Health and Hygiene,85.2224,OUT018,2009,Medium,Tier 3,Supermarket Type2,1278.336 +FDH60,19.7,Regular,0,Baking Goods,197.911,OUT045,2002,,Tier 2,Supermarket Type1,1767.699 +DRL60,8.52,Low Fat,0.027114238,Soft Drinks,151.9682,OUT045,2002,,Tier 2,Supermarket Type1,1677.1502 +FDS32,17.75,Regular,0.049634572,Fruits and Vegetables,140.2838,OUT010,1998,,Tier 3,Grocery Store,280.9676 +FDM58,,reg,0,Snack Foods,112.2544,OUT027,1985,Medium,Tier 3,Supermarket Type3,3914.904 +FDK10,5.785,Regular,0.040587146,Snack Foods,180.366,OUT017,2007,,Tier 2,Supermarket Type1,1258.362 +NCS30,5.945,LF,0.093008616,Household,127.8652,OUT035,2004,Small,Tier 2,Supermarket Type1,2195.8084 +FDY15,18.25,Regular,0.17179432,Dairy,154.663,OUT017,2007,,Tier 2,Supermarket Type1,2659.871 +FDC53,8.68,Low Fat,0.008828341,Frozen Foods,99.9384,OUT013,1987,High,Tier 3,Supermarket Type1,689.7688 +FDK45,11.65,LF,0.033858187,Seafood,113.386,OUT046,1997,Small,Tier 1,Supermarket Type1,2603.278 +FDH26,19.25,reg,0.034841089,Canned,141.1496,OUT018,2009,Medium,Tier 3,Supermarket Type2,282.2992 +NCW06,16.2,Low Fat,0.08425957,Household,192.3162,OUT010,1998,,Tier 3,Grocery Store,769.6648 +FDV37,13,Regular,0.083444376,Canned,195.8426,OUT013,1987,High,Tier 3,Supermarket Type1,4152.5946 +FDB52,17.75,low fat,0.030497325,Dairy,256.9672,OUT045,2002,,Tier 2,Supermarket Type1,1534.0032 +FDF41,12.15,Low Fat,0.131179812,Frozen Foods,245.246,OUT046,1997,Small,Tier 1,Supermarket Type1,3202.498 +FDA39,6.32,Low Fat,0.012737719,Meat,38.5822,OUT049,1999,Medium,Tier 1,Supermarket Type1,353.5398 +FDE56,17.25,Regular,0.159165324,Fruits and Vegetables,63.4194,OUT035,2004,Small,Tier 2,Supermarket Type1,1547.985 +FDC56,7.72,Low Fat,0.122015744,Fruits and Vegetables,121.744,OUT018,2009,Medium,Tier 3,Supermarket Type2,2277.036 +FDT26,18.85,Regular,0.068091318,Dairy,120.644,OUT045,2002,,Tier 2,Supermarket Type1,3475.476 +FDR21,19.7,Low Fat,0.067314073,Snack Foods,175.137,OUT017,2007,,Tier 2,Supermarket Type1,2822.992 +FDC14,14.5,Regular,0.041249072,Canned,40.5454,OUT046,1997,Small,Tier 1,Supermarket Type1,1216.4166 +FDI32,17.7,Low Fat,0.174340475,Fruits and Vegetables,116.6834,OUT035,2004,Small,Tier 2,Supermarket Type1,3570.6854 +FDI02,15.7,Regular,0.11454343,Canned,113.7202,OUT035,2004,Small,Tier 2,Supermarket Type1,3263.0858 +FDE22,9.695,Low Fat,0.029693277,Snack Foods,159.792,OUT018,2009,Medium,Tier 3,Supermarket Type2,2716.464 +FDW26,11.8,Regular,0.107057186,Dairy,224.1772,OUT046,1997,Small,Tier 1,Supermarket Type1,3558.0352 +FDA36,,Low Fat,0.009921107,Baking Goods,183.6924,OUT019,1985,Small,Tier 1,Grocery Store,555.2772 +NCS06,,Low Fat,0.031583053,Household,260.991,OUT027,1985,Medium,Tier 3,Supermarket Type3,7100.757 +NCX05,15.2,Low Fat,0.097043739,Health and Hygiene,116.8492,OUT035,2004,Small,Tier 2,Supermarket Type1,2664.5316 +FDU19,8.77,reg,0.046762633,Fruits and Vegetables,170.8422,OUT035,2004,Small,Tier 2,Supermarket Type1,1724.422 +FDA49,19.7,Low Fat,0.064909488,Canned,88.5198,OUT035,2004,Small,Tier 2,Supermarket Type1,1308.297 +NCZ42,10.5,LF,0.011305479,Household,235.5248,OUT049,1999,Medium,Tier 1,Supermarket Type1,4740.496 +FDX32,15.1,Regular,0,Fruits and Vegetables,146.2786,OUT010,1998,,Tier 3,Grocery Store,433.4358 +FDR01,5.405,Regular,0.053576661,Canned,200.5742,OUT013,1987,High,Tier 3,Supermarket Type1,2388.8904 +FDQ15,20.35,Regular,0.150947728,Meat,81.0276,OUT013,1987,High,Tier 3,Supermarket Type1,1868.2348 +FDQ14,,low fat,0.10818157,Dairy,149.605,OUT019,1985,Small,Tier 1,Grocery Store,449.415 +FDS56,5.785,Regular,0.038749536,Fruits and Vegetables,262.0252,OUT035,2004,Small,Tier 2,Supermarket Type1,4459.5284 +DRJ24,11.8,Low Fat,0.113790879,Soft Drinks,185.3924,OUT018,2009,Medium,Tier 3,Supermarket Type2,370.1848 +FDG52,,Low Fat,0.065313024,Frozen Foods,47.1402,OUT027,1985,Medium,Tier 3,Supermarket Type3,1516.0266 +FDF59,12.5,Low Fat,0,Starchy Foods,127.102,OUT017,2007,,Tier 2,Supermarket Type1,253.004 +DRM49,6.11,Regular,0.152813518,Soft Drinks,45.6086,OUT017,2007,,Tier 2,Supermarket Type1,1025.9978 +NCP02,7.105,Low Fat,0.044771473,Household,58.2562,OUT013,1987,High,Tier 3,Supermarket Type1,592.562 +FDW13,8.5,Low Fat,0.098083231,Canned,50.3324,OUT045,2002,,Tier 2,Supermarket Type1,675.1212 +FDV12,16.7,Regular,0.06121901,Baking Goods,100.0384,OUT017,2007,,Tier 2,Supermarket Type1,1970.768 +FDH14,17.1,Regular,0.047073322,Canned,138.6838,OUT017,2007,,Tier 2,Supermarket Type1,2950.1598 +FDQ20,8.325,Low Fat,0.029953314,Fruits and Vegetables,39.5138,OUT017,2007,,Tier 2,Supermarket Type1,568.5932 +FDT45,15.85,Low Fat,0,Snack Foods,55.1956,OUT013,1987,High,Tier 3,Supermarket Type1,1255.6988 +NCM26,,Low Fat,0.040520754,Others,153.934,OUT019,1985,Small,Tier 1,Grocery Store,153.134 +FDJ22,,Low Fat,0.052554508,Snack Foods,190.3504,OUT027,1985,Medium,Tier 3,Supermarket Type3,1917.504 +FDD29,12.15,Low Fat,0.018514652,Frozen Foods,252.7698,OUT017,2007,,Tier 2,Supermarket Type1,5834.4054 +FDA13,15.85,Low Fat,0.07871426,Canned,37.2506,OUT045,2002,,Tier 2,Supermarket Type1,493.3578 +FDV47,17.1,Low Fat,0.054197299,Breads,83.5566,OUT035,2004,Small,Tier 2,Supermarket Type1,1860.2452 +FDS57,15.5,Low Fat,0.103442268,Snack Foods,144.847,OUT046,1997,Small,Tier 1,Supermarket Type1,2433.499 +DRG36,14.15,LF,0.095360186,Soft Drinks,172.3106,OUT035,2004,Small,Tier 2,Supermarket Type1,3251.1014 +FDK38,,low fat,0.053031857,Canned,149.1734,OUT027,1985,Medium,Tier 3,Supermarket Type3,4454.202 +DRJ49,6.865,Low Fat,0.013990601,Soft Drinks,127.6652,OUT035,2004,Small,Tier 2,Supermarket Type1,2841.6344 +FDR37,16.5,Regular,0.066237024,Breakfast,183.1292,OUT035,2004,Small,Tier 2,Supermarket Type1,6385.022 +NCS53,14.5,Low Fat,0.089761211,Health and Hygiene,159.4604,OUT035,2004,Small,Tier 2,Supermarket Type1,2376.906 +FDR22,19.35,Regular,0.01863822,Snack Foods,110.2544,OUT018,2009,Medium,Tier 3,Supermarket Type2,1677.816 +NCP42,8.51,Low Fat,0.016176344,Household,192.1478,OUT018,2009,Medium,Tier 3,Supermarket Type2,1937.478 +FDK38,6.65,Low Fat,0.089196394,Canned,147.0734,OUT010,1998,,Tier 3,Grocery Store,296.9468 +NCC43,7.39,Low Fat,0.092782895,Household,252.6066,OUT046,1997,Small,Tier 1,Supermarket Type1,2259.0594 +FDH57,10.895,Low Fat,0.0358031,Fruits and Vegetables,130.3284,OUT049,1999,Medium,Tier 1,Supermarket Type1,2504.7396 +FDQ25,8.63,Regular,0.028271345,Canned,170.5422,OUT035,2004,Small,Tier 2,Supermarket Type1,2069.3064 +FDA11,7.75,Low Fat,0.043238822,Baking Goods,92.5436,OUT046,1997,Small,Tier 1,Supermarket Type1,1701.7848 +FDG31,12.15,Low Fat,0.037955309,Meat,62.8826,OUT049,1999,Medium,Tier 1,Supermarket Type1,710.4086 +FDW28,18.25,Low Fat,0.089186083,Frozen Foods,194.3452,OUT018,2009,Medium,Tier 3,Supermarket Type2,4502.1396 +FDV14,19.85,Low Fat,0.044566659,Dairy,88.5856,OUT049,1999,Medium,Tier 1,Supermarket Type1,703.0848 +FDB60,9.3,Low Fat,0.028638276,Baking Goods,195.8136,OUT018,2009,Medium,Tier 3,Supermarket Type2,2138.5496 +FDU43,,Regular,0.057762301,Fruits and Vegetables,237.3564,OUT027,1985,Medium,Tier 3,Supermarket Type3,2145.2076 +DRH11,5.98,LF,0.075711199,Hard Drinks,55.6614,OUT045,2002,,Tier 2,Supermarket Type1,331.5684 +FDC48,,Low Fat,0.027767577,Baking Goods,82.1592,OUT019,1985,Small,Tier 1,Grocery Store,412.796 +DRK39,7.02,Low Fat,0.049865399,Dairy,82.925,OUT046,1997,Small,Tier 1,Supermarket Type1,1165.15 +FDB20,7.72,Low Fat,0.052061483,Fruits and Vegetables,76.7986,OUT049,1999,Medium,Tier 1,Supermarket Type1,1324.2762 +FDE51,5.925,Regular,0.096387053,Dairy,45.6086,OUT013,1987,High,Tier 3,Supermarket Type1,356.8688 +FDX36,9.695,Regular,0.128176489,Baking Goods,224.8404,OUT013,1987,High,Tier 3,Supermarket Type1,3600.6464 +NCT29,12.6,Low Fat,0.064110725,Health and Hygiene,122.3414,OUT046,1997,Small,Tier 1,Supermarket Type1,243.6828 +FDU45,15.6,Regular,0.035561344,Snack Foods,112.1518,OUT049,1999,Medium,Tier 1,Supermarket Type1,1821.6288 +FDF56,16.7,Regular,0.119647957,Fruits and Vegetables,180.9976,OUT049,1999,Medium,Tier 1,Supermarket Type1,4165.2448 +FDW07,18,Regular,0.238831875,Fruits and Vegetables,88.2514,OUT010,1998,,Tier 3,Grocery Store,88.5514 +FDR52,,Regular,0.075676339,Frozen Foods,190.4846,OUT027,1985,Medium,Tier 3,Supermarket Type3,8789.8916 +FDB45,20.85,LF,0.021416681,Fruits and Vegetables,104.6306,OUT018,2009,Medium,Tier 3,Supermarket Type2,1149.8366 +NCT42,,Low Fat,0.024766802,Household,151.0392,OUT027,1985,Medium,Tier 3,Supermarket Type3,3281.0624 +FDP52,18.7,reg,0.070691729,Frozen Foods,230.201,OUT046,1997,Small,Tier 1,Supermarket Type1,5742.525 +FDI50,,Regular,0.030693309,Canned,228.0352,OUT027,1985,Medium,Tier 3,Supermarket Type3,10306.584 +FDU48,18.85,Low Fat,0.055671582,Baking Goods,133.3284,OUT017,2007,,Tier 2,Supermarket Type1,263.6568 +FDS43,11.65,Low Fat,0.040507228,Fruits and Vegetables,186.924,OUT035,2004,Small,Tier 2,Supermarket Type1,2237.088 +NCM41,16.5,Low Fat,0.035626319,Health and Hygiene,93.112,OUT013,1987,High,Tier 3,Supermarket Type1,932.12 +FDP37,15.6,Low Fat,0.143688905,Breakfast,128.1994,OUT018,2009,Medium,Tier 3,Supermarket Type2,2184.4898 +FDJ44,12.3,Regular,0.106542886,Fruits and Vegetables,173.2396,OUT045,2002,,Tier 2,Supermarket Type1,3139.9128 +FDY38,,Regular,0.208662546,Dairy,231.83,OUT019,1985,Small,Tier 1,Grocery Store,466.06 +FDC20,10.65,Low Fat,0.024107056,Fruits and Vegetables,56.6272,OUT017,2007,,Tier 2,Supermarket Type1,447.4176 +FDF02,16.2,Low Fat,0.104058452,Canned,102.499,OUT017,2007,,Tier 2,Supermarket Type1,2063.98 +FDX38,10.5,Regular,0.048403392,Dairy,48.2376,OUT018,2009,Medium,Tier 3,Supermarket Type2,527.3136 +FDN50,,Regular,0.026391403,Canned,92.812,OUT027,1985,Medium,Tier 3,Supermarket Type3,2609.936 +FDA07,7.55,Regular,0.031007381,Fruits and Vegetables,123.4072,OUT045,2002,,Tier 2,Supermarket Type1,2082.6224 +FDT49,,Low Fat,0.150672399,Canned,104.728,OUT027,1985,Medium,Tier 3,Supermarket Type3,2450.144 +FDA09,13.35,Regular,0.149598628,Snack Foods,179.466,OUT049,1999,Medium,Tier 1,Supermarket Type1,3775.086 +FDV43,16,Low Fat,0.077290355,Fruits and Vegetables,44.5086,OUT017,2007,,Tier 2,Supermarket Type1,713.7376 +FDK58,,Regular,0.078758649,Snack Foods,103.0016,OUT019,1985,Small,Tier 1,Grocery Store,202.4032 +FDL22,16.85,Low Fat,0.036359891,Snack Foods,90.7488,OUT013,1987,High,Tier 3,Supermarket Type1,2263.72 +FDP56,8.185,Low Fat,0.046747071,Fruits and Vegetables,49.9692,OUT017,2007,,Tier 2,Supermarket Type1,837.5764 +DRL47,19.7,Low Fat,0,Hard Drinks,125.9362,OUT049,1999,Medium,Tier 1,Supermarket Type1,1635.8706 +NCT17,10.8,Low Fat,0.041865848,Health and Hygiene,189.7214,OUT046,1997,Small,Tier 1,Supermarket Type1,5841.0634 +FDR12,12.6,Regular,0.031713126,Baking Goods,172.5764,OUT017,2007,,Tier 2,Supermarket Type1,1030.6584 +FDD39,16.7,Low Fat,0.07044068,Dairy,216.885,OUT018,2009,Medium,Tier 3,Supermarket Type2,6275.165 +FDG04,13.1,Low Fat,0.006087409,Frozen Foods,185.0898,OUT018,2009,Medium,Tier 3,Supermarket Type2,1870.898 +FDV19,14.85,Regular,0.035456465,Fruits and Vegetables,162.2578,OUT017,2007,,Tier 2,Supermarket Type1,3690.5294 +FDS55,,Low Fat,0.142107998,Fruits and Vegetables,150.3734,OUT019,1985,Small,Tier 1,Grocery Store,296.9468 +FDM50,13,Regular,0.030064132,Canned,58.022,OUT013,1987,High,Tier 3,Supermarket Type1,898.83 +DRF13,12.1,Low Fat,0.029781363,Soft Drinks,146.9444,OUT046,1997,Small,Tier 1,Supermarket Type1,1596.5884 +FDJ48,11.3,Low Fat,0.056387854,Baking Goods,245.4118,OUT013,1987,High,Tier 3,Supermarket Type1,6669.3186 +FDM20,10,Low Fat,0.038653608,Fruits and Vegetables,245.4144,OUT013,1987,High,Tier 3,Supermarket Type1,7105.4176 +FDP24,20.6,Low Fat,0.083172413,Baking Goods,121.0756,OUT045,2002,,Tier 2,Supermarket Type1,1696.4584 +FDC16,11.5,Regular,0.020565921,Dairy,86.054,OUT035,2004,Small,Tier 2,Supermarket Type1,1384.864 +NCB42,11.8,LF,0.008609602,Health and Hygiene,114.8492,OUT017,2007,,Tier 2,Supermarket Type1,1390.1904 +FDN01,8.895,Low Fat,0.121180705,Breakfast,177.037,OUT010,1998,,Tier 3,Grocery Store,176.437 +FDT34,9.3,Low Fat,0.174703862,Snack Foods,104.0964,OUT045,2002,,Tier 2,Supermarket Type1,1788.3388 +FDA52,,Regular,0.127800388,Frozen Foods,177.037,OUT027,1985,Medium,Tier 3,Supermarket Type3,4587.362 +NCC18,19.1,Low Fat,0.296713665,Household,171.8422,OUT010,1998,,Tier 3,Grocery Store,1034.6532 +NCR41,17.85,Low Fat,0.018125948,Health and Hygiene,94.9094,OUT017,2007,,Tier 2,Supermarket Type1,761.6752 +FDX23,6.445,Low Fat,0.029859711,Baking Goods,94.1436,OUT017,2007,,Tier 2,Supermarket Type1,1418.154 +FDP39,12.65,Low Fat,0.116203156,Meat,53.5324,OUT010,1998,,Tier 3,Grocery Store,415.4592 +NCH07,13.15,Low Fat,0.09264951,Household,157.8604,OUT035,2004,Small,Tier 2,Supermarket Type1,3803.0496 +FDW47,,Low Fat,0.081197035,Breads,121.7414,OUT019,1985,Small,Tier 1,Grocery Store,365.5242 +DRD13,15,Low Fat,0.049070183,Soft Drinks,61.9168,OUT035,2004,Small,Tier 2,Supermarket Type1,767.0016 +FDR48,11.65,Low Fat,0.131394793,Baking Goods,151.9024,OUT013,1987,High,Tier 3,Supermarket Type1,1669.8264 +FDE17,20.1,Regular,0,Frozen Foods,152.2366,OUT010,1998,,Tier 3,Grocery Store,151.1366 +FDP60,17.35,Low Fat,0,Baking Goods,102.9016,OUT046,1997,Small,Tier 1,Supermarket Type1,1922.8304 +FDD57,18.1,Low Fat,0.022526293,Fruits and Vegetables,95.0094,OUT017,2007,,Tier 2,Supermarket Type1,1713.7692 +FDW13,8.5,low fat,0.163838951,Canned,51.3324,OUT010,1998,,Tier 3,Grocery Store,311.5944 +FDN24,14.1,Low Fat,0.11349714,Baking Goods,56.1956,OUT045,2002,,Tier 2,Supermarket Type1,1364.89 +FDJ34,11.8,Regular,0.094185483,Snack Foods,126.2704,OUT017,2007,,Tier 2,Supermarket Type1,2002.7264 +FDD46,6.035,low fat,0.14113846,Snack Foods,155.0998,OUT013,1987,High,Tier 3,Supermarket Type1,3691.1952 +FDF46,,Low Fat,0.164006137,Snack Foods,113.2834,OUT019,1985,Small,Tier 1,Grocery Store,575.917 +NCE43,12.5,Low Fat,0.17314115,Household,168.4448,OUT010,1998,,Tier 3,Grocery Store,170.4448 +FDN27,20.85,Low Fat,0.039555016,Meat,116.8808,OUT035,2004,Small,Tier 2,Supermarket Type1,820.2656 +FDW52,14,Regular,0.037580877,Frozen Foods,162.6526,OUT049,1999,Medium,Tier 1,Supermarket Type1,4275.7676 +DRH03,17.25,Low Fat,0.035064318,Dairy,92.412,OUT046,1997,Small,Tier 1,Supermarket Type1,1304.968 +NCM29,11.5,Low Fat,0.017678008,Health and Hygiene,129.2626,OUT045,2002,,Tier 2,Supermarket Type1,1705.1138 +FDR58,6.675,Low Fat,0.041986639,Snack Foods,93.2462,OUT049,1999,Medium,Tier 1,Supermarket Type1,1480.7392 +FDY50,5.8,Low Fat,0.130955811,Dairy,90.3172,OUT046,1997,Small,Tier 1,Supermarket Type1,1338.258 +FDE16,8.895,Low Fat,0.026492726,Frozen Foods,208.4954,OUT017,2007,,Tier 2,Supermarket Type1,6251.862 +NCE31,7.67,Low Fat,0.185130961,Household,32.9216,OUT049,1999,Medium,Tier 1,Supermarket Type1,588.5672 +FDE53,10.895,Low Fat,0.026934673,Frozen Foods,106.128,OUT045,2002,,Tier 2,Supermarket Type1,319.584 +DRK11,8.21,Low Fat,0,Hard Drinks,148.2392,OUT045,2002,,Tier 2,Supermarket Type1,1491.392 +DRH13,8.575,Low Fat,0.023866079,Soft Drinks,107.128,OUT013,1987,High,Tier 3,Supermarket Type1,958.752 +FDA11,7.75,Low Fat,0.043414959,Baking Goods,93.1436,OUT018,2009,Medium,Tier 3,Supermarket Type2,1418.154 +DRL35,,Low Fat,0.030554947,Hard Drinks,41.877,OUT027,1985,Medium,Tier 3,Supermarket Type3,1125.202 +DRF36,,Low Fat,0.023463124,Soft Drinks,190.6846,OUT027,1985,Medium,Tier 3,Supermarket Type3,9554.23 +FDI07,12.35,Regular,0.033951827,Meat,197.2426,OUT017,2007,,Tier 2,Supermarket Type1,2966.139 +FDI32,17.7,Low Fat,0.174228338,Fruits and Vegetables,117.1834,OUT013,1987,High,Tier 3,Supermarket Type1,691.1004 +DRL60,8.52,Low Fat,0.027169589,Soft Drinks,151.0682,OUT018,2009,Medium,Tier 3,Supermarket Type2,1829.6184 +NCY17,18.2,Low Fat,0.1630653,Health and Hygiene,43.3086,OUT035,2004,Small,Tier 2,Supermarket Type1,758.3462 +DRH36,,Low Fat,0.058444176,Soft Drinks,73.0696,OUT019,1985,Small,Tier 1,Grocery Store,223.7088 +FDX02,16,Low Fat,0.057049301,Dairy,225.9404,OUT035,2004,Small,Tier 2,Supermarket Type1,1350.2424 +FDG46,8.63,Regular,0.032960823,Snack Foods,115.0518,OUT049,1999,Medium,Tier 1,Supermarket Type1,1366.2216 +FDM60,10.8,Regular,0,Baking Goods,40.7138,OUT017,2007,,Tier 2,Supermarket Type1,406.138 +FDJ22,18.75,Low Fat,0.053025371,Snack Foods,192.5504,OUT018,2009,Medium,Tier 3,Supermarket Type2,2109.2544 +FDU59,5.78,Low Fat,0.096306016,Breads,161.9552,OUT013,1987,High,Tier 3,Supermarket Type1,2111.9176 +FDL38,13.8,Regular,0.014762987,Canned,90.7172,OUT045,2002,,Tier 2,Supermarket Type1,1338.258 +FDZ23,17.75,Regular,0.067446626,Baking Goods,184.724,OUT013,1987,High,Tier 3,Supermarket Type1,1677.816 +FDX52,11.5,Regular,0.042173667,Frozen Foods,194.682,OUT018,2009,Medium,Tier 3,Supermarket Type2,2316.984 +NCB42,11.8,LF,0.008578539,Health and Hygiene,117.6492,OUT045,2002,,Tier 2,Supermarket Type1,1158.492 +NCU18,15.1,Low Fat,0.056155909,Household,140.5496,OUT017,2007,,Tier 2,Supermarket Type1,2681.8424 +FDI32,,Low Fat,0.305305397,Fruits and Vegetables,116.6834,OUT019,1985,Small,Tier 1,Grocery Store,460.7336 +DRZ11,8.85,Regular,0.112571187,Soft Drinks,122.0388,OUT013,1987,High,Tier 3,Supermarket Type1,1609.9044 +NCL54,12.6,Low Fat,0.083221904,Household,174.5054,OUT017,2007,,Tier 2,Supermarket Type1,2626.581 +FDS19,13.8,Regular,0.064195136,Fruits and Vegetables,75.8012,OUT035,2004,Small,Tier 2,Supermarket Type1,1138.518 +DRB13,6.115,Regular,0.007055292,Soft Drinks,188.653,OUT049,1999,Medium,Tier 1,Supermarket Type1,3605.307 +DRI51,17.25,Low Fat,0.070703828,Dairy,170.3764,OUT010,1998,,Tier 3,Grocery Store,343.5528 +FDS57,,Low Fat,0.102941345,Snack Foods,142.047,OUT027,1985,Medium,Tier 3,Supermarket Type3,2719.793 +FDT39,6.26,Regular,0.009887927,Meat,150.7366,OUT045,2002,,Tier 2,Supermarket Type1,2418.1856 +FDH48,13.5,Low Fat,0.101231721,Baking Goods,86.254,OUT010,1998,,Tier 3,Grocery Store,173.108 +NCB18,19.6,Low Fat,0.069112952,Household,90.1514,OUT010,1998,,Tier 3,Grocery Store,442.757 +FDR25,,Regular,0.138846289,Canned,263.7884,OUT027,1985,Medium,Tier 3,Supermarket Type3,1324.942 +FDV21,11.5,Low Fat,0.171050595,Snack Foods,126.3704,OUT035,2004,Small,Tier 2,Supermarket Type1,3880.2824 +DRH23,14.65,Low Fat,0,Hard Drinks,54.9614,OUT049,1999,Medium,Tier 1,Supermarket Type1,552.614 +FDS52,8.89,Low Fat,0.005496816,Frozen Foods,102.8016,OUT018,2009,Medium,Tier 3,Supermarket Type2,1012.016 +NCC31,8.02,LF,0.033259081,Household,154.2972,OUT010,1998,,Tier 3,Grocery Store,1090.5804 +FDU03,18.7,Regular,0.092095924,Meat,183.3292,OUT017,2007,,Tier 2,Supermarket Type1,2006.7212 +FDG50,7.405,Low Fat,0.015295536,Canned,89.7146,OUT049,1999,Medium,Tier 1,Supermarket Type1,547.2876 +FDY31,5.98,Low Fat,0.043526599,Fruits and Vegetables,148.4418,OUT013,1987,High,Tier 3,Supermarket Type1,2354.2688 +FDX39,,Regular,0.049435598,Meat,209.7586,OUT027,1985,Medium,Tier 3,Supermarket Type3,5487.5236 +FDE46,,Low Fat,0.027610698,Snack Foods,149.5366,OUT019,1985,Small,Tier 1,Grocery Store,604.5464 +NCN29,15.2,Low Fat,0.012141036,Health and Hygiene,48.7034,OUT045,2002,,Tier 2,Supermarket Type1,680.4476 +DRF13,12.1,Low Fat,0.029949818,Soft Drinks,146.3444,OUT017,2007,,Tier 2,Supermarket Type1,3773.7544 +FDT46,,Low Fat,0.053939315,Snack Foods,52.1008,OUT019,1985,Small,Tier 1,Grocery Store,50.6008 +FDS58,9.285,Regular,0,Snack Foods,161.5578,OUT046,1997,Small,Tier 1,Supermarket Type1,4653.2762 +FDX52,,Regular,0.073541072,Frozen Foods,192.282,OUT019,1985,Small,Tier 1,Grocery Store,386.164 +FDP27,8.155,Low Fat,0.199935881,Meat,188.453,OUT010,1998,,Tier 3,Grocery Store,379.506 +FDX44,9.3,Low Fat,0.043033346,Fruits and Vegetables,89.4172,OUT049,1999,Medium,Tier 1,Supermarket Type1,1159.8236 +DRO35,13.85,Low Fat,0.034570357,Hard Drinks,117.4492,OUT046,1997,Small,Tier 1,Supermarket Type1,3243.7776 +FDC59,16.7,Regular,0.054739692,Starchy Foods,65.7168,OUT045,2002,,Tier 2,Supermarket Type1,1086.5856 +FDB12,11.15,Regular,0.105471384,Baking Goods,105.8648,OUT049,1999,Medium,Tier 1,Supermarket Type1,1973.4312 +FDU26,16.7,Regular,0.042610897,Dairy,117.2782,OUT035,2004,Small,Tier 2,Supermarket Type1,715.0692 +NCF30,17,Low Fat,0.126758324,Household,124.5362,OUT018,2009,Medium,Tier 3,Supermarket Type2,1132.5258 +FDX20,7.365,Low Fat,0.042524835,Fruits and Vegetables,228.372,OUT013,1987,High,Tier 3,Supermarket Type1,4527.44 +FDN02,16.5,Low Fat,0.073813788,Canned,207.2638,OUT035,2004,Small,Tier 2,Supermarket Type1,5383.6588 +DRC27,13.8,Low Fat,0.097251621,Dairy,245.7802,OUT010,1998,,Tier 3,Grocery Store,245.6802 +FDZ38,,Low Fat,0.014008751,Dairy,171.3422,OUT019,1985,Small,Tier 1,Grocery Store,862.211 +DRH25,18.7,Low Fat,0.02442574,Soft Drinks,52.9324,OUT010,1998,,Tier 3,Grocery Store,51.9324 +FDK21,7.905,Low Fat,0.010012319,Snack Foods,250.4408,OUT046,1997,Small,Tier 1,Supermarket Type1,3004.0896 +FDT01,13.65,Regular,0.184454044,Canned,211.4902,OUT049,1999,Medium,Tier 1,Supermarket Type1,4035.4138 +FDZ09,17.6,Low Fat,0.105042025,Snack Foods,163.8868,OUT049,1999,Medium,Tier 1,Supermarket Type1,3111.9492 +DRL37,15.5,Low Fat,0.053589594,Soft Drinks,44.177,OUT018,2009,Medium,Tier 3,Supermarket Type2,173.108 +FDN49,17.25,Regular,0.125734578,Breakfast,41.748,OUT018,2009,Medium,Tier 3,Supermarket Type2,199.74 +FDC22,6.89,Regular,0.136705075,Snack Foods,194.882,OUT045,2002,,Tier 2,Supermarket Type1,4440.886 +FDT33,7.81,Regular,0.03412912,Snack Foods,165.1158,OUT018,2009,Medium,Tier 3,Supermarket Type2,1838.2738 +NCB43,20.2,Low Fat,0.100319317,Household,188.6898,OUT018,2009,Medium,Tier 3,Supermarket Type2,3367.6164 +DRI25,,Low Fat,0.033737273,Soft Drinks,56.6614,OUT027,1985,Medium,Tier 3,Supermarket Type3,607.8754 +FDD21,10.3,Regular,0.030569229,Fruits and Vegetables,113.1176,OUT046,1997,Small,Tier 1,Supermarket Type1,4695.2216 +FDS23,4.635,Low Fat,0.14086247,Breads,126.4994,OUT035,2004,Small,Tier 2,Supermarket Type1,1670.4922 +FDS13,6.465,Low Fat,0.208397715,Canned,265.2884,OUT010,1998,,Tier 3,Grocery Store,264.9884 +DRI03,,Low Fat,0.039751236,Dairy,176.9028,OUT019,1985,Small,Tier 1,Grocery Store,708.4112 +FDU58,6.61,Regular,0,Snack Foods,186.4898,OUT045,2002,,Tier 2,Supermarket Type1,2993.4368 +FDL09,,Regular,0.127416049,Snack Foods,167.4816,OUT027,1985,Medium,Tier 3,Supermarket Type3,1006.6896 +FDS12,9.1,Low Fat,0.291438755,Baking Goods,126.8362,OUT010,1998,,Tier 3,Grocery Store,125.8362 +FDP03,5.15,Regular,0.06112617,Meat,122.5388,OUT013,1987,High,Tier 3,Supermarket Type1,371.5164 +FDI21,,Regular,0.056328717,Snack Foods,63.9168,OUT027,1985,Medium,Tier 3,Supermarket Type3,1597.92 +FDW45,18,Low Fat,0.03901099,Snack Foods,147.7418,OUT046,1997,Small,Tier 1,Supermarket Type1,4119.9704 +NCA18,10.1,Low Fat,0.093862362,Household,115.9492,OUT010,1998,,Tier 3,Grocery Store,231.6984 +FDN32,,Low Fat,0.015485016,Fruits and Vegetables,185.6266,OUT027,1985,Medium,Tier 3,Supermarket Type3,4979.5182 +FDR15,,Regular,0.033276066,Meat,153.8314,OUT027,1985,Medium,Tier 3,Supermarket Type3,3723.1536 +DRK11,8.21,Low Fat,0.010781158,Hard Drinks,149.9392,OUT049,1999,Medium,Tier 1,Supermarket Type1,1938.8096 +DRG49,7.81,Low Fat,0.067730081,Soft Drinks,242.6486,OUT018,2009,Medium,Tier 3,Supermarket Type2,2199.1374 +FDD29,12.15,Low Fat,0.018410515,Frozen Foods,252.1698,OUT046,1997,Small,Tier 1,Supermarket Type1,2283.0282 +FDE33,19.35,Regular,0.083079826,Fruits and Vegetables,80.3644,OUT010,1998,,Tier 3,Grocery Store,157.1288 +FDJ58,15.6,Regular,0.176244038,Snack Foods,173.6764,OUT010,1998,,Tier 3,Grocery Store,515.3292 +FDM46,7.365,Low Fat,0.160216552,Snack Foods,93.512,OUT049,1999,Medium,Tier 1,Supermarket Type1,1677.816 +FDD23,9.5,Regular,0.048676324,Starchy Foods,187.7898,OUT035,2004,Small,Tier 2,Supermarket Type1,2057.9878 +DRM35,,Low Fat,0.070103425,Hard Drinks,179.4344,OUT027,1985,Medium,Tier 3,Supermarket Type3,5888.3352 +DRC25,5.73,Low Fat,0.045556681,Soft Drinks,85.3882,OUT018,2009,Medium,Tier 3,Supermarket Type2,1288.323 +FDL36,15.1,Low Fat,0.076193763,Baking Goods,89.783,OUT049,1999,Medium,Tier 1,Supermarket Type1,2247.075 +FDD41,6.765,Regular,0.087187488,Frozen Foods,105.5306,OUT013,1987,High,Tier 3,Supermarket Type1,1567.959 +FDV19,14.85,Regular,0.035311852,Fruits and Vegetables,160.9578,OUT049,1999,Medium,Tier 1,Supermarket Type1,4813.734 +FDR44,6.11,Regular,0.103080901,Fruits and Vegetables,131.2968,OUT049,1999,Medium,Tier 1,Supermarket Type1,1957.452 +FDX50,20.1,Low Fat,0.075049323,Dairy,110.4228,OUT017,2007,,Tier 2,Supermarket Type1,1105.228 +DRC25,5.73,Low Fat,0.045463871,Soft Drinks,85.2882,OUT045,2002,,Tier 2,Supermarket Type1,2061.3168 +FDA15,,Low Fat,0.015944801,Dairy,249.5092,OUT027,1985,Medium,Tier 3,Supermarket Type3,6474.2392 +FDX22,6.785,Regular,0.022974812,Snack Foods,208.7928,OUT046,1997,Small,Tier 1,Supermarket Type1,5890.9984 +FDJ50,8.645,Low Fat,0.021629781,Canned,51.9982,OUT045,2002,,Tier 2,Supermarket Type1,999.3658 +FDT13,,Low Fat,0.032516546,Canned,188.8214,OUT019,1985,Small,Tier 1,Grocery Store,753.6856 +FDN12,15.6,Low Fat,0.081036436,Baking Goods,112.3544,OUT013,1987,High,Tier 3,Supermarket Type1,2572.6512 +FDD58,7.76,LF,0.059472609,Snack Foods,98.77,OUT045,2002,,Tier 2,Supermarket Type1,1298.31 +FDM04,9.195,Regular,0.047081398,Frozen Foods,51.1666,OUT013,1987,High,Tier 3,Supermarket Type1,1179.1318 +FDA23,9.8,Low Fat,0.047260402,Baking Goods,102.8016,OUT049,1999,Medium,Tier 1,Supermarket Type1,1922.8304 +FDW28,18.25,LF,0.148673586,Frozen Foods,197.2452,OUT010,1998,,Tier 3,Grocery Store,195.7452 +FDA45,21.25,Low Fat,0.156012631,Snack Foods,177.337,OUT018,2009,Medium,Tier 3,Supermarket Type2,2822.992 +NCO26,7.235,Low Fat,0.077011493,Household,117.3492,OUT045,2002,,Tier 2,Supermarket Type1,1506.0396 +FDV26,20.25,Regular,0.07614605,Dairy,197.0794,OUT035,2004,Small,Tier 2,Supermarket Type1,4681.9056 +FDC50,,Low Fat,0.135836915,Canned,93.8094,OUT027,1985,Medium,Tier 3,Supermarket Type3,3237.1196 +NCV05,,Low Fat,0.030062224,Health and Hygiene,154.3656,OUT027,1985,Medium,Tier 3,Supermarket Type3,2471.4496 +FDW48,18,Low Fat,0.008575615,Baking Goods,80.2618,OUT018,2009,Medium,Tier 3,Supermarket Type2,644.4944 +FDS55,7.02,Low Fat,0.081096635,Fruits and Vegetables,148.4734,OUT013,1987,High,Tier 3,Supermarket Type1,3563.3616 +FDX32,15.1,Regular,0.100060762,Fruits and Vegetables,144.0786,OUT045,2002,,Tier 2,Supermarket Type1,2600.6148 +FDC53,8.68,Low Fat,0.008834023,Frozen Foods,100.0384,OUT035,2004,Small,Tier 2,Supermarket Type1,2266.3832 +FDG35,21.2,Regular,0.007069662,Starchy Foods,175.7738,OUT018,2009,Medium,Tier 3,Supermarket Type2,1911.5118 +NCC30,16.6,Low Fat,0.046161923,Household,176.6344,OUT010,1998,,Tier 3,Grocery Store,356.8688 +NCZ17,12.15,Low Fat,0.079592733,Health and Hygiene,37.3506,OUT045,2002,,Tier 2,Supermarket Type1,645.1602 +FDZ56,16.25,Low Fat,0.025776994,Fruits and Vegetables,169.9474,OUT049,1999,Medium,Tier 1,Supermarket Type1,2863.6058 +NCS05,11.5,Low Fat,0.020960615,Health and Hygiene,133.2942,OUT013,1987,High,Tier 3,Supermarket Type1,2649.884 +DRC25,,Low Fat,0,Soft Drinks,87.3882,OUT027,1985,Medium,Tier 3,Supermarket Type3,1374.2112 +FDW59,13.15,Low Fat,0.020715913,Breads,83.5566,OUT046,1997,Small,Tier 1,Supermarket Type1,1268.349 +FDB36,5.465,Regular,0.048801674,Baking Goods,132.1626,OUT017,2007,,Tier 2,Supermarket Type1,1573.9512 +FDT37,14.15,Low Fat,0,Canned,253.7014,OUT045,2002,,Tier 2,Supermarket Type1,5865.0322 +FDG47,12.8,Low Fat,0.069605676,Starchy Foods,261.9252,OUT035,2004,Small,Tier 2,Supermarket Type1,4984.1788 +FDM45,8.655,Regular,0.088373591,Snack Foods,119.3756,OUT045,2002,,Tier 2,Supermarket Type1,1454.1072 +FDQ40,,Regular,0.035853059,Frozen Foods,176.8712,OUT027,1985,Medium,Tier 3,Supermarket Type3,3691.1952 +FDF34,9.3,Regular,0.01404119,Snack Foods,199.1084,OUT049,1999,Medium,Tier 1,Supermarket Type1,396.8168 +FDP24,20.6,Low Fat,0.083473583,Baking Goods,120.8756,OUT017,2007,,Tier 2,Supermarket Type1,1211.756 +FDT55,,Regular,0.076434542,Fruits and Vegetables,155.8946,OUT019,1985,Small,Tier 1,Grocery Store,473.3838 +FDH60,19.7,reg,0.08073703,Baking Goods,197.011,OUT046,1997,Small,Tier 1,Supermarket Type1,3338.987 +FDF57,14.5,Regular,0,Fruits and Vegetables,169.6448,OUT035,2004,Small,Tier 2,Supermarket Type1,2045.3376 +NCX29,10,Low Fat,0.089152528,Health and Hygiene,147.7102,OUT046,1997,Small,Tier 1,Supermarket Type1,437.4306 +FDD34,7.945,Low Fat,0.015863075,Snack Foods,161.821,OUT013,1987,High,Tier 3,Supermarket Type1,2446.815 +FDQ15,20.35,Regular,0.151308326,Meat,81.7276,OUT049,1999,Medium,Tier 1,Supermarket Type1,2030.69 +FDL12,15.85,Regular,0.121609722,Baking Goods,60.222,OUT035,2004,Small,Tier 2,Supermarket Type1,539.298 +FDS22,16.85,Regular,0.023135131,Snack Foods,44.8428,OUT013,1987,High,Tier 3,Supermarket Type1,703.0848 +NCM29,11.5,Low Fat,0.017714096,Health and Hygiene,132.9626,OUT018,2009,Medium,Tier 3,Supermarket Type2,1442.7886 +FDO24,11.1,low fat,0,Baking Goods,156.4604,OUT049,1999,Medium,Tier 1,Supermarket Type1,2376.906 +NCJ43,6.635,Low Fat,0.027069402,Household,174.9396,OUT046,1997,Small,Tier 1,Supermarket Type1,1744.396 +FDA37,7.81,Regular,0.055226755,Canned,123.1046,OUT046,1997,Small,Tier 1,Supermarket Type1,871.5322 +NCM07,9.395,Low Fat,0.040124625,Others,85.1908,OUT018,2009,Medium,Tier 3,Supermarket Type2,1342.2528 +FDT49,7,Low Fat,0.151376958,Canned,108.228,OUT035,2004,Small,Tier 2,Supermarket Type1,1171.808 +FDP23,6.71,Low Fat,0.03558013,Breads,217.5166,OUT035,2004,Small,Tier 2,Supermarket Type1,4572.0486 +DRF51,15.75,Low Fat,0.166513779,Dairy,38.0506,OUT018,2009,Medium,Tier 3,Supermarket Type2,265.6542 +NCZ41,19.85,Low Fat,0.06478563,Health and Hygiene,123.7704,OUT017,2007,,Tier 2,Supermarket Type1,2503.408 +DRJ11,9.5,Low Fat,0.085223447,Hard Drinks,189.2872,OUT049,1999,Medium,Tier 1,Supermarket Type1,6050.7904 +FDP37,15.6,Low Fat,0.143915417,Breakfast,127.5994,OUT017,2007,,Tier 2,Supermarket Type1,2441.4886 +FDT60,,Low Fat,0.132275338,Baking Goods,123.8388,OUT019,1985,Small,Tier 1,Grocery Store,123.8388 +FDA09,13.35,Regular,0.149338159,Snack Foods,178.666,OUT035,2004,Small,Tier 2,Supermarket Type1,1797.66 +FDJ46,11.1,Low Fat,0.044823438,Snack Foods,174.2054,OUT046,1997,Small,Tier 1,Supermarket Type1,1926.1594 +FDO48,15,Regular,0.02681843,Baking Goods,219.7456,OUT013,1987,High,Tier 3,Supermarket Type1,3094.6384 +FDS59,14.8,Regular,0.04407225,Breads,109.057,OUT018,2009,Medium,Tier 3,Supermarket Type2,1428.141 +FDH44,19.1,Regular,0.025872153,Fruits and Vegetables,145.7418,OUT046,1997,Small,Tier 1,Supermarket Type1,882.8508 +NCM05,6.825,Low Fat,0.059835659,Health and Hygiene,264.3226,OUT035,2004,Small,Tier 2,Supermarket Type1,4229.1616 +NCU06,,Low Fat,0.13027716,Household,228.001,OUT019,1985,Small,Tier 1,Grocery Store,1148.505 +FDV13,17.35,Regular,0.027653795,Canned,88.0856,OUT049,1999,Medium,Tier 1,Supermarket Type1,1318.284 +FDA23,9.8,Low Fat,0.04714777,Baking Goods,102.4016,OUT013,1987,High,Tier 3,Supermarket Type1,1720.4272 +FDJ60,19.35,Regular,0.062882112,Baking Goods,164.1184,OUT017,2007,,Tier 2,Supermarket Type1,2807.0128 +FDN13,18.6,Low Fat,0.152294691,Breakfast,98.9358,OUT049,1999,Medium,Tier 1,Supermarket Type1,1508.037 +DRF49,7.27,LF,0.071064499,Soft Drinks,114.4518,OUT035,2004,Small,Tier 2,Supermarket Type1,1366.2216 +FDK20,12.6,Regular,0.041726942,Fruits and Vegetables,122.0072,OUT018,2009,Medium,Tier 3,Supermarket Type2,1470.0864 +FDB27,,Low Fat,0.055121892,Dairy,196.7768,OUT027,1985,Medium,Tier 3,Supermarket Type3,5912.304 +NCS18,12.65,Low Fat,0.042211119,Household,108.6938,OUT046,1997,Small,Tier 1,Supermarket Type1,1393.5194 +FDZ49,,Regular,0.132500853,Canned,220.3798,OUT027,1985,Medium,Tier 3,Supermarket Type3,5289.1152 +FDN32,17.5,Low Fat,0.015557426,Fruits and Vegetables,184.7266,OUT035,2004,Small,Tier 2,Supermarket Type1,2213.1192 +FDO37,8.06,Low Fat,0.021409913,Breakfast,229.7326,OUT049,1999,Medium,Tier 1,Supermarket Type1,6930.978 +NCD31,12.1,LF,0.015497337,Household,165.5526,OUT018,2009,Medium,Tier 3,Supermarket Type2,3453.5046 +NCV30,,Low Fat,0.065612808,Household,62.351,OUT027,1985,Medium,Tier 3,Supermarket Type3,2150.534 +FDY49,17.2,Regular,0.012030747,Canned,166.6184,OUT049,1999,Medium,Tier 1,Supermarket Type1,1155.8288 +FDM10,,Low Fat,0.075603699,Snack Foods,215.1218,OUT027,1985,Medium,Tier 3,Supermarket Type3,3205.827 +FDT11,5.94,Regular,0.029372367,Breads,186.7556,OUT046,1997,Small,Tier 1,Supermarket Type1,3942.8676 +FDD39,16.7,low fat,0.070096518,Dairy,217.885,OUT013,1987,High,Tier 3,Supermarket Type1,3894.93 +NCL31,7.39,Low Fat,0.120258245,Others,141.547,OUT035,2004,Small,Tier 2,Supermarket Type1,2290.352 +FDZ47,20.7,Regular,0.079281476,Baking Goods,100.1042,OUT035,2004,Small,Tier 2,Supermarket Type1,892.8378 +NCU18,,Low Fat,0.097768728,Household,142.4496,OUT019,1985,Small,Tier 1,Grocery Store,564.5984 +FDJ58,,Regular,0.104786172,Snack Foods,172.2764,OUT027,1985,Medium,Tier 3,Supermarket Type3,1545.9876 +FDX12,18.2,Regular,0.043626605,Baking Goods,241.4196,OUT010,1998,,Tier 3,Grocery Store,482.0392 +FDV60,20.2,Regular,0.117839328,Baking Goods,195.211,OUT018,2009,Medium,Tier 3,Supermarket Type2,2356.932 +NCB19,,Low Fat,0.089858447,Household,84.5882,OUT027,1985,Medium,Tier 3,Supermarket Type3,2061.3168 +FDH45,,Regular,0.185008985,Fruits and Vegetables,42.3796,OUT019,1985,Small,Tier 1,Grocery Store,123.8388 +FDB03,17.75,Regular,0.156701315,Dairy,240.7538,OUT013,1987,High,Tier 3,Supermarket Type1,4566.7222 +FDI27,8.71,Regular,0,Dairy,43.5744,OUT017,2007,,Tier 2,Supermarket Type1,498.0184 +FDN22,18.85,Regular,0.139087683,Snack Foods,251.7724,OUT017,2007,,Tier 2,Supermarket Type1,3020.0688 +FDQ37,20.75,Low Fat,0.089243789,Breakfast,192.0478,OUT035,2004,Small,Tier 2,Supermarket Type1,4649.9472 +FDM02,12.5,Regular,0.073721115,Canned,85.6198,OUT035,2004,Small,Tier 2,Supermarket Type1,610.5386 +FDW38,5.325,Regular,0.138679995,Dairy,53.7298,OUT046,1997,Small,Tier 1,Supermarket Type1,862.8768 +FDP34,,Low Fat,0.240268248,Snack Foods,156.463,OUT019,1985,Small,Tier 1,Grocery Store,312.926 +FDY55,16.75,Low Fat,0,Fruits and Vegetables,255.3988,OUT046,1997,Small,Tier 1,Supermarket Type1,4625.9784 +FDL34,16,Low Fat,0.040911824,Snack Foods,141.2496,OUT013,1987,High,Tier 3,Supermarket Type1,3387.5904 +FDA09,13.35,Regular,0.149974858,Snack Foods,179.766,OUT018,2009,Medium,Tier 3,Supermarket Type2,5932.278 +FDM51,11.8,Regular,0.026072872,Meat,99.8674,OUT017,2007,,Tier 2,Supermarket Type1,1018.674 +FDI34,10.65,Regular,0.085482761,Snack Foods,231.4668,OUT018,2009,Medium,Tier 3,Supermarket Type2,3225.1352 +NCD31,12.1,LF,0.015521768,Household,165.8526,OUT017,2007,,Tier 2,Supermarket Type1,3124.5994 +FDW33,9.395,Low Fat,0.099101845,Snack Foods,105.828,OUT035,2004,Small,Tier 2,Supermarket Type1,1704.448 +NCP05,19.6,Low Fat,0.025281802,Health and Hygiene,152.0024,OUT035,2004,Small,Tier 2,Supermarket Type1,2884.2456 +FDL56,14.1,Low Fat,0.125675936,Fruits and Vegetables,86.9198,OUT013,1987,High,Tier 3,Supermarket Type1,1133.8574 +FDN01,,Low Fat,0.07204818,Breakfast,177.937,OUT027,1985,Medium,Tier 3,Supermarket Type3,6881.043 +FDA25,16.5,Regular,0.068263916,Canned,104.799,OUT045,2002,,Tier 2,Supermarket Type1,1238.388 +FDF08,14.3,Regular,0.109144085,Fruits and Vegetables,88.2856,OUT010,1998,,Tier 3,Grocery Store,175.7712 +FDH08,7.51,Low Fat,0.017425784,Fruits and Vegetables,227.901,OUT035,2004,Small,Tier 2,Supermarket Type1,459.402 +DRH03,17.25,low fat,0.035118834,Dairy,93.412,OUT049,1999,Medium,Tier 1,Supermarket Type1,932.12 +FDQ31,5.785,Regular,0.054066567,Fruits and Vegetables,87.0856,OUT018,2009,Medium,Tier 3,Supermarket Type2,1406.1696 +FDO10,13.65,Regular,0.012823829,Snack Foods,55.5588,OUT017,2007,,Tier 2,Supermarket Type1,916.1408 +FDT39,6.26,reg,0.009883257,Meat,149.8366,OUT049,1999,Medium,Tier 1,Supermarket Type1,1964.7758 +FDM22,,Regular,0.041754584,Snack Foods,53.464,OUT027,1985,Medium,Tier 3,Supermarket Type3,1597.92 +FDR21,19.7,Low Fat,0.112036236,Snack Foods,174.937,OUT010,1998,,Tier 3,Grocery Store,882.185 +FDQ01,19.7,Regular,0.161610636,Canned,255.2014,OUT017,2007,,Tier 2,Supermarket Type1,3570.0196 +FDZ03,13.65,Regular,0.078909166,Dairy,186.724,OUT049,1999,Medium,Tier 1,Supermarket Type1,4474.176 +NCK05,20.1,Low Fat,0.077769768,Health and Hygiene,63.0536,OUT018,2009,Medium,Tier 3,Supermarket Type2,980.0576 +FDW55,12.6,Regular,0.021951613,Fruits and Vegetables,250.9092,OUT013,1987,High,Tier 3,Supermarket Type1,4731.1748 +FDF47,20.85,Low Fat,0.097770004,Starchy Foods,222.8746,OUT049,1999,Medium,Tier 1,Supermarket Type1,3589.9936 +DRO59,,Low Fat,0.094817105,Hard Drinks,77.9012,OUT019,1985,Small,Tier 1,Grocery Store,75.9012 +NCM55,15.6,Low Fat,0.066726133,Others,185.8924,OUT046,1997,Small,Tier 1,Supermarket Type1,3516.7556 +FDY31,5.98,Low Fat,0.043809261,Fruits and Vegetables,146.8418,OUT017,2007,,Tier 2,Supermarket Type1,1765.7016 +FDJ57,,Regular,0,Seafood,184.3582,OUT019,1985,Small,Tier 1,Grocery Store,185.7582 +FDV51,16.35,Low Fat,0.032671446,Meat,165.4842,OUT018,2009,Medium,Tier 3,Supermarket Type2,1492.0578 +DRG36,14.15,Low Fat,0.095378221,Soft Drinks,170.5106,OUT046,1997,Small,Tier 1,Supermarket Type1,2395.5484 +DRF13,12.1,Low Fat,0,Soft Drinks,145.1444,OUT013,1987,High,Tier 3,Supermarket Type1,3338.3212 +NCJ54,9.895,Low Fat,0.060188932,Household,233.0642,OUT045,2002,,Tier 2,Supermarket Type1,6041.4692 +NCP42,8.51,Low Fat,0.016135764,Household,195.6478,OUT049,1999,Medium,Tier 1,Supermarket Type1,4262.4516 +NCF30,17,LF,0.126220187,Household,126.7362,OUT035,2004,Small,Tier 2,Supermarket Type1,1258.362 +FDY44,,Regular,0.024286378,Fruits and Vegetables,194.711,OUT027,1985,Medium,Tier 3,Supermarket Type3,5892.33 +FDX09,9,Low Fat,0.065350715,Snack Foods,175.437,OUT049,1999,Medium,Tier 1,Supermarket Type1,3175.866 +NCU30,5.11,Low Fat,0.035071955,Household,163.221,OUT017,2007,,Tier 2,Supermarket Type1,2773.057 +FDU49,19.5,Regular,0.030742083,Canned,85.554,OUT049,1999,Medium,Tier 1,Supermarket Type1,1211.756 +FDC48,9.195,Low Fat,0.015949001,Baking Goods,84.1592,OUT017,2007,,Tier 2,Supermarket Type1,1238.388 +FDJ21,16.7,Regular,0.038496166,Snack Foods,147.5102,OUT013,1987,High,Tier 3,Supermarket Type1,5540.7876 +NCX41,19,Low Fat,0.017746826,Health and Hygiene,210.8244,OUT049,1999,Medium,Tier 1,Supermarket Type1,2540.6928 +FDT36,12.3,Low Fat,0.111274591,Baking Goods,35.0874,OUT046,1997,Small,Tier 1,Supermarket Type1,458.7362 +FDK28,,Low Fat,0.065272284,Frozen Foods,256.1646,OUT027,1985,Medium,Tier 3,Supermarket Type3,3349.6398 +DRI49,14.15,Low Fat,0.183472595,Soft Drinks,82.0276,OUT035,2004,Small,Tier 2,Supermarket Type1,1624.552 +NCM54,,Low Fat,0.08918772,Household,128.9678,OUT019,1985,Small,Tier 1,Grocery Store,254.3356 +FDD48,10.395,Low Fat,0.030281543,Baking Goods,116.3176,OUT018,2009,Medium,Tier 3,Supermarket Type2,1259.6936 +NCF30,17,Low Fat,0.211306673,Household,125.1362,OUT010,1998,,Tier 3,Grocery Store,251.6724 +FDX03,15.85,Regular,0.061190964,Meat,47.1744,OUT049,1999,Medium,Tier 1,Supermarket Type1,996.0368 +FDZ33,10.195,Low Fat,0.107307677,Snack Foods,149.8076,OUT013,1987,High,Tier 3,Supermarket Type1,2217.114 +FDB39,,Low Fat,0.067441726,Dairy,57.4272,OUT019,1985,Small,Tier 1,Grocery Store,111.8544 +DRM11,6.57,Low Fat,0.066338717,Hard Drinks,261.4278,OUT018,2009,Medium,Tier 3,Supermarket Type2,4165.2448 +DRE48,8.43,Low Fat,0,Soft Drinks,195.3768,OUT017,2007,,Tier 2,Supermarket Type1,1576.6144 +NCL31,7.39,Low Fat,0.120524922,Others,142.247,OUT045,2002,,Tier 2,Supermarket Type1,2433.499 +FDB11,16,LF,0.061192211,Starchy Foods,224.1404,OUT017,2007,,Tier 2,Supermarket Type1,4725.8484 +FDX14,13.1,Low Fat,0.075056542,Dairy,76.0354,OUT049,1999,Medium,Tier 1,Supermarket Type1,601.8832 +NCM29,,Low Fat,0.017556795,Health and Hygiene,129.9626,OUT027,1985,Medium,Tier 3,Supermarket Type3,3410.2276 +FDH47,13.5,reg,0.129077455,Starchy Foods,95.2068,OUT045,2002,,Tier 2,Supermarket Type1,583.2408 +FDG09,20.6,Regular,0.047896393,Fruits and Vegetables,185.8556,OUT013,1987,High,Tier 3,Supermarket Type1,1689.8004 +FDP25,15.2,Low Fat,0.021240491,Canned,216.9824,OUT049,1999,Medium,Tier 1,Supermarket Type1,4804.4128 +FDY27,,Low Fat,0.031743707,Dairy,179.1344,OUT027,1985,Medium,Tier 3,Supermarket Type3,1605.9096 +DRM59,5.88,Low Fat,0.003612411,Hard Drinks,154.1998,OUT017,2007,,Tier 2,Supermarket Type1,3537.3954 +DRI03,6.03,Low Fat,0.022796178,Dairy,178.1028,OUT018,2009,Medium,Tier 3,Supermarket Type2,1416.8224 +FDY03,,Regular,0.133279499,Meat,112.6202,OUT019,1985,Small,Tier 1,Grocery Store,675.1212 +NCV17,18.85,Low Fat,0.016132592,Health and Hygiene,130.2626,OUT049,1999,Medium,Tier 1,Supermarket Type1,3016.7398 +NCJ17,7.68,Low Fat,0.152429537,Health and Hygiene,85.5224,OUT013,1987,High,Tier 3,Supermarket Type1,1278.336 +NCP54,15.35,Low Fat,0.035348491,Household,124.673,OUT017,2007,,Tier 2,Supermarket Type1,2093.941 +FDZ15,13.1,Low Fat,0.020903193,Dairy,119.2782,OUT049,1999,Medium,Tier 1,Supermarket Type1,3098.6332 +NCR05,10.1,Low Fat,0.054853377,Health and Hygiene,198.6084,OUT018,2009,Medium,Tier 3,Supermarket Type2,2182.4924 +FDX03,,Regular,0.106971167,Meat,44.7744,OUT019,1985,Small,Tier 1,Grocery Store,135.8232 +FDQ12,12.65,Low Fat,0.035482562,Baking Goods,231.401,OUT045,2002,,Tier 2,Supermarket Type1,2526.711 +FDC21,14.6,Regular,0.042923071,Fruits and Vegetables,109.8254,OUT013,1987,High,Tier 3,Supermarket Type1,1627.881 +FDQ40,11.1,Regular,0.036174285,Frozen Foods,176.0712,OUT018,2009,Medium,Tier 3,Supermarket Type2,1581.9408 +FDI07,,Regular,0.033597374,Meat,197.2426,OUT027,1985,Medium,Tier 3,Supermarket Type3,3163.8816 +FDQ25,8.63,Regular,0.028320655,Canned,172.5422,OUT049,1999,Medium,Tier 1,Supermarket Type1,2241.7486 +NCK18,9.6,Low Fat,0,Household,163.9184,OUT035,2004,Small,Tier 2,Supermarket Type1,4293.0784 +DRI25,19.6,Low Fat,0.056744064,Soft Drinks,55.6614,OUT010,1998,,Tier 3,Grocery Store,165.7842 +DRA24,19.35,Regular,0.039990314,Soft Drinks,165.0868,OUT049,1999,Medium,Tier 1,Supermarket Type1,982.7208 +FDA32,14,Low Fat,0.030155224,Fruits and Vegetables,214.7192,OUT045,2002,,Tier 2,Supermarket Type1,3020.0688 +FDE59,12.15,Low Fat,0.062541552,Starchy Foods,34.3532,OUT018,2009,Medium,Tier 3,Supermarket Type2,251.6724 +FDY59,8.195,Low Fat,0.031403441,Baking Goods,93.8462,OUT046,1997,Small,Tier 1,Supermarket Type1,647.8234 +FDQ20,8.325,Low Fat,0.029845243,Fruits and Vegetables,41.6138,OUT045,2002,,Tier 2,Supermarket Type1,284.2966 +FDB21,7.475,Low Fat,0.149125615,Fruits and Vegetables,241.6854,OUT018,2009,Medium,Tier 3,Supermarket Type2,6042.135 +FDB41,,Regular,0.170382726,Frozen Foods,45.2718,OUT019,1985,Small,Tier 1,Grocery Store,47.2718 +DRG11,6.385,Low Fat,0.083768522,Hard Drinks,109.8596,OUT013,1987,High,Tier 3,Supermarket Type1,3235.788 +FDV10,,Regular,0.116793684,Snack Foods,41.0112,OUT019,1985,Small,Tier 1,Grocery Store,42.6112 +FDI41,18.5,Regular,0.062205112,Frozen Foods,148.3418,OUT013,1987,High,Tier 3,Supermarket Type1,1765.7016 +FDN10,11.5,Low Fat,0.0463847,Snack Foods,118.9124,OUT017,2007,,Tier 2,Supermarket Type1,1540.6612 +NCM17,7.93,Low Fat,0.071425647,Health and Hygiene,45.9086,OUT018,2009,Medium,Tier 3,Supermarket Type2,1070.6064 +DRG37,,LF,0.033929133,Soft Drinks,154.3972,OUT019,1985,Small,Tier 1,Grocery Store,311.5944 +FDA21,13.65,Low Fat,0.036033639,Snack Foods,183.7924,OUT045,2002,,Tier 2,Supermarket Type1,2591.2936 +FDM27,12.35,Regular,0.158337479,Meat,157.9946,OUT013,1987,High,Tier 3,Supermarket Type1,3313.6866 +FDA32,14,Low Fat,0.030140981,Fruits and Vegetables,216.0192,OUT049,1999,Medium,Tier 1,Supermarket Type1,2588.6304 +NCZ53,9.6,Low Fat,0.024515221,Health and Hygiene,189.2214,OUT049,1999,Medium,Tier 1,Supermarket Type1,3956.8494 +FDW40,14,Regular,0.105125569,Frozen Foods,143.2812,OUT035,2004,Small,Tier 2,Supermarket Type1,3277.0676 +FDS52,8.89,Low Fat,0.00547348,Frozen Foods,100.5016,OUT035,2004,Small,Tier 2,Supermarket Type1,1315.6208 +FDM58,16.85,Regular,0.133385398,Snack Foods,109.8544,OUT010,1998,,Tier 3,Grocery Store,223.7088 +NCE54,,Low Fat,0.047098175,Household,75.5354,OUT019,1985,Small,Tier 1,Grocery Store,150.4708 +FDS11,7.05,Regular,0.055548003,Breads,225.3088,OUT035,2004,Small,Tier 2,Supermarket Type1,5816.4288 +FDL20,17.1,Low Fat,0.128614205,Fruits and Vegetables,111.6886,OUT049,1999,Medium,Tier 1,Supermarket Type1,1556.6404 +FDX13,,Low Fat,0.047551568,Canned,249.1092,OUT027,1985,Medium,Tier 3,Supermarket Type3,8217.3036 +FDR21,19.7,LF,0.066879757,Snack Foods,174.437,OUT013,1987,High,Tier 3,Supermarket Type1,1587.933 +FDV28,16.1,Regular,0.160379061,Frozen Foods,33.6558,OUT018,2009,Medium,Tier 3,Supermarket Type2,203.7348 +FDZ51,11.3,Regular,0.054861393,Meat,96.9094,OUT017,2007,,Tier 2,Supermarket Type1,952.094 +FDD46,6.035,LF,0.141542481,Snack Foods,153.1998,OUT045,2002,,Tier 2,Supermarket Type1,1537.998 +FDE23,17.6,Regular,0.053397642,Starchy Foods,46.706,OUT018,2009,Medium,Tier 3,Supermarket Type2,699.09 +NCF55,6.675,LF,0.021710275,Household,34.9874,OUT045,2002,,Tier 2,Supermarket Type1,247.0118 +FDU12,15.5,Regular,0.075688032,Baking Goods,262.9568,OUT013,1987,High,Tier 3,Supermarket Type1,1845.5976 +FDZ22,9.395,Low Fat,0.045340279,Snack Foods,85.025,OUT049,1999,Medium,Tier 1,Supermarket Type1,2080.625 +FDI44,16.1,LF,0.100149459,Fruits and Vegetables,78.4328,OUT013,1987,High,Tier 3,Supermarket Type1,1158.492 +FDH50,15,Regular,0.162348584,Canned,185.9266,OUT017,2007,,Tier 2,Supermarket Type1,4610.665 +FDE57,9.6,Low Fat,0.036341539,Fruits and Vegetables,142.9154,OUT049,1999,Medium,Tier 1,Supermarket Type1,3261.7542 +DRJ51,14.1,Low Fat,0.087920675,Dairy,228.5668,OUT013,1987,High,Tier 3,Supermarket Type1,1151.834 +FDX52,11.5,Regular,0.042087749,Frozen Foods,192.682,OUT045,2002,,Tier 2,Supermarket Type1,3861.64 +DRN47,12.1,Low Fat,0.016921927,Hard Drinks,178.366,OUT017,2007,,Tier 2,Supermarket Type1,4314.384 +FDT21,7.42,Low Fat,0.020423549,Snack Foods,249.0092,OUT049,1999,Medium,Tier 1,Supermarket Type1,2988.1104 +FDY21,15.1,Low Fat,0.173833129,Snack Foods,196.511,OUT045,2002,,Tier 2,Supermarket Type1,4713.864 +FDG21,,Regular,0.256152243,Seafood,151.005,OUT019,1985,Small,Tier 1,Grocery Store,149.805 +FDS58,9.285,Regular,0.021002641,Snack Foods,161.1578,OUT035,2004,Small,Tier 2,Supermarket Type1,4011.445 +FDA26,7.855,Regular,0,Dairy,220.1482,OUT018,2009,Medium,Tier 3,Supermarket Type2,4600.0122 +FDY16,,Regular,0.091780142,Frozen Foods,182.5266,OUT027,1985,Medium,Tier 3,Supermarket Type3,6454.931 +FDF20,12.85,Low Fat,0.033220169,Fruits and Vegetables,196.6768,OUT046,1997,Small,Tier 1,Supermarket Type1,2759.0752 +FDI15,13.8,Low Fat,0.141234932,Dairy,263.7884,OUT013,1987,High,Tier 3,Supermarket Type1,5564.7564 +FDC47,15,Low Fat,0.19899855,Snack Foods,226.5694,OUT010,1998,,Tier 3,Grocery Store,913.4776 +FDL08,10.8,Low Fat,0.049709624,Fruits and Vegetables,246.8144,OUT035,2004,Small,Tier 2,Supermarket Type1,2450.144 +FDF08,14.3,Regular,0.065153295,Fruits and Vegetables,88.4856,OUT013,1987,High,Tier 3,Supermarket Type1,1406.1696 +FDN03,9.8,Regular,0.015087112,Meat,250.1408,OUT035,2004,Small,Tier 2,Supermarket Type1,4005.4528 +FDG34,11.5,Regular,0.037782943,Snack Foods,106.6254,OUT017,2007,,Tier 2,Supermarket Type1,325.5762 +FDA56,9.21,Low Fat,0.008782561,Fruits and Vegetables,119.8414,OUT045,2002,,Tier 2,Supermarket Type1,1340.2554 +NCI17,,Low Fat,0.142728113,Health and Hygiene,95.141,OUT027,1985,Medium,Tier 3,Supermarket Type3,2510.066 +NCO17,10,Low Fat,0.073493831,Health and Hygiene,118.344,OUT049,1999,Medium,Tier 1,Supermarket Type1,1797.66 +FDK55,18.5,Low Fat,0.025907416,Meat,87.7172,OUT017,2007,,Tier 2,Supermarket Type1,802.9548 +FDD10,20.6,Regular,0.046280998,Snack Foods,177.4344,OUT017,2007,,Tier 2,Supermarket Type1,1962.7784 +NCH18,9.3,Low Fat,0.044624064,Household,245.4802,OUT013,1987,High,Tier 3,Supermarket Type1,3193.8426 +NCA53,11.395,Low Fat,0.009898492,Health and Hygiene,48.8034,OUT045,2002,,Tier 2,Supermarket Type1,777.6544 +DRJ24,11.8,Low Fat,0.189689886,Soft Drinks,184.3924,OUT010,1998,,Tier 3,Grocery Store,370.1848 +DRN35,8.01,Low Fat,0.070189131,Hard Drinks,37.9532,OUT013,1987,High,Tier 3,Supermarket Type1,826.9236 +FDC47,15,Low Fat,0.119374946,Snack Foods,229.3694,OUT018,2009,Medium,Tier 3,Supermarket Type2,5024.1268 +FDN48,13.35,Low Fat,0.065215312,Baking Goods,93.4804,OUT018,2009,Medium,Tier 3,Supermarket Type2,1102.5648 +FDR27,,Regular,0.095635061,Meat,130.7942,OUT027,1985,Medium,Tier 3,Supermarket Type3,3047.3666 +FDS33,,Regular,0.216107535,Snack Foods,86.8514,OUT019,1985,Small,Tier 1,Grocery Store,354.2056 +DRL11,10.5,Low Fat,0.048009081,Hard Drinks,157.0946,OUT035,2004,Small,Tier 2,Supermarket Type1,2209.1244 +FDQ21,21.25,Low Fat,0.019533098,Snack Foods,120.4756,OUT017,2007,,Tier 2,Supermarket Type1,1938.8096 +FDY37,17,Regular,0.026568875,Canned,142.047,OUT046,1997,Small,Tier 1,Supermarket Type1,3149.234 +FDS35,9.3,Low Fat,0.111127966,Breads,63.1826,OUT013,1987,High,Tier 3,Supermarket Type1,2002.0606 +DRD60,15.7,Low Fat,0.03723211,Soft Drinks,183.1634,OUT046,1997,Small,Tier 1,Supermarket Type1,5634.6654 +DRP47,15.75,Low Fat,0.140603316,Hard Drinks,252.8382,OUT046,1997,Small,Tier 1,Supermarket Type1,6308.455 +NCY41,,low fat,0.075368868,Health and Hygiene,35.2532,OUT027,1985,Medium,Tier 3,Supermarket Type3,970.7364 +FDR59,14.5,Regular,0.063962842,Breads,263.1594,OUT049,1999,Medium,Tier 1,Supermarket Type1,2616.594 +FDM36,,Regular,0.102830104,Baking Goods,172.6422,OUT019,1985,Small,Tier 1,Grocery Store,344.8844 +NCI42,,Low Fat,0.01031535,Household,208.4954,OUT027,1985,Medium,Tier 3,Supermarket Type3,3751.1172 +FDA31,7.1,Low Fat,0.110633958,Fruits and Vegetables,173.808,OUT017,2007,,Tier 2,Supermarket Type1,1211.756 +FDY33,14.5,Regular,0,Snack Foods,159.3262,OUT035,2004,Small,Tier 2,Supermarket Type1,2864.2716 +FDV40,17.35,Low Fat,0.014721579,Frozen Foods,73.1038,OUT045,2002,,Tier 2,Supermarket Type1,886.8456 +NCW17,18,Low Fat,0.019465205,Health and Hygiene,128.6994,OUT018,2009,Medium,Tier 3,Supermarket Type2,2441.4886 +FDN38,6.615,Regular,0.091895319,Canned,248.6408,OUT013,1987,High,Tier 3,Supermarket Type1,3504.7712 +FDQ11,,Regular,0.118535581,Breads,256.3988,OUT019,1985,Small,Tier 1,Grocery Store,256.9988 +FDG34,11.5,Regular,0.037646623,Snack Foods,107.5254,OUT045,2002,,Tier 2,Supermarket Type1,325.5762 +NCN14,19.1,Low Fat,0.092060694,Others,183.7608,OUT049,1999,Medium,Tier 1,Supermarket Type1,4777.7808 +FDY46,,Low Fat,0.04765803,Snack Foods,188.3898,OUT027,1985,Medium,Tier 3,Supermarket Type3,5238.5144 +FDS11,7.05,Regular,0.05587277,Breads,222.1088,OUT017,2007,,Tier 2,Supermarket Type1,4026.7584 +NCA53,,Low Fat,0.017295906,Health and Hygiene,47.1034,OUT019,1985,Small,Tier 1,Grocery Store,145.8102 +NCN30,16.35,Low Fat,0.02844314,Household,98.141,OUT010,1998,,Tier 3,Grocery Store,386.164 +FDW32,18.35,Regular,0.094296835,Fruits and Vegetables,84.3882,OUT046,1997,Small,Tier 1,Supermarket Type1,1116.5466 +NCR42,9.105,Low Fat,0.064410783,Household,33.39,OUT010,1998,,Tier 3,Grocery Store,33.29 +FDU33,7.63,Regular,0.134684292,Snack Foods,47.0402,OUT035,2004,Small,Tier 2,Supermarket Type1,1470.0864 +FDN15,,Low Fat,0.029299175,Meat,140.318,OUT019,1985,Small,Tier 1,Grocery Store,139.818 +FDD51,,low fat,0.210021713,Dairy,44.2744,OUT019,1985,Small,Tier 1,Grocery Store,90.5488 +FDF14,7.55,Low Fat,0.027224917,Canned,152.934,OUT045,2002,,Tier 2,Supermarket Type1,2450.144 +NCN19,,Low Fat,0.021184746,Others,189.553,OUT019,1985,Small,Tier 1,Grocery Store,379.506 +NCO43,5.5,Low Fat,0.047059016,Others,100.1016,OUT013,1987,High,Tier 3,Supermarket Type1,2125.2336 +FDT19,7.59,Regular,0.14526636,Fruits and Vegetables,172.908,OUT049,1999,Medium,Tier 1,Supermarket Type1,6231.888 +DRK12,9.5,Low Fat,0.041851461,Soft Drinks,31.49,OUT013,1987,High,Tier 3,Supermarket Type1,466.06 +DRM49,6.11,Regular,0.152262171,Soft Drinks,44.4086,OUT045,2002,,Tier 2,Supermarket Type1,1159.8236 +FDX43,5.655,Low Fat,0.085757338,Fruits and Vegetables,164.75,OUT017,2007,,Tier 2,Supermarket Type1,1498.05 +FDS14,7.285,Low Fat,0.049954435,Dairy,156.5288,OUT035,2004,Small,Tier 2,Supermarket Type1,2356.932 +NCK07,10.65,Low Fat,0.048762383,Others,165.2526,OUT049,1999,Medium,Tier 1,Supermarket Type1,3946.8624 +FDO19,17.7,Regular,0,Fruits and Vegetables,46.8034,OUT017,2007,,Tier 2,Supermarket Type1,923.4646 +FDH32,12.8,Low Fat,0.075996742,Fruits and Vegetables,97.141,OUT013,1987,High,Tier 3,Supermarket Type1,2799.689 +NCZ41,19.85,Low Fat,0,Health and Hygiene,126.1704,OUT018,2009,Medium,Tier 3,Supermarket Type2,1877.556 +FDL32,15.7,Regular,0.204984538,Fruits and Vegetables,111.0544,OUT010,1998,,Tier 3,Grocery Store,223.7088 +FDC44,15.6,Low Fat,0.173573164,Fruits and Vegetables,114.4518,OUT017,2007,,Tier 2,Supermarket Type1,2390.8878 +FDQ59,9.8,Regular,0.056339618,Breads,84.2908,OUT013,1987,High,Tier 3,Supermarket Type1,755.0172 +NCO54,19.5,Low Fat,0.014262413,Household,57.1614,OUT013,1987,High,Tier 3,Supermarket Type1,331.5684 +DRH36,16.2,Low Fat,0.03338006,Soft Drinks,74.0696,OUT046,1997,Small,Tier 1,Supermarket Type1,1416.8224 +FDY35,17.6,Regular,0.016024651,Breads,44.0402,OUT035,2004,Small,Tier 2,Supermarket Type1,597.2226 +FDA46,13.6,low fat,0.11830085,Snack Foods,196.2136,OUT017,2007,,Tier 2,Supermarket Type1,1944.136 +NCL18,18.85,Low Fat,0.167552202,Household,193.1136,OUT035,2004,Small,Tier 2,Supermarket Type1,2332.9632 +FDL57,15.1,Regular,0.067181098,Snack Foods,258.8304,OUT049,1999,Medium,Tier 1,Supermarket Type1,5424.9384 +NCP50,17.35,Low Fat,0,Others,79.2618,OUT018,2009,Medium,Tier 3,Supermarket Type2,966.7416 +FDZ25,,Regular,0,Canned,169.879,OUT019,1985,Small,Tier 1,Grocery Store,339.558 +FDH24,20.7,Low Fat,0.021431134,Baking Goods,157.0288,OUT046,1997,Small,Tier 1,Supermarket Type1,2199.8032 +FDQ26,13.5,Regular,0.068256316,Dairy,60.9562,OUT017,2007,,Tier 2,Supermarket Type1,533.3058 +NCK17,,Low Fat,0,Health and Hygiene,40.348,OUT019,1985,Small,Tier 1,Grocery Store,79.896 +FDO46,,Regular,0.014143673,Snack Foods,187.3872,OUT027,1985,Medium,Tier 3,Supermarket Type3,2836.308 +FDW50,13.1,Low Fat,0.075563757,Dairy,168.1158,OUT035,2004,Small,Tier 2,Supermarket Type1,2005.3896 +FDD29,12.15,Low Fat,0.018439138,Frozen Foods,254.7698,OUT049,1999,Medium,Tier 1,Supermarket Type1,5073.396 +FDU26,,Regular,0.074620291,Dairy,120.1782,OUT019,1985,Small,Tier 1,Grocery Store,357.5346 +FDX04,,Regular,0.041370245,Frozen Foods,46.2376,OUT027,1985,Medium,Tier 3,Supermarket Type3,814.9392 +FDH31,,Regular,0.020312314,Meat,98.1042,OUT027,1985,Medium,Tier 3,Supermarket Type3,2777.7176 +FDJ45,,Low Fat,0.128532558,Seafood,34.2216,OUT019,1985,Small,Tier 1,Grocery Store,173.108 +FDX55,15.1,Low Fat,0.055195461,Fruits and Vegetables,216.1166,OUT035,2004,Small,Tier 2,Supermarket Type1,5007.4818 +FDR02,16.7,Low Fat,0.022065676,Dairy,110.5886,OUT046,1997,Small,Tier 1,Supermarket Type1,1556.6404 +NCP55,14.65,Low Fat,0.011212719,Others,55.6614,OUT045,2002,,Tier 2,Supermarket Type1,1049.9666 +FDT28,13.3,Low Fat,0.063925726,Frozen Foods,151.8708,OUT017,2007,,Tier 2,Supermarket Type1,1655.1788 +NCJ06,20.1,Low Fat,0.034848629,Household,118.6782,OUT017,2007,,Tier 2,Supermarket Type1,2502.7422 +FDF08,14.3,Regular,0,Fruits and Vegetables,89.8856,OUT018,2009,Medium,Tier 3,Supermarket Type2,1406.1696 +FDT21,7.42,Low Fat,0.02050719,Snack Foods,249.7092,OUT017,2007,,Tier 2,Supermarket Type1,7719.2852 +FDK22,,Low Fat,0.025960174,Snack Foods,214.885,OUT027,1985,Medium,Tier 3,Supermarket Type3,4976.855 +DRJ11,9.5,Low Fat,0.085020342,Hard Drinks,188.7872,OUT013,1987,High,Tier 3,Supermarket Type1,1701.7848 +FDH27,7.075,Low Fat,0.097660814,Dairy,141.8128,OUT010,1998,,Tier 3,Grocery Store,143.8128 +FDU52,,Low Fat,0.111654545,Frozen Foods,157.063,OUT019,1985,Small,Tier 1,Grocery Store,312.926 +FDK50,7.96,Low Fat,0,Canned,160.7894,OUT017,2007,,Tier 2,Supermarket Type1,3235.788 +DRJ01,6.135,Low Fat,0.115265695,Soft Drinks,160.5236,OUT045,2002,,Tier 2,Supermarket Type1,2094.6068 +FDC21,14.6,Regular,0.043133816,Fruits and Vegetables,109.7254,OUT018,2009,Medium,Tier 3,Supermarket Type2,651.1524 +FDX39,14.3,reg,0.049676157,Meat,212.4586,OUT046,1997,Small,Tier 1,Supermarket Type1,3799.0548 +NCY54,,Low Fat,0.176834351,Household,172.1422,OUT027,1985,Medium,Tier 3,Supermarket Type3,5000.8238 +FDD58,,Low Fat,0.103918113,Snack Foods,100.67,OUT019,1985,Small,Tier 1,Grocery Store,399.48 +FDW12,8.315,Regular,0.035644325,Baking Goods,147.1444,OUT045,2002,,Tier 2,Supermarket Type1,870.8664 +DRE01,10.1,Low Fat,0.279783532,Soft Drinks,241.8512,OUT010,1998,,Tier 3,Grocery Store,484.7024 +FDT16,9.895,Regular,0.048738014,Frozen Foods,262.1278,OUT049,1999,Medium,Tier 1,Supermarket Type1,3904.917 +FDC16,11.5,Regular,0.020686161,Dairy,85.054,OUT017,2007,,Tier 2,Supermarket Type1,1731.08 +FDK52,18.25,LF,0.079342006,Frozen Foods,226.0062,OUT049,1999,Medium,Tier 1,Supermarket Type1,1805.6496 +FDS23,4.635,Low Fat,0.140889111,Breads,127.0994,OUT046,1997,Small,Tier 1,Supermarket Type1,1927.491 +FDI41,18.5,Regular,0.062245149,Frozen Foods,145.8418,OUT035,2004,Small,Tier 2,Supermarket Type1,5591.3884 +FDG33,5.365,Regular,0.140811559,Seafood,173.5764,OUT018,2009,Medium,Tier 3,Supermarket Type2,2061.3168 +NCM31,6.095,Low Fat,0.08152738,Others,140.3154,OUT018,2009,Medium,Tier 3,Supermarket Type2,1843.6002 +NCY53,,Low Fat,0.058198141,Health and Hygiene,110.4544,OUT027,1985,Medium,Tier 3,Supermarket Type3,4250.4672 +FDY55,16.75,Low Fat,0.081446638,Fruits and Vegetables,257.0988,OUT049,1999,Medium,Tier 1,Supermarket Type1,6424.97 +FDQ21,21.25,Low Fat,0.019462623,Snack Foods,120.8756,OUT045,2002,,Tier 2,Supermarket Type1,1575.2828 +NCD18,,Low Fat,0.072317217,Household,230.2668,OUT027,1985,Medium,Tier 3,Supermarket Type3,8062.838 +FDV09,12.1,Low Fat,0.020684919,Snack Foods,148.5734,OUT017,2007,,Tier 2,Supermarket Type1,1336.2606 +FDI19,15.1,Low Fat,0.087604871,Meat,242.2512,OUT010,1998,,Tier 3,Grocery Store,484.7024 +FDY47,8.6,Regular,0,Breads,131.531,OUT049,1999,Medium,Tier 1,Supermarket Type1,2466.789 +DRH37,17.6,Low Fat,0.041681059,Soft Drinks,164.2526,OUT049,1999,Medium,Tier 1,Supermarket Type1,1315.6208 +NCL19,15.35,Low Fat,0.015676231,Others,144.047,OUT046,1997,Small,Tier 1,Supermarket Type1,286.294 +DRI11,8.26,Low Fat,0.034397781,Hard Drinks,115.7834,OUT035,2004,Small,Tier 2,Supermarket Type1,2073.3012 +NCC19,6.57,Low Fat,0.096880574,Household,191.482,OUT046,1997,Small,Tier 1,Supermarket Type1,5020.132 +FDS01,11.6,Low Fat,0.017817285,Canned,177.0686,OUT018,2009,Medium,Tier 3,Supermarket Type2,1422.1488 +FDX31,20.35,Regular,0.014909465,Fruits and Vegetables,232.3958,OUT017,2007,,Tier 2,Supermarket Type1,6076.0908 +NCL55,12.15,Low Fat,0,Others,254.904,OUT046,1997,Small,Tier 1,Supermarket Type1,4048.064 +FDW16,17.35,Regular,0.041439718,Frozen Foods,93.7804,OUT013,1987,High,Tier 3,Supermarket Type1,2848.2924 +FDT49,7,Low Fat,0.151405587,Canned,107.728,OUT046,1997,Small,Tier 1,Supermarket Type1,2024.032 +FDW13,8.5,Low Fat,0.097803261,Canned,50.5324,OUT013,1987,High,Tier 3,Supermarket Type1,882.8508 +NCG30,,Low Fat,0.196659953,Household,125.8046,OUT019,1985,Small,Tier 1,Grocery Store,249.0092 +FDC14,14.5,Regular,0.041313203,Canned,42.0454,OUT049,1999,Medium,Tier 1,Supermarket Type1,377.5086 +FDS15,9.195,Regular,0.130657442,Meat,106.4596,OUT010,1998,,Tier 3,Grocery Store,215.7192 +FDS32,17.75,Regular,0.029700018,Fruits and Vegetables,140.3838,OUT049,1999,Medium,Tier 1,Supermarket Type1,1404.838 +FDE09,8.775,Low Fat,0,Fruits and Vegetables,111.3228,OUT049,1999,Medium,Tier 1,Supermarket Type1,1436.7964 +FDM12,16.7,Regular,0.070312473,Baking Goods,189.6214,OUT017,2007,,Tier 2,Supermarket Type1,2826.321 +FDT57,15.2,Low Fat,0.019064377,Snack Foods,238.2248,OUT049,1999,Medium,Tier 1,Supermarket Type1,3555.372 +FDM32,20.5,Low Fat,0.020605032,Fruits and Vegetables,91.083,OUT046,1997,Small,Tier 1,Supermarket Type1,539.298 +NCS38,,Low Fat,0,Household,115.2176,OUT027,1985,Medium,Tier 3,Supermarket Type3,1030.6584 +NCW30,5.21,Low Fat,0.011072173,Household,257.8962,OUT017,2007,,Tier 2,Supermarket Type1,4402.9354 +FDD21,10.3,Regular,0,Fruits and Vegetables,115.7176,OUT017,2007,,Tier 2,Supermarket Type1,1717.764 +FDH35,18.25,Low Fat,0.060342304,Starchy Foods,165.9526,OUT049,1999,Medium,Tier 1,Supermarket Type1,1644.526 +NCX17,21.25,Low Fat,0.113833823,Health and Hygiene,232.83,OUT045,2002,,Tier 2,Supermarket Type1,1398.18 +NCI29,8.6,Low Fat,0.032615377,Health and Hygiene,142.9154,OUT035,2004,Small,Tier 2,Supermarket Type1,992.7078 +FDL24,10.3,Regular,0.024935297,Baking Goods,172.0422,OUT049,1999,Medium,Tier 1,Supermarket Type1,3966.1706 +FDI46,9.5,Low Fat,0.074345268,Snack Foods,251.9724,OUT046,1997,Small,Tier 1,Supermarket Type1,3523.4136 +DRQ35,9.3,Low Fat,0.042283454,Hard Drinks,125.4388,OUT035,2004,Small,Tier 2,Supermarket Type1,3715.164 +FDM04,9.195,Regular,0.047387144,Frozen Foods,50.8666,OUT017,2007,,Tier 2,Supermarket Type1,871.5322 +NCJ17,7.68,Low Fat,0.152865879,Health and Hygiene,84.9224,OUT045,2002,,Tier 2,Supermarket Type1,1619.2256 +NCJ18,,Low Fat,0.163148041,Household,116.6124,OUT027,1985,Medium,Tier 3,Supermarket Type3,3199.8348 +DRF13,12.1,Low Fat,0.02984176,Soft Drinks,144.4444,OUT045,2002,,Tier 2,Supermarket Type1,3628.61 +FDB39,11.6,LF,0.038511676,Dairy,57.7272,OUT035,2004,Small,Tier 2,Supermarket Type1,503.3448 +FDT52,9.695,Regular,0.047622786,Frozen Foods,246.2144,OUT018,2009,Medium,Tier 3,Supermarket Type2,3675.216 +FDT60,12,Low Fat,0.07554831,Baking Goods,121.9388,OUT046,1997,Small,Tier 1,Supermarket Type1,3219.8088 +FDM34,19,Low Fat,0.067447572,Snack Foods,132.9626,OUT046,1997,Small,Tier 1,Supermarket Type1,1967.439 +FDY27,6.38,Low Fat,0.03187163,Dairy,179.5344,OUT013,1987,High,Tier 3,Supermarket Type1,4103.9912 +FDP08,20.5,Regular,0.112638016,Fruits and Vegetables,195.5478,OUT045,2002,,Tier 2,Supermarket Type1,3874.956 +FDP59,,Regular,0.056192276,Breads,103.1648,OUT027,1985,Medium,Tier 3,Supermarket Type3,1973.4312 +FDQ11,5.695,Regular,0.06797671,Breads,257.4988,OUT018,2009,Medium,Tier 3,Supermarket Type2,3083.9856 +FDV01,19.2,Regular,0.142189843,Canned,153.8314,OUT010,1998,,Tier 3,Grocery Store,155.1314 +FDX31,20.35,Regular,0.014813268,Fruits and Vegetables,234.9958,OUT013,1987,High,Tier 3,Supermarket Type1,5842.395 +NCX54,9.195,low fat,0.080442371,Household,107.7622,OUT010,1998,,Tier 3,Grocery Store,105.8622 +DRC12,17.85,Low Fat,0.03781972,Soft Drinks,191.6188,OUT035,2004,Small,Tier 2,Supermarket Type1,2475.4444 +FDU11,,Low Fat,0.092145264,Breads,120.7098,OUT027,1985,Medium,Tier 3,Supermarket Type3,3735.8038 +NCB30,14.6,Low Fat,0.025702994,Household,199.9084,OUT046,1997,Small,Tier 1,Supermarket Type1,2380.9008 +FDS27,10.195,Regular,0.012483408,Meat,195.411,OUT045,2002,,Tier 2,Supermarket Type1,2749.754 +FDX16,17.85,Low Fat,0,Frozen Foods,148.005,OUT018,2009,Medium,Tier 3,Supermarket Type2,898.83 +NCL53,7.5,Low Fat,0.036204764,Health and Hygiene,176.1028,OUT013,1987,High,Tier 3,Supermarket Type1,1948.1308 +NCZ30,6.59,Low Fat,0.026238087,Household,121.6098,OUT045,2002,,Tier 2,Supermarket Type1,2410.196 +FDB15,10.895,Low Fat,0.137584599,Dairy,262.2568,OUT017,2007,,Tier 2,Supermarket Type1,3954.852 +FDY51,,Low Fat,0.080741927,Meat,220.8798,OUT027,1985,Medium,Tier 3,Supermarket Type3,6170.6344 +NCT18,14.6,Low Fat,0.059741172,Household,179.6976,OUT017,2007,,Tier 2,Supermarket Type1,5070.7328 +FDL32,,Regular,0.214423791,Fruits and Vegetables,111.6544,OUT019,1985,Small,Tier 1,Grocery Store,335.5632 +FDK46,9.6,Low Fat,0.051677051,Snack Foods,258.062,OUT018,2009,Medium,Tier 3,Supermarket Type2,2856.282 +FDI22,,Low Fat,0.168455549,Snack Foods,211.0612,OUT019,1985,Small,Tier 1,Grocery Store,418.1224 +FDF21,10.3,Regular,0,Fruits and Vegetables,189.053,OUT045,2002,,Tier 2,Supermarket Type1,5313.084 +FDR34,17,Regular,0.016055615,Snack Foods,228.4352,OUT017,2007,,Tier 2,Supermarket Type1,8245.2672 +FDJ50,8.645,Low Fat,0.021619564,Canned,50.6982,OUT049,1999,Medium,Tier 1,Supermarket Type1,736.3748 +FDC34,16,Regular,0.173027688,Snack Foods,155.2972,OUT049,1999,Medium,Tier 1,Supermarket Type1,3583.3356 +FDW51,6.155,Regular,0.095045476,Meat,213.456,OUT018,2009,Medium,Tier 3,Supermarket Type2,2556.672 +FDR28,13.85,Regular,0.025891588,Frozen Foods,165.121,OUT035,2004,Small,Tier 2,Supermarket Type1,2936.178 +FDV60,,Regular,0.205484395,Baking Goods,198.011,OUT019,1985,Small,Tier 1,Grocery Store,392.822 +FDI45,13.1,Low Fat,0.037793818,Fruits and Vegetables,173.8054,OUT017,2007,,Tier 2,Supermarket Type1,2801.6864 +NCB30,,Low Fat,0.045002624,Household,196.5084,OUT019,1985,Small,Tier 1,Grocery Store,198.4084 +DRO59,11.8,Low Fat,0.054460571,Hard Drinks,77.0012,OUT017,2007,,Tier 2,Supermarket Type1,2277.036 +FDU12,15.5,Regular,0.075736746,Baking Goods,265.5568,OUT035,2004,Small,Tier 2,Supermarket Type1,4482.1656 +NCX18,14.15,Low Fat,0.014719325,Household,196.911,OUT010,1998,,Tier 3,Grocery Store,392.822 +NCH30,,Low Fat,0.066828857,Household,114.186,OUT027,1985,Medium,Tier 3,Supermarket Type3,1924.162 +FDE11,,Regular,0.23653561,Starchy Foods,184.1924,OUT019,1985,Small,Tier 1,Grocery Store,185.0924 +FDE32,20.7,Low Fat,0.04903471,Fruits and Vegetables,39.9506,OUT017,2007,,Tier 2,Supermarket Type1,872.8638 +FDP25,15.2,Low Fat,0.035497039,Canned,216.7824,OUT010,1998,,Tier 3,Grocery Store,436.7648 +NCM29,11.5,Low Fat,0.017638893,Health and Hygiene,132.7626,OUT035,2004,Small,Tier 2,Supermarket Type1,2885.5772 +FDQ21,21.25,Low Fat,0.01945343,Snack Foods,120.8756,OUT049,1999,Medium,Tier 1,Supermarket Type1,1454.1072 +FDN24,14.1,Low Fat,0.11326743,Baking Goods,54.5956,OUT046,1997,Small,Tier 1,Supermarket Type1,1037.3164 +DRY23,9.395,Regular,0.109713464,Soft Drinks,41.3112,OUT017,2007,,Tier 2,Supermarket Type1,255.6672 +FDW04,,Regular,0,Frozen Foods,130.531,OUT027,1985,Medium,Tier 3,Supermarket Type3,5582.733 +FDM01,7.895,Regular,0.094952408,Breakfast,101.1332,OUT018,2009,Medium,Tier 3,Supermarket Type2,1332.9316 +NCW29,14,Low Fat,0.029026218,Health and Hygiene,131.331,OUT017,2007,,Tier 2,Supermarket Type1,3635.268 +FDG33,5.365,Regular,0.140123575,Seafood,172.0764,OUT013,1987,High,Tier 3,Supermarket Type1,2748.4224 +FDV51,16.35,Low Fat,0.03272295,Meat,165.7842,OUT017,2007,,Tier 2,Supermarket Type1,1823.6262 +NCQ18,15.75,Low Fat,0.135836828,Household,100.37,OUT017,2007,,Tier 2,Supermarket Type1,1298.31 +NCL53,7.5,Low Fat,0.036382524,Health and Hygiene,177.9028,OUT018,2009,Medium,Tier 3,Supermarket Type2,1416.8224 +FDQ39,14.8,Low Fat,0,Meat,189.3846,OUT013,1987,High,Tier 3,Supermarket Type1,4777.115 +FDF46,7.07,Low Fat,0.094201018,Snack Foods,115.8834,OUT017,2007,,Tier 2,Supermarket Type1,1036.6506 +NCA06,20.5,Low Fat,0.143506376,Household,34.719,OUT049,1999,Medium,Tier 1,Supermarket Type1,768.999 +FDV26,,Regular,0.133347119,Dairy,193.0794,OUT019,1985,Small,Tier 1,Grocery Store,975.397 +FDJ04,18,Low Fat,0.124428516,Frozen Foods,119.9124,OUT035,2004,Small,Tier 2,Supermarket Type1,948.0992 +FDE28,9.5,Regular,0.221856492,Frozen Foods,231.8668,OUT010,1998,,Tier 3,Grocery Store,230.3668 +NCZ29,15,Low Fat,0.071312064,Health and Hygiene,125.7362,OUT013,1987,High,Tier 3,Supermarket Type1,3020.0688 +FDW43,20.1,Regular,0.022425236,Fruits and Vegetables,226.3036,OUT046,1997,Small,Tier 1,Supermarket Type1,910.8144 +FDZ49,11,Regular,0.133352623,Canned,219.7798,OUT049,1999,Medium,Tier 1,Supermarket Type1,2644.5576 +NCJ05,18.7,Low Fat,0.046079558,Health and Hygiene,151.5682,OUT035,2004,Small,Tier 2,Supermarket Type1,1982.0866 +NCP29,,LF,0,Health and Hygiene,64.2168,OUT027,1985,Medium,Tier 3,Supermarket Type3,1278.336 +FDS16,15.15,Regular,0.066446521,Frozen Foods,147.976,OUT018,2009,Medium,Tier 3,Supermarket Type2,732.38 +FDZ45,14.1,Low Fat,0.066979957,Snack Foods,196.7084,OUT049,1999,Medium,Tier 1,Supermarket Type1,3174.5344 +NCP29,8.42,Low Fat,0.187918654,Health and Hygiene,65.4168,OUT010,1998,,Tier 3,Grocery Store,127.8336 +FDZ58,,Low Fat,0.051924192,Snack Foods,121.0072,OUT027,1985,Medium,Tier 3,Supermarket Type3,2940.1728 +FDV55,,Low Fat,0.054806734,Fruits and Vegetables,145.1444,OUT027,1985,Medium,Tier 3,Supermarket Type3,3918.8988 +NCV53,8.27,Low Fat,0.018813601,Health and Hygiene,237.988,OUT046,1997,Small,Tier 1,Supermarket Type1,7190.64 +FDV47,,Low Fat,0.094910421,Breads,84.5566,OUT019,1985,Small,Tier 1,Grocery Store,253.6698 +FDD45,8.615,Low Fat,0.116722514,Fruits and Vegetables,95.4436,OUT018,2009,Medium,Tier 3,Supermarket Type2,567.2616 +FDP26,,Low Fat,0.244338986,Dairy,105.9306,OUT019,1985,Small,Tier 1,Grocery Store,209.0612 +DRD37,9.8,Low Fat,0.013863257,Soft Drinks,45.106,OUT049,1999,Medium,Tier 1,Supermarket Type1,1398.18 +FDT09,,Regular,0.021471456,Snack Foods,131.0284,OUT019,1985,Small,Tier 1,Grocery Store,131.8284 +FDM03,,Low Fat,0,Meat,109.1938,OUT027,1985,Medium,Tier 3,Supermarket Type3,2036.6822 +FDW09,13.65,Regular,0.026067434,Snack Foods,78.8302,OUT017,2007,,Tier 2,Supermarket Type1,713.0718 +FDX10,6.385,Regular,0.123710526,Snack Foods,37.1874,OUT046,1997,Small,Tier 1,Supermarket Type1,247.0118 +FDZ60,20.5,Low Fat,0.119547387,Baking Goods,108.9596,OUT049,1999,Medium,Tier 1,Supermarket Type1,539.298 +FDM58,16.85,Regular,0.079690403,Snack Foods,113.4544,OUT046,1997,Small,Tier 1,Supermarket Type1,2908.2144 +FDV32,7.785,Low Fat,0.088691614,Fruits and Vegetables,61.851,OUT035,2004,Small,Tier 2,Supermarket Type1,1454.773 +FDU07,,Low Fat,0.104784329,Fruits and Vegetables,150.4366,OUT019,1985,Small,Tier 1,Grocery Store,151.1366 +FDS51,,LF,0.032024659,Meat,62.7194,OUT027,1985,Medium,Tier 3,Supermarket Type3,1857.582 +NCT17,10.8,Low Fat,0.041950753,Health and Hygiene,190.0214,OUT045,2002,,Tier 2,Supermarket Type1,2449.4782 +FDA01,15,Regular,0.091018048,Canned,60.2904,OUT010,1998,,Tier 3,Grocery Store,117.1808 +FDW25,5.175,Low Fat,0.037398953,Canned,84.2224,OUT046,1997,Small,Tier 1,Supermarket Type1,852.224 +FDS01,11.6,Low Fat,0.017845372,Canned,179.0686,OUT017,2007,,Tier 2,Supermarket Type1,5688.5952 +NCV18,6.775,Low Fat,0.105459307,Household,84.625,OUT045,2002,,Tier 2,Supermarket Type1,2496.75 +FDZ04,9.31,Low Fat,0.038032068,Frozen Foods,61.351,OUT045,2002,,Tier 2,Supermarket Type1,822.263 +DRN59,15,Low Fat,0.064504433,Hard Drinks,47.306,OUT017,2007,,Tier 2,Supermarket Type1,652.484 +FDD36,13.3,LF,0.021306635,Baking Goods,119.8124,OUT049,1999,Medium,Tier 1,Supermarket Type1,1896.1984 +FDT56,16,Regular,0.116063284,Fruits and Vegetables,59.1246,OUT018,2009,Medium,Tier 3,Supermarket Type2,753.0198 +FDP09,,low fat,0.059336763,Snack Foods,212.1902,OUT019,1985,Small,Tier 1,Grocery Store,424.7804 +FDA33,6.48,Low Fat,0.034091649,Snack Foods,146.2076,OUT017,2007,,Tier 2,Supermarket Type1,2364.9216 +FDH14,,Regular,0.081955735,Canned,142.0838,OUT019,1985,Small,Tier 1,Grocery Store,280.9676 +NCF18,,Low Fat,0.088551694,Household,191.5504,OUT027,1985,Medium,Tier 3,Supermarket Type3,5944.2624 +FDF59,12.5,Low Fat,0.071230537,Starchy Foods,128.102,OUT035,2004,Small,Tier 2,Supermarket Type1,885.514 +FDC29,8.39,reg,0.024185517,Frozen Foods,115.7176,OUT013,1987,High,Tier 3,Supermarket Type1,1374.2112 +FDD32,17.7,reg,0.041163522,Fruits and Vegetables,80.8276,OUT017,2007,,Tier 2,Supermarket Type1,1868.2348 +FDZ08,12.5,Regular,0,Fruits and Vegetables,80.8592,OUT010,1998,,Tier 3,Grocery Store,82.5592 +FDT21,,Low Fat,0,Snack Foods,248.8092,OUT027,1985,Medium,Tier 3,Supermarket Type3,6474.2392 +FDM33,15.6,Low Fat,0.087719692,Snack Foods,218.5798,OUT046,1997,Small,Tier 1,Supermarket Type1,4407.596 +NCK07,10.65,Low Fat,0.048677482,Others,166.1526,OUT035,2004,Small,Tier 2,Supermarket Type1,2466.789 +NCL41,12.35,Low Fat,0.041907648,Health and Hygiene,36.2216,OUT018,2009,Medium,Tier 3,Supermarket Type2,346.216 +FDZ36,6.035,Regular,0.065783783,Baking Goods,188.224,OUT046,1997,Small,Tier 1,Supermarket Type1,5779.144 +FDW51,6.155,Regular,0.094807042,Meat,213.356,OUT049,1999,Medium,Tier 1,Supermarket Type1,3835.008 +FDS47,16.75,Low Fat,0.128778474,Breads,89.1856,OUT013,1987,High,Tier 3,Supermarket Type1,1581.9408 +FDV02,16.75,Low Fat,0.060668416,Dairy,172.4106,OUT045,2002,,Tier 2,Supermarket Type1,2908.8802 +NCU18,15.1,Low Fat,0.056067524,Household,139.8496,OUT018,2009,Medium,Tier 3,Supermarket Type2,1270.3464 +NCX17,21.25,Low Fat,0.114066204,Health and Hygiene,233.03,OUT018,2009,Medium,Tier 3,Supermarket Type2,5592.72 +FDI12,9.395,Regular,0.10039894,Baking Goods,89.6856,OUT046,1997,Small,Tier 1,Supermarket Type1,878.856 +DRH51,17.6,Low Fat,0.097135675,Dairy,89.3856,OUT013,1987,High,Tier 3,Supermarket Type1,1318.284 +NCP30,,Low Fat,0.032610007,Household,37.4822,OUT027,1985,Medium,Tier 3,Supermarket Type3,942.7728 +FDG08,13.15,Regular,0.165616415,Fruits and Vegetables,172.6764,OUT049,1999,Medium,Tier 1,Supermarket Type1,2061.3168 +FDX35,5.035,Regular,0,Breads,228.2036,OUT046,1997,Small,Tier 1,Supermarket Type1,4781.7756 +FDY26,,Regular,0.030362777,Dairy,210.5244,OUT027,1985,Medium,Tier 3,Supermarket Type3,6775.1808 +NCM43,,Low Fat,0.03409886,Others,162.621,OUT019,1985,Small,Tier 1,Grocery Store,815.605 +NCZ54,,Low Fat,0.145951533,Household,160.9552,OUT019,1985,Small,Tier 1,Grocery Store,162.4552 +FDO16,5.48,Low Fat,0.015138834,Frozen Foods,81.925,OUT045,2002,,Tier 2,Supermarket Type1,3079.325 +FDR22,19.35,Regular,0.031069993,Snack Foods,112.0544,OUT010,1998,,Tier 3,Grocery Store,223.7088 +FDJ16,9.195,Low Fat,0.115535487,Frozen Foods,59.5246,OUT017,2007,,Tier 2,Supermarket Type1,810.9444 +FDT47,5.26,Regular,0.02454694,Breads,95.7068,OUT049,1999,Medium,Tier 1,Supermarket Type1,1166.4816 +FDZ23,,Regular,0.067175915,Baking Goods,187.124,OUT027,1985,Medium,Tier 3,Supermarket Type3,3728.48 +NCB31,6.235,Low Fat,0.118674359,Household,261.691,OUT046,1997,Small,Tier 1,Supermarket Type1,3155.892 +FDM15,11.8,Regular,0.057421582,Meat,149.9366,OUT046,1997,Small,Tier 1,Supermarket Type1,1662.5026 +FDX27,20.7,Regular,0.114022125,Dairy,92.9436,OUT013,1987,High,Tier 3,Supermarket Type1,2174.5028 +NCS54,13.6,LF,0.010033871,Household,177.937,OUT018,2009,Medium,Tier 3,Supermarket Type2,2293.681 +NCJ30,5.82,low fat,0.080765853,Household,169.179,OUT049,1999,Medium,Tier 1,Supermarket Type1,2037.348 +FDD58,7.76,Low Fat,0.05930285,Snack Foods,98.77,OUT013,1987,High,Tier 3,Supermarket Type1,1697.79 +DRJ23,18.35,Low Fat,0.041753387,Hard Drinks,187.6872,OUT045,2002,,Tier 2,Supermarket Type1,2836.308 +FDS14,7.285,Low Fat,0.050065211,Dairy,157.4288,OUT045,2002,,Tier 2,Supermarket Type1,2042.6744 +FDR27,15.1,Regular,0.096020459,Meat,133.7942,OUT013,1987,High,Tier 3,Supermarket Type1,2384.8956 +FDT49,7,Low Fat,0.15202235,Canned,106.628,OUT018,2009,Medium,Tier 3,Supermarket Type2,639.168 +FDX26,,Low Fat,0.087383304,Dairy,180.4292,OUT027,1985,Medium,Tier 3,Supermarket Type3,4013.4424 +NCW53,18.35,Low Fat,0.03066757,Health and Hygiene,193.4162,OUT017,2007,,Tier 2,Supermarket Type1,2116.5782 +FDS19,13.8,Regular,0,Fruits and Vegetables,74.3012,OUT045,2002,,Tier 2,Supermarket Type1,1669.8264 +DRF15,18.35,Low Fat,0.03321399,Dairy,154.934,OUT046,1997,Small,Tier 1,Supermarket Type1,1225.072 +DRH01,,Low Fat,0.097429924,Soft Drinks,172.8738,OUT027,1985,Medium,Tier 3,Supermarket Type3,3649.2498 +FDJ12,8.895,Regular,0.039120291,Baking Goods,206.8296,OUT045,2002,,Tier 2,Supermarket Type1,4154.592 +NCE42,,Low Fat,0.01055095,Household,234.9958,OUT027,1985,Medium,Tier 3,Supermarket Type3,13086.9648 +DRL37,15.5,Low Fat,0.053480419,Soft Drinks,42.377,OUT045,2002,,Tier 2,Supermarket Type1,1211.756 +FDJ36,14.5,Regular,0.128520186,Baking Goods,101.4332,OUT045,2002,,Tier 2,Supermarket Type1,1948.1308 +NCH18,,Low Fat,0.044444956,Household,245.2802,OUT027,1985,Medium,Tier 3,Supermarket Type3,10072.8882 +DRI11,8.26,Low Fat,0.034544435,Hard Drinks,116.0834,OUT018,2009,Medium,Tier 3,Supermarket Type2,1267.0174 +NCO17,10,Low Fat,0.073678663,Health and Hygiene,120.944,OUT018,2009,Medium,Tier 3,Supermarket Type2,2037.348 +FDS49,9,Low Fat,0.079668739,Canned,79.6644,OUT018,2009,Medium,Tier 3,Supermarket Type2,1571.288 +FDX43,5.655,Low Fat,0.085447928,Fruits and Vegetables,165.85,OUT045,2002,,Tier 2,Supermarket Type1,1830.95 +NCS17,18.6,Low Fat,0.080434451,Health and Hygiene,93.4436,OUT013,1987,High,Tier 3,Supermarket Type1,1701.7848 +NCC42,15,Low Fat,0.044978225,Health and Hygiene,140.8838,OUT049,1999,Medium,Tier 1,Supermarket Type1,2247.7408 +NCM26,20.5,Low Fat,0.023190134,Others,153.434,OUT045,2002,,Tier 2,Supermarket Type1,3981.484 +FDU32,8.785,Low Fat,0.025967624,Fruits and Vegetables,119.9414,OUT046,1997,Small,Tier 1,Supermarket Type1,1462.0968 +FDU19,8.77,reg,0.046962004,Fruits and Vegetables,173.8422,OUT018,2009,Medium,Tier 3,Supermarket Type2,3448.844 +NCM53,18.75,Low Fat,0.05233528,Health and Hygiene,108.128,OUT017,2007,,Tier 2,Supermarket Type1,1065.28 +FDG32,19.85,Low Fat,0.17635245,Fruits and Vegetables,220.8772,OUT045,2002,,Tier 2,Supermarket Type1,4225.1668 +FDF04,17.5,LF,0.013692598,Frozen Foods,259.7304,OUT018,2009,Medium,Tier 3,Supermarket Type2,3616.6256 +NCN55,14.6,LF,0,Others,242.3538,OUT035,2004,Small,Tier 2,Supermarket Type1,5287.7836 +FDJ34,11.8,Regular,0.093655728,Snack Foods,127.1704,OUT046,1997,Small,Tier 1,Supermarket Type1,3004.0896 +FDT51,11.65,Regular,0.018275816,Meat,110.8544,OUT010,1998,,Tier 3,Grocery Store,111.8544 +FDT01,13.65,Regular,0.184167712,Canned,213.7902,OUT046,1997,Small,Tier 1,Supermarket Type1,1274.3412 +FDV28,,Regular,0.158954903,Frozen Foods,34.9558,OUT027,1985,Medium,Tier 3,Supermarket Type3,1120.5414 +FDD02,16.6,Low Fat,0.050392993,Canned,118.4124,OUT045,2002,,Tier 2,Supermarket Type1,3199.8348 +FDW48,18,Low Fat,0.008558144,Baking Goods,79.0618,OUT045,2002,,Tier 2,Supermarket Type1,1208.427 +FDF44,7.17,Regular,0.059820884,Fruits and Vegetables,130.3968,OUT049,1999,Medium,Tier 1,Supermarket Type1,3523.4136 +FDY14,10.3,LF,0.070149088,Dairy,264.5226,OUT049,1999,Medium,Tier 1,Supermarket Type1,3436.1938 +FDU59,,Low Fat,0.095919472,Breads,162.6552,OUT027,1985,Medium,Tier 3,Supermarket Type3,5685.932 +FDQ10,,Low Fat,0.058092551,Snack Foods,172.0422,OUT019,1985,Small,Tier 1,Grocery Store,517.3266 +FDV21,11.5,Low Fat,0.286357776,Snack Foods,123.9704,OUT010,1998,,Tier 3,Grocery Store,375.5112 +FDQ36,7.855,Regular,0.161798604,Baking Goods,37.2848,OUT049,1999,Medium,Tier 1,Supermarket Type1,745.696 +FDH12,,Low Fat,0.148742896,Baking Goods,107.128,OUT019,1985,Small,Tier 1,Grocery Store,319.584 +FDV40,17.35,Low Fat,0,Frozen Foods,72.2038,OUT017,2007,,Tier 2,Supermarket Type1,886.8456 +NCF07,9,Low Fat,0.032022535,Household,101.8016,OUT046,1997,Small,Tier 1,Supermarket Type1,1720.4272 +FDA08,,Regular,0.049842613,Fruits and Vegetables,164.2526,OUT027,1985,Medium,Tier 3,Supermarket Type3,3946.8624 +FDP33,,Low Fat,0.156304192,Snack Foods,256.3672,OUT019,1985,Small,Tier 1,Grocery Store,255.6672 +FDS27,10.195,Regular,0.012458143,Meat,196.311,OUT046,1997,Small,Tier 1,Supermarket Type1,589.233 +DRD60,15.7,Low Fat,0.037201127,Soft Drinks,181.7634,OUT013,1987,High,Tier 3,Supermarket Type1,2544.6876 +FDM28,15.7,Low Fat,0.045274134,Frozen Foods,177.966,OUT049,1999,Medium,Tier 1,Supermarket Type1,3415.554 +NCU54,8.88,Low Fat,0.098603729,Household,210.727,OUT035,2004,Small,Tier 2,Supermarket Type1,4194.54 +NCX05,15.2,LF,0.097457483,Health and Hygiene,114.4492,OUT018,2009,Medium,Tier 3,Supermarket Type2,579.246 +FDX59,10.195,Low Fat,0.051661272,Breads,33.3558,OUT046,1997,Small,Tier 1,Supermarket Type1,848.895 +FDE10,6.67,Regular,0,Snack Foods,133.0626,OUT049,1999,Medium,Tier 1,Supermarket Type1,1573.9512 +FDW16,,Regular,0.041273391,Frozen Foods,91.6804,OUT027,1985,Medium,Tier 3,Supermarket Type3,3858.9768 +FDW07,,Regular,0.141997869,Fruits and Vegetables,90.5514,OUT027,1985,Medium,Tier 3,Supermarket Type3,2036.6822 +FDG38,8.975,Regular,0,Canned,84.9224,OUT018,2009,Medium,Tier 3,Supermarket Type2,1278.336 +DRC27,13.8,Low Fat,0.058339153,Dairy,246.2802,OUT018,2009,Medium,Tier 3,Supermarket Type2,1228.401 +FDT43,16.35,Low Fat,0.020544065,Fruits and Vegetables,49.9324,OUT035,2004,Small,Tier 2,Supermarket Type1,259.662 +FDR44,6.11,Regular,0.103503049,Fruits and Vegetables,129.6968,OUT017,2007,,Tier 2,Supermarket Type1,1174.4712 +FDP26,7.785,Low Fat,0.140342195,Dairy,105.6306,OUT017,2007,,Tier 2,Supermarket Type1,627.1836 +NCE55,,Low Fat,0.12929931,Household,178.237,OUT027,1985,Medium,Tier 3,Supermarket Type3,7939.665 +FDU39,18.85,Low Fat,0.036031137,Meat,60.4562,OUT035,2004,Small,Tier 2,Supermarket Type1,1125.8678 +FDK27,,Low Fat,0.008903212,Meat,120.9756,OUT027,1985,Medium,Tier 3,Supermarket Type3,2787.0388 +FDP32,6.65,Low Fat,0.087669485,Fruits and Vegetables,127.2678,OUT046,1997,Small,Tier 1,Supermarket Type1,2416.1882 +NCW54,7.5,Low Fat,0,Household,59.2588,OUT049,1999,Medium,Tier 1,Supermarket Type1,916.1408 +FDA36,5.985,Low Fat,0.005661669,Baking Goods,186.5924,OUT013,1987,High,Tier 3,Supermarket Type1,2591.2936 +FDU24,6.78,Regular,0,Baking Goods,95.012,OUT049,1999,Medium,Tier 1,Supermarket Type1,2050.664 +FDX34,6.195,Low Fat,0.07198553,Snack Foods,122.2098,OUT046,1997,Small,Tier 1,Supermarket Type1,1205.098 +FDU27,18.6,Regular,0.17133418,Meat,48.8376,OUT013,1987,High,Tier 3,Supermarket Type1,287.6256 +FDQ25,8.63,Regular,0.047329385,Canned,174.1422,OUT010,1998,,Tier 3,Grocery Store,517.3266 +FDY01,11.8,Regular,0.170977155,Canned,117.0834,OUT018,2009,Medium,Tier 3,Supermarket Type2,1842.9344 +FDH27,7.075,Low Fat,0.058298384,Dairy,145.8128,OUT013,1987,High,Tier 3,Supermarket Type1,1725.7536 +FDL10,8.395,Low Fat,0.039715591,Snack Foods,100.1042,OUT017,2007,,Tier 2,Supermarket Type1,1289.6546 +FDL15,17.85,Low Fat,0.046824729,Meat,153.6682,OUT018,2009,Medium,Tier 3,Supermarket Type2,1829.6184 +FDT24,12.35,Regular,0.311090379,Baking Goods,79.2328,OUT010,1998,,Tier 3,Grocery Store,154.4656 +NCN55,14.6,Low Fat,0.059611153,Others,238.3538,OUT045,2002,,Tier 2,Supermarket Type1,2163.1842 +FDZ59,,Regular,0.103517853,Baking Goods,164.95,OUT027,1985,Medium,Tier 3,Supermarket Type3,4161.25 +FDM57,11.65,Regular,0.075834825,Snack Foods,82.9908,OUT035,2004,Small,Tier 2,Supermarket Type1,1258.362 +FDD14,20.7,Low Fat,0.170072462,Canned,183.8266,OUT049,1999,Medium,Tier 1,Supermarket Type1,1844.266 +FDU19,8.77,Regular,0,Fruits and Vegetables,173.6422,OUT013,1987,High,Tier 3,Supermarket Type1,517.3266 +DRJ39,20.25,Low Fat,0.036399734,Dairy,219.3482,OUT045,2002,,Tier 2,Supermarket Type1,8323.8316 +FDI04,13.65,Regular,0.072912432,Frozen Foods,198.4426,OUT046,1997,Small,Tier 1,Supermarket Type1,5536.7928 +NCQ54,17.7,Low Fat,0.012567811,Household,168.4474,OUT045,2002,,Tier 2,Supermarket Type1,2358.2636 +FDW12,8.315,Regular,0.035773394,Baking Goods,144.3444,OUT017,2007,,Tier 2,Supermarket Type1,3483.4656 +FDQ32,,Regular,0.046382793,Fruits and Vegetables,122.8388,OUT027,1985,Medium,Tier 3,Supermarket Type3,2972.1312 +DRG49,7.81,Low Fat,0.067836851,Soft Drinks,246.1486,OUT017,2007,,Tier 2,Supermarket Type1,5375.6692 +FDP58,11.1,Low Fat,0,Snack Foods,220.7482,OUT049,1999,Medium,Tier 1,Supermarket Type1,4380.964 +FDD57,18.1,low fat,0.022434418,Fruits and Vegetables,96.2094,OUT049,1999,Medium,Tier 1,Supermarket Type1,952.094 +DRG23,8.88,Low Fat,0.086764795,Hard Drinks,153.8682,OUT035,2004,Small,Tier 2,Supermarket Type1,1829.6184 +NCZ17,12.15,LF,0,Health and Hygiene,39.1506,OUT017,2007,,Tier 2,Supermarket Type1,1480.0734 +DRJ11,9.5,Low Fat,0.085437778,Hard Drinks,188.4872,OUT018,2009,Medium,Tier 3,Supermarket Type2,3592.6568 +FDG16,15.25,Low Fat,0.089998959,Frozen Foods,215.1192,OUT045,2002,,Tier 2,Supermarket Type1,2157.192 +FDZ51,,Regular,0.054288646,Meat,96.6094,OUT027,1985,Medium,Tier 3,Supermarket Type3,2189.8162 +NCN43,12.15,Low Fat,0,Others,123.773,OUT046,1997,Small,Tier 1,Supermarket Type1,3325.671 +NCN30,16.35,LF,0.016993204,Household,95.741,OUT046,1997,Small,Tier 1,Supermarket Type1,965.41 +FDP39,,Low Fat,0.06908877,Meat,52.3324,OUT027,1985,Medium,Tier 3,Supermarket Type3,1298.31 +FDP34,12.85,Low Fat,0.137441201,Snack Foods,157.663,OUT049,1999,Medium,Tier 1,Supermarket Type1,2659.871 +FDM44,12.5,Low Fat,0.051970788,Fruits and Vegetables,103.699,OUT010,1998,,Tier 3,Grocery Store,412.796 +FDC28,7.905,Low Fat,0,Frozen Foods,109.1254,OUT017,2007,,Tier 2,Supermarket Type1,1627.881 +DRC24,17.85,Low Fat,0.02492239,Soft Drinks,153.4998,OUT018,2009,Medium,Tier 3,Supermarket Type2,2922.1962 +FDN46,7.21,Regular,0.144924795,Snack Foods,100.8332,OUT045,2002,,Tier 2,Supermarket Type1,1537.998 +NCN53,5.175,LF,0.030349723,Health and Hygiene,37.0874,OUT035,2004,Small,Tier 2,Supermarket Type1,423.4488 +FDY32,,Low Fat,0.226284381,Fruits and Vegetables,163.221,OUT019,1985,Small,Tier 1,Grocery Store,326.242 +NCW06,16.2,Low Fat,0.050625182,Household,193.1162,OUT017,2007,,Tier 2,Supermarket Type1,2501.4106 +FDY48,14,Low Fat,0.02371512,Baking Goods,103.8332,OUT013,1987,High,Tier 3,Supermarket Type1,1743.0644 +NCP29,8.42,Low Fat,0.112177581,Health and Hygiene,65.9168,OUT013,1987,High,Tier 3,Supermarket Type1,958.752 +FDB60,9.3,low fat,0.04774013,Baking Goods,195.0136,OUT010,1998,,Tier 3,Grocery Store,194.4136 +DRE60,9.395,Low Fat,0.159304333,Soft Drinks,226.172,OUT035,2004,Small,Tier 2,Supermarket Type1,3848.324 +FDN51,17.85,Regular,0.020989308,Meat,260.7936,OUT045,2002,,Tier 2,Supermarket Type1,4697.8848 +DRE15,,Low Fat,0.01769927,Dairy,74.2012,OUT027,1985,Medium,Tier 3,Supermarket Type3,1290.3204 +DRG15,6.13,Low Fat,0,Dairy,60.1536,OUT013,1987,High,Tier 3,Supermarket Type1,1102.5648 +FDX55,,Low Fat,0.096658404,Fruits and Vegetables,216.9166,OUT019,1985,Small,Tier 1,Grocery Store,217.7166 +FDC57,20.1,Regular,0.054816926,Fruits and Vegetables,194.282,OUT018,2009,Medium,Tier 3,Supermarket Type2,1544.656 +FDA25,16.5,Regular,0.068511103,Canned,103.699,OUT017,2007,,Tier 2,Supermarket Type1,1651.184 +NCK29,5.615,Low Fat,0.12574524,Health and Hygiene,122.473,OUT035,2004,Small,Tier 2,Supermarket Type1,1354.903 +FDP48,7.52,Regular,0.044023213,Baking Goods,183.095,OUT046,1997,Small,Tier 1,Supermarket Type1,5492.85 +FDP49,,Regular,0.068754395,Breakfast,54.5614,OUT027,1985,Medium,Tier 3,Supermarket Type3,1713.1034 +FDL38,13.8,Regular,0.024660202,Canned,87.4172,OUT010,1998,,Tier 3,Grocery Store,178.4344 +FDZ21,17.6,Regular,0.039214444,Snack Foods,98.241,OUT035,2004,Small,Tier 2,Supermarket Type1,1930.82 +FDQ44,20.5,Low Fat,0.036344721,Fruits and Vegetables,122.3756,OUT017,2007,,Tier 2,Supermarket Type1,2544.6876 +NCB42,11.8,LF,0.008554052,Health and Hygiene,116.9492,OUT013,1987,High,Tier 3,Supermarket Type1,1969.4364 +FDY15,,Regular,0.170000805,Dairy,155.963,OUT027,1985,Medium,Tier 3,Supermarket Type3,4537.427 +NCW05,20.25,Low Fat,0.148302815,Health and Hygiene,108.3938,OUT049,1999,Medium,Tier 1,Supermarket Type1,2787.0388 +FDR23,15.85,Low Fat,0.081914677,Breads,177.637,OUT049,1999,Medium,Tier 1,Supermarket Type1,3352.303 +FDO34,17.7,Low Fat,0.029914022,Snack Foods,166.2816,OUT013,1987,High,Tier 3,Supermarket Type1,2516.724 +FDZ36,6.035,Regular,0.065771344,Baking Goods,185.324,OUT035,2004,Small,Tier 2,Supermarket Type1,3728.48 +FDX58,,Low Fat,0.043551753,Snack Foods,184.495,OUT027,1985,Medium,Tier 3,Supermarket Type3,7873.085 +NCJ18,12.35,Low Fat,0.163941937,Household,117.0124,OUT046,1997,Small,Tier 1,Supermarket Type1,1540.6612 +FDP22,14.65,Regular,0.099692906,Snack Foods,50.9666,OUT017,2007,,Tier 2,Supermarket Type1,717.7324 +FDH57,10.895,Low Fat,0.059834024,Fruits and Vegetables,133.5284,OUT010,1998,,Tier 3,Grocery Store,263.6568 +DRF51,15.75,Low Fat,0.166174549,Dairy,37.4506,OUT045,2002,,Tier 2,Supermarket Type1,1062.6168 +FDD51,11.15,LF,0.119930029,Dairy,44.2744,OUT035,2004,Small,Tier 2,Supermarket Type1,588.5672 +FDW04,8.985,reg,0.057944376,Frozen Foods,131.531,OUT045,2002,,Tier 2,Supermarket Type1,1428.141 +FDZ21,17.6,Regular,0.065649353,Snack Foods,94.841,OUT010,1998,,Tier 3,Grocery Store,193.082 +NCJ30,,LF,0.080249973,Household,168.679,OUT027,1985,Medium,Tier 3,Supermarket Type3,4923.591 +FDO45,13.15,Regular,0.037952777,Snack Foods,89.5856,OUT046,1997,Small,Tier 1,Supermarket Type1,1494.0552 +FDE41,9.195,Regular,0.064113698,Frozen Foods,86.5566,OUT049,1999,Medium,Tier 1,Supermarket Type1,1183.7924 +DRD13,,Low Fat,0.048841794,Soft Drinks,64.7168,OUT027,1985,Medium,Tier 3,Supermarket Type3,3068.0064 +NCC07,19.6,Low Fat,0.02394662,Household,106.9964,OUT035,2004,Small,Tier 2,Supermarket Type1,1788.3388 +FDE51,,Regular,0.096000183,Dairy,43.7086,OUT027,1985,Medium,Tier 3,Supermarket Type3,1293.6494 +NCG43,20.2,Low Fat,0.074177667,Household,93.2462,OUT013,1987,High,Tier 3,Supermarket Type1,1018.0082 +FDS59,,Regular,0.04368089,Breads,110.157,OUT027,1985,Medium,Tier 3,Supermarket Type3,2306.997 +FDV16,7.75,reg,0.083268523,Frozen Foods,32.9558,OUT018,2009,Medium,Tier 3,Supermarket Type2,101.8674 +FDC03,8.575,Regular,0.071832909,Dairy,194.1794,OUT035,2004,Small,Tier 2,Supermarket Type1,3316.3498 +FDV60,20.2,Regular,0,Baking Goods,197.211,OUT013,1987,High,Tier 3,Supermarket Type1,3535.398 +FDJ60,19.35,Regular,0.062625641,Baking Goods,165.3184,OUT049,1999,Medium,Tier 1,Supermarket Type1,1651.184 +FDX20,7.365,Low Fat,0.042646566,Fruits and Vegetables,225.172,OUT045,2002,,Tier 2,Supermarket Type1,452.744 +FDD17,7.5,Low Fat,0,Frozen Foods,237.7906,OUT035,2004,Small,Tier 2,Supermarket Type1,1188.453 +FDD08,8.3,Low Fat,0.03555434,Fruits and Vegetables,37.4506,OUT017,2007,,Tier 2,Supermarket Type1,796.9626 +FDX45,16.75,Low Fat,0.105068444,Snack Foods,156.663,OUT045,2002,,Tier 2,Supermarket Type1,2816.334 +FDM25,10.695,Regular,0.060912865,Breakfast,173.8712,OUT018,2009,Medium,Tier 3,Supermarket Type2,4570.0512 +NCT42,5.88,Low Fat,0.02488732,Household,147.5392,OUT046,1997,Small,Tier 1,Supermarket Type1,2684.5056 +FDT02,12.6,Low Fat,0.024194731,Dairy,36.1874,OUT046,1997,Small,Tier 1,Supermarket Type1,423.4488 +FDV34,10.695,Regular,0.01141595,Snack Foods,74.0038,OUT013,1987,High,Tier 3,Supermarket Type1,1034.6532 +NCR41,17.85,Low Fat,0.018023997,Health and Hygiene,95.9094,OUT046,1997,Small,Tier 1,Supermarket Type1,2285.0256 +FDT31,19.75,Low Fat,0.012499004,Fruits and Vegetables,188.0872,OUT018,2009,Medium,Tier 3,Supermarket Type2,2458.1336 +FDF33,7.97,Low Fat,0.036045991,Seafood,107.5596,OUT010,1998,,Tier 3,Grocery Store,431.4384 +NCU29,,Low Fat,0.044607722,Health and Hygiene,145.976,OUT019,1985,Small,Tier 1,Grocery Store,585.904 +NCB55,15.7,Low Fat,0.16098885,Household,57.8562,OUT045,2002,,Tier 2,Supermarket Type1,651.8182 +NCU18,15.1,Low Fat,0.055793586,Household,139.7496,OUT013,1987,High,Tier 3,Supermarket Type1,3952.1888 +FDZ59,6.63,Regular,0.104445322,Baking Goods,167.25,OUT018,2009,Medium,Tier 3,Supermarket Type2,1830.95 +NCI29,8.6,Low Fat,0.032687702,Health and Hygiene,140.9154,OUT045,2002,,Tier 2,Supermarket Type1,1134.5232 +FDL03,,Regular,0.026949463,Meat,197.711,OUT027,1985,Medium,Tier 3,Supermarket Type3,4910.275 +NCQ06,13,Low Fat,0.041909345,Household,255.0014,OUT045,2002,,Tier 2,Supermarket Type1,5865.0322 +FDY31,5.98,LF,0.04363058,Fruits and Vegetables,148.2418,OUT049,1999,Medium,Tier 1,Supermarket Type1,1618.5598 +DRI03,6.03,Low Fat,0,Dairy,175.1028,OUT049,1999,Medium,Tier 1,Supermarket Type1,1593.9252 +FDL38,13.8,Regular,0.014793124,Canned,88.5172,OUT018,2009,Medium,Tier 3,Supermarket Type2,2408.8644 +FDR37,,Regular,0.065928735,Breakfast,183.0292,OUT027,1985,Medium,Tier 3,Supermarket Type3,8209.314 +FDT59,,Low Fat,0.01583438,Breads,228.5668,OUT027,1985,Medium,Tier 3,Supermarket Type3,3225.1352 +FDV28,16.1,Regular,0.159728395,Frozen Foods,34.3558,OUT046,1997,Small,Tier 1,Supermarket Type1,271.6464 +NCX53,20.1,Low Fat,0.014925407,Health and Hygiene,143.4154,OUT013,1987,High,Tier 3,Supermarket Type1,3545.385 +FDZ12,9.17,Low Fat,0.102893121,Baking Goods,141.947,OUT013,1987,High,Tier 3,Supermarket Type1,4008.116 +NCT05,10.895,Low Fat,0.020951848,Health and Hygiene,255.3672,OUT046,1997,Small,Tier 1,Supermarket Type1,767.0016 +FDW38,5.325,Regular,0,Dairy,55.8298,OUT035,2004,Small,Tier 2,Supermarket Type1,485.3682 +FDD33,12.85,Low Fat,0.108102606,Fruits and Vegetables,233.3642,OUT013,1987,High,Tier 3,Supermarket Type1,3950.1914 +FDV39,,Low Fat,0,Meat,196.8426,OUT019,1985,Small,Tier 1,Grocery Store,593.2278 +DRE25,15.35,LF,0.073697713,Soft Drinks,91.912,OUT017,2007,,Tier 2,Supermarket Type1,559.272 +FDC59,16.7,reg,0.091437584,Starchy Foods,64.3168,OUT010,1998,,Tier 3,Grocery Store,127.8336 +FDF58,13.3,Low Fat,0.009581155,Snack Foods,64.951,OUT046,1997,Small,Tier 1,Supermarket Type1,1644.526 +NCP50,,Low Fat,0.035997636,Others,78.6618,OUT019,1985,Small,Tier 1,Grocery Store,80.5618 +FDS33,6.67,Regular,0.12332588,Snack Foods,90.2514,OUT013,1987,High,Tier 3,Supermarket Type1,974.0654 +FDP08,20.5,Regular,0.112584813,Fruits and Vegetables,192.0478,OUT049,1999,Medium,Tier 1,Supermarket Type1,1549.9824 +FDF29,15.1,Regular,0.019930418,Frozen Foods,131.531,OUT035,2004,Small,Tier 2,Supermarket Type1,2856.282 +NCF30,17,Low Fat,0.126244059,Household,124.6362,OUT046,1997,Small,Tier 1,Supermarket Type1,3900.9222 +FDI50,8.42,Regular,0.030905215,Canned,227.6352,OUT045,2002,,Tier 2,Supermarket Type1,2748.4224 +FDD56,15.2,Regular,0.104365283,Fruits and Vegetables,177.1054,OUT017,2007,,Tier 2,Supermarket Type1,3151.8972 +NCN41,17,Low Fat,0.087387669,Health and Hygiene,125.073,OUT010,1998,,Tier 3,Grocery Store,369.519 +FDE23,17.6,Regular,0.053481818,Starchy Foods,47.806,OUT017,2007,,Tier 2,Supermarket Type1,1071.938 +FDL26,18,Low Fat,0.073306615,Canned,155.0972,OUT049,1999,Medium,Tier 1,Supermarket Type1,3894.93 +NCB30,14.6,Low Fat,0.043021542,Household,196.9084,OUT010,1998,,Tier 3,Grocery Store,595.2252 +FDY50,5.8,Low Fat,0.13169655,Dairy,89.4172,OUT017,2007,,Tier 2,Supermarket Type1,2498.0816 +NCK19,9.8,Low Fat,0.090834158,Others,192.2478,OUT018,2009,Medium,Tier 3,Supermarket Type2,4068.7038 +NCR38,,Low Fat,0.19875618,Household,250.7724,OUT019,1985,Small,Tier 1,Grocery Store,251.6724 +FDI28,14.3,Low Fat,0.026321701,Frozen Foods,77.6302,OUT046,1997,Small,Tier 1,Supermarket Type1,950.7624 +FDO24,11.1,Low Fat,0.176215665,Baking Goods,158.8604,OUT046,1997,Small,Tier 1,Supermarket Type1,2693.8268 +FDC45,17,Low Fat,0.136008489,Fruits and Vegetables,171.7106,OUT045,2002,,Tier 2,Supermarket Type1,1711.106 +FDU27,18.6,Regular,0.17174348,Meat,48.8376,OUT049,1999,Medium,Tier 1,Supermarket Type1,1294.3152 +FDS09,8.895,Regular,0.08154715,Snack Foods,49.8008,OUT017,2007,,Tier 2,Supermarket Type1,759.012 +DRE13,,low fat,0.027570939,Soft Drinks,86.6198,OUT027,1985,Medium,Tier 3,Supermarket Type3,2529.3742 +FDV15,10.3,Low Fat,0.146767897,Meat,102.3648,OUT018,2009,Medium,Tier 3,Supermarket Type2,1557.972 +FDH26,19.25,Regular,0.03467086,Canned,141.8496,OUT013,1987,High,Tier 3,Supermarket Type1,2399.5432 +FDI22,12.6,Low Fat,0.09619424,Snack Foods,210.8612,OUT035,2004,Small,Tier 2,Supermarket Type1,1254.3672 +FDJ26,15.3,Regular,0.08511049,Canned,215.7218,OUT018,2009,Medium,Tier 3,Supermarket Type2,1923.4962 +FDD26,,Regular,0.1263349,Canned,184.0924,OUT019,1985,Small,Tier 1,Grocery Store,555.2772 +NCI55,,Low Fat,0.012592289,Household,123.3414,OUT027,1985,Medium,Tier 3,Supermarket Type3,4751.8146 +FDA35,,Regular,0.05357685,Baking Goods,122.2072,OUT027,1985,Medium,Tier 3,Supermarket Type3,3552.7088 +FDN21,18.6,Low Fat,0.077168705,Snack Foods,160.6236,OUT018,2009,Medium,Tier 3,Supermarket Type2,1611.236 +NCM43,14.5,Low Fat,0.032597778,Others,163.621,OUT010,1998,,Tier 3,Grocery Store,815.605 +FDD09,13.5,Low Fat,0.021583971,Fruits and Vegetables,179.5976,OUT018,2009,Medium,Tier 3,Supermarket Type2,2173.1712 +FDI24,10.3,Low Fat,0.078903499,Baking Goods,177.637,OUT045,2002,,Tier 2,Supermarket Type1,4234.488 +NCN41,,Low Fat,0.091411749,Health and Hygiene,121.373,OUT019,1985,Small,Tier 1,Grocery Store,369.519 +NCT53,,Low Fat,0.084245356,Health and Hygiene,164.6526,OUT019,1985,Small,Tier 1,Grocery Store,657.8104 +FDQ47,7.155,Regular,0.281509514,Breads,33.8874,OUT010,1998,,Tier 3,Grocery Store,35.2874 +NCD42,16.5,Low Fat,0.012689327,Health and Hygiene,39.7506,OUT018,2009,Medium,Tier 3,Supermarket Type2,227.7036 +FDI21,5.59,Regular,0.094741514,Snack Foods,63.1168,OUT010,1998,,Tier 3,Grocery Store,191.7504 +FDS48,15.15,Low Fat,0.046496777,Baking Goods,149.6708,OUT010,1998,,Tier 3,Grocery Store,300.9416 +FDW50,13.1,Low Fat,0.076005548,Dairy,166.1158,OUT017,2007,,Tier 2,Supermarket Type1,1169.8106 +FDO37,8.06,Low Fat,0,Breakfast,232.7326,OUT018,2009,Medium,Tier 3,Supermarket Type2,3696.5216 +FDS04,10.195,Regular,0,Frozen Foods,139.5838,OUT018,2009,Medium,Tier 3,Supermarket Type2,4495.4816 +FDP38,10.1,Low Fat,0.053732324,Canned,49.8008,OUT010,1998,,Tier 3,Grocery Store,303.6048 +NCF06,6.235,Low Fat,0.033807904,Household,258.9962,OUT010,1998,,Tier 3,Grocery Store,258.9962 +FDR35,12.5,Low Fat,0.020782036,Breads,198.3742,OUT018,2009,Medium,Tier 3,Supermarket Type2,2587.9646 +FDB04,11.35,Regular,0.063173691,Dairy,86.1856,OUT013,1987,High,Tier 3,Supermarket Type1,1494.0552 +FDK16,9.065,Low Fat,0.115563679,Frozen Foods,96.0094,OUT045,2002,,Tier 2,Supermarket Type1,1713.7692 +FDM57,11.65,Regular,0.076278201,Snack Foods,85.1908,OUT017,2007,,Tier 2,Supermarket Type1,671.1264 +FDF45,18.2,Regular,0.012223687,Fruits and Vegetables,57.1904,OUT049,1999,Medium,Tier 1,Supermarket Type1,1640.5312 +FDH04,6.115,Regular,0.011419301,Frozen Foods,91.0488,OUT018,2009,Medium,Tier 3,Supermarket Type2,1629.8784 +FDL25,6.92,Regular,0.131458247,Breakfast,90.5804,OUT018,2009,Medium,Tier 3,Supermarket Type2,183.7608 +FDK40,7.035,LF,0.021883368,Frozen Foods,263.791,OUT049,1999,Medium,Tier 1,Supermarket Type1,4996.829 +FDV46,18.2,Low Fat,0.012607876,Snack Foods,139.818,OUT046,1997,Small,Tier 1,Supermarket Type1,1398.18 +FDU31,10.5,Regular,0.025041738,Fruits and Vegetables,218.7508,OUT045,2002,,Tier 2,Supermarket Type1,3255.762 +NCQ53,17.6,Low Fat,0.018934719,Health and Hygiene,237.759,OUT049,1999,Medium,Tier 1,Supermarket Type1,3545.385 +FDD09,,Low Fat,0.021392306,Fruits and Vegetables,182.0976,OUT027,1985,Medium,Tier 3,Supermarket Type3,6157.3184 +FDY19,19.75,Low Fat,0.041448824,Fruits and Vegetables,116.5466,OUT045,2002,,Tier 2,Supermarket Type1,2828.3184 +FDI33,16.5,Low Fat,0.028395167,Snack Foods,91.7146,OUT013,1987,High,Tier 3,Supermarket Type1,2462.7942 +FDG08,13.15,Regular,0.165221717,Fruits and Vegetables,172.0764,OUT013,1987,High,Tier 3,Supermarket Type1,4466.1864 +FDE39,7.89,Low Fat,0.036127671,Dairy,117.4782,OUT035,2004,Small,Tier 2,Supermarket Type1,2026.0294 +FDH53,20.5,Regular,0.019277945,Frozen Foods,82.8592,OUT018,2009,Medium,Tier 3,Supermarket Type2,1733.7432 +FDB09,16.25,Low Fat,0.057629899,Fruits and Vegetables,123.9046,OUT018,2009,Medium,Tier 3,Supermarket Type2,1120.5414 +FDI22,12.6,Low Fat,0.096212432,Snack Foods,207.2612,OUT046,1997,Small,Tier 1,Supermarket Type1,4390.2852 +FDX24,,LF,0.024387984,Baking Goods,92.4462,OUT019,1985,Small,Tier 1,Grocery Store,185.0924 +FDE09,8.775,Low Fat,0.021647195,Fruits and Vegetables,109.5228,OUT045,2002,,Tier 2,Supermarket Type1,994.7052 +FDJ57,7.42,Regular,0.021573645,Seafood,184.6582,OUT046,1997,Small,Tier 1,Supermarket Type1,5015.4714 +DRC49,8.67,Low Fat,0.065424208,Soft Drinks,145.8128,OUT035,2004,Small,Tier 2,Supermarket Type1,2444.8176 +FDU19,8.77,Regular,0.046866331,Fruits and Vegetables,170.5422,OUT045,2002,,Tier 2,Supermarket Type1,1551.9798 +FDU43,19.35,Regular,0,Fruits and Vegetables,238.6564,OUT013,1987,High,Tier 3,Supermarket Type1,3575.346 +FDA50,16.25,Low Fat,0.087102593,Dairy,96.041,OUT013,1987,High,Tier 3,Supermarket Type1,868.869 +NCM29,11.5,Low Fat,0.01774202,Health and Hygiene,129.6626,OUT017,2007,,Tier 2,Supermarket Type1,1836.2764 +FDQ13,11.1,Low Fat,0.010632752,Canned,82.5908,OUT013,1987,High,Tier 3,Supermarket Type1,1510.0344 +FDB26,,Regular,0.031116081,Canned,55.264,OUT027,1985,Medium,Tier 3,Supermarket Type3,1544.656 +FDI21,5.59,Regular,0.05671761,Snack Foods,62.9168,OUT045,2002,,Tier 2,Supermarket Type1,1406.1696 +FDV25,,Low Fat,0.079931185,Canned,219.7456,OUT019,1985,Small,Tier 1,Grocery Store,884.1824 +FDQ23,6.55,Low Fat,0.024505418,Breads,102.9332,OUT013,1987,High,Tier 3,Supermarket Type1,1845.5976 +FDJ41,6.85,Low Fat,0.03830192,Frozen Foods,261.2594,OUT010,1998,,Tier 3,Grocery Store,1046.6376 +NCO42,21.25,Low Fat,0.024693927,Household,144.1102,OUT049,1999,Medium,Tier 1,Supermarket Type1,1749.7224 +FDQ13,,Low Fat,0.010590075,Canned,84.6908,OUT027,1985,Medium,Tier 3,Supermarket Type3,3691.1952 +FDU47,12.8,Regular,0.190569038,Breads,138.7838,OUT010,1998,,Tier 3,Grocery Store,280.9676 +FDW57,8.31,Regular,0,Snack Foods,177.4028,OUT046,1997,Small,Tier 1,Supermarket Type1,3896.2616 +DRN47,12.1,Low Fat,0.016826748,Hard Drinks,179.166,OUT046,1997,Small,Tier 1,Supermarket Type1,3056.022 +FDW28,,Low Fat,0.088394115,Frozen Foods,194.7452,OUT027,1985,Medium,Tier 3,Supermarket Type3,5872.356 +NCN42,20.25,Low Fat,0,Household,145.6418,OUT013,1987,High,Tier 3,Supermarket Type1,3384.2614 +FDR60,,Low Fat,0.129783577,Baking Goods,78.2328,OUT027,1985,Medium,Tier 3,Supermarket Type3,1004.0264 +FDO09,,Regular,0,Snack Foods,262.891,OUT019,1985,Small,Tier 1,Grocery Store,788.973 +FDX45,16.75,Low Fat,0,Snack Foods,156.163,OUT046,1997,Small,Tier 1,Supermarket Type1,2816.334 +FDH27,7.075,Low Fat,0.058465268,Dairy,145.3128,OUT045,2002,,Tier 2,Supermarket Type1,1869.5664 +FDO08,11.1,Regular,0.053765212,Fruits and Vegetables,163.1526,OUT035,2004,Small,Tier 2,Supermarket Type1,1808.9786 +FDG10,6.63,Regular,0.01098386,Snack Foods,55.4588,OUT018,2009,Medium,Tier 3,Supermarket Type2,343.5528 +FDZ40,8.935,Low Fat,0.040245222,Frozen Foods,54.9298,OUT049,1999,Medium,Tier 1,Supermarket Type1,1348.245 +FDZ27,7.935,Low Fat,0.017253305,Dairy,51.435,OUT017,2007,,Tier 2,Supermarket Type1,499.35 +FDZ46,7.485,Low Fat,0.069231189,Snack Foods,112.1228,OUT049,1999,Medium,Tier 1,Supermarket Type1,1215.7508 +FDI46,9.5,Low Fat,0.074648119,Snack Foods,253.3724,OUT018,2009,Medium,Tier 3,Supermarket Type2,755.0172 +NCW53,18.35,Low Fat,0.030542489,Health and Hygiene,193.1162,OUT049,1999,Medium,Tier 1,Supermarket Type1,2693.8268 +FDY52,6.365,Low Fat,0.007359711,Frozen Foods,60.1536,OUT049,1999,Medium,Tier 1,Supermarket Type1,490.0288 +FDU07,11.1,Low Fat,0.059940022,Fruits and Vegetables,149.1366,OUT049,1999,Medium,Tier 1,Supermarket Type1,4231.8248 +NCQ05,11.395,Low Fat,0,Health and Hygiene,149.2708,OUT017,2007,,Tier 2,Supermarket Type1,2407.5328 +FDT16,9.895,Regular,0.048860587,Frozen Foods,260.2278,OUT018,2009,Medium,Tier 3,Supermarket Type2,4165.2448 +NCJ17,7.68,Low Fat,0.153419412,Health and Hygiene,86.4224,OUT017,2007,,Tier 2,Supermarket Type1,511.3344 +NCY29,13.65,Low Fat,0.077219509,Health and Hygiene,56.493,OUT035,2004,Small,Tier 2,Supermarket Type1,509.337 +NCQ18,15.75,Low Fat,0.13504726,Household,98.57,OUT035,2004,Small,Tier 2,Supermarket Type1,2496.75 +FDS02,10.195,Regular,0.146094132,Dairy,196.1794,OUT049,1999,Medium,Tier 1,Supermarket Type1,2926.191 +NCK31,10.895,Low Fat,0.027157955,Others,50.2666,OUT018,2009,Medium,Tier 3,Supermarket Type2,820.2656 +FDH60,,Regular,0.080346058,Baking Goods,195.711,OUT027,1985,Medium,Tier 3,Supermarket Type3,5499.508 +FDO19,17.7,Regular,0.016596645,Fruits and Vegetables,48.3034,OUT046,1997,Small,Tier 1,Supermarket Type1,777.6544 +DRF37,17.25,low fat,0.084316691,Soft Drinks,263.391,OUT035,2004,Small,Tier 2,Supermarket Type1,6311.784 +FDN21,18.6,Low Fat,0.076791671,Snack Foods,161.0236,OUT013,1987,High,Tier 3,Supermarket Type1,3705.8428 +FDM14,13.8,Low Fat,0.01326146,Canned,108.0254,OUT035,2004,Small,Tier 2,Supermarket Type1,759.6778 +FDO08,11.1,Regular,0,Fruits and Vegetables,165.5526,OUT018,2009,Medium,Tier 3,Supermarket Type2,1973.4312 +FDS27,10.195,Regular,0.012528611,Meat,195.111,OUT017,2007,,Tier 2,Supermarket Type1,3731.809 +DRM59,5.88,Low Fat,0.003597678,Hard Drinks,153.8998,OUT049,1999,Medium,Tier 1,Supermarket Type1,2922.1962 +NCO29,11.15,Low Fat,0.032438645,Health and Hygiene,163.0526,OUT017,2007,,Tier 2,Supermarket Type1,2302.3364 +FDC32,,Low Fat,0.173527068,Fruits and Vegetables,92.0462,OUT019,1985,Small,Tier 1,Grocery Store,277.6386 +DRA12,11.6,Low Fat,0.041112694,Soft Drinks,142.0154,OUT018,2009,Medium,Tier 3,Supermarket Type2,850.8924 +FDI14,,Low Fat,0.089243504,Canned,139.2496,OUT027,1985,Medium,Tier 3,Supermarket Type3,1976.0944 +DRG51,12.1,Low Fat,0.011539622,Dairy,163.5526,OUT046,1997,Small,Tier 1,Supermarket Type1,2302.3364 +FDR33,,Low Fat,0.04690397,Snack Foods,110.657,OUT019,1985,Small,Tier 1,Grocery Store,659.142 +FDS23,4.635,Low Fat,0.141686037,Breads,126.9994,OUT017,2007,,Tier 2,Supermarket Type1,1798.9916 +NCF43,8.51,Low Fat,0.052051256,Household,142.247,OUT045,2002,,Tier 2,Supermarket Type1,2004.058 +DRN37,9.6,low fat,0.09627919,Soft Drinks,167.3158,OUT035,2004,Small,Tier 2,Supermarket Type1,1838.2738 +FDX57,17.25,Regular,0.047533568,Snack Foods,96.9068,OUT017,2007,,Tier 2,Supermarket Type1,1458.102 +NCC42,15,Low Fat,0.04499948,Health and Hygiene,140.4838,OUT045,2002,,Tier 2,Supermarket Type1,1685.8056 +FDS47,16.75,Low Fat,0.12888573,Breads,87.6856,OUT046,1997,Small,Tier 1,Supermarket Type1,1494.0552 +DRK35,8.365,Low Fat,0.120256303,Hard Drinks,39.2506,OUT010,1998,,Tier 3,Grocery Store,75.9012 +DRF37,,Low Fat,0,Soft Drinks,261.291,OUT019,1985,Small,Tier 1,Grocery Store,788.973 +DRI23,18.85,Low Fat,0.137755834,Hard Drinks,161.8578,OUT018,2009,Medium,Tier 3,Supermarket Type2,3530.0716 +FDB28,6.615,Low Fat,0.093913607,Dairy,198.7426,OUT017,2007,,Tier 2,Supermarket Type1,1186.4556 +FDU50,5.75,Regular,0.075287081,Dairy,115.3176,OUT049,1999,Medium,Tier 1,Supermarket Type1,572.588 +FDD22,10,Low Fat,0.100055625,Snack Foods,113.3544,OUT018,2009,Medium,Tier 3,Supermarket Type2,3467.4864 +FDG04,13.1,Low Fat,0.006061565,Frozen Foods,188.9898,OUT035,2004,Small,Tier 2,Supermarket Type1,4303.0654 +FDM08,10.1,Regular,0.053667516,Fruits and Vegetables,223.0088,OUT049,1999,Medium,Tier 1,Supermarket Type1,671.1264 +FDI28,,Low Fat,0.026194237,Frozen Foods,79.0302,OUT027,1985,Medium,Tier 3,Supermarket Type3,1901.5248 +FDM57,11.65,Regular,0.076002991,Snack Foods,83.4908,OUT045,2002,,Tier 2,Supermarket Type1,503.3448 +NCS17,,Low Fat,0.080111611,Health and Hygiene,94.6436,OUT027,1985,Medium,Tier 3,Supermarket Type3,4065.3748 +FDX44,9.3,Low Fat,0.043141572,Fruits and Vegetables,90.4172,OUT018,2009,Medium,Tier 3,Supermarket Type2,1249.0408 +DRE03,19.6,Low Fat,0.024276035,Dairy,45.3718,OUT045,2002,,Tier 2,Supermarket Type1,614.5334 +FDT46,11.35,Low Fat,0.03093263,Snack Foods,51.5008,OUT018,2009,Medium,Tier 3,Supermarket Type2,607.2096 +FDW60,5.44,Regular,0.017096552,Baking Goods,178.137,OUT045,2002,,Tier 2,Supermarket Type1,3175.866 +FDE44,14.65,Low Fat,0.172357491,Fruits and Vegetables,50.8692,OUT017,2007,,Tier 2,Supermarket Type1,788.3072 +FDT24,12.35,Regular,0.185824165,Baking Goods,78.5328,OUT035,2004,Small,Tier 2,Supermarket Type1,695.0952 +FDO20,12.85,Regular,0.152988295,Fruits and Vegetables,253.7382,OUT017,2007,,Tier 2,Supermarket Type1,2271.0438 +FDV47,17.1,Low Fat,0,Breads,85.5566,OUT049,1999,Medium,Tier 1,Supermarket Type1,1860.2452 +FDZ26,11.6,reg,0.143897558,Dairy,240.6222,OUT013,1987,High,Tier 3,Supermarket Type1,2868.2664 +FDK48,7.445,Low Fat,0.037845086,Baking Goods,75.5354,OUT017,2007,,Tier 2,Supermarket Type1,1956.1204 +FDX32,,Regular,0.1748389,Fruits and Vegetables,142.8786,OUT019,1985,Small,Tier 1,Grocery Store,433.4358 +FDE56,,Regular,0.278730642,Fruits and Vegetables,63.2194,OUT019,1985,Small,Tier 1,Grocery Store,247.6776 +DRJ01,6.135,low fat,0.115500999,Soft Drinks,161.1236,OUT018,2009,Medium,Tier 3,Supermarket Type2,644.4944 +FDC53,8.68,Low Fat,0.01478914,Frozen Foods,97.7384,OUT010,1998,,Tier 3,Grocery Store,98.5384 +NCN07,18.5,Low Fat,0.033938279,Others,132.5284,OUT035,2004,Small,Tier 2,Supermarket Type1,1318.284 +FDI28,14.3,Low Fat,0.026299797,Frozen Foods,79.4302,OUT013,1987,High,Tier 3,Supermarket Type1,1743.0644 +NCO55,,Low Fat,0.159394437,Others,105.6938,OUT019,1985,Small,Tier 1,Grocery Store,214.3876 +FDP46,15.35,Low Fat,0,Snack Foods,88.283,OUT046,1997,Small,Tier 1,Supermarket Type1,1797.66 +FDX26,17.7,Low Fat,0,Dairy,182.5292,OUT013,1987,High,Tier 3,Supermarket Type1,2736.438 +FDD56,15.2,Regular,0.10377827,Fruits and Vegetables,175.6054,OUT046,1997,Small,Tier 1,Supermarket Type1,2451.4756 +FDP12,9.8,Regular,0.045522854,Baking Goods,35.0874,OUT017,2007,,Tier 2,Supermarket Type1,352.874 +FDT40,,Low Fat,0.095331433,Frozen Foods,125.5678,OUT027,1985,Medium,Tier 3,Supermarket Type3,2543.356 +FDV57,15.25,Regular,0,Snack Foods,179.766,OUT018,2009,Medium,Tier 3,Supermarket Type2,3056.022 +FDZ09,17.6,Low Fat,0.105472205,Snack Foods,165.6868,OUT017,2007,,Tier 2,Supermarket Type1,3111.9492 +FDA07,7.55,Regular,0.030938774,Fruits and Vegetables,121.0072,OUT035,2004,Small,Tier 2,Supermarket Type1,2082.6224 +FDV36,,Low Fat,0.026174636,Baking Goods,127.102,OUT027,1985,Medium,Tier 3,Supermarket Type3,3415.554 +FDQ01,19.7,Regular,0.160671255,Canned,254.7014,OUT035,2004,Small,Tier 2,Supermarket Type1,3570.0196 +FDW46,13,Regular,0.070243155,Snack Foods,65.7484,OUT013,1987,High,Tier 3,Supermarket Type1,391.4904 +FDW19,,Regular,0.038313981,Fruits and Vegetables,109.957,OUT027,1985,Medium,Tier 3,Supermarket Type3,4504.137 +FDY01,11.8,Regular,0.170548238,Canned,113.8834,OUT049,1999,Medium,Tier 1,Supermarket Type1,1382.2008 +FDG60,20.35,Low Fat,0.060794097,Baking Goods,233.6616,OUT049,1999,Medium,Tier 1,Supermarket Type1,2577.9776 +FDL22,16.85,Low Fat,0.036446751,Snack Foods,90.3488,OUT049,1999,Medium,Tier 1,Supermarket Type1,996.0368 +DRK01,7.63,Low Fat,0.061188147,Soft Drinks,94.0436,OUT045,2002,,Tier 2,Supermarket Type1,1134.5232 +FDO12,15.75,Low Fat,0.054884821,Baking Goods,195.3452,OUT013,1987,High,Tier 3,Supermarket Type1,1761.7068 +FDX12,18.2,Regular,0.026064486,Baking Goods,241.8196,OUT046,1997,Small,Tier 1,Supermarket Type1,4097.3332 +FDR28,13.85,Regular,0.025936747,Frozen Foods,164.921,OUT049,1999,Medium,Tier 1,Supermarket Type1,2609.936 +FDH57,10.895,LF,0.035949725,Fruits and Vegetables,132.9284,OUT017,2007,,Tier 2,Supermarket Type1,3295.71 +FDC04,15.6,Low Fat,0.045168898,Dairy,242.9854,OUT018,2009,Medium,Tier 3,Supermarket Type2,2175.1686 +NCI06,11.3,Low Fat,0.04767798,Household,181.466,OUT013,1987,High,Tier 3,Supermarket Type1,3775.086 +NCY53,20,Low Fat,0.058812134,Health and Hygiene,111.6544,OUT017,2007,,Tier 2,Supermarket Type1,1565.9616 +FDR22,19.35,Regular,0.018667601,Snack Foods,112.9544,OUT017,2007,,Tier 2,Supermarket Type1,2908.2144 +FDM33,15.6,Low Fat,0.087646694,Snack Foods,221.5798,OUT013,1987,High,Tier 3,Supermarket Type1,5509.495 +FDO57,,Low Fat,0.19033746,Snack Foods,159.4578,OUT019,1985,Small,Tier 1,Grocery Store,160.4578 +FDO56,10.195,Regular,0.045165796,Fruits and Vegetables,118.4808,OUT018,2009,Medium,Tier 3,Supermarket Type2,1640.5312 +FDO58,,Low Fat,0.039385518,Snack Foods,164.8526,OUT027,1985,Medium,Tier 3,Supermarket Type3,2631.2416 +FDQ45,9.5,Regular,0.010914988,Snack Foods,183.8608,OUT035,2004,Small,Tier 2,Supermarket Type1,2572.6512 +FDO60,,Low Fat,0.034203092,Baking Goods,43.3086,OUT027,1985,Medium,Tier 3,Supermarket Type3,624.5204 +FDI34,10.65,reg,0.085268317,Snack Foods,229.7668,OUT049,1999,Medium,Tier 1,Supermarket Type1,3916.2356 +FDJ26,,Regular,0.084354713,Canned,215.5218,OUT027,1985,Medium,Tier 3,Supermarket Type3,4915.6014 +FDV08,7.35,Low Fat,0.028571132,Fruits and Vegetables,40.8454,OUT013,1987,High,Tier 3,Supermarket Type1,587.2356 +DRD60,15.7,LF,0.037383778,Soft Drinks,179.7634,OUT018,2009,Medium,Tier 3,Supermarket Type2,1817.634 +FDX20,,Low Fat,0.042354152,Fruits and Vegetables,227.272,OUT027,1985,Medium,Tier 3,Supermarket Type3,7017.532 +FDG59,15.85,Low Fat,0.043410693,Starchy Foods,39.4164,OUT018,2009,Medium,Tier 3,Supermarket Type2,154.4656 +FDN58,13.8,Regular,0.056872392,Snack Foods,231.1984,OUT046,1997,Small,Tier 1,Supermarket Type1,5097.3648 +FDV48,9.195,Regular,0.051573903,Baking Goods,79.8644,OUT013,1987,High,Tier 3,Supermarket Type1,785.644 +FDA15,9.3,LF,0.016113019,Dairy,248.8092,OUT017,2007,,Tier 2,Supermarket Type1,5976.2208 +FDI19,15.1,Low Fat,0.052295514,Meat,242.9512,OUT013,1987,High,Tier 3,Supermarket Type1,4847.024 +FDX19,19.1,Low Fat,0.097127867,Fruits and Vegetables,234.4958,OUT018,2009,Medium,Tier 3,Supermarket Type2,1635.8706 +FDO52,11.6,Regular,0.077284566,Frozen Foods,172.4106,OUT049,1999,Medium,Tier 1,Supermarket Type1,4277.765 +NCO05,7.27,Low Fat,0.046653872,Health and Hygiene,98.6384,OUT045,2002,,Tier 2,Supermarket Type1,1970.768 +NCP17,19.35,Low Fat,0.02775746,Health and Hygiene,62.5168,OUT049,1999,Medium,Tier 1,Supermarket Type1,1534.0032 +FDK56,9.695,Low Fat,0,Fruits and Vegetables,186.7898,OUT010,1998,,Tier 3,Grocery Store,561.2694 +NCG43,20.2,Low Fat,0,Household,94.1462,OUT046,1997,Small,Tier 1,Supermarket Type1,832.9158 +DRM59,,LF,0.003574698,Hard Drinks,154.6998,OUT027,1985,Medium,Tier 3,Supermarket Type3,3229.7958 +FDA47,10.5,Regular,0.11733375,Baking Goods,164.121,OUT017,2007,,Tier 2,Supermarket Type1,2773.057 +FDY20,12.5,Regular,0.081684728,Fruits and Vegetables,92.3488,OUT013,1987,High,Tier 3,Supermarket Type1,1177.1344 +FDZ22,,Low Fat,0.079261744,Snack Foods,81.825,OUT019,1985,Small,Tier 1,Grocery Store,83.225 +FDB52,17.75,Low Fat,0.030410273,Dairy,256.0672,OUT013,1987,High,Tier 3,Supermarket Type1,2045.3376 +NCS29,9,Low Fat,0.069938838,Health and Hygiene,264.8884,OUT017,2007,,Tier 2,Supermarket Type1,2914.8724 +DRC12,17.85,Low Fat,0.037885683,Soft Drinks,190.4188,OUT049,1999,Medium,Tier 1,Supermarket Type1,952.094 +FDP13,,Regular,0.235183205,Canned,41.548,OUT019,1985,Small,Tier 1,Grocery Store,79.896 +DRF23,4.61,Low Fat,0.123151947,Hard Drinks,175.2396,OUT018,2009,Medium,Tier 3,Supermarket Type2,2093.2752 +FDB56,8.75,Regular,0.074565098,Fruits and Vegetables,186.8556,OUT013,1987,High,Tier 3,Supermarket Type1,7322.4684 +FDQ47,7.155,Regular,0.169137707,Breads,35.2874,OUT017,2007,,Tier 2,Supermarket Type1,388.1614 +FDY39,,Regular,0,Meat,182.0608,OUT027,1985,Medium,Tier 3,Supermarket Type3,7717.9536 +FDY36,12.3,Low Fat,0.009429612,Baking Goods,71.338,OUT045,2002,,Tier 2,Supermarket Type1,1098.57 +NCM17,7.93,Low Fat,0.071076672,Health and Hygiene,44.9086,OUT013,1987,High,Tier 3,Supermarket Type1,802.9548 +DRN35,8.01,Low Fat,0.070234306,Hard Drinks,34.9532,OUT035,2004,Small,Tier 2,Supermarket Type1,539.298 +FDK22,9.8,Low Fat,0.043663452,Snack Foods,217.185,OUT010,1998,,Tier 3,Grocery Store,432.77 +FDI07,,Regular,0.059110912,Meat,199.3426,OUT019,1985,Small,Tier 1,Grocery Store,395.4852 +DRK37,5,LF,0,Soft Drinks,190.453,OUT010,1998,,Tier 3,Grocery Store,379.506 +NCP05,19.6,Low Fat,0.042324556,Health and Hygiene,150.9024,OUT010,1998,,Tier 3,Grocery Store,303.6048 +NCD42,16.5,Low Fat,0.012657494,Health and Hygiene,36.3506,OUT049,1999,Medium,Tier 1,Supermarket Type1,872.8638 +FDW11,12.6,low fat,0.048857925,Breads,61.0194,OUT049,1999,Medium,Tier 1,Supermarket Type1,1052.6298 +FDI14,14.1,Low Fat,0.090185027,Canned,140.2496,OUT017,2007,,Tier 2,Supermarket Type1,2681.8424 +NCY42,6.38,Low Fat,0.015186146,Household,144.947,OUT049,1999,Medium,Tier 1,Supermarket Type1,3435.528 +FDV26,20.25,Regular,0,Dairy,194.2794,OUT049,1999,Medium,Tier 1,Supermarket Type1,4291.7468 +FDX15,,Low Fat,0.155541973,Meat,159.7578,OUT027,1985,Medium,Tier 3,Supermarket Type3,641.8312 +NCG07,12.3,Low Fat,0.052502049,Household,190.853,OUT046,1997,Small,Tier 1,Supermarket Type1,4364.319 +FDC44,15.6,Low Fat,0.172596885,Fruits and Vegetables,114.8518,OUT046,1997,Small,Tier 1,Supermarket Type1,2163.1842 +FDC47,15,Low Fat,0.118868155,Snack Foods,229.4694,OUT035,2004,Small,Tier 2,Supermarket Type1,5937.6044 +NCK53,11.6,Low Fat,0.037639672,Health and Hygiene,98.4042,OUT049,1999,Medium,Tier 1,Supermarket Type1,1388.8588 +FDY49,,Regular,0.021031586,Canned,164.7184,OUT019,1985,Small,Tier 1,Grocery Store,495.3552 +NCM07,,Low Fat,0.069968018,Others,83.9908,OUT019,1985,Small,Tier 1,Grocery Store,167.7816 +FDR47,17.85,Low Fat,0.087963415,Breads,193.3794,OUT017,2007,,Tier 2,Supermarket Type1,4291.7468 +FDS59,14.8,Regular,0.043885147,Breads,108.757,OUT035,2004,Small,Tier 2,Supermarket Type1,1867.569 +DRK47,7.905,Low Fat,0.064163983,Hard Drinks,229.9694,OUT049,1999,Medium,Tier 1,Supermarket Type1,4567.388 +FDZ27,,Low Fat,0,Dairy,51.235,OUT019,1985,Small,Tier 1,Grocery Store,49.935 +FDE36,,Regular,0,Baking Goods,165.5868,OUT027,1985,Medium,Tier 3,Supermarket Type3,5404.9644 +FDM51,11.8,Regular,0.02592132,Meat,101.9674,OUT035,2004,Small,Tier 2,Supermarket Type1,1731.7458 +FDY48,14,Low Fat,0.023734872,Baking Goods,103.2332,OUT046,1997,Small,Tier 1,Supermarket Type1,1845.5976 +FDA35,14.85,Regular,0.053921264,Baking Goods,123.0072,OUT049,1999,Medium,Tier 1,Supermarket Type1,1960.1152 +NCL31,7.39,Low Fat,0.120770963,Others,143.447,OUT018,2009,Medium,Tier 3,Supermarket Type2,2290.352 +FDC47,15,Low Fat,0.118791698,Snack Foods,229.9694,OUT013,1987,High,Tier 3,Supermarket Type1,4339.0186 +FDI26,,Low Fat,0.034717799,Canned,179.4344,OUT027,1985,Medium,Tier 3,Supermarket Type3,6066.7696 +FDQ16,19.7,LF,0.041823046,Frozen Foods,108.0912,OUT045,2002,,Tier 2,Supermarket Type1,1965.4416 +FDK15,10.8,Low Fat,0.164724567,Meat,98.4042,OUT010,1998,,Tier 3,Grocery Store,99.2042 +NCO53,,Low Fat,0.174336148,Health and Hygiene,184.0608,OUT027,1985,Medium,Tier 3,Supermarket Type3,6431.628 +FDG12,,Regular,0.006295472,Baking Goods,122.4098,OUT027,1985,Medium,Tier 3,Supermarket Type3,3735.8038 +FDU28,,Regular,0.093463546,Frozen Foods,189.1214,OUT027,1985,Medium,Tier 3,Supermarket Type3,2261.0568 +FDI20,,Low Fat,0.067520165,Fruits and Vegetables,211.3586,OUT019,1985,Small,Tier 1,Grocery Store,422.1172 +DRN37,9.6,Low Fat,0.161182103,Soft Drinks,165.3158,OUT010,1998,,Tier 3,Grocery Store,334.2316 +FDD28,10.695,Low Fat,0.053296868,Frozen Foods,59.6904,OUT046,1997,Small,Tier 1,Supermarket Type1,937.4464 +FDP31,21.1,Regular,0.161474419,Fruits and Vegetables,62.9168,OUT035,2004,Small,Tier 2,Supermarket Type1,1086.5856 +DRD27,,Low Fat,0.041740624,Dairy,98.3042,OUT019,1985,Small,Tier 1,Grocery Store,198.4084 +DRF01,,Low Fat,0.306542848,Soft Drinks,147.3102,OUT019,1985,Small,Tier 1,Grocery Store,291.6204 +DRD25,6.135,LF,0.079293753,Soft Drinks,111.286,OUT018,2009,Medium,Tier 3,Supermarket Type2,2263.72 +FDD53,16.2,Low Fat,0.044472637,Frozen Foods,43.3454,OUT017,2007,,Tier 2,Supermarket Type1,922.7988 +FDQ24,15.7,Low Fat,0.073816097,Baking Goods,253.4724,OUT045,2002,,Tier 2,Supermarket Type1,2013.3792 +FDY49,17.2,Regular,0.012080016,Canned,164.4184,OUT017,2007,,Tier 2,Supermarket Type1,2641.8944 +NCP18,12.15,Low Fat,0.02859825,Household,150.4708,OUT046,1997,Small,Tier 1,Supermarket Type1,2257.062 +FDT07,,Regular,0.076944658,Fruits and Vegetables,257.133,OUT027,1985,Medium,Tier 3,Supermarket Type3,7433.657 +FDG46,8.63,Regular,0.055084019,Snack Foods,114.7518,OUT010,1998,,Tier 3,Grocery Store,455.4072 +FDH50,15,Regular,0.162093059,Canned,182.5266,OUT018,2009,Medium,Tier 3,Supermarket Type2,1290.9862 +FDS40,,Low Fat,0.024546148,Frozen Foods,34.619,OUT019,1985,Small,Tier 1,Grocery Store,36.619 +FDZ60,,Low Fat,0.118783796,Baking Goods,108.5596,OUT027,1985,Medium,Tier 3,Supermarket Type3,1725.7536 +FDG38,8.975,Regular,0.052836076,Canned,86.6224,OUT045,2002,,Tier 2,Supermarket Type1,1619.2256 +FDG31,12.15,Low Fat,0.037889224,Meat,64.7826,OUT035,2004,Small,Tier 2,Supermarket Type1,904.1564 +FDS39,6.895,Low Fat,0.022587621,Meat,143.7812,OUT017,2007,,Tier 2,Supermarket Type1,1994.7368 +FDL22,,Low Fat,0.036213953,Snack Foods,92.5488,OUT027,1985,Medium,Tier 3,Supermarket Type3,2625.9152 +FDQ20,8.325,Low Fat,0.029779207,Fruits and Vegetables,39.3138,OUT035,2004,Small,Tier 2,Supermarket Type1,974.7312 +DRB24,8.785,Low Fat,0.020693619,Soft Drinks,153.1656,OUT017,2007,,Tier 2,Supermarket Type1,1853.5872 +DRI51,,Low Fat,0.042037073,Dairy,172.6764,OUT027,1985,Medium,Tier 3,Supermarket Type3,6183.9504 +FDJ60,19.35,Regular,0.062516602,Baking Goods,163.9184,OUT035,2004,Small,Tier 2,Supermarket Type1,3137.2496 +FDB40,17.5,Regular,0.012620221,Dairy,144.8102,OUT010,1998,,Tier 3,Grocery Store,291.6204 +FDO15,16.75,Regular,0.008615,Meat,72.4038,OUT017,2007,,Tier 2,Supermarket Type1,739.038 +FDI53,8.895,Regular,0.137618927,Frozen Foods,161.5236,OUT035,2004,Small,Tier 2,Supermarket Type1,1772.3596 +FDZ14,7.71,Regular,0.047588696,Dairy,122.4756,OUT046,1997,Small,Tier 1,Supermarket Type1,605.878 +NCD54,,Low Fat,0.050790917,Household,142.7786,OUT019,1985,Small,Tier 1,Grocery Store,144.4786 +FDF28,15.7,Regular,0.037864721,Frozen Foods,124.1046,OUT046,1997,Small,Tier 1,Supermarket Type1,1120.5414 +FDD39,16.7,Low Fat,0.070551723,Dairy,217.685,OUT017,2007,,Tier 2,Supermarket Type1,2163.85 +NCN54,20.35,Low Fat,0.021326471,Household,76.1328,OUT046,1997,Small,Tier 1,Supermarket Type1,772.328 +NCO41,12.5,Low Fat,0.018955479,Health and Hygiene,100.1384,OUT017,2007,,Tier 2,Supermarket Type1,2167.8448 +FDH45,15.1,Regular,0.105666833,Fruits and Vegetables,41.6796,OUT046,1997,Small,Tier 1,Supermarket Type1,495.3552 +NCD55,14,Low Fat,0.040725405,Household,43.4454,OUT010,1998,,Tier 3,Grocery Store,41.9454 +DRK35,8.365,Low Fat,0.072252888,Hard Drinks,39.6506,OUT017,2007,,Tier 2,Supermarket Type1,834.9132 +FDM25,10.695,Regular,0.061008889,Breakfast,177.5712,OUT017,2007,,Tier 2,Supermarket Type1,2636.568 +NCW30,5.21,Low Fat,0.011007815,Household,259.5962,OUT035,2004,Small,Tier 2,Supermarket Type1,2848.9582 +FDU15,13.65,Regular,0,Meat,37.9532,OUT045,2002,,Tier 2,Supermarket Type1,575.2512 +DRN35,8.01,Low Fat,0.070247589,Hard Drinks,37.5532,OUT046,1997,Small,Tier 1,Supermarket Type1,1366.2216 +FDN28,5.88,Regular,0.030294931,Frozen Foods,104.099,OUT049,1999,Medium,Tier 1,Supermarket Type1,412.796 +NCK29,5.615,Low Fat,0.210511558,Health and Hygiene,121.373,OUT010,1998,,Tier 3,Grocery Store,123.173 +FDA49,19.7,LF,0.0650227,Canned,87.0198,OUT049,1999,Medium,Tier 1,Supermarket Type1,697.7584 +FDE40,,Regular,0.173587926,Dairy,60.0194,OUT019,1985,Small,Tier 1,Grocery Store,123.8388 +FDD52,18.25,Regular,0.183579854,Dairy,110.857,OUT049,1999,Medium,Tier 1,Supermarket Type1,1977.426 +FDZ31,15.35,Regular,0.113678422,Fruits and Vegetables,189.7504,OUT018,2009,Medium,Tier 3,Supermarket Type2,2492.7552 +FDA13,,Low Fat,0.078174543,Canned,39.9506,OUT027,1985,Medium,Tier 3,Supermarket Type3,721.0614 +FDU08,10.3,Low Fat,0.027292686,Fruits and Vegetables,101.2042,OUT013,1987,High,Tier 3,Supermarket Type1,396.8168 +FDU15,13.65,Regular,0.026602089,Meat,35.1532,OUT046,1997,Small,Tier 1,Supermarket Type1,790.9704 +FDD45,8.615,Low Fat,0.116226984,Fruits and Vegetables,95.9436,OUT035,2004,Small,Tier 2,Supermarket Type1,2741.7644 +FDY50,5.8,Low Fat,0.131221393,Dairy,87.8172,OUT045,2002,,Tier 2,Supermarket Type1,1070.6064 +FDD08,8.3,Low Fat,0.035409328,Fruits and Vegetables,36.2506,OUT049,1999,Medium,Tier 1,Supermarket Type1,834.9132 +NCE30,16,Low Fat,0,Household,210.4902,OUT045,2002,,Tier 2,Supermarket Type1,3610.6334 +FDB05,5.155,Low Fat,0.083327693,Frozen Foods,247.2776,OUT049,1999,Medium,Tier 1,Supermarket Type1,5944.2624 +FDS09,8.895,Regular,0.08125293,Snack Foods,49.8008,OUT045,2002,,Tier 2,Supermarket Type1,1062.6168 +FDZ07,15.1,Regular,0,Fruits and Vegetables,63.7194,OUT018,2009,Medium,Tier 3,Supermarket Type2,1362.2268 +FDS57,15.5,LF,0.103422709,Snack Foods,144.847,OUT035,2004,Small,Tier 2,Supermarket Type1,1717.764 +FDX28,6.325,Low Fat,0.125688044,Frozen Foods,100.9042,OUT018,2009,Medium,Tier 3,Supermarket Type2,2083.2882 +FDN56,,Regular,0.187443314,Fruits and Vegetables,145.8786,OUT019,1985,Small,Tier 1,Grocery Store,288.9572 +FDX44,9.3,Low Fat,0.04295842,Fruits and Vegetables,89.3172,OUT035,2004,Small,Tier 2,Supermarket Type1,2051.9956 +NCF19,,Low Fat,0.034938717,Household,49.0034,OUT027,1985,Medium,Tier 3,Supermarket Type3,826.2578 +NCA17,20.6,LF,0.045603215,Health and Hygiene,149.2392,OUT018,2009,Medium,Tier 3,Supermarket Type2,4026.7584 +FDY40,15.5,Regular,0.085834992,Frozen Foods,49.6692,OUT046,1997,Small,Tier 1,Supermarket Type1,788.3072 +NCX54,9.195,Low Fat,0.048050783,Household,105.6622,OUT035,2004,Small,Tier 2,Supermarket Type1,1693.7952 +FDK28,5.695,Low Fat,0.065589906,Frozen Foods,258.2646,OUT046,1997,Small,Tier 1,Supermarket Type1,5410.9566 +FDI32,,Low Fat,0.173529036,Fruits and Vegetables,113.2834,OUT027,1985,Medium,Tier 3,Supermarket Type3,4376.9692 +FDT11,5.94,Regular,0.029492018,Breads,188.0556,OUT018,2009,Medium,Tier 3,Supermarket Type2,938.778 +FDO32,6.36,Low Fat,0.121225455,Fruits and Vegetables,45.906,OUT017,2007,,Tier 2,Supermarket Type1,1118.544 +DRJ01,,Low Fat,0.114475357,Soft Drinks,160.9236,OUT027,1985,Medium,Tier 3,Supermarket Type3,2255.7304 +FDW02,4.805,Regular,0,Dairy,123.9704,OUT045,2002,,Tier 2,Supermarket Type1,2253.0672 +NCK30,14.85,Low Fat,0.060927824,Household,254.8698,OUT013,1987,High,Tier 3,Supermarket Type1,4819.7262 +NCM43,14.5,Low Fat,0.019459164,Others,161.621,OUT013,1987,High,Tier 3,Supermarket Type1,2120.573 +FDJ14,10.3,Regular,0.050070476,Canned,77.896,OUT046,1997,Small,Tier 1,Supermarket Type1,1278.336 +FDE59,12.15,Low Fat,0.06227604,Starchy Foods,37.9532,OUT035,2004,Small,Tier 2,Supermarket Type1,1078.596 +FDN10,11.5,Low Fat,0.046217345,Snack Foods,120.3124,OUT045,2002,,Tier 2,Supermarket Type1,474.0496 +NCC18,19.1,Low Fat,0.177270016,Household,174.0422,OUT046,1997,Small,Tier 1,Supermarket Type1,1724.422 +FDN34,,Regular,0.080127283,Snack Foods,168.7132,OUT019,1985,Small,Tier 1,Grocery Store,338.2264 +FDU12,15.5,Regular,0.076059648,Baking Goods,265.1568,OUT018,2009,Medium,Tier 3,Supermarket Type2,2109.2544 +FDR33,7.31,Low Fat,0.026788937,Snack Foods,110.357,OUT046,1997,Small,Tier 1,Supermarket Type1,3185.853 +FDP33,18.7,Low Fat,0.089197963,Snack Foods,257.3672,OUT013,1987,High,Tier 3,Supermarket Type1,2045.3376 +FDT49,7,Low Fat,0.151279591,Canned,107.028,OUT013,1987,High,Tier 3,Supermarket Type1,2876.256 +FDK02,12.5,Low Fat,0.112203445,Canned,121.144,OUT035,2004,Small,Tier 2,Supermarket Type1,1438.128 +NCM07,9.395,Low Fat,0.039961837,Others,84.0908,OUT046,1997,Small,Tier 1,Supermarket Type1,419.454 +FDX38,10.5,Regular,0.048207017,Dairy,45.9376,OUT046,1997,Small,Tier 1,Supermarket Type1,575.2512 +FDS56,5.785,Regular,0.064871045,Fruits and Vegetables,262.1252,OUT010,1998,,Tier 3,Grocery Store,786.9756 +FDU26,16.7,Regular,0.042685217,Dairy,120.7782,OUT049,1999,Medium,Tier 1,Supermarket Type1,1072.6038 +FDR16,5.845,Regular,0.105181277,Frozen Foods,214.4218,OUT049,1999,Medium,Tier 1,Supermarket Type1,5343.045 +FDA58,9.395,Low Fat,0.103751236,Snack Foods,235.8932,OUT046,1997,Small,Tier 1,Supermarket Type1,942.7728 +FDI26,5.94,Low Fat,0.035028853,Canned,179.8344,OUT018,2009,Medium,Tier 3,Supermarket Type2,1249.0408 +FDU36,6.15,Low Fat,0.046262201,Baking Goods,97.8384,OUT035,2004,Small,Tier 2,Supermarket Type1,2069.3064 +FDG60,20.35,Low Fat,0.060688248,Baking Goods,234.2616,OUT035,2004,Small,Tier 2,Supermarket Type1,4687.232 +FDH14,17.1,Regular,0.078347922,Canned,141.8838,OUT010,1998,,Tier 3,Grocery Store,280.9676 +FDQ37,,Low Fat,0.088828418,Breakfast,192.2478,OUT027,1985,Medium,Tier 3,Supermarket Type3,7943.6598 +FDW23,5.765,Low Fat,0.081944045,Baking Goods,36.7164,OUT013,1987,High,Tier 3,Supermarket Type1,849.5608 +FDM03,12.65,Low Fat,0.123726711,Meat,107.7938,OUT017,2007,,Tier 2,Supermarket Type1,2251.0698 +FDB58,10.5,reg,0.013485235,Snack Foods,140.0154,OUT013,1987,High,Tier 3,Supermarket Type1,3119.9388 +FDR09,18.25,Low Fat,0.077659918,Snack Foods,260.2962,OUT013,1987,High,Tier 3,Supermarket Type1,1035.9848 +FDR48,11.65,Low Fat,0,Baking Goods,149.8024,OUT018,2009,Medium,Tier 3,Supermarket Type2,1821.6288 +FDZ52,19.2,Low Fat,0.100074524,Frozen Foods,110.2886,OUT046,1997,Small,Tier 1,Supermarket Type1,778.3202 +DRD60,15.7,Low Fat,0.037289996,Soft Drinks,182.7634,OUT049,1999,Medium,Tier 1,Supermarket Type1,3453.5046 +FDJ14,10.3,Regular,0.050028809,Canned,80.096,OUT013,1987,High,Tier 3,Supermarket Type1,239.688 +NCY29,13.65,low fat,0.077234113,Health and Hygiene,56.893,OUT046,1997,Small,Tier 1,Supermarket Type1,1188.453 +NCP41,16.6,Low Fat,0.016197216,Health and Hygiene,108.8596,OUT013,1987,High,Tier 3,Supermarket Type1,970.7364 +FDK46,9.6,Low Fat,0.051571772,Snack Foods,258.462,OUT045,2002,,Tier 2,Supermarket Type1,4673.916 +FDI48,11.85,Regular,0.055672032,Baking Goods,50.5666,OUT013,1987,High,Tier 3,Supermarket Type1,922.7988 +FDX48,,reg,0.066336811,Baking Goods,154.1656,OUT019,1985,Small,Tier 1,Grocery Store,617.8624 +NCI29,8.6,Low Fat,0.032672263,Health and Hygiene,141.2154,OUT049,1999,Medium,Tier 1,Supermarket Type1,709.077 +FDL51,20.7,Regular,0.047491371,Dairy,213.9876,OUT046,1997,Small,Tier 1,Supermarket Type1,2143.876 +FDU21,11.8,Regular,0.077154417,Snack Foods,35.7558,OUT017,2007,,Tier 2,Supermarket Type1,577.2486 +FDA08,,Regular,0.087692636,Fruits and Vegetables,162.5526,OUT019,1985,Small,Tier 1,Grocery Store,328.9052 +FDK03,12.6,Regular,0.074221559,Dairy,255.9356,OUT018,2009,Medium,Tier 3,Supermarket Type2,4832.3764 +DRH39,20.7,Low Fat,0.092834313,Dairy,77.667,OUT049,1999,Medium,Tier 1,Supermarket Type1,2220.443 +NCR18,15.85,Low Fat,0.020571083,Household,41.6112,OUT018,2009,Medium,Tier 3,Supermarket Type2,255.6672 +NCX42,6.36,Low Fat,0.005978595,Household,163.6526,OUT046,1997,Small,Tier 1,Supermarket Type1,1151.1682 +FDR15,9.3,reg,0.033489979,Meat,156.6314,OUT049,1999,Medium,Tier 1,Supermarket Type1,1241.0512 +FDN60,,Low Fat,0.166609517,Baking Goods,157.6604,OUT019,1985,Small,Tier 1,Grocery Store,316.9208 +FDH24,20.7,Low Fat,0.021552357,Baking Goods,157.0288,OUT017,2007,,Tier 2,Supermarket Type1,2985.4472 +FDY50,,Low Fat,0.130321652,Dairy,88.7172,OUT027,1985,Medium,Tier 3,Supermarket Type3,3301.0364 +FDT26,18.85,Regular,0.068059156,Dairy,120.344,OUT049,1999,Medium,Tier 1,Supermarket Type1,1797.66 +NCC30,16.6,Low Fat,0.027573983,Household,176.6344,OUT035,2004,Small,Tier 2,Supermarket Type1,2676.516 +NCE43,12.5,low fat,0.103442268,Household,170.8448,OUT046,1997,Small,Tier 1,Supermarket Type1,4942.8992 +DRK39,7.02,Low Fat,0,Dairy,83.825,OUT017,2007,,Tier 2,Supermarket Type1,1414.825 +FDL16,12.85,Low Fat,0.168312678,Frozen Foods,45.906,OUT013,1987,High,Tier 3,Supermarket Type1,885.514 +FDQ36,7.855,Regular,0.162205516,Baking Goods,36.2848,OUT018,2009,Medium,Tier 3,Supermarket Type2,1155.8288 +FDS34,19.35,reg,0.076744561,Snack Foods,113.4518,OUT035,2004,Small,Tier 2,Supermarket Type1,1593.9252 +FDN32,17.5,Low Fat,0.015591925,Fruits and Vegetables,184.8266,OUT045,2002,,Tier 2,Supermarket Type1,2766.399 +FDZ23,17.75,Regular,0.067639698,Baking Goods,187.624,OUT045,2002,,Tier 2,Supermarket Type1,1491.392 +DRL49,13.15,Low Fat,0.056516756,Soft Drinks,143.4812,OUT049,1999,Medium,Tier 1,Supermarket Type1,854.8872 +FDG33,5.365,Regular,0.140213762,Seafood,173.7764,OUT035,2004,Small,Tier 2,Supermarket Type1,4637.9628 +FDG04,13.1,Low Fat,0.006075007,Frozen Foods,187.5898,OUT045,2002,,Tier 2,Supermarket Type1,2432.1674 +FDR04,7.075,Low Fat,0.022612742,Frozen Foods,97.0068,OUT045,2002,,Tier 2,Supermarket Type1,1944.136 +FDF52,9.3,LF,0.066770664,Frozen Foods,180.5292,OUT035,2004,Small,Tier 2,Supermarket Type1,2189.1504 +FDT36,12.3,Low Fat,0.186250852,Baking Goods,37.2874,OUT010,1998,,Tier 3,Grocery Store,176.437 +FDH17,16.2,Regular,0.016639482,Frozen Foods,95.8726,OUT013,1987,High,Tier 3,Supermarket Type1,1076.5986 +NCL42,18.85,Low Fat,0.040599963,Household,244.0144,OUT017,2007,,Tier 2,Supermarket Type1,5635.3312 +DRN35,8.01,Low Fat,0.070533748,Hard Drinks,34.2532,OUT018,2009,Medium,Tier 3,Supermarket Type2,467.3916 +FDL21,,Regular,0.01251245,Snack Foods,38.748,OUT019,1985,Small,Tier 1,Grocery Store,79.896 +FDX07,,Regular,0.022807826,Fruits and Vegetables,183.495,OUT027,1985,Medium,Tier 3,Supermarket Type3,4577.375 +FDW16,17.35,Regular,0.041474232,Frozen Foods,93.0804,OUT046,1997,Small,Tier 1,Supermarket Type1,826.9236 +FDS11,,Regular,0.055289464,Breads,222.5088,OUT027,1985,Medium,Tier 3,Supermarket Type3,7158.6816 +NCZ54,14.65,Low Fat,0.083698962,Household,163.4552,OUT018,2009,Medium,Tier 3,Supermarket Type2,2599.2832 +FDH32,12.8,Low Fat,0.076045655,Fruits and Vegetables,96.541,OUT035,2004,Small,Tier 2,Supermarket Type1,3765.099 +NCQ17,,Low Fat,0.116366304,Health and Hygiene,158.363,OUT027,1985,Medium,Tier 3,Supermarket Type3,4068.038 +FDK38,6.65,Low Fat,0.053279839,Canned,147.7734,OUT035,2004,Small,Tier 2,Supermarket Type1,2078.6276 +NCF55,6.675,Low Fat,0.021648305,Household,35.6874,OUT013,1987,High,Tier 3,Supermarket Type1,952.7598 +FDW39,6.69,Regular,0.037060755,Meat,176.837,OUT018,2009,Medium,Tier 3,Supermarket Type2,1411.496 +FDX36,,Regular,0.224607399,Baking Goods,223.1404,OUT019,1985,Small,Tier 1,Grocery Store,450.0808 +FDD47,7.6,reg,0.142699588,Starchy Foods,171.7448,OUT045,2002,,Tier 2,Supermarket Type1,4431.5648 +FDQ46,7.51,Low Fat,0.103726639,Snack Foods,110.6544,OUT013,1987,High,Tier 3,Supermarket Type1,1901.5248 +FDE56,,Regular,0.158424516,Fruits and Vegetables,62.4194,OUT027,1985,Medium,Tier 3,Supermarket Type3,2291.0178 +FDY39,,Regular,0.08234117,Meat,185.7608,OUT019,1985,Small,Tier 1,Grocery Store,1470.0864 +FDG05,11,Regular,0.087847141,Frozen Foods,156.863,OUT046,1997,Small,Tier 1,Supermarket Type1,2972.797 +NCR54,,Low Fat,0.158562708,Household,194.711,OUT019,1985,Small,Tier 1,Grocery Store,196.411 +FDX57,17.25,reg,0.047458754,Snack Foods,95.8068,OUT018,2009,Medium,Tier 3,Supermarket Type2,1263.6884 +FDC17,,Low Fat,0.015385857,Frozen Foods,208.9928,OUT027,1985,Medium,Tier 3,Supermarket Type3,9678.0688 +DRL60,,Low Fat,0.047377447,Soft Drinks,150.6682,OUT019,1985,Small,Tier 1,Grocery Store,457.4046 +FDO32,6.36,Low Fat,0.120443298,Fruits and Vegetables,45.406,OUT013,1987,High,Tier 3,Supermarket Type1,1118.544 +NCO29,11.15,Low Fat,0.032229348,Health and Hygiene,163.2526,OUT013,1987,High,Tier 3,Supermarket Type1,1480.0734 +FDJ36,,Regular,0.127638966,Baking Goods,104.5332,OUT027,1985,Medium,Tier 3,Supermarket Type3,2563.33 +NCF54,18,Low Fat,0.047473135,Household,170.5422,OUT045,2002,,Tier 2,Supermarket Type1,3103.9596 +FDV04,7.825,Regular,0.149986868,Frozen Foods,158.8288,OUT035,2004,Small,Tier 2,Supermarket Type1,1414.1592 +NCK30,14.85,Low Fat,0.102065622,Household,254.2698,OUT010,1998,,Tier 3,Grocery Store,1775.6886 +FDX09,,Low Fat,0.114243048,Snack Foods,174.937,OUT019,1985,Small,Tier 1,Grocery Store,176.437 +FDH53,20.5,Regular,0.019183756,Frozen Foods,83.7592,OUT013,1987,High,Tier 3,Supermarket Type1,1403.5064 +FDT22,10.395,Low Fat,0.112324552,Snack Foods,60.622,OUT045,2002,,Tier 2,Supermarket Type1,778.986 +DRF25,,Low Fat,0.068153091,Soft Drinks,36.019,OUT019,1985,Small,Tier 1,Grocery Store,73.238 +FDG56,13.3,Regular,0.071597469,Fruits and Vegetables,60.8536,OUT045,2002,,Tier 2,Supermarket Type1,918.804 +FDG38,,Regular,0.052473797,Canned,83.6224,OUT027,1985,Medium,Tier 3,Supermarket Type3,3494.1184 +FDS34,19.35,Regular,0.076914745,Snack Foods,114.8518,OUT045,2002,,Tier 2,Supermarket Type1,1707.777 +FDP44,16.5,Regular,0.079837509,Fruits and Vegetables,102.1332,OUT049,1999,Medium,Tier 1,Supermarket Type1,1743.0644 +FDW03,5.63,Regular,0.024520854,Meat,102.8306,OUT013,1987,High,Tier 3,Supermarket Type1,1986.0814 +FDU25,12.35,LF,0.02678995,Canned,58.9246,OUT018,2009,Medium,Tier 3,Supermarket Type2,926.7936 +NCR17,9.8,Low Fat,0.024432767,Health and Hygiene,116.4492,OUT045,2002,,Tier 2,Supermarket Type1,2780.3808 +FDY39,5.305,Regular,0.047220268,Meat,181.9608,OUT018,2009,Medium,Tier 3,Supermarket Type2,2388.8904 +FDA03,18.5,Regular,0.045534457,Dairy,146.3102,OUT049,1999,Medium,Tier 1,Supermarket Type1,3645.255 +FDG58,10.695,Regular,0,Snack Foods,156.1972,OUT046,1997,Small,Tier 1,Supermarket Type1,1869.5664 +NCB19,6.525,Low Fat,0.090806457,Household,86.4882,OUT017,2007,,Tier 2,Supermarket Type1,1631.8758 +FDI07,12.35,Regular,0.033813351,Meat,198.1426,OUT049,1999,Medium,Tier 1,Supermarket Type1,3757.1094 +NCS06,7.935,Low Fat,0.031730739,Household,261.091,OUT035,2004,Small,Tier 2,Supermarket Type1,2366.919 +FDX03,15.85,Regular,0.102262138,Meat,47.1744,OUT010,1998,,Tier 3,Grocery Store,90.5488 +NCK29,5.615,LF,0,Health and Hygiene,121.973,OUT046,1997,Small,Tier 1,Supermarket Type1,2463.46 +FDH16,10.5,Low Fat,0.052511611,Frozen Foods,90.783,OUT013,1987,High,Tier 3,Supermarket Type1,1258.362 +FDA55,,Regular,0.056713056,Fruits and Vegetables,223.8088,OUT027,1985,Medium,Tier 3,Supermarket Type3,5592.72 +FDS20,8.85,Low Fat,0.053950661,Fruits and Vegetables,182.7292,OUT049,1999,Medium,Tier 1,Supermarket Type1,4925.5884 +FDS31,13.1,Regular,0.044192372,Fruits and Vegetables,180.3318,OUT046,1997,Small,Tier 1,Supermarket Type1,2345.6134 +FDA23,,Low Fat,0.046958533,Baking Goods,101.3016,OUT027,1985,Medium,Tier 3,Supermarket Type3,2327.6368 +NCU18,15.1,Low Fat,0.055829496,Household,140.2496,OUT035,2004,Small,Tier 2,Supermarket Type1,2681.8424 +FDE11,17.7,Regular,0.13498355,Starchy Foods,184.4924,OUT013,1987,High,Tier 3,Supermarket Type1,3146.5708 +FDE44,14.65,Low Fat,0,Fruits and Vegetables,49.7692,OUT045,2002,,Tier 2,Supermarket Type1,837.5764 +FDV51,16.35,Low Fat,0.032538896,Meat,165.7842,OUT046,1997,Small,Tier 1,Supermarket Type1,2652.5472 +FDK51,19.85,Low Fat,0.005264755,Dairy,264.5884,OUT017,2007,,Tier 2,Supermarket Type1,5829.7448 +FDR36,6.715,Regular,0.121832956,Baking Goods,43.5454,OUT045,2002,,Tier 2,Supermarket Type1,838.908 +FDU40,20.85,Low Fat,0.037403973,Frozen Foods,192.5478,OUT046,1997,Small,Tier 1,Supermarket Type1,2906.217 +FDU37,,Regular,0.10400212,Canned,79.796,OUT027,1985,Medium,Tier 3,Supermarket Type3,4074.696 +FDV47,17.1,low fat,0.054162439,Breads,85.3566,OUT013,1987,High,Tier 3,Supermarket Type1,1775.6886 +FDF04,,Low Fat,0.023876708,Frozen Foods,258.6304,OUT019,1985,Small,Tier 1,Grocery Store,516.6608 +FDX16,17.85,Low Fat,0.065797601,Frozen Foods,147.805,OUT035,2004,Small,Tier 2,Supermarket Type1,1947.465 +NCL05,19.6,Low Fat,0.047857804,Health and Hygiene,45.077,OUT013,1987,High,Tier 3,Supermarket Type1,605.878 +NCL30,,Low Fat,0.048703432,Household,125.9336,OUT027,1985,Medium,Tier 3,Supermarket Type3,7158.6816 +NCR06,12.5,Low Fat,0.006765149,Household,41.7112,OUT046,1997,Small,Tier 1,Supermarket Type1,383.5008 +FDX03,15.85,Regular,0.06121988,Meat,45.6744,OUT045,2002,,Tier 2,Supermarket Type1,633.8416 +FDR32,6.78,Regular,0,Fruits and Vegetables,227.4694,OUT046,1997,Small,Tier 1,Supermarket Type1,3197.1716 +FDX04,19.6,Regular,0.041563696,Frozen Foods,47.6376,OUT035,2004,Small,Tier 2,Supermarket Type1,335.5632 +DRH01,17.5,Low Fat,0.098457814,Soft Drinks,171.7738,OUT017,2007,,Tier 2,Supermarket Type1,2432.8332 +FDO57,20.75,Low Fat,0.108930629,Snack Foods,160.9578,OUT045,2002,,Tier 2,Supermarket Type1,1444.1202 +FDD11,,Low Fat,0.03046847,Starchy Foods,254.704,OUT027,1985,Medium,Tier 3,Supermarket Type3,3036.048 +DRM47,9.3,Low Fat,0.073288275,Hard Drinks,189.1846,OUT010,1998,,Tier 3,Grocery Store,382.1692 +NCC54,17.75,Low Fat,0.097692448,Health and Hygiene,242.4196,OUT035,2004,Small,Tier 2,Supermarket Type1,5543.4508 +FDC45,17,Low Fat,0.135944247,Fruits and Vegetables,171.5106,OUT049,1999,Medium,Tier 1,Supermarket Type1,1539.9954 +FDW46,,Regular,0.123089128,Snack Foods,63.6484,OUT019,1985,Small,Tier 1,Grocery Store,65.2484 +FDP40,4.555,Regular,0.034328578,Frozen Foods,110.1544,OUT013,1987,High,Tier 3,Supermarket Type1,1230.3984 +FDM08,10.1,Regular,0.089688978,Fruits and Vegetables,225.5088,OUT010,1998,,Tier 3,Grocery Store,1342.2528 +FDV52,20.7,Regular,0.121709653,Frozen Foods,119.7466,OUT049,1999,Medium,Tier 1,Supermarket Type1,2003.3922 +DRB24,8.785,Low Fat,0.020618957,Soft Drinks,153.0656,OUT045,2002,,Tier 2,Supermarket Type1,4170.5712 +NCC54,17.75,LF,0.163548055,Health and Hygiene,239.3196,OUT010,1998,,Tier 3,Grocery Store,723.0588 +FDV38,,Low Fat,0.178192864,Dairy,54.9956,OUT019,1985,Small,Tier 1,Grocery Store,109.1912 +FDB36,5.465,Regular,0.048625599,Baking Goods,129.2626,OUT045,2002,,Tier 2,Supermarket Type1,1311.626 +DRH51,,Low Fat,0.170213676,Dairy,89.5856,OUT019,1985,Small,Tier 1,Grocery Store,175.7712 +FDV45,,Low Fat,0.044829295,Snack Foods,187.4556,OUT027,1985,Medium,Tier 3,Supermarket Type3,7510.224 +NCL29,,Low Fat,0.113387677,Health and Hygiene,156.9604,OUT027,1985,Medium,Tier 3,Supermarket Type3,1584.604 +FDU14,17.75,Low Fat,0.058168807,Dairy,249.575,OUT010,1998,,Tier 3,Grocery Store,499.35 +FDH17,16.2,Regular,0.016650191,Frozen Foods,97.4726,OUT035,2004,Small,Tier 2,Supermarket Type1,1174.4712 +FDQ15,20.35,Regular,0.151044881,Meat,79.2276,OUT035,2004,Small,Tier 2,Supermarket Type1,649.8208 +FDZ44,8.185,Low Fat,0.038948125,Fruits and Vegetables,115.4808,OUT017,2007,,Tier 2,Supermarket Type1,820.2656 +FDM32,20.5,Low Fat,0.020688969,Fruits and Vegetables,88.183,OUT018,2009,Medium,Tier 3,Supermarket Type2,719.064 +NCP29,8.42,Low Fat,0.112249781,Health and Hygiene,64.3168,OUT035,2004,Small,Tier 2,Supermarket Type1,703.0848 +FDG53,10,Low Fat,0.046116319,Frozen Foods,141.818,OUT017,2007,,Tier 2,Supermarket Type1,838.908 +FDT25,7.5,Low Fat,0.050957715,Canned,122.4072,OUT018,2009,Medium,Tier 3,Supermarket Type2,2572.6512 +FDM39,,Low Fat,0.053211728,Dairy,177.6002,OUT027,1985,Medium,Tier 3,Supermarket Type3,8417.7094 +FDW35,10.6,Low Fat,0.011111714,Breads,43.8454,OUT045,2002,,Tier 2,Supermarket Type1,671.1264 +FDD10,20.6,Regular,0.077029195,Snack Foods,177.2344,OUT010,1998,,Tier 3,Grocery Store,892.172 +FDH08,,Low Fat,0.017344679,Fruits and Vegetables,230.801,OUT027,1985,Medium,Tier 3,Supermarket Type3,5283.123 +DRG37,16.2,Low Fat,0.019457372,Soft Drinks,153.9972,OUT018,2009,Medium,Tier 3,Supermarket Type2,1246.3776 +FDU01,20.25,Regular,0.012063121,Canned,183.5924,OUT017,2007,,Tier 2,Supermarket Type1,2406.2012 +NCZ17,12.15,Low Fat,0.079755214,Health and Hygiene,36.6506,OUT018,2009,Medium,Tier 3,Supermarket Type2,493.3578 +FDU34,,LF,0.074830794,Snack Foods,125.9046,OUT027,1985,Medium,Tier 3,Supermarket Type3,4482.1656 +FDB16,8.21,Low Fat,0.044917289,Dairy,88.5198,OUT035,2004,Small,Tier 2,Supermarket Type1,1133.8574 +FDG10,6.63,Regular,0.018310142,Snack Foods,57.7588,OUT010,1998,,Tier 3,Grocery Store,57.2588 +FDH46,6.935,Regular,0.041247932,Snack Foods,101.8332,OUT013,1987,High,Tier 3,Supermarket Type1,2255.7304 +FDC16,,Regular,0.0204702,Dairy,88.254,OUT027,1985,Medium,Tier 3,Supermarket Type3,2510.066 +FDH50,15,Regular,0.161404914,Canned,185.8266,OUT035,2004,Small,Tier 2,Supermarket Type1,1844.266 +NCZ18,7.825,Low Fat,0.186067862,Household,255.4698,OUT046,1997,Small,Tier 1,Supermarket Type1,5073.396 +FDJ32,10.695,LF,0.057792343,Fruits and Vegetables,61.4536,OUT046,1997,Small,Tier 1,Supermarket Type1,428.7752 +DRI23,18.85,Low Fat,0,Hard Drinks,162.0578,OUT035,2004,Small,Tier 2,Supermarket Type1,3209.156 +DRD01,12.1,Regular,0.061270647,Soft Drinks,53.2614,OUT049,1999,Medium,Tier 1,Supermarket Type1,386.8298 +FDY02,8.945,Regular,0.087823675,Dairy,261.091,OUT045,2002,,Tier 2,Supermarket Type1,3418.883 +FDG38,8.975,Regular,0.05281112,Canned,86.6224,OUT049,1999,Medium,Tier 1,Supermarket Type1,1704.448 +NCG30,20.2,Low Fat,0.112495847,Household,124.4046,OUT049,1999,Medium,Tier 1,Supermarket Type1,1120.5414 +FDO31,6.76,Regular,0.029100745,Fruits and Vegetables,80.696,OUT018,2009,Medium,Tier 3,Supermarket Type2,559.272 +NCU42,9,Low Fat,0.019546214,Household,168.1474,OUT045,2002,,Tier 2,Supermarket Type1,4211.185 +NCG30,20.2,Low Fat,0.112549008,Household,123.1046,OUT045,2002,,Tier 2,Supermarket Type1,1120.5414 +NCA30,19,Low Fat,0,Household,189.1872,OUT046,1997,Small,Tier 1,Supermarket Type1,567.2616 +FDF29,15.1,Regular,0.019917598,Frozen Foods,129.431,OUT013,1987,High,Tier 3,Supermarket Type1,3505.437 +FDI14,14.1,Low Fat,0.089817198,Canned,142.7496,OUT049,1999,Medium,Tier 1,Supermarket Type1,3528.74 +FDY57,20.2,Regular,0.121442754,Snack Foods,94.9752,OUT049,1999,Medium,Tier 1,Supermarket Type1,1342.2528 +FDT27,,Regular,0.069250192,Meat,232.9616,OUT027,1985,Medium,Tier 3,Supermarket Type3,3515.424 +FDM46,,Low Fat,0.159193194,Snack Foods,92.712,OUT027,1985,Medium,Tier 3,Supermarket Type3,3635.268 +NCD30,,Low Fat,0,Household,98.1726,OUT027,1985,Medium,Tier 3,Supermarket Type3,978.726 +FDJ15,,Regular,0.023209537,Dairy,183.3608,OUT027,1985,Medium,Tier 3,Supermarket Type3,6064.1064 +NCW05,20.25,Low Fat,0.148372897,Health and Hygiene,108.8938,OUT045,2002,,Tier 2,Supermarket Type1,3644.5892 +FDT13,14.85,Low Fat,0,Canned,187.7214,OUT010,1998,,Tier 3,Grocery Store,188.4214 +NCP06,20.7,Low Fat,0.065689432,Household,149.7366,OUT010,1998,,Tier 3,Grocery Store,151.1366 +FDP03,5.15,Regular,0.061301149,Meat,122.1388,OUT045,2002,,Tier 2,Supermarket Type1,2352.9372 +NCM30,,Low Fat,0.117825569,Household,43.2796,OUT019,1985,Small,Tier 1,Grocery Store,41.2796 +FDK20,12.6,Regular,0.04152307,Fruits and Vegetables,124.3072,OUT013,1987,High,Tier 3,Supermarket Type1,5022.7952 +FDX01,10.1,Low Fat,0.024201905,Canned,114.915,OUT049,1999,Medium,Tier 1,Supermarket Type1,2796.36 +FDV57,15.25,Regular,0.066269294,Snack Foods,179.666,OUT017,2007,,Tier 2,Supermarket Type1,6471.576 +FDY34,10.5,Regular,0.01100413,Snack Foods,167.1842,OUT045,2002,,Tier 2,Supermarket Type1,2984.1156 +FDP37,,Low Fat,0.250560049,Breakfast,126.9994,OUT019,1985,Small,Tier 1,Grocery Store,385.4982 +FDP22,14.65,Regular,0.099113429,Snack Foods,52.8666,OUT035,2004,Small,Tier 2,Supermarket Type1,461.3994 +FDS25,6.885,Regular,0.140008554,Canned,108.7228,OUT046,1997,Small,Tier 1,Supermarket Type1,2542.0244 +NCY18,7.285,Low Fat,0.031278532,Household,176.0054,OUT018,2009,Medium,Tier 3,Supermarket Type2,2626.581 +FDO08,11.1,Regular,0.05373063,Fruits and Vegetables,165.1526,OUT013,1987,High,Tier 3,Supermarket Type1,1480.0734 +NCI43,,Low Fat,0.025842951,Household,48.6376,OUT027,1985,Medium,Tier 3,Supermarket Type3,1677.816 +FDH16,10.5,Low Fat,0.052555346,Frozen Foods,89.683,OUT046,1997,Small,Tier 1,Supermarket Type1,988.713 +NCZ05,,Low Fat,0.10178199,Health and Hygiene,104.699,OUT019,1985,Small,Tier 1,Grocery Store,103.199 +DRE49,20.75,Low Fat,0.021293097,Soft Drinks,151.9024,OUT045,2002,,Tier 2,Supermarket Type1,2732.4432 +FDO09,,Regular,0.124668026,Snack Foods,261.091,OUT027,1985,Medium,Tier 3,Supermarket Type3,5522.811 +FDA08,11.85,Regular,0.050043472,Fruits and Vegetables,164.6526,OUT013,1987,High,Tier 3,Supermarket Type1,2137.8838 +NCD55,14,Low Fat,0.024468806,Household,41.1454,OUT017,2007,,Tier 2,Supermarket Type1,503.3448 +NCR50,20.2,Low Fat,0.01181025,Household,154.634,OUT013,1987,High,Tier 3,Supermarket Type1,4287.752 +NCC06,19,Low Fat,0.027028323,Household,127.0336,OUT049,1999,Medium,Tier 1,Supermarket Type1,3962.8416 +FDC34,16,Regular,0.172615327,Snack Foods,154.5972,OUT013,1987,High,Tier 3,Supermarket Type1,1869.5664 +FDQ49,,Regular,0.06871772,Breakfast,155.563,OUT019,1985,Small,Tier 1,Grocery Store,469.389 +FDS60,20.85,Low Fat,0.032421521,Baking Goods,181.666,OUT013,1987,High,Tier 3,Supermarket Type1,1438.128 +FDP10,19,Low Fat,0.127983545,Snack Foods,107.6622,OUT013,1987,High,Tier 3,Supermarket Type1,1270.3464 +FDW46,13,Regular,0.070288365,Snack Foods,64.3484,OUT035,2004,Small,Tier 2,Supermarket Type1,2218.4456 +FDG53,10,Low Fat,0.076755106,Frozen Foods,141.618,OUT010,1998,,Tier 3,Grocery Store,139.818 +FDP57,17.5,low fat,0.052434201,Snack Foods,103.999,OUT035,2004,Small,Tier 2,Supermarket Type1,1857.582 +NCP43,,Low Fat,0.053413906,Others,181.766,OUT019,1985,Small,Tier 1,Grocery Store,179.766 +FDW49,19.5,Low Fat,0.083019163,Canned,180.2002,OUT017,2007,,Tier 2,Supermarket Type1,5193.9058 +FDA28,16.1,Regular,0.080010553,Frozen Foods,124.2362,OUT010,1998,,Tier 3,Grocery Store,377.5086 +NCS42,8.6,low fat,0.069403341,Household,91.2146,OUT035,2004,Small,Tier 2,Supermarket Type1,2554.0088 +FDP21,,Regular,0.025616191,Snack Foods,188.1872,OUT027,1985,Medium,Tier 3,Supermarket Type3,6239.8776 +DRJ39,20.25,Low Fat,0.036326064,Dairy,220.1482,OUT046,1997,Small,Tier 1,Supermarket Type1,3066.6748 +FDH12,9.6,Low Fat,0.085434195,Baking Goods,105.028,OUT017,2007,,Tier 2,Supermarket Type1,2556.672 +FDQ13,11.1,Low Fat,0.010658153,Canned,83.0908,OUT049,1999,Medium,Tier 1,Supermarket Type1,1593.9252 +NCQ06,13,LF,0.041994899,Household,254.7014,OUT018,2009,Medium,Tier 3,Supermarket Type2,5100.028 +FDL40,,Low Fat,0.011556919,Frozen Foods,94.741,OUT027,1985,Medium,Tier 3,Supermarket Type3,1641.197 +NCE54,20.7,Low Fat,0,Household,74.3354,OUT018,2009,Medium,Tier 3,Supermarket Type2,1880.885 +FDL58,5.78,Regular,0.124110349,Snack Foods,262.3568,OUT010,1998,,Tier 3,Grocery Store,790.9704 +FDW38,5.325,Regular,0.139244918,Dairy,53.0298,OUT018,2009,Medium,Tier 3,Supermarket Type2,377.5086 +FDD17,7.5,Low Fat,0.032599801,Frozen Foods,238.1906,OUT013,1987,High,Tier 3,Supermarket Type1,3327.6684 +FDK25,11.6,Regular,0.157075658,Breakfast,166.6474,OUT049,1999,Medium,Tier 1,Supermarket Type1,4211.185 +FDR22,,Regular,0.018472714,Snack Foods,109.9544,OUT027,1985,Medium,Tier 3,Supermarket Type3,5257.1568 +FDU35,6.44,low fat,0,Breads,99.87,OUT045,2002,,Tier 2,Supermarket Type1,1498.05 +FDR35,12.5,Low Fat,0.020739698,Breads,198.9742,OUT045,2002,,Tier 2,Supermarket Type1,995.371 +NCZ18,7.825,Low Fat,0.186825823,Household,253.5698,OUT018,2009,Medium,Tier 3,Supermarket Type2,3805.047 +FDF22,6.865,Low Fat,0.09512291,Snack Foods,212.3218,OUT010,1998,,Tier 3,Grocery Store,427.4436 +FDD17,7.5,Low Fat,0.03269312,Frozen Foods,238.7906,OUT045,2002,,Tier 2,Supermarket Type1,4040.7402 +DRD37,9.8,Low Fat,0.013841737,Soft Drinks,45.206,OUT046,1997,Small,Tier 1,Supermarket Type1,1211.756 +FDC08,19,Regular,0.103449993,Fruits and Vegetables,225.472,OUT046,1997,Small,Tier 1,Supermarket Type1,3169.208 +FDU57,8.27,reg,0.089554186,Snack Foods,150.8708,OUT046,1997,Small,Tier 1,Supermarket Type1,2407.5328 +FDZ58,17.85,Low Fat,0.052257982,Snack Foods,121.8072,OUT049,1999,Medium,Tier 1,Supermarket Type1,2450.144 +FDY01,11.8,Regular,0.170251293,Canned,116.4834,OUT035,2004,Small,Tier 2,Supermarket Type1,1958.1178 +FDG09,20.6,Regular,0.048131556,Fruits and Vegetables,187.1556,OUT018,2009,Medium,Tier 3,Supermarket Type2,4693.89 +NCE54,20.7,Low Fat,0.026899856,Household,73.9354,OUT046,1997,Small,Tier 1,Supermarket Type1,677.1186 +FDB34,15.25,Low Fat,0.026663778,Snack Foods,87.0198,OUT045,2002,,Tier 2,Supermarket Type1,2442.1544 +FDT24,12.35,Regular,0,Baking Goods,76.2328,OUT046,1997,Small,Tier 1,Supermarket Type1,1544.656 +FDZ08,12.5,Regular,0.109900843,Fruits and Vegetables,83.0592,OUT013,1987,High,Tier 3,Supermarket Type1,743.0328 +NCI54,15.2,Low Fat,0.033651278,Household,108.9912,OUT049,1999,Medium,Tier 1,Supermarket Type1,1965.4416 +FDU34,18.25,Low Fat,0.075311837,Snack Foods,122.6046,OUT049,1999,Medium,Tier 1,Supermarket Type1,2988.1104 +FDP23,6.71,Low Fat,0,Breads,218.9166,OUT013,1987,High,Tier 3,Supermarket Type1,2394.8826 +NCV29,,Low Fat,0.039996021,Health and Hygiene,176.7686,OUT019,1985,Small,Tier 1,Grocery Store,888.843 +FDG10,,Regular,0.010886324,Snack Foods,57.2588,OUT027,1985,Medium,Tier 3,Supermarket Type3,801.6232 +FDZ56,,Low Fat,0.04506213,Fruits and Vegetables,167.5474,OUT019,1985,Small,Tier 1,Grocery Store,1010.6844 +NCL41,12.35,Low Fat,0.041729735,Health and Hygiene,36.3216,OUT035,2004,Small,Tier 2,Supermarket Type1,276.9728 +FDM39,6.42,low fat,0.053426165,Dairy,178.7002,OUT013,1987,High,Tier 3,Supermarket Type1,4477.505 +NCZ54,14.65,Low Fat,0.083488992,Household,161.3552,OUT049,1999,Medium,Tier 1,Supermarket Type1,7148.0288 +FDT59,13.65,Low Fat,0,Breads,229.4668,OUT049,1999,Medium,Tier 1,Supermarket Type1,4837.7028 +FDV20,20.2,Regular,0.060045008,Fruits and Vegetables,128.3678,OUT018,2009,Medium,Tier 3,Supermarket Type2,1398.8458 +NCE43,12.5,Low Fat,0.10402738,Household,172.2448,OUT017,2007,,Tier 2,Supermarket Type1,1874.8928 +FDP15,,Low Fat,0.083536071,Meat,255.433,OUT027,1985,Medium,Tier 3,Supermarket Type3,9227.988 +FDO16,5.48,Low Fat,0.015169739,Frozen Foods,82.225,OUT018,2009,Medium,Tier 3,Supermarket Type2,2247.075 +NCP41,,Low Fat,0.028382853,Health and Hygiene,109.4596,OUT019,1985,Small,Tier 1,Grocery Store,647.1576 +DRD01,12.1,Regular,0.061299601,Soft Drinks,56.2614,OUT045,2002,,Tier 2,Supermarket Type1,552.614 +FDM56,16.7,Low Fat,0.070588621,Fruits and Vegetables,107.9912,OUT017,2007,,Tier 2,Supermarket Type1,1419.4856 +FDS22,16.85,Regular,0.023201357,Snack Foods,45.9428,OUT045,2002,,Tier 2,Supermarket Type1,307.5996 +FDX20,7.365,LF,0.042626422,Fruits and Vegetables,227.072,OUT049,1999,Medium,Tier 1,Supermarket Type1,4074.696 +FDE34,9.195,Low Fat,0.108501676,Snack Foods,183.6634,OUT017,2007,,Tier 2,Supermarket Type1,2362.9242 +FDV50,14.3,Low Fat,0.122571209,Dairy,122.373,OUT046,1997,Small,Tier 1,Supermarket Type1,985.384 +NCU17,5.32,Low Fat,0.093408695,Health and Hygiene,101.2674,OUT017,2007,,Tier 2,Supermarket Type1,2241.0828 +NCP53,,Low Fat,0.032731074,Health and Hygiene,235.6906,OUT027,1985,Medium,Tier 3,Supermarket Type3,5704.5744 +FDW09,13.65,Regular,0.043386131,Snack Foods,80.2302,OUT010,1998,,Tier 3,Grocery Store,79.2302 +FDW55,12.6,Regular,0.021969896,Fruits and Vegetables,248.6092,OUT046,1997,Small,Tier 1,Supermarket Type1,3237.1196 +NCE31,,Low Fat,0.183948465,Household,33.6216,OUT027,1985,Medium,Tier 3,Supermarket Type3,934.7832 +FDO49,10.6,reg,0.033052168,Breakfast,49.7008,OUT046,1997,Small,Tier 1,Supermarket Type1,961.4152 +FDH34,,Low Fat,0.054443762,Snack Foods,184.6582,OUT019,1985,Small,Tier 1,Grocery Store,185.7582 +FDJ38,8.6,Regular,0.040172077,Canned,188.553,OUT013,1987,High,Tier 3,Supermarket Type1,3795.06 +FDG32,19.85,LF,0.175995526,Fruits and Vegetables,224.0772,OUT046,1997,Small,Tier 1,Supermarket Type1,1556.6404 +DRQ35,9.3,Low Fat,0.042530668,Hard Drinks,125.5388,OUT017,2007,,Tier 2,Supermarket Type1,2848.2924 +FDK25,,Regular,0.274592283,Breakfast,167.8474,OUT019,1985,Small,Tier 1,Grocery Store,336.8948 +FDD58,7.76,Low Fat,0.059594017,Snack Foods,99.67,OUT018,2009,Medium,Tier 3,Supermarket Type2,1897.53 +FDB15,10.895,Low Fat,0.136784873,Dairy,265.2568,OUT035,2004,Small,Tier 2,Supermarket Type1,4218.5088 +DRF60,10.8,Low Fat,0,Soft Drinks,238.1564,OUT018,2009,Medium,Tier 3,Supermarket Type2,5243.8408 +FDH04,,Regular,0.019912606,Frozen Foods,91.0488,OUT019,1985,Small,Tier 1,Grocery Store,271.6464 +FDM04,9.195,Regular,0.04719387,Frozen Foods,52.8666,OUT049,1999,Medium,Tier 1,Supermarket Type1,1384.1982 +FDO58,19.6,Low Fat,0.039638705,Snack Foods,166.0526,OUT049,1999,Medium,Tier 1,Supermarket Type1,3124.5994 +FDQ24,15.7,Low Fat,0.074083388,Baking Goods,253.3724,OUT017,2007,,Tier 2,Supermarket Type1,6795.1548 +DRP35,18.85,Low Fat,0.091051579,Hard Drinks,127.4336,OUT045,2002,,Tier 2,Supermarket Type1,894.8352 +DRI47,14.7,Low Fat,0.02090277,Hard Drinks,144.5128,OUT013,1987,High,Tier 3,Supermarket Type1,3307.6944 +FDF35,15,Low Fat,0.153861181,Starchy Foods,108.5938,OUT013,1987,High,Tier 3,Supermarket Type1,1393.5194 +FDP31,21.1,Regular,0.161504957,Fruits and Vegetables,65.0168,OUT046,1997,Small,Tier 1,Supermarket Type1,639.168 +FDQ52,17,Low Fat,0.119871307,Frozen Foods,248.3434,OUT018,2009,Medium,Tier 3,Supermarket Type2,6208.585 +FDM12,16.7,Regular,0.069903773,Baking Goods,188.6214,OUT035,2004,Small,Tier 2,Supermarket Type1,565.2642 +NCS42,8.6,Low Fat,0.069416467,Household,92.5146,OUT046,1997,Small,Tier 1,Supermarket Type1,2006.7212 +FDO31,6.76,Regular,0.02914662,Fruits and Vegetables,79.296,OUT017,2007,,Tier 2,Supermarket Type1,1118.544 +FDU19,8.77,Regular,0.046771477,Fruits and Vegetables,173.9422,OUT046,1997,Small,Tier 1,Supermarket Type1,3103.9596 +NCE19,,Low Fat,0.092564193,Household,53.4956,OUT027,1985,Medium,Tier 3,Supermarket Type3,2129.2284 +FDR16,5.845,Regular,0.104998144,Frozen Foods,213.2218,OUT035,2004,Small,Tier 2,Supermarket Type1,7266.5412 +FDF56,16.7,Regular,0.119704498,Fruits and Vegetables,181.9976,OUT045,2002,,Tier 2,Supermarket Type1,5432.928 +DRJ59,11.65,Low Fat,0.03242518,Hard Drinks,38.8164,OUT010,1998,,Tier 3,Grocery Store,77.2328 +FDH16,,Low Fat,0.052300844,Frozen Foods,88.283,OUT027,1985,Medium,Tier 3,Supermarket Type3,2157.192 +FDI28,14.3,Low Fat,0.026362624,Frozen Foods,78.3302,OUT049,1999,Medium,Tier 1,Supermarket Type1,1267.6832 +FDC58,,Low Fat,0,Snack Foods,45.7428,OUT027,1985,Medium,Tier 3,Supermarket Type3,615.1992 +FDU13,8.355,Low Fat,0.187558629,Canned,148.0418,OUT046,1997,Small,Tier 1,Supermarket Type1,1471.418 +FDX58,13.15,Low Fat,0.04376368,Snack Foods,183.095,OUT046,1997,Small,Tier 1,Supermarket Type1,1830.95 +FDU16,19.25,Regular,0,Frozen Foods,82.5908,OUT045,2002,,Tier 2,Supermarket Type1,922.7988 +FDX35,5.035,Regular,0.080072603,Breads,228.2036,OUT045,2002,,Tier 2,Supermarket Type1,2504.7396 +FDL21,15.85,Regular,0.007146415,Snack Foods,41.048,OUT046,1997,Small,Tier 1,Supermarket Type1,798.96 +DRM37,15.35,Low Fat,0.096317593,Soft Drinks,197.3768,OUT013,1987,High,Tier 3,Supermarket Type1,3350.3056 +FDR35,12.5,Low Fat,0.020729902,Breads,197.2742,OUT049,1999,Medium,Tier 1,Supermarket Type1,3782.4098 +FDW32,18.35,Regular,0.15783357,Fruits and Vegetables,87.5882,OUT010,1998,,Tier 3,Grocery Store,171.7764 +FDY34,,Regular,0.010928678,Snack Foods,167.0842,OUT027,1985,Medium,Tier 3,Supermarket Type3,6465.5838 +FDQ44,20.5,Low Fat,0.036110222,Fruits and Vegetables,120.1756,OUT013,1987,High,Tier 3,Supermarket Type1,2059.9852 +DRD24,13.85,Low Fat,0.030842963,Soft Drinks,143.1154,OUT049,1999,Medium,Tier 1,Supermarket Type1,2552.6772 +DRE12,4.59,Low Fat,0,Soft Drinks,111.186,OUT045,2002,,Tier 2,Supermarket Type1,1245.046 +NCX29,10,Low Fat,0.089078338,Health and Hygiene,147.1102,OUT013,1987,High,Tier 3,Supermarket Type1,2916.204 +FDS07,12.35,Low Fat,0.100164204,Fruits and Vegetables,113.6518,OUT018,2009,Medium,Tier 3,Supermarket Type2,1593.9252 +FDI27,,Regular,0.045763623,Dairy,43.8744,OUT027,1985,Medium,Tier 3,Supermarket Type3,1222.4088 +FDL02,20,Regular,0.10399676,Canned,107.4622,OUT013,1987,High,Tier 3,Supermarket Type1,1587.933 +FDN58,13.8,Regular,0.057104066,Snack Foods,232.6984,OUT018,2009,Medium,Tier 3,Supermarket Type2,1390.1904 +DRK12,9.5,Low Fat,0.041971264,Soft Drinks,33.39,OUT045,2002,,Tier 2,Supermarket Type1,732.38 +FDC60,5.425,Regular,0.114472403,Baking Goods,88.3514,OUT046,1997,Small,Tier 1,Supermarket Type1,2833.6448 +FDV45,16.75,Low Fat,0.045117476,Snack Foods,187.9556,OUT049,1999,Medium,Tier 1,Supermarket Type1,2440.8228 +FDB23,19.2,Regular,0,Starchy Foods,223.8062,OUT045,2002,,Tier 2,Supermarket Type1,5642.655 +NCA29,10.5,Low Fat,0.02727641,Household,171.3106,OUT046,1997,Small,Tier 1,Supermarket Type1,3593.3226 +FDO20,12.85,Regular,0.152747503,Fruits and Vegetables,252.0382,OUT018,2009,Medium,Tier 3,Supermarket Type2,4037.4112 +NCH55,,Low Fat,0.060706749,Household,127.502,OUT019,1985,Small,Tier 1,Grocery Store,379.506 +FDO32,6.36,Low Fat,0.120788077,Fruits and Vegetables,45.706,OUT045,2002,,Tier 2,Supermarket Type1,838.908 +FDS59,,Regular,0.076851759,Breads,111.857,OUT019,1985,Small,Tier 1,Grocery Store,109.857 +FDR59,14.5,Regular,0.063810405,Breads,263.2594,OUT013,1987,High,Tier 3,Supermarket Type1,2878.2534 +FDS55,7.02,Low Fat,0.081328781,Fruits and Vegetables,150.0734,OUT045,2002,,Tier 2,Supermarket Type1,4454.202 +FDT21,7.42,Low Fat,0.020387989,Snack Foods,247.1092,OUT035,2004,Small,Tier 2,Supermarket Type1,4233.1564 +NCR38,17.25,Low Fat,0.113518466,Household,253.5724,OUT046,1997,Small,Tier 1,Supermarket Type1,5033.448 +FDJ22,18.75,Low Fat,0.052917345,Snack Foods,190.6504,OUT045,2002,,Tier 2,Supermarket Type1,1342.2528 +FDB57,20.25,reg,0.018911474,Fruits and Vegetables,220.5772,OUT017,2007,,Tier 2,Supermarket Type1,2446.1492 +FDR52,12.65,Regular,0.075981306,Frozen Foods,192.3846,OUT013,1987,High,Tier 3,Supermarket Type1,1910.846 +NCO41,12.5,Low Fat,0.018848862,Health and Hygiene,96.7384,OUT046,1997,Small,Tier 1,Supermarket Type1,2167.8448 +FDG47,12.8,Low Fat,0.116527666,Starchy Foods,261.4252,OUT010,1998,,Tier 3,Grocery Store,262.3252 +FDB44,6.655,Low Fat,0,Fruits and Vegetables,212.4586,OUT017,2007,,Tier 2,Supermarket Type1,2743.7618 +FDY14,10.3,Low Fat,0.070040195,Dairy,263.0226,OUT046,1997,Small,Tier 1,Supermarket Type1,4229.1616 +NCN55,14.6,Low Fat,0.059827007,Others,239.2538,OUT017,2007,,Tier 2,Supermarket Type1,3605.307 +FDV48,9.195,Regular,0.051827123,Baking Goods,77.4644,OUT018,2009,Medium,Tier 3,Supermarket Type2,1414.1592 +FDA21,13.65,Low Fat,0.03595391,Snack Foods,185.2924,OUT035,2004,Small,Tier 2,Supermarket Type1,3146.5708 +FDZ27,7.935,Low Fat,0.017182935,Dairy,51.235,OUT049,1999,Medium,Tier 1,Supermarket Type1,848.895 +FDW58,20.75,Low Fat,0.007546808,Snack Foods,104.1622,OUT013,1987,High,Tier 3,Supermarket Type1,1693.7952 +FDH45,15.1,Regular,0.105831117,Fruits and Vegetables,41.6796,OUT049,1999,Medium,Tier 1,Supermarket Type1,784.3124 +FDH38,,Low Fat,0.018275994,Canned,115.2808,OUT019,1985,Small,Tier 1,Grocery Store,117.1808 +FDL43,10.1,Low Fat,0.027064381,Meat,76.367,OUT046,1997,Small,Tier 1,Supermarket Type1,765.67 +FDD38,,Regular,0,Canned,100.3674,OUT027,1985,Medium,Tier 3,Supermarket Type3,1833.6132 +FDV02,16.75,Low Fat,0.06063976,Dairy,173.0106,OUT049,1999,Medium,Tier 1,Supermarket Type1,3593.3226 +NCF31,9.13,Low Fat,0.051847425,Household,152.8024,OUT046,1997,Small,Tier 1,Supermarket Type1,1214.4192 +NCN05,8.235,Low Fat,0.014518575,Health and Hygiene,182.195,OUT018,2009,Medium,Tier 3,Supermarket Type2,2380.235 +FDZ16,16.85,Regular,0.159722816,Frozen Foods,194.1478,OUT013,1987,High,Tier 3,Supermarket Type1,5812.434 +NCT18,,Low Fat,0.05911748,Household,181.5976,OUT027,1985,Medium,Tier 3,Supermarket Type3,4165.2448 +NCP50,17.35,Low Fat,0.020555958,Others,79.4618,OUT035,2004,Small,Tier 2,Supermarket Type1,1772.3596 +FDW13,,Low Fat,0.171383506,Canned,50.5324,OUT019,1985,Small,Tier 1,Grocery Store,207.7296 +NCS53,14.5,Low Fat,0.090286009,Health and Hygiene,159.9604,OUT017,2007,,Tier 2,Supermarket Type1,2218.4456 +DRG03,14.5,Low Fat,0.061986574,Dairy,153.0998,OUT046,1997,Small,Tier 1,Supermarket Type1,4921.5936 +DRE60,9.395,Low Fat,0.160235723,Soft Drinks,227.872,OUT017,2007,,Tier 2,Supermarket Type1,1584.604 +FDK21,7.905,Low Fat,0.010032624,Snack Foods,248.3408,OUT045,2002,,Tier 2,Supermarket Type1,751.0224 +FDF52,,Low Fat,0.116928924,Frozen Foods,183.3292,OUT019,1985,Small,Tier 1,Grocery Store,364.8584 +NCN43,,Low Fat,0.011835436,Others,121.373,OUT019,1985,Small,Tier 1,Grocery Store,246.346 +FDW13,8.5,Low Fat,0.097884718,Canned,52.5324,OUT046,1997,Small,Tier 1,Supermarket Type1,1194.4452 +FDW14,8.3,Regular,0.038204311,Dairy,87.7198,OUT035,2004,Small,Tier 2,Supermarket Type1,1831.6158 +FDG24,7.975,Low Fat,0.014631149,Baking Goods,84.525,OUT046,1997,Small,Tier 1,Supermarket Type1,416.125 +FDR19,13.5,Regular,0.160044589,Fruits and Vegetables,145.4102,OUT045,2002,,Tier 2,Supermarket Type1,3499.4448 +NCG06,,Low Fat,0.02930277,Household,256.1646,OUT027,1985,Medium,Tier 3,Supermarket Type3,5926.2858 +FDK10,5.785,Regular,0.040351229,Snack Foods,181.366,OUT035,2004,Small,Tier 2,Supermarket Type1,1977.426 +DRK12,9.5,LF,0.042123243,Soft Drinks,32.09,OUT017,2007,,Tier 2,Supermarket Type1,432.77 +FDY55,16.75,Low Fat,0.081485126,Fruits and Vegetables,258.0988,OUT045,2002,,Tier 2,Supermarket Type1,8994.958 +FDV04,,Regular,0.149288779,Frozen Foods,158.4288,OUT027,1985,Medium,Tier 3,Supermarket Type3,2985.4472 +FDE23,17.6,Regular,0,Starchy Foods,46.006,OUT046,1997,Small,Tier 1,Supermarket Type1,326.242 +FDI08,18.2,Regular,0.066567121,Fruits and Vegetables,250.2092,OUT018,2009,Medium,Tier 3,Supermarket Type2,2988.1104 +DRA12,11.6,Low Fat,0.068535039,Soft Drinks,143.0154,OUT010,1998,,Tier 3,Grocery Store,283.6308 +FDF22,6.865,Low Fat,0.057062186,Snack Foods,212.0218,OUT018,2009,Medium,Tier 3,Supermarket Type2,2350.9398 +FDQ57,7.275,Low Fat,0.027991093,Snack Foods,145.976,OUT049,1999,Medium,Tier 1,Supermarket Type1,3515.424 +FDP07,18.2,Low Fat,0.089901774,Fruits and Vegetables,197.511,OUT046,1997,Small,Tier 1,Supermarket Type1,392.822 +DRE37,13.5,Low Fat,0,Soft Drinks,189.1872,OUT035,2004,Small,Tier 2,Supermarket Type1,1890.872 +DRF25,9,Low Fat,0.038892859,Soft Drinks,36.119,OUT013,1987,High,Tier 3,Supermarket Type1,1098.57 +DRF03,19.1,Low Fat,0.045270426,Dairy,38.8138,OUT013,1987,High,Tier 3,Supermarket Type1,731.0484 +FDN51,17.85,Regular,0.020942867,Meat,260.2936,OUT035,2004,Small,Tier 2,Supermarket Type1,4175.8976 +FDD21,10.3,Regular,0.030693756,Fruits and Vegetables,114.2176,OUT018,2009,Medium,Tier 3,Supermarket Type2,2175.8344 +NCY42,6.38,Low Fat,0.015162573,Household,145.147,OUT046,1997,Small,Tier 1,Supermarket Type1,3006.087 +FDH28,,Regular,0,Frozen Foods,37.0506,OUT027,1985,Medium,Tier 3,Supermarket Type3,986.7156 +NCZ29,15,Low Fat,0.119461188,Health and Hygiene,126.3362,OUT010,1998,,Tier 3,Grocery Store,503.3448 +FDN60,15.1,Low Fat,0.095158081,Baking Goods,159.2604,OUT046,1997,Small,Tier 1,Supermarket Type1,2852.2872 +NCW06,16.2,Low Fat,0.050545502,Household,191.6162,OUT018,2009,Medium,Tier 3,Supermarket Type2,1731.7458 +NCS30,5.945,Low Fat,0.093405156,Household,129.3652,OUT018,2009,Medium,Tier 3,Supermarket Type2,4391.6168 +FDW26,11.8,Regular,0.179191782,Dairy,224.2772,OUT010,1998,,Tier 3,Grocery Store,667.1316 +FDQ01,19.7,Regular,0.160951491,Canned,256.1014,OUT049,1999,Medium,Tier 1,Supermarket Type1,3060.0168 +FDH27,,Low Fat,0.102157958,Dairy,145.0128,OUT019,1985,Small,Tier 1,Grocery Store,143.8128 +NCX41,19,Low Fat,0.017791458,Health and Hygiene,211.9244,OUT018,2009,Medium,Tier 3,Supermarket Type2,2117.244 +FDH58,12.3,Low Fat,0.036997104,Snack Foods,115.9834,OUT049,1999,Medium,Tier 1,Supermarket Type1,2073.3012 +DRB25,12.3,Low Fat,0.116261335,Soft Drinks,107.0938,OUT010,1998,,Tier 3,Grocery Store,214.3876 +FDG45,8.1,Low Fat,0.12829573,Fruits and Vegetables,210.4902,OUT045,2002,,Tier 2,Supermarket Type1,5309.755 +FDP11,15.85,Low Fat,0.069100548,Breads,216.6166,OUT046,1997,Small,Tier 1,Supermarket Type1,4136.6154 +FDV19,14.85,Regular,0.035257037,Fruits and Vegetables,161.2578,OUT046,1997,Small,Tier 1,Supermarket Type1,4171.9028 +FDT32,19,Regular,0.065633934,Fruits and Vegetables,186.5214,OUT046,1997,Small,Tier 1,Supermarket Type1,2261.0568 +NCU53,5.485,low fat,0.042743728,Health and Hygiene,166.2842,OUT035,2004,Small,Tier 2,Supermarket Type1,1989.4104 +NCA30,19,Low Fat,0.129309277,Household,188.8872,OUT035,2004,Small,Tier 2,Supermarket Type1,3592.6568 +FDH20,16.1,Regular,0,Fruits and Vegetables,98.441,OUT017,2007,,Tier 2,Supermarket Type1,868.869 +DRD25,6.135,Low Fat,0,Soft Drinks,114.286,OUT046,1997,Small,Tier 1,Supermarket Type1,2376.906 +FDK25,11.6,Regular,0.156802171,Breakfast,168.0474,OUT035,2004,Small,Tier 2,Supermarket Type1,4379.6324 +FDF02,16.2,Low Fat,0.103634038,Canned,101.399,OUT049,1999,Medium,Tier 1,Supermarket Type1,1031.99 +FDC04,15.6,Low Fat,0.045055587,Dairy,242.3854,OUT049,1999,Medium,Tier 1,Supermarket Type1,2416.854 +FDH21,10.395,Low Fat,0.031199028,Seafood,159.4604,OUT013,1987,High,Tier 3,Supermarket Type1,316.9208 +DRG03,14.5,Low Fat,0.062239081,Dairy,154.2998,OUT018,2009,Medium,Tier 3,Supermarket Type2,1691.7978 +NCY06,15.25,Low Fat,0.06153089,Household,132.2968,OUT017,2007,,Tier 2,Supermarket Type1,1696.4584 +FDM08,10.1,Regular,0.053692878,Fruits and Vegetables,222.9088,OUT045,2002,,Tier 2,Supermarket Type1,5145.3024 +NCD31,12.1,Low Fat,0.01545846,Household,166.0526,OUT049,1999,Medium,Tier 1,Supermarket Type1,3617.9572 +FDU09,,Regular,0.06627464,Snack Foods,54.1956,OUT027,1985,Medium,Tier 3,Supermarket Type3,3002.758 +FDB49,8.3,Regular,0.030274175,Baking Goods,98.5384,OUT018,2009,Medium,Tier 3,Supermarket Type2,1872.2296 +FDQ58,7.315,Low Fat,0.015332872,Snack Foods,154.034,OUT045,2002,,Tier 2,Supermarket Type1,612.536 +FDJ58,15.6,Regular,0.10589167,Snack Foods,172.6764,OUT017,2007,,Tier 2,Supermarket Type1,2920.1988 +NCN30,,LF,0.016910914,Household,96.641,OUT027,1985,Medium,Tier 3,Supermarket Type3,1544.656 +FDA52,16.2,reg,0.128621941,Frozen Foods,175.537,OUT049,1999,Medium,Tier 1,Supermarket Type1,3528.74 +NCN42,,Low Fat,0.014153743,Household,145.6418,OUT027,1985,Medium,Tier 3,Supermarket Type3,3825.6868 +FDF04,17.5,Low Fat,0.013637046,Frozen Foods,258.5304,OUT046,1997,Small,Tier 1,Supermarket Type1,6199.9296 +FDY15,18.25,Regular,0.171523928,Dairy,155.863,OUT018,2009,Medium,Tier 3,Supermarket Type2,2346.945 +FDT03,,Low Fat,0.009950343,Meat,185.5608,OUT027,1985,Medium,Tier 3,Supermarket Type3,3307.6944 +DRL59,,Low Fat,0.037160705,Hard Drinks,54.2298,OUT019,1985,Small,Tier 1,Grocery Store,161.7894 +FDW08,12.1,Low Fat,0.148986013,Fruits and Vegetables,106.528,OUT018,2009,Medium,Tier 3,Supermarket Type2,1171.808 +FDO50,16.25,Low Fat,0.078103689,Canned,91.1804,OUT013,1987,High,Tier 3,Supermarket Type1,1929.4884 +FDP26,7.785,Low Fat,0.140121306,Dairy,102.5306,OUT018,2009,Medium,Tier 3,Supermarket Type2,1358.8978 +FDX01,10.1,Low Fat,0.040446145,Canned,118.115,OUT010,1998,,Tier 3,Grocery Store,116.515 +FDU22,12.35,Low Fat,0.093824276,Snack Foods,119.9124,OUT017,2007,,Tier 2,Supermarket Type1,2014.7108 +FDQ08,15.7,Regular,0.018926773,Fruits and Vegetables,60.2536,OUT035,2004,Small,Tier 2,Supermarket Type1,1163.8184 +NCN54,20.35,Low Fat,0.021322439,Household,79.1328,OUT035,2004,Small,Tier 2,Supermarket Type1,1235.7248 +FDR01,,Regular,0.05336162,Canned,200.1742,OUT027,1985,Medium,Tier 3,Supermarket Type3,6171.3002 +FDB53,,Low Fat,0.138777108,Frozen Foods,147.5392,OUT027,1985,Medium,Tier 3,Supermarket Type3,5219.872 +DRN47,12.1,Low Fat,0.016823566,Hard Drinks,178.566,OUT035,2004,Small,Tier 2,Supermarket Type1,3775.086 +FDR39,20.35,Low Fat,0.083799283,Meat,184.1292,OUT046,1997,Small,Tier 1,Supermarket Type1,2189.1504 +NCL30,18.1,Low Fat,0.048940428,Household,127.5336,OUT046,1997,Small,Tier 1,Supermarket Type1,1789.6704 +FDT02,12.6,LF,0.02429329,Dairy,33.4874,OUT018,2009,Medium,Tier 3,Supermarket Type2,105.8622 +FDT25,7.5,Low Fat,0.050829881,Canned,122.7072,OUT049,1999,Medium,Tier 1,Supermarket Type1,1470.0864 +FDH53,20.5,Regular,0,Frozen Foods,83.2592,OUT017,2007,,Tier 2,Supermarket Type1,1155.8288 +DRB48,16.75,Regular,0.024994069,Soft Drinks,37.4822,OUT017,2007,,Tier 2,Supermarket Type1,549.9508 +FDX16,17.85,Low Fat,0.110152524,Frozen Foods,150.205,OUT010,1998,,Tier 3,Grocery Store,149.805 +FDH48,13.5,Low Fat,0.060603014,Baking Goods,85.554,OUT045,2002,,Tier 2,Supermarket Type1,1731.08 +FDF20,12.85,Low Fat,0.033192524,Fruits and Vegetables,199.0768,OUT013,1987,High,Tier 3,Supermarket Type1,3153.2288 +FDJ03,12.35,Regular,0.121174241,Dairy,47.8692,OUT010,1998,,Tier 3,Grocery Store,49.2692 +DRJ35,10.1,Low Fat,0.046848053,Hard Drinks,60.6878,OUT017,2007,,Tier 2,Supermarket Type1,363.5268 +NCN17,11,Low Fat,0.05489331,Health and Hygiene,101.9358,OUT013,1987,High,Tier 3,Supermarket Type1,1105.8938 +FDN09,14.15,Low Fat,0.034868095,Snack Foods,243.7828,OUT035,2004,Small,Tier 2,Supermarket Type1,6579.4356 +NCR30,20.6,Low Fat,0.070933894,Household,74.8696,OUT013,1987,High,Tier 3,Supermarket Type1,223.7088 +FDW23,5.765,Low Fat,0.0821398,Baking Goods,37.2164,OUT049,1999,Medium,Tier 1,Supermarket Type1,579.246 +DRN35,8.01,Low Fat,0.117580062,Hard Drinks,36.6532,OUT010,1998,,Tier 3,Grocery Store,71.9064 +FDL08,10.8,Low Fat,0.049819857,Fruits and Vegetables,243.2144,OUT045,2002,,Tier 2,Supermarket Type1,1225.072 +DRL35,15.7,Low Fat,0.030877303,Hard Drinks,42.177,OUT017,2007,,Tier 2,Supermarket Type1,735.709 +NCS42,8.6,Low Fat,0.069524391,Household,91.8146,OUT049,1999,Medium,Tier 1,Supermarket Type1,2371.5796 +NCY29,,Low Fat,0.076860103,Health and Hygiene,55.993,OUT027,1985,Medium,Tier 3,Supermarket Type3,1471.418 +FDO32,6.36,Low Fat,0.121034655,Fruits and Vegetables,47.506,OUT018,2009,Medium,Tier 3,Supermarket Type2,1071.938 +NCU17,5.32,Low Fat,0.092865746,Health and Hygiene,100.6674,OUT035,2004,Small,Tier 2,Supermarket Type1,2648.5524 +FDY03,,Regular,0.075753207,Meat,111.1202,OUT027,1985,Medium,Tier 3,Supermarket Type3,3150.5656 +NCI30,,Low Fat,0.103188491,Household,244.346,OUT019,1985,Small,Tier 1,Grocery Store,246.346 +FDI04,,Regular,0.072559351,Frozen Foods,199.3426,OUT027,1985,Medium,Tier 3,Supermarket Type3,3757.1094 +FDC35,7.435,Low Fat,0.122735471,Starchy Foods,205.2638,OUT013,1987,High,Tier 3,Supermarket Type1,3520.0846 +FDN38,6.615,Regular,0.091971856,Canned,251.6408,OUT046,1997,Small,Tier 1,Supermarket Type1,6008.1792 +FDJ48,11.3,LF,0.056434817,Baking Goods,247.8118,OUT046,1997,Small,Tier 1,Supermarket Type1,2964.1416 +FDH57,10.895,Low Fat,0.035740763,Fruits and Vegetables,131.9284,OUT035,2004,Small,Tier 2,Supermarket Type1,659.142 +FDI40,11.5,Regular,0.125602951,Frozen Foods,100.8358,OUT046,1997,Small,Tier 1,Supermarket Type1,2111.2518 +FDF50,,Low Fat,0.116762173,Canned,198.9768,OUT027,1985,Medium,Tier 3,Supermarket Type3,4729.8432 +FDA07,7.55,Regular,0.030918873,Fruits and Vegetables,123.9072,OUT013,1987,High,Tier 3,Supermarket Type1,1102.5648 +FDZ60,20.5,Low Fat,0.119848041,Baking Goods,109.4596,OUT018,2009,Medium,Tier 3,Supermarket Type2,431.4384 +FDW38,5.325,Regular,0.139464425,Dairy,53.2298,OUT017,2007,,Tier 2,Supermarket Type1,1240.3854 +NCF55,6.675,LF,0.021666335,Household,33.3874,OUT046,1997,Small,Tier 1,Supermarket Type1,1235.059 +FDR37,16.5,Regular,0.066249551,Breakfast,183.3292,OUT046,1997,Small,Tier 1,Supermarket Type1,2006.7212 +FDZ33,10.195,Low Fat,0.107564024,Snack Foods,149.0076,OUT049,1999,Medium,Tier 1,Supermarket Type1,1182.4608 +FDV01,19.2,Regular,0.085122855,Canned,155.4314,OUT045,2002,,Tier 2,Supermarket Type1,3568.0222 +FDI02,15.7,Regular,0.115031783,Canned,114.1202,OUT018,2009,Medium,Tier 3,Supermarket Type2,787.6414 +DRH25,18.7,Low Fat,0.014580886,Soft Drinks,50.2324,OUT013,1987,High,Tier 3,Supermarket Type1,623.1888 +NCY29,13.65,Low Fat,0.077548732,Health and Hygiene,55.093,OUT018,2009,Medium,Tier 3,Supermarket Type2,452.744 +FDR04,,Low Fat,0.022457694,Frozen Foods,98.6068,OUT027,1985,Medium,Tier 3,Supermarket Type3,2430.17 +FDR44,6.11,reg,0.103129612,Fruits and Vegetables,129.5968,OUT045,2002,,Tier 2,Supermarket Type1,2348.9424 +FDJ41,6.85,Low Fat,0.023012718,Frozen Foods,262.0594,OUT017,2007,,Tier 2,Supermarket Type1,1569.9564 +FDL43,,Low Fat,0.026933321,Meat,78.467,OUT027,1985,Medium,Tier 3,Supermarket Type3,3292.381 +FDB21,7.475,Low Fat,0.149360698,Fruits and Vegetables,243.4854,OUT017,2007,,Tier 2,Supermarket Type1,1691.7978 +NCU42,9,Low Fat,0.019586115,Household,170.2474,OUT018,2009,Medium,Tier 3,Supermarket Type2,4211.185 +FDY21,15.1,Low Fat,0,Snack Foods,195.211,OUT013,1987,High,Tier 3,Supermarket Type1,3142.576 +FDK58,11.35,Regular,0,Snack Foods,101.5016,OUT046,1997,Small,Tier 1,Supermarket Type1,202.4032 +DRD13,15,Low Fat,0.049155769,Soft Drinks,65.2168,OUT049,1999,Medium,Tier 1,Supermarket Type1,958.752 +FDU35,6.44,Low Fat,0,Breads,98.27,OUT046,1997,Small,Tier 1,Supermarket Type1,2396.88 +FDX23,6.445,Low Fat,0.049697923,Baking Goods,95.0436,OUT010,1998,,Tier 3,Grocery Store,94.5436 +FDQ39,14.8,Low Fat,0.081206491,Meat,189.2846,OUT045,2002,,Tier 2,Supermarket Type1,1719.7614 +FDR31,,Regular,0.048924811,Fruits and Vegetables,147.4102,OUT027,1985,Medium,Tier 3,Supermarket Type3,3207.8244 +FDS28,8.18,Regular,0.082386011,Frozen Foods,56.6588,OUT035,2004,Small,Tier 2,Supermarket Type1,687.1056 +DRN36,15.2,Low Fat,0.050279604,Soft Drinks,94.1752,OUT045,2002,,Tier 2,Supermarket Type1,2109.2544 +FDX60,,LF,0.080203852,Baking Goods,77.996,OUT027,1985,Medium,Tier 3,Supermarket Type3,2716.464 +NCB54,8.76,Low Fat,0.050335829,Health and Hygiene,126.2336,OUT017,2007,,Tier 2,Supermarket Type1,1406.1696 +FDC15,18.1,Low Fat,0.178694026,Dairy,158.9288,OUT018,2009,Medium,Tier 3,Supermarket Type2,1571.288 +NCP17,,Low Fat,0.027580163,Health and Hygiene,62.2168,OUT027,1985,Medium,Tier 3,Supermarket Type3,1661.8368 +FDY39,5.305,Regular,0.04710181,Meat,181.8608,OUT049,1999,Medium,Tier 1,Supermarket Type1,4594.02 +FDH33,12.85,LF,0.121914662,Snack Foods,43.5428,OUT049,1999,Medium,Tier 1,Supermarket Type1,615.1992 +FDG09,,Regular,0.047704151,Fruits and Vegetables,187.2556,OUT027,1985,Medium,Tier 3,Supermarket Type3,4506.1344 +FDO10,,Regular,0.01268995,Snack Foods,56.4588,OUT027,1985,Medium,Tier 3,Supermarket Type3,973.3996 +FDD39,,Low Fat,0.06981517,Dairy,214.385,OUT027,1985,Medium,Tier 3,Supermarket Type3,4327.7 +FDJ09,15,Low Fat,0.058513255,Snack Foods,46.9744,OUT045,2002,,Tier 2,Supermarket Type1,679.116 +DRQ35,9.3,Low Fat,0.042357203,Hard Drinks,123.2388,OUT049,1999,Medium,Tier 1,Supermarket Type1,1857.582 +FDV38,19.25,Low Fat,0.101932076,Dairy,54.5956,OUT049,1999,Medium,Tier 1,Supermarket Type1,764.3384 +FDJ60,19.35,Regular,0.062476391,Baking Goods,164.5184,OUT013,1987,High,Tier 3,Supermarket Type1,1651.184 +FDJ15,11.35,Regular,0.023454399,Dairy,181.9608,OUT017,2007,,Tier 2,Supermarket Type1,1653.8472 +FDR08,18.7,Low Fat,0.037681448,Fruits and Vegetables,111.0886,OUT049,1999,Medium,Tier 1,Supermarket Type1,222.3772 +FDZ55,6.055,Low Fat,0.025408702,Fruits and Vegetables,160.892,OUT046,1997,Small,Tier 1,Supermarket Type1,2396.88 +FDL10,8.395,Low Fat,0.039572298,Snack Foods,100.9042,OUT045,2002,,Tier 2,Supermarket Type1,1686.4714 +FDJ34,,Regular,0.093202196,Snack Foods,125.5704,OUT027,1985,Medium,Tier 3,Supermarket Type3,1001.3632 +FDW60,,Regular,0.016979326,Baking Goods,177.037,OUT027,1985,Medium,Tier 3,Supermarket Type3,3352.303 +FDK08,9.195,Regular,0.122304725,Fruits and Vegetables,99.2016,OUT046,1997,Small,Tier 1,Supermarket Type1,809.6128 +NCE42,21.1,Low Fat,0.010600287,Household,233.9958,OUT035,2004,Small,Tier 2,Supermarket Type1,1869.5664 +FDR39,20.35,Low Fat,0.084273286,Meat,181.7292,OUT017,2007,,Tier 2,Supermarket Type1,4013.4424 +NCN17,11,Low Fat,0.055162827,Health and Hygiene,100.3358,OUT018,2009,Medium,Tier 3,Supermarket Type2,904.8222 +NCR05,10.1,Low Fat,0.054741627,Health and Hygiene,200.2084,OUT045,2002,,Tier 2,Supermarket Type1,3174.5344 +FDV48,,Regular,0.051366901,Baking Goods,77.0644,OUT027,1985,Medium,Tier 3,Supermarket Type3,3221.1404 +DRF27,8.93,Low Fat,0.028533032,Dairy,151.434,OUT018,2009,Medium,Tier 3,Supermarket Type2,1225.072 +NCF07,9,Low Fat,0.032072321,Household,102.2016,OUT049,1999,Medium,Tier 1,Supermarket Type1,1416.8224 +FDF40,20.25,Regular,0.022507877,Dairy,248.1092,OUT035,2004,Small,Tier 2,Supermarket Type1,4731.1748 +FDO28,5.765,Low Fat,0.072410764,Frozen Foods,122.5098,OUT049,1999,Medium,Tier 1,Supermarket Type1,1084.5882 +FDB23,19.2,Regular,0.005611367,Starchy Foods,226.2062,OUT018,2009,Medium,Tier 3,Supermarket Type2,1579.9434 +FDV48,9.195,Regular,0.051697108,Baking Goods,79.2644,OUT049,1999,Medium,Tier 1,Supermarket Type1,864.2084 +FDM45,8.655,Regular,0.08819473,Snack Foods,119.6756,OUT046,1997,Small,Tier 1,Supermarket Type1,2423.512 +FDC16,11.5,Regular,0.020611526,Dairy,84.954,OUT045,2002,,Tier 2,Supermarket Type1,865.54 +DRE25,,Low Fat,0.072928316,Soft Drinks,94.412,OUT027,1985,Medium,Tier 3,Supermarket Type3,1304.968 +FDY35,17.6,Regular,0.0160526,Breads,43.9402,OUT049,1999,Medium,Tier 1,Supermarket Type1,1286.3256 +FDR22,19.35,Regular,0.018600249,Snack Foods,110.2544,OUT045,2002,,Tier 2,Supermarket Type1,2908.2144 +FDZ10,17.85,Low Fat,0.04453262,Snack Foods,127.202,OUT049,1999,Medium,Tier 1,Supermarket Type1,2656.542 +FDY15,,Regular,0.299097859,Dairy,157.863,OUT019,1985,Small,Tier 1,Grocery Store,469.389 +DRA24,19.35,Regular,0.039895009,Soft Drinks,162.4868,OUT013,1987,High,Tier 3,Supermarket Type1,4422.2436 +FDV37,13,Regular,0.083683243,Canned,198.5426,OUT045,2002,,Tier 2,Supermarket Type1,1186.4556 +FDO10,13.65,Regular,0.012749289,Snack Foods,58.8588,OUT035,2004,Small,Tier 2,Supermarket Type1,973.3996 +FDR59,,Regular,0.063554289,Breads,263.6594,OUT027,1985,Medium,Tier 3,Supermarket Type3,3401.5722 +FDR34,17,Regular,0.016030344,Snack Foods,228.0352,OUT018,2009,Medium,Tier 3,Supermarket Type2,2748.4224 +FDG16,15.25,Low Fat,0.090324849,Frozen Foods,214.4192,OUT017,2007,,Tier 2,Supermarket Type1,4961.5416 +FDO03,,Regular,0.03670437,Meat,228.1352,OUT027,1985,Medium,Tier 3,Supermarket Type3,9390.4432 +FDC09,15.5,Regular,0.026342897,Fruits and Vegetables,104.1332,OUT049,1999,Medium,Tier 1,Supermarket Type1,1230.3984 +FDJ52,7.145,Low Fat,0.017783501,Frozen Foods,159.4578,OUT035,2004,Small,Tier 2,Supermarket Type1,3209.156 +FDL33,7.235,Low Fat,0.167316771,Snack Foods,197.5452,OUT010,1998,,Tier 3,Grocery Store,195.7452 +FDJ53,10.5,Low Fat,0.071660976,Frozen Foods,119.7098,OUT017,2007,,Tier 2,Supermarket Type1,2410.196 +FDX08,,Low Fat,0.039576776,Fruits and Vegetables,179.9318,OUT019,1985,Small,Tier 1,Grocery Store,360.8636 +FDK32,16.25,Regular,0.049074897,Fruits and Vegetables,154.2682,OUT045,2002,,Tier 2,Supermarket Type1,3354.3004 +FDM20,10,Low Fat,0.038904624,Fruits and Vegetables,245.4144,OUT017,2007,,Tier 2,Supermarket Type1,6615.3888 +NCJ42,19.75,Low Fat,0.01438222,Household,102.2332,OUT017,2007,,Tier 2,Supermarket Type1,3075.996 +FDI50,8.42,Regular,0.030968306,Canned,227.8352,OUT018,2009,Medium,Tier 3,Supermarket Type2,3435.528 +FDZ15,13.1,Low Fat,0,Dairy,117.8782,OUT035,2004,Small,Tier 2,Supermarket Type1,2741.0986 +NCK18,9.6,Low Fat,0,Household,164.2184,OUT045,2002,,Tier 2,Supermarket Type1,1981.4208 +FDW33,9.395,Low Fat,0.099681254,Snack Foods,106.428,OUT017,2007,,Tier 2,Supermarket Type1,1917.504 +NCT05,10.895,LF,0.021037197,Health and Hygiene,255.9672,OUT018,2009,Medium,Tier 3,Supermarket Type2,4857.6768 +FDZ16,,Regular,0.279886948,Frozen Foods,193.1478,OUT019,1985,Small,Tier 1,Grocery Store,387.4956 +NCV17,18.85,Low Fat,0.016107549,Health and Hygiene,129.7626,OUT046,1997,Small,Tier 1,Supermarket Type1,3016.7398 +FDE34,9.195,Low Fat,0.108330902,Snack Foods,183.6634,OUT018,2009,Medium,Tier 3,Supermarket Type2,2726.451 +FDH44,19.1,Regular,0.025924623,Fruits and Vegetables,148.0418,OUT045,2002,,Tier 2,Supermarket Type1,3825.6868 +NCK06,5.03,Low Fat,0.008664064,Household,119.3756,OUT045,2002,,Tier 2,Supermarket Type1,605.878 +FDS46,17.6,Regular,0.047330801,Snack Foods,120.8782,OUT049,1999,Medium,Tier 1,Supermarket Type1,2621.9204 +NCO42,21.25,Low Fat,0.024756031,Household,146.7102,OUT018,2009,Medium,Tier 3,Supermarket Type2,1603.9122 +FDL13,13.85,Regular,0.056406129,Breakfast,231.43,OUT049,1999,Medium,Tier 1,Supermarket Type1,3029.39 +FDK14,6.98,Low Fat,0.0413383,Canned,83.3934,OUT017,2007,,Tier 2,Supermarket Type1,491.3604 +FDX13,7.725,Low Fat,0.047879864,Canned,250.2092,OUT045,2002,,Tier 2,Supermarket Type1,3984.1472 +DRI47,14.7,Low Fat,0.021005399,Hard Drinks,144.5128,OUT018,2009,Medium,Tier 3,Supermarket Type2,2588.6304 +FDG22,17.6,Regular,0.041615224,Snack Foods,37.219,OUT017,2007,,Tier 2,Supermarket Type1,366.19 +FDA13,15.85,Low Fat,0.07867708,Canned,37.8506,OUT049,1999,Medium,Tier 1,Supermarket Type1,341.5554 +FDE46,18.6,Low Fat,0.015769693,Snack Foods,152.1366,OUT046,1997,Small,Tier 1,Supermarket Type1,1813.6392 +FDX25,16.7,Low Fat,0.102633047,Canned,180.8292,OUT017,2007,,Tier 2,Supermarket Type1,3466.1548 +FDC58,10.195,Low Fat,0.04217956,Snack Foods,44.2428,OUT017,2007,,Tier 2,Supermarket Type1,703.0848 +NCA42,6.965,Low Fat,0.028710065,Household,158.1604,OUT017,2007,,Tier 2,Supermarket Type1,2693.8268 +FDV01,19.2,Regular,0.085082648,Canned,153.5314,OUT049,1999,Medium,Tier 1,Supermarket Type1,2171.8396 +FDU24,6.78,reg,0.140163038,Baking Goods,94.212,OUT046,1997,Small,Tier 1,Supermarket Type1,1025.332 +FDO51,6.785,Regular,0.042153502,Meat,44.0112,OUT018,2009,Medium,Tier 3,Supermarket Type2,340.8896 +NCN14,19.1,Low Fat,0.15385153,Others,185.1608,OUT010,1998,,Tier 3,Grocery Store,551.2824 +FDT37,,Low Fat,0.061753511,Canned,253.3014,OUT019,1985,Small,Tier 1,Grocery Store,510.0028 +FDY09,15.6,Low Fat,0.042179884,Snack Foods,174.7054,OUT010,1998,,Tier 3,Grocery Store,175.1054 +NCG06,16.35,Low Fat,0.029420857,Household,256.9646,OUT013,1987,High,Tier 3,Supermarket Type1,4637.9628 +FDG40,13.65,Low Fat,0.066657791,Frozen Foods,32.6558,OUT010,1998,,Tier 3,Grocery Store,67.9116 +FDQ47,7.155,Regular,0.168154574,Breads,33.7874,OUT035,2004,Small,Tier 2,Supermarket Type1,882.185 +DRH59,10.8,LF,0.097805615,Hard Drinks,73.938,OUT010,1998,,Tier 3,Grocery Store,73.238 +FDH48,13.5,Low Fat,0.06082246,Baking Goods,85.154,OUT017,2007,,Tier 2,Supermarket Type1,605.878 +FDE34,9.195,Low Fat,0.107870997,Snack Foods,181.2634,OUT035,2004,Small,Tier 2,Supermarket Type1,2362.9242 +NCM05,6.825,Low Fat,0.059940022,Health and Hygiene,262.4226,OUT049,1999,Medium,Tier 1,Supermarket Type1,3964.839 +FDU55,16.2,Low Fat,0.035967107,Fruits and Vegetables,260.3278,OUT049,1999,Medium,Tier 1,Supermarket Type1,7549.5062 +FDS60,20.85,Low Fat,0.032442388,Baking Goods,178.366,OUT035,2004,Small,Tier 2,Supermarket Type1,4673.916 +FDZ32,7.785,Regular,0,Fruits and Vegetables,106.4964,OUT013,1987,High,Tier 3,Supermarket Type1,1577.946 +FDP12,9.8,Regular,0.045358609,Baking Goods,36.1874,OUT045,2002,,Tier 2,Supermarket Type1,423.4488 +NCL31,,Low Fat,0.119698523,Others,143.047,OUT027,1985,Medium,Tier 3,Supermarket Type3,3578.675 +FDR32,,Regular,0.150238656,Fruits and Vegetables,229.3694,OUT019,1985,Small,Tier 1,Grocery Store,228.3694 +FDL08,,Low Fat,0.049478259,Fruits and Vegetables,245.4144,OUT027,1985,Medium,Tier 3,Supermarket Type3,3675.216 +FDY34,10.5,Regular,0.010998932,Snack Foods,164.3842,OUT049,1999,Medium,Tier 1,Supermarket Type1,1823.6262 +DRG23,8.88,Low Fat,0,Hard Drinks,154.0682,OUT018,2009,Medium,Tier 3,Supermarket Type2,2896.8958 +FDD04,16,Low Fat,0.08989642,Dairy,143.4154,OUT013,1987,High,Tier 3,Supermarket Type1,1985.4156 +FDX37,16.2,Low Fat,0.063385859,Canned,98.17,OUT017,2007,,Tier 2,Supermarket Type1,2696.49 +FDM09,11.15,Regular,0.086281593,Snack Foods,170.579,OUT018,2009,Medium,Tier 3,Supermarket Type2,1358.232 +FDA52,16.2,Regular,0.128315409,Frozen Foods,178.137,OUT013,1987,High,Tier 3,Supermarket Type1,3881.614 +NCV41,14.35,Low Fat,0.017108186,Health and Hygiene,110.3228,OUT018,2009,Medium,Tier 3,Supermarket Type2,552.614 +FDB20,7.72,LF,0.051970838,Fruits and Vegetables,79.7986,OUT035,2004,Small,Tier 2,Supermarket Type1,2336.958 +FDD28,10.695,Low Fat,0,Frozen Foods,60.5904,OUT017,2007,,Tier 2,Supermarket Type1,410.1328 +FDI38,13.35,Regular,0.024482433,Canned,205.7638,OUT010,1998,,Tier 3,Grocery Store,621.1914 +FDA28,16.1,Regular,0.047792845,Frozen Foods,126.1362,OUT035,2004,Small,Tier 2,Supermarket Type1,3271.7412 +FDB32,,Low Fat,0.023339367,Fruits and Vegetables,94.8778,OUT027,1985,Medium,Tier 3,Supermarket Type3,4036.7454 +NCS54,13.6,Low Fat,0.009991273,Household,175.537,OUT035,2004,Small,Tier 2,Supermarket Type1,3705.177 +NCA17,20.6,Low Fat,0.045675104,Health and Hygiene,150.9392,OUT017,2007,,Tier 2,Supermarket Type1,4026.7584 +FDR14,11.65,Low Fat,0.173904193,Dairy,52.3298,OUT013,1987,High,Tier 3,Supermarket Type1,269.649 +FDS58,9.285,Regular,0.021039273,Snack Foods,160.0578,OUT049,1999,Medium,Tier 1,Supermarket Type1,2567.3248 +FDU08,10.3,Low Fat,0.027426689,Fruits and Vegetables,97.3042,OUT018,2009,Medium,Tier 3,Supermarket Type2,694.4294 +FDI60,7.22,Regular,0.064141866,Baking Goods,61.251,OUT010,1998,,Tier 3,Grocery Store,126.502 +FDU40,20.85,Low Fat,0.037556341,Frozen Foods,195.3478,OUT018,2009,Medium,Tier 3,Supermarket Type2,1937.478 +FDX46,,Regular,0.057835325,Snack Foods,57.5562,OUT027,1985,Medium,Tier 3,Supermarket Type3,2548.0166 +FDG41,8.84,Regular,0.076995176,Frozen Foods,112.0228,OUT017,2007,,Tier 2,Supermarket Type1,1215.7508 +FDD14,,LF,0.297312685,Canned,185.4266,OUT019,1985,Small,Tier 1,Grocery Store,368.8532 +FDX45,,Low Fat,0.104348025,Snack Foods,156.263,OUT027,1985,Medium,Tier 3,Supermarket Type3,4850.353 +NCN30,16.35,Low Fat,0.016989991,Household,98.541,OUT035,2004,Small,Tier 2,Supermarket Type1,772.328 +DRH13,8.575,Low Fat,0.023885957,Soft Drinks,106.628,OUT046,1997,Small,Tier 1,Supermarket Type1,958.752 +NCP30,20.5,Low Fat,0.032954044,Household,39.3822,OUT017,2007,,Tier 2,Supermarket Type1,314.2576 +FDT52,9.695,Regular,0.047429578,Frozen Foods,245.8144,OUT046,1997,Small,Tier 1,Supermarket Type1,3430.2016 +FDS36,8.38,Regular,0.047152554,Baking Goods,110.157,OUT017,2007,,Tier 2,Supermarket Type1,3185.853 +FDB03,17.75,Regular,0.157470693,Dairy,239.1538,OUT018,2009,Medium,Tier 3,Supermarket Type2,4326.3684 +FDO09,13.5,Regular,0.125274674,Snack Foods,262.191,OUT046,1997,Small,Tier 1,Supermarket Type1,2366.919 +FDD28,,Low Fat,0.053038775,Frozen Foods,59.5904,OUT027,1985,Medium,Tier 3,Supermarket Type3,1640.5312 +FDF08,14.3,Regular,0.065339802,Fruits and Vegetables,89.1856,OUT045,2002,,Tier 2,Supermarket Type1,1845.5976 +FDB49,8.3,Regular,0.05046718,Baking Goods,97.6384,OUT010,1998,,Tier 3,Grocery Store,197.0768 +FDB08,6.055,Low Fat,0,Fruits and Vegetables,162.3578,OUT035,2004,Small,Tier 2,Supermarket Type1,1604.578 +NCP06,20.7,Low Fat,0.039306822,Household,150.7366,OUT049,1999,Medium,Tier 1,Supermarket Type1,3325.0052 +FDH28,15.85,Regular,0.110254143,Frozen Foods,37.3506,OUT045,2002,,Tier 2,Supermarket Type1,341.5554 +FDU20,,Regular,0.037569401,Fruits and Vegetables,120.7098,OUT019,1985,Small,Tier 1,Grocery Store,361.5294 +DRB25,12.3,Low Fat,0.069852615,Soft Drinks,107.4938,OUT017,2007,,Tier 2,Supermarket Type1,2358.2636 +NCM30,19.1,Low Fat,0.067676056,Household,40.8796,OUT017,2007,,Tier 2,Supermarket Type1,371.5164 +FDU57,8.27,Regular,0.149895348,Snack Foods,152.0708,OUT010,1998,,Tier 3,Grocery Store,451.4124 +FDF56,,Regular,0.209162936,Fruits and Vegetables,179.1976,OUT019,1985,Small,Tier 1,Grocery Store,543.2928 +NCT30,9.1,Low Fat,0.080277707,Household,47.2718,OUT035,2004,Small,Tier 2,Supermarket Type1,850.8924 +FDX15,17.2,Low Fat,0.156935553,Meat,160.6578,OUT018,2009,Medium,Tier 3,Supermarket Type2,1925.4936 +FDX58,13.15,low fat,0.044011225,Snack Foods,181.295,OUT017,2007,,Tier 2,Supermarket Type1,4028.09 +FDQ08,15.7,Regular,0.031685529,Fruits and Vegetables,63.1536,OUT010,1998,,Tier 3,Grocery Store,122.5072 +DRL23,18.35,Low Fat,0.015291576,Hard Drinks,106.1938,OUT013,1987,High,Tier 3,Supermarket Type1,1607.907 +FDA25,16.5,Regular,0.068112874,Canned,104.599,OUT035,2004,Small,Tier 2,Supermarket Type1,2889.572 +FDV09,12.1,Low Fat,0.020600553,Snack Foods,147.5734,OUT049,1999,Medium,Tier 1,Supermarket Type1,3414.8882 +FDQ46,7.51,Low Fat,0.10423592,Snack Foods,111.7544,OUT018,2009,Medium,Tier 3,Supermarket Type2,2460.7968 +FDH41,,Low Fat,0.081614376,Frozen Foods,214.7534,OUT027,1985,Medium,Tier 3,Supermarket Type3,5806.4418 +FDY20,12.5,Regular,0.082215187,Fruits and Vegetables,91.4488,OUT017,2007,,Tier 2,Supermarket Type1,1086.5856 +FDO37,8.06,Low Fat,0.021372636,Breakfast,231.7326,OUT035,2004,Small,Tier 2,Supermarket Type1,5313.7498 +FDZ55,6.055,Low Fat,0.025460232,Fruits and Vegetables,160.892,OUT045,2002,,Tier 2,Supermarket Type1,1917.504 +FDS32,,Regular,0.029510313,Fruits and Vegetables,141.9838,OUT027,1985,Medium,Tier 3,Supermarket Type3,4354.9978 +FDV50,14.3,Low Fat,0.122761775,Dairy,124.373,OUT049,1999,Medium,Tier 1,Supermarket Type1,2093.941 +NCV30,20.2,Low Fat,0.066065799,Household,61.351,OUT045,2002,,Tier 2,Supermarket Type1,1201.769 +FDP16,18.6,Low Fat,0.039454924,Frozen Foods,244.0802,OUT018,2009,Medium,Tier 3,Supermarket Type2,3193.8426 +FDW39,6.69,Regular,0.036910398,Meat,175.037,OUT046,1997,Small,Tier 1,Supermarket Type1,2117.244 +FDN39,19.35,Regular,0,Meat,169.0816,OUT013,1987,High,Tier 3,Supermarket Type1,3523.4136 +FDV55,17.75,Low Fat,0.055159054,Fruits and Vegetables,145.6444,OUT049,1999,Medium,Tier 1,Supermarket Type1,2467.4548 +FDZ20,16.1,Low Fat,0.034300475,Fruits and Vegetables,253.2356,OUT035,2004,Small,Tier 2,Supermarket Type1,5849.7188 +FDK02,12.5,Low Fat,0.112399145,Canned,120.444,OUT049,1999,Medium,Tier 1,Supermarket Type1,1438.128 +FDK10,5.785,Regular,0.040523265,Snack Foods,177.866,OUT018,2009,Medium,Tier 3,Supermarket Type2,4853.682 +NCQ41,14.8,Low Fat,0.019559746,Health and Hygiene,193.7794,OUT018,2009,Medium,Tier 3,Supermarket Type2,2926.191 +FDA11,7.75,Low Fat,0.043483398,Baking Goods,94.3436,OUT017,2007,,Tier 2,Supermarket Type1,2363.59 +FDN13,18.6,Low Fat,0.152366659,Breakfast,98.5358,OUT045,2002,,Tier 2,Supermarket Type1,1306.9654 +NCA42,6.965,Low Fat,0.047784475,Household,158.8604,OUT010,1998,,Tier 3,Grocery Store,316.9208 +NCX30,16.7,Low Fat,0.026598474,Household,245.8776,OUT013,1987,High,Tier 3,Supermarket Type1,4210.5192 +FDL10,,Low Fat,0.039300964,Snack Foods,99.5042,OUT027,1985,Medium,Tier 3,Supermarket Type3,1884.8798 +FDQ33,13.35,Low Fat,0.091348964,Snack Foods,150.3708,OUT049,1999,Medium,Tier 1,Supermarket Type1,4363.6532 +NCE42,21.1,Low Fat,0.010602292,Household,235.3958,OUT046,1997,Small,Tier 1,Supermarket Type1,3271.7412 +FDH58,12.3,Low Fat,0,Snack Foods,116.4834,OUT018,2009,Medium,Tier 3,Supermarket Type2,1842.9344 +FDF33,7.97,Low Fat,0.021579162,Seafood,105.9596,OUT045,2002,,Tier 2,Supermarket Type1,2049.3324 +DRK49,14.15,Low Fat,0.03593692,Soft Drinks,41.0138,OUT035,2004,Small,Tier 2,Supermarket Type1,771.6622 +NCK19,9.8,Low Fat,0.09046564,Others,193.6478,OUT046,1997,Small,Tier 1,Supermarket Type1,3099.9648 +FDT24,,Regular,0,Baking Goods,75.9328,OUT027,1985,Medium,Tier 3,Supermarket Type3,3012.0792 +FDI57,19.85,Low Fat,0.054245722,Seafood,196.0768,OUT018,2009,Medium,Tier 3,Supermarket Type2,5518.1504 +NCQ06,,Low Fat,0.041621987,Household,253.6014,OUT027,1985,Medium,Tier 3,Supermarket Type3,6630.0364 +FDB16,8.21,Low Fat,0.044888397,Dairy,87.3198,OUT013,1987,High,Tier 3,Supermarket Type1,610.5386 +FDB57,20.25,Regular,0.018805105,Fruits and Vegetables,220.6772,OUT046,1997,Small,Tier 1,Supermarket Type1,2223.772 +DRD13,15,Low Fat,0.049279392,Soft Drinks,65.7168,OUT018,2009,Medium,Tier 3,Supermarket Type2,575.2512 +FDC41,15.6,Low Fat,0.116815953,Frozen Foods,75.567,OUT013,1987,High,Tier 3,Supermarket Type1,1684.474 +FDW59,13.15,Low Fat,0.020698674,Breads,86.3566,OUT013,1987,High,Tier 3,Supermarket Type1,1099.2358 +FDO49,10.6,Regular,0.033103556,Breakfast,48.9008,OUT049,1999,Medium,Tier 1,Supermarket Type1,708.4112 +FDO08,11.1,Regular,0.090008963,Fruits and Vegetables,164.0526,OUT010,1998,,Tier 3,Grocery Store,164.4526 +NCV06,,Low Fat,0.116750407,Household,195.2478,OUT019,1985,Small,Tier 1,Grocery Store,193.7478 +NCY06,15.25,Low Fat,0.061184804,Household,132.0968,OUT046,1997,Small,Tier 1,Supermarket Type1,3914.904 +FDL03,19.25,Regular,0.027190917,Meat,194.811,OUT018,2009,Medium,Tier 3,Supermarket Type2,2160.521 +NCL31,7.39,LF,0.120467994,Others,145.147,OUT049,1999,Medium,Tier 1,Supermarket Type1,5296.439 +FDU46,10.3,Regular,0.011189235,Snack Foods,86.654,OUT017,2007,,Tier 2,Supermarket Type1,2423.512 +FDF04,17.5,Low Fat,0.013714183,Frozen Foods,259.2304,OUT017,2007,,Tier 2,Supermarket Type1,2841.6344 +FDX31,,Regular,0,Fruits and Vegetables,234.7958,OUT019,1985,Small,Tier 1,Grocery Store,467.3916 +FDI24,10.3,Low Fat,0.078728915,Baking Goods,178.437,OUT035,2004,Small,Tier 2,Supermarket Type1,2822.992 +FDY28,,Regular,0.26639671,Frozen Foods,215.6218,OUT019,1985,Small,Tier 1,Grocery Store,641.1654 +DRN11,7.85,Low Fat,0.163902159,Hard Drinks,143.3444,OUT017,2007,,Tier 2,Supermarket Type1,1596.5884 +FDB10,10,Low Fat,0.067312613,Snack Foods,234.359,OUT049,1999,Medium,Tier 1,Supermarket Type1,3072.667 +FDI60,7.22,Regular,0.03832122,Baking Goods,61.851,OUT046,1997,Small,Tier 1,Supermarket Type1,822.263 +FDN15,,Low Fat,0.016653022,Meat,139.518,OUT027,1985,Medium,Tier 3,Supermarket Type3,2936.178 +NCE18,10,Low Fat,0.021421289,Household,248.375,OUT035,2004,Small,Tier 2,Supermarket Type1,7240.575 +NCE43,,LF,0.102941345,Household,171.2448,OUT027,1985,Medium,Tier 3,Supermarket Type3,4602.0096 +NCN53,5.175,Low Fat,0.030479118,Health and Hygiene,33.2874,OUT018,2009,Medium,Tier 3,Supermarket Type2,635.1732 +NCX41,,Low Fat,0.031024168,Health and Hygiene,210.5244,OUT019,1985,Small,Tier 1,Grocery Store,1482.0708 +FDO52,11.6,Regular,0.077100381,Frozen Foods,172.4106,OUT013,1987,High,Tier 3,Supermarket Type1,1539.9954 +FDW45,18,Low Fat,0.038978526,Snack Foods,148.6418,OUT013,1987,High,Tier 3,Supermarket Type1,2795.6942 +FDN45,,Low Fat,0.117530851,Snack Foods,222.7088,OUT027,1985,Medium,Tier 3,Supermarket Type3,4026.7584 +FDD38,16.75,Regular,0.008238064,Canned,101.9674,OUT017,2007,,Tier 2,Supermarket Type1,1528.011 +FDK27,,Low Fat,0.015664229,Meat,122.2756,OUT019,1985,Small,Tier 1,Grocery Store,121.1756 +FDG40,13.65,Low Fat,0.039824346,Frozen Foods,32.8558,OUT046,1997,Small,Tier 1,Supermarket Type1,645.1602 +FDA34,11.5,Low Fat,0.014883661,Starchy Foods,174.508,OUT049,1999,Medium,Tier 1,Supermarket Type1,3635.268 +FDX48,17.75,Regular,0.038102203,Baking Goods,154.0656,OUT017,2007,,Tier 2,Supermarket Type1,1390.1904 +FDY37,,Regular,0.026440214,Canned,143.647,OUT027,1985,Medium,Tier 3,Supermarket Type3,2862.94 +DRE48,8.43,Low Fat,0.017396308,Soft Drinks,196.0768,OUT018,2009,Medium,Tier 3,Supermarket Type2,4138.6128 +FDT58,9,Low Fat,0.086088353,Snack Foods,168.7816,OUT049,1999,Medium,Tier 1,Supermarket Type1,3355.632 +FDA19,7.52,Low Fat,0.092272132,Fruits and Vegetables,128.7994,OUT010,1998,,Tier 3,Grocery Store,128.4994 +FDG52,13.65,Low Fat,0.065618434,Frozen Foods,47.6402,OUT035,2004,Small,Tier 2,Supermarket Type1,459.402 +FDA32,,LF,0.052691046,Fruits and Vegetables,216.3192,OUT019,1985,Small,Tier 1,Grocery Store,215.7192 +NCM19,12.65,Low Fat,0.047333044,Others,113.8202,OUT045,2002,,Tier 2,Supermarket Type1,1800.3232 +NCF42,17.35,Low Fat,0.167722519,Household,176.3712,OUT045,2002,,Tier 2,Supermarket Type1,1054.6272 +FDV23,11,Low Fat,0.105816753,Breads,126.0046,OUT035,2004,Small,Tier 2,Supermarket Type1,871.5322 +DRA59,8.27,Regular,0.214125129,Soft Drinks,183.9924,OUT010,1998,,Tier 3,Grocery Store,185.0924 +FDA01,,Regular,0.054114924,Canned,58.4904,OUT027,1985,Medium,Tier 3,Supermarket Type3,1054.6272 +FDX44,,Low Fat,0.042758477,Fruits and Vegetables,88.4172,OUT027,1985,Medium,Tier 3,Supermarket Type3,2051.9956 +FDW25,5.175,Low Fat,0.037391881,Canned,83.2224,OUT035,2004,Small,Tier 2,Supermarket Type1,1789.6704 +NCM05,,Low Fat,0.104784329,Health and Hygiene,266.0226,OUT019,1985,Small,Tier 1,Grocery Store,528.6452 +NCJ54,9.895,Low Fat,0.060055757,Household,234.2642,OUT035,2004,Small,Tier 2,Supermarket Type1,3717.8272 +NCK07,10.65,Low Fat,0.048885018,Others,166.1526,OUT018,2009,Medium,Tier 3,Supermarket Type2,1973.4312 +NCX05,15.2,Low Fat,0.097611115,Health and Hygiene,116.5492,OUT017,2007,,Tier 2,Supermarket Type1,810.9444 +FDV39,11.3,LF,0.007279889,Meat,199.3426,OUT046,1997,Small,Tier 1,Supermarket Type1,2372.9112 +FDI19,15.1,low fat,0,Meat,244.2512,OUT045,2002,,Tier 2,Supermarket Type1,3635.268 +FDT12,6.215,Regular,0.049621701,Baking Goods,226.1062,OUT046,1997,Small,Tier 1,Supermarket Type1,4739.8302 +FDF12,8.235,Low Fat,0.08235926,Baking Goods,147.6076,OUT013,1987,High,Tier 3,Supermarket Type1,3103.9596 +NCQ54,,Low Fat,0.012481638,Household,168.3474,OUT027,1985,Medium,Tier 3,Supermarket Type3,5221.8694 +FDU10,10.1,Regular,0.045653999,Snack Foods,35.6848,OUT013,1987,High,Tier 3,Supermarket Type1,633.8416 +NCK53,11.6,Low Fat,0.037734334,Health and Hygiene,98.1042,OUT018,2009,Medium,Tier 3,Supermarket Type2,2678.5134 +FDB51,6.92,Low Fat,0.038454076,Dairy,61.5852,OUT046,1997,Small,Tier 1,Supermarket Type1,813.6076 +FDT10,16.7,reg,0.062395455,Snack Foods,57.6562,OUT017,2007,,Tier 2,Supermarket Type1,533.3058 +NCU53,5.485,Low Fat,0.042716235,Health and Hygiene,164.8842,OUT013,1987,High,Tier 3,Supermarket Type1,2155.1946 +FDJ40,13.6,Regular,0.049547993,Frozen Foods,108.6912,OUT013,1987,High,Tier 3,Supermarket Type1,2402.2064 +NCQ05,,Low Fat,0.037829469,Health and Hygiene,151.0708,OUT019,1985,Small,Tier 1,Grocery Store,451.4124 +FDV15,10.3,LF,0.146172453,Meat,103.3648,OUT046,1997,Small,Tier 1,Supermarket Type1,3219.8088 +FDD41,6.765,Regular,0.08739577,Frozen Foods,105.3306,OUT049,1999,Medium,Tier 1,Supermarket Type1,836.2448 +FDT20,10.5,Low Fat,0.041479396,Fruits and Vegetables,36.8164,OUT045,2002,,Tier 2,Supermarket Type1,772.328 +FDM44,12.5,Low Fat,0.031023835,Fruits and Vegetables,104.099,OUT013,1987,High,Tier 3,Supermarket Type1,309.597 +FDG21,17.35,Regular,0,Seafood,150.205,OUT045,2002,,Tier 2,Supermarket Type1,5992.2 +DRZ11,8.85,Regular,0.112893431,Soft Drinks,123.3388,OUT045,2002,,Tier 2,Supermarket Type1,2972.1312 +FDC59,16.7,Regular,0.054851438,Starchy Foods,64.4168,OUT018,2009,Medium,Tier 3,Supermarket Type2,830.9184 +NCD43,8.85,Low Fat,0.016052446,Household,106.7964,OUT045,2002,,Tier 2,Supermarket Type1,1367.5532 +DRL49,13.15,Low Fat,0.094450618,Soft Drinks,141.4812,OUT010,1998,,Tier 3,Grocery Store,284.9624 +NCE07,8.18,Low Fat,0.02197698,Household,140.6154,OUT010,1998,,Tier 3,Grocery Store,425.4462 +FDM02,12.5,Regular,0.074152133,Canned,88.6198,OUT017,2007,,Tier 2,Supermarket Type1,1395.5168 +DRJ49,6.865,Low Fat,0.014072399,Soft Drinks,127.3652,OUT017,2007,,Tier 2,Supermarket Type1,1679.1476 +FDY25,12,Low Fat,0.034112833,Canned,180.1976,OUT018,2009,Medium,Tier 3,Supermarket Type2,3984.1472 +DRH39,,low fat,0,Dairy,75.967,OUT019,1985,Small,Tier 1,Grocery Store,153.134 +FDB09,,Low Fat,0.100493148,Fruits and Vegetables,123.1046,OUT019,1985,Small,Tier 1,Grocery Store,124.5046 +FDM38,5.885,Regular,0.092771309,Canned,54.1982,OUT046,1997,Small,Tier 1,Supermarket Type1,999.3658 +FDY22,16.5,Regular,0.159690469,Snack Foods,142.4128,OUT035,2004,Small,Tier 2,Supermarket Type1,575.2512 +FDP48,7.52,Regular,0.044272226,Baking Goods,181.395,OUT017,2007,,Tier 2,Supermarket Type1,2563.33 +NCT05,10.895,Low Fat,0.020934413,Health and Hygiene,256.5672,OUT013,1987,High,Tier 3,Supermarket Type1,4090.6752 +NCS06,7.935,Low Fat,0,Household,263.691,OUT046,1997,Small,Tier 1,Supermarket Type1,788.973 +FDD47,7.6,Regular,0.142632186,Starchy Foods,172.3448,OUT049,1999,Medium,Tier 1,Supermarket Type1,4431.5648 +FDZ49,11,Regular,0.13341564,Canned,218.7798,OUT045,2002,,Tier 2,Supermarket Type1,2203.798 +FDW59,13.15,Low Fat,0.020711996,Breads,82.7566,OUT035,2004,Small,Tier 2,Supermarket Type1,1691.132 +DRO47,10.195,Low Fat,0.112399145,Hard Drinks,111.686,OUT049,1999,Medium,Tier 1,Supermarket Type1,2263.72 +FDR46,16.85,Low Fat,0.139700397,Snack Foods,147.776,OUT045,2002,,Tier 2,Supermarket Type1,2490.092 +FDY59,8.195,Low Fat,0.031377308,Baking Goods,93.6462,OUT013,1987,High,Tier 3,Supermarket Type1,925.462 +NCU05,11.8,Low Fat,0.058855357,Health and Hygiene,79.1618,OUT045,2002,,Tier 2,Supermarket Type1,2336.2922 +DRJ25,14.6,Low Fat,0.151180862,Soft Drinks,47.5692,OUT018,2009,Medium,Tier 3,Supermarket Type2,443.4228 +FDU28,19.2,Regular,0.09391835,Frozen Foods,189.8214,OUT046,1997,Small,Tier 1,Supermarket Type1,942.107 +FDL50,12.15,Regular,0.042378864,Canned,125.4046,OUT049,1999,Medium,Tier 1,Supermarket Type1,1867.569 +FDA43,10.895,Low Fat,0.064939211,Fruits and Vegetables,194.1794,OUT018,2009,Medium,Tier 3,Supermarket Type2,2340.9528 +FDD08,,Low Fat,0.035183156,Fruits and Vegetables,37.8506,OUT027,1985,Medium,Tier 3,Supermarket Type3,417.4566 +FDJ57,7.42,Regular,0.021661527,Seafood,187.7582,OUT018,2009,Medium,Tier 3,Supermarket Type2,2600.6148 +FDC39,7.405,Low Fat,0.159165324,Dairy,207.1296,OUT035,2004,Small,Tier 2,Supermarket Type1,3739.1328 +FDQ58,7.315,Low Fat,0,Snack Foods,153.734,OUT035,2004,Small,Tier 2,Supermarket Type1,2756.412 +FDA22,7.435,Low Fat,0.084436394,Starchy Foods,168.6158,OUT035,2004,Small,Tier 2,Supermarket Type1,4512.1266 +FDP39,12.65,Low Fat,0.069532901,Meat,51.8324,OUT049,1999,Medium,Tier 1,Supermarket Type1,1090.5804 +FDV44,8.365,Regular,0.039836895,Fruits and Vegetables,191.6188,OUT035,2004,Small,Tier 2,Supermarket Type1,2094.6068 +FDE04,19.75,Regular,0.018019662,Frozen Foods,181.566,OUT035,2004,Small,Tier 2,Supermarket Type1,2876.256 +NCO30,19.5,Low Fat,0.015711807,Household,181.8608,OUT013,1987,High,Tier 3,Supermarket Type1,4042.7376 +FDA44,19.7,Low Fat,0.053330653,Fruits and Vegetables,56.793,OUT045,2002,,Tier 2,Supermarket Type1,848.895 +FDI16,14,Regular,0.227260689,Frozen Foods,54.364,OUT010,1998,,Tier 3,Grocery Store,159.792 +FDM15,11.8,Regular,0.057410724,Meat,149.5366,OUT035,2004,Small,Tier 2,Supermarket Type1,1813.6392 +DRJ13,12.65,Low Fat,0.062878412,Soft Drinks,160.9578,OUT035,2004,Small,Tier 2,Supermarket Type1,4332.3606 +FDT48,,Low Fat,0,Baking Goods,196.5084,OUT027,1985,Medium,Tier 3,Supermarket Type3,793.6336 +FDH33,12.85,Low Fat,0.121725411,Snack Foods,45.1428,OUT046,1997,Small,Tier 1,Supermarket Type1,527.3136 +FDE14,13.65,Regular,0.031439206,Canned,100.07,OUT035,2004,Small,Tier 2,Supermarket Type1,2596.62 +FDE26,9.3,Low Fat,0.088931701,Canned,143.3786,OUT013,1987,High,Tier 3,Supermarket Type1,3034.0506 +FDN08,7.72,Regular,0,Fruits and Vegetables,117.7466,OUT018,2009,Medium,Tier 3,Supermarket Type2,1296.3126 +NCO29,11.15,Low Fat,0.032387589,Health and Hygiene,164.3526,OUT018,2009,Medium,Tier 3,Supermarket Type2,2960.1468 +FDK60,16.5,Regular,0.094010215,Baking Goods,95.2068,OUT049,1999,Medium,Tier 1,Supermarket Type1,777.6544 +FDX40,,Low Fat,0.173324207,Frozen Foods,39.9164,OUT019,1985,Small,Tier 1,Grocery Store,38.6164 +FDX15,17.2,LF,0.156541861,Meat,162.4578,OUT049,1999,Medium,Tier 1,Supermarket Type1,2888.2404 +FDO28,,Low Fat,0.071948252,Frozen Foods,121.6098,OUT027,1985,Medium,Tier 3,Supermarket Type3,482.0392 +NCL05,19.6,Low Fat,0.048092778,Health and Hygiene,44.477,OUT018,2009,Medium,Tier 3,Supermarket Type2,432.77 +FDT04,17.25,Low Fat,0.107258822,Frozen Foods,40.1822,OUT045,2002,,Tier 2,Supermarket Type1,510.6686 +FDS26,20.35,Low Fat,0.089975294,Dairy,261.6594,OUT017,2007,,Tier 2,Supermarket Type1,7588.1226 +FDV50,14.3,Low Fat,0.123070513,Dairy,121.173,OUT018,2009,Medium,Tier 3,Supermarket Type2,2093.941 +FDG02,,Low Fat,0.019716846,Canned,191.9188,OUT019,1985,Small,Tier 1,Grocery Store,571.2564 +FDC28,7.905,Low Fat,0.054986919,Frozen Foods,108.6254,OUT046,1997,Small,Tier 1,Supermarket Type1,1844.9318 +FDK21,7.905,Low Fat,0.010027885,Snack Foods,249.6408,OUT049,1999,Medium,Tier 1,Supermarket Type1,3254.4304 +NCO42,21.25,Low Fat,0.024795057,Household,147.4102,OUT017,2007,,Tier 2,Supermarket Type1,3791.0652 +FDB46,10.5,Regular,0.093954022,Snack Foods,211.8244,OUT045,2002,,Tier 2,Supermarket Type1,3387.5904 +NCH54,,Low Fat,0.127234249,Household,158.392,OUT019,1985,Small,Tier 1,Grocery Store,159.792 +FDL26,18,Low Fat,0.073606829,Canned,156.6972,OUT017,2007,,Tier 2,Supermarket Type1,4206.5244 +NCQ30,7.725,Low Fat,0.029131242,Household,123.8414,OUT045,2002,,Tier 2,Supermarket Type1,487.3656 +FDY50,5.8,Low Fat,0.130931048,Dairy,89.9172,OUT035,2004,Small,Tier 2,Supermarket Type1,1516.6924 +FDX20,,Low Fat,0.074517508,Fruits and Vegetables,227.372,OUT019,1985,Small,Tier 1,Grocery Store,452.744 +FDQ34,10.85,Low Fat,0.162211939,Snack Foods,107.0622,OUT035,2004,Small,Tier 2,Supermarket Type1,741.0354 +FDN39,19.35,Regular,0.065507999,Meat,168.9816,OUT035,2004,Small,Tier 2,Supermarket Type1,2852.2872 +FDB17,13.15,Low Fat,0.036672107,Frozen Foods,182.5976,OUT046,1997,Small,Tier 1,Supermarket Type1,4165.2448 +FDQ31,5.785,Regular,0.053802405,Fruits and Vegetables,85.9856,OUT013,1987,High,Tier 3,Supermarket Type1,1494.0552 +FDG59,,Low Fat,0.043025208,Starchy Foods,37.6164,OUT027,1985,Medium,Tier 3,Supermarket Type3,810.9444 +FDO56,10.195,Regular,0.045073782,Fruits and Vegetables,119.1808,OUT045,2002,,Tier 2,Supermarket Type1,468.7232 +FDX11,16,Regular,0.106968577,Baking Goods,180.5634,OUT045,2002,,Tier 2,Supermarket Type1,2726.451 +FDJ32,10.695,Low Fat,0.057744249,Fruits and Vegetables,61.2536,OUT013,1987,High,Tier 3,Supermarket Type1,673.7896 +FDV31,9.8,LF,0,Fruits and Vegetables,175.237,OUT049,1999,Medium,Tier 1,Supermarket Type1,3881.614 +FDB20,7.72,Low Fat,0.052086085,Fruits and Vegetables,76.8986,OUT045,2002,,Tier 2,Supermarket Type1,467.3916 +FDQ45,,Regular,0.019114349,Snack Foods,182.1608,OUT019,1985,Small,Tier 1,Grocery Store,367.5216 +FDW27,5.86,Regular,0.151087845,Meat,155.1314,OUT049,1999,Medium,Tier 1,Supermarket Type1,1551.314 +NCT53,5.4,Low Fat,0.048388423,Health and Hygiene,163.0526,OUT017,2007,,Tier 2,Supermarket Type1,2302.3364 +NCS41,,Low Fat,0.053185208,Health and Hygiene,182.9608,OUT027,1985,Medium,Tier 3,Supermarket Type3,1653.8472 +DRI47,14.7,Low Fat,0.035016091,Hard Drinks,144.3128,OUT010,1998,,Tier 3,Grocery Store,431.4384 +NCJ42,19.75,Low Fat,0.01433033,Household,104.2332,OUT045,2002,,Tier 2,Supermarket Type1,2153.1972 +NCS17,18.6,Low Fat,0.080626601,Health and Hygiene,92.5436,OUT049,1999,Medium,Tier 1,Supermarket Type1,378.1744 +NCO41,12.5,Low Fat,0.018887088,Health and Hygiene,98.8384,OUT045,2002,,Tier 2,Supermarket Type1,1280.9992 +FDC05,13.1,Regular,0.099343352,Frozen Foods,198.1768,OUT017,2007,,Tier 2,Supermarket Type1,1970.768 +FDX34,6.195,Low Fat,0.071971918,Snack Foods,121.3098,OUT035,2004,Small,Tier 2,Supermarket Type1,4820.392 +FDL10,8.395,Low Fat,0.039553606,Snack Foods,99.1042,OUT049,1999,Medium,Tier 1,Supermarket Type1,2579.3092 +FDQ58,,Low Fat,0,Snack Foods,154.534,OUT019,1985,Small,Tier 1,Grocery Store,459.402 +FDT56,16,Regular,0.115826834,Fruits and Vegetables,56.0246,OUT045,2002,,Tier 2,Supermarket Type1,695.0952 +FDZ28,20,Regular,0.051702257,Frozen Foods,125.8678,OUT018,2009,Medium,Tier 3,Supermarket Type2,763.0068 +DRI11,8.26,Low Fat,0.03447406,Hard Drinks,117.0834,OUT045,2002,,Tier 2,Supermarket Type1,1612.5676 +DRJ49,6.865,Low Fat,0,Soft Drinks,129.9652,OUT013,1987,High,Tier 3,Supermarket Type1,2324.9736 +DRK37,,Low Fat,0.04379158,Soft Drinks,189.053,OUT027,1985,Medium,Tier 3,Supermarket Type3,6261.849 +FDR20,20,Regular,0,Fruits and Vegetables,46.4744,OUT010,1998,,Tier 3,Grocery Store,45.2744 +DRG13,,Low Fat,0.037006076,Soft Drinks,164.7526,OUT027,1985,Medium,Tier 3,Supermarket Type3,4111.315 +NCN14,,Low Fat,0.09147267,Others,184.6608,OUT027,1985,Medium,Tier 3,Supermarket Type3,2756.412 +FDV13,17.35,Regular,0.027723342,Canned,89.6856,OUT018,2009,Medium,Tier 3,Supermarket Type2,2109.2544 +FDU44,,Regular,0.102295904,Fruits and Vegetables,162.3552,OUT019,1985,Small,Tier 1,Grocery Store,487.3656 +FDO03,10.395,Regular,0.037033223,Meat,227.9352,OUT018,2009,Medium,Tier 3,Supermarket Type2,4809.7392 +FDT34,9.3,Low Fat,0.174350275,Snack Foods,104.4964,OUT046,1997,Small,Tier 1,Supermarket Type1,2419.5172 +FDP21,7.42,Regular,0.025886443,Snack Foods,189.1872,OUT017,2007,,Tier 2,Supermarket Type1,4727.18 +NCI54,15.2,Low Fat,0,Household,110.4912,OUT017,2007,,Tier 2,Supermarket Type1,1637.868 +FDE22,9.695,Low Fat,0.029567218,Snack Foods,160.492,OUT035,2004,Small,Tier 2,Supermarket Type1,4314.384 +FDJ57,7.42,Regular,0.021695674,Seafood,185.3582,OUT017,2007,,Tier 2,Supermarket Type1,3715.164 +FDT08,13.65,Low Fat,0.049209192,Fruits and Vegetables,150.005,OUT035,2004,Small,Tier 2,Supermarket Type1,2247.075 +NCP54,15.35,Low Fat,0.035292855,Household,124.573,OUT018,2009,Medium,Tier 3,Supermarket Type2,1601.249 +NCK53,11.6,Low Fat,0.037574137,Health and Hygiene,100.0042,OUT035,2004,Small,Tier 2,Supermarket Type1,2976.126 +NCQ42,20.35,Low Fat,0,Household,125.1678,OUT017,2007,,Tier 2,Supermarket Type1,1907.517 +FDW21,5.34,Regular,0.005997615,Snack Foods,100.4358,OUT017,2007,,Tier 2,Supermarket Type1,1508.037 +NCH43,8.42,Low Fat,0.070712031,Household,216.4192,OUT045,2002,,Tier 2,Supermarket Type1,3020.0688 +FDQ44,20.5,Low Fat,0.036133463,Fruits and Vegetables,120.1756,OUT035,2004,Small,Tier 2,Supermarket Type1,3392.9168 +NCN18,,Low Fat,0.124110734,Household,111.7544,OUT027,1985,Medium,Tier 3,Supermarket Type3,4138.6128 +FDB46,10.5,Regular,0.094145821,Snack Foods,210.8244,OUT018,2009,Medium,Tier 3,Supermarket Type2,2117.244 +DRF37,17.25,Low Fat,0.084676173,Soft Drinks,263.191,OUT018,2009,Medium,Tier 3,Supermarket Type2,3944.865 +FDN28,5.88,Regular,0.030242184,Frozen Foods,101.799,OUT035,2004,Small,Tier 2,Supermarket Type1,515.995 +FDW31,11.35,Regular,0.04324563,Fruits and Vegetables,199.4742,OUT045,2002,,Tier 2,Supermarket Type1,2587.9646 +FDG45,8.1,Low Fat,0.214306131,Fruits and Vegetables,213.9902,OUT010,1998,,Tier 3,Grocery Store,424.7804 +FDN58,13.8,Regular,0.056861638,Snack Foods,231.5984,OUT035,2004,Small,Tier 2,Supermarket Type1,7182.6504 +FDF05,17.5,Low Fat,0.026980351,Frozen Foods,262.591,OUT018,2009,Medium,Tier 3,Supermarket Type2,4207.856 +FDR26,20.7,Low Fat,0.04280113,Dairy,178.3028,OUT013,1987,High,Tier 3,Supermarket Type1,2479.4392 +FDH31,12,Regular,0.020407296,Meat,99.9042,OUT035,2004,Small,Tier 2,Supermarket Type1,595.2252 +FDA01,15,Regular,0.054488534,Canned,57.5904,OUT045,2002,,Tier 2,Supermarket Type1,468.7232 +FDH24,20.7,Low Fat,0.021518435,Baking Goods,157.5288,OUT018,2009,Medium,Tier 3,Supermarket Type2,1571.288 +NCJ19,18.6,Low Fat,0.118661426,Others,58.7588,OUT018,2009,Medium,Tier 3,Supermarket Type2,858.882 +FDF53,20.75,reg,0.083606565,Frozen Foods,178.8318,OUT046,1997,Small,Tier 1,Supermarket Type1,3608.636 +FDF22,6.865,Low Fat,0.056783389,Snack Foods,214.5218,OUT013,1987,High,Tier 3,Supermarket Type1,2778.3834 +FDS36,8.38,Regular,0.046982429,Baking Goods,108.157,OUT045,2002,,Tier 2,Supermarket Type1,549.285 +NCJ29,10.6,Low Fat,0.035186271,Health and Hygiene,85.1224,OUT035,2004,Small,Tier 2,Supermarket Type1,1193.1136 +FDN46,7.21,Regular,0.145220646,Snack Foods,103.1332,OUT018,2009,Medium,Tier 3,Supermarket Type2,1845.5976 +DRG01,14.8,Low Fat,0.04487828,Soft Drinks,75.467,OUT046,1997,Small,Tier 1,Supermarket Type1,765.67 diff --git a/R/BigMartSales/Tutorial_on_DS.Rmd b/R/BigMartSales/Tutorial_on_DS.Rmd new file mode 100644 index 000000000..812450d0e --- /dev/null +++ b/R/BigMartSales/Tutorial_on_DS.Rmd @@ -0,0 +1,61 @@ +--- +title: "https://www.analyticsvidhya.com/blog/2016/02/complete-tutorial-learn-data-science-scratch/#one" +output: html_notebook +--- + +```{r} +path <- "~/Code/Henkel/Learning/aima-python/R/BigMartSales/" +setwd(path) +``` +```{r} + +``` +Load datafiles downloaded from https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/ +```{r} +train <- read.csv(file = "./Train_UWu5bXk.csv") +test <- read.csv(file = "./Test_u94Q5KV.csv") +``` + +```{r} +str(train) +cat('\n\n Summary: \n') +summary(train) +``` +```{r} +table(is.na(train)) +colSums(is.na(train)) +``` +```{r} +library(ggplot2) +ggplot(train, aes(x= Item_Weight, y = Item_Visibility)) + geom_point(size = 2.5, color="navy") + ylab("Item Visibility") + xlab("Item Weight") + ggtitle("Item Visibility vs Item Outlet Sales") +``` + +```{r} +test$Item_Outlet_Sales <- mean(train$Item_Outlet_Sales) +dim(test) +combi <- rbind(train, test) +combi$Item_Weight[is.na(combi$Item_Weight)] <- median(combi$Item_Weight, na.rm = TRUE) +table(is.na(combi)) +``` + +```{r} +combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0, median(combi$Item_Visibility), combi$Item_Visibility) +``` +```{r} +levels(combi$Item_Fat_Content) +library(plyr) +combi$Item_Fat_Content <- revalue(combi$Item_Fat_Content, c("LF"="Low Fat", "low fat"="Low Fat", "reg"="Regular")) +``` + +```{r} +levels(combi$Outlet_Size) +``` + +```{r} +summary(combi) +``` + +```{r} +?group_by +``` + diff --git a/R/BigMartSales/Tutorial_on_DS.nb.html b/R/BigMartSales/Tutorial_on_DS.nb.html new file mode 100644 index 000000000..edd37527f --- /dev/null +++ b/R/BigMartSales/Tutorial_on_DS.nb.html @@ -0,0 +1,329 @@ + + + + + + + + + + + + + +https://www.analyticsvidhya.com/blog/2016/02/complete-tutorial-learn-data-science-scratch/#one + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + diff --git a/R/decision_tree_learning.Rmd b/R/decision_tree_learning.Rmd new file mode 100644 index 000000000..840cd58f0 --- /dev/null +++ b/R/decision_tree_learning.Rmd @@ -0,0 +1,82 @@ +--- +title: "Chi^2 prunning" +output: html_notebook +--- +Data generation: +```{r} +samples = 2000 +a1 = runif(samples, 0, 1) < 0.5; +a2 = runif(samples, 0, 1) < 0.5; +ans = xor(a1, a2); +ts = data.frame(a1, a2, ans); +colnames(ts) <- c("A1", "A2", "Ans"); +ts +``` +Some helper functions: +```{r} +# return the most likely answer when no further evidence is avaialable +getmode <- function(v) { + length(v["Ans"] == TRUE) > length(v["Ans"])/2 +} +``` + +```{r} +# gives entropy contained in a list of boolean values +booleanEntropy <- function(truth_table){ + tab = table(truth_table); + if(! "TRUE" %in% names(tab) || ! "FALSE" %in% names(tab)) + return(0) + pos <- table(truth_table)["FALSE"] + names(pos) <- "bool entropy" + p <- pos/length(truth_table) + return(- p * log2(p) - (1-p) * log2(1-p)) +} +``` + +```{r} +# calculates information gain of splitting by given attribute +importance <- function(atr, examples){ + val1 = examples[examples[atr] == TRUE, ] + val2 = examples[examples[atr] == FALSE, ] + s_true <- booleanEntropy(val1[,"Ans"]) + s_false <- booleanEntropy(val2[, "Ans"]) + print(paste("Entropies:", s_true, s_false)) + R <- (s_false*length(val1[, "Ans"]) + + s_true*length(val2[, "Ans"]))/(length(examples[, atr])) + names(R) <- paste("Gain on", atr) + return(-R + booleanEntropy(examples[,"Ans"])) # strange ordering to preserve name +} +importance("Ans", ts) +``` + + +Decision tree learning function: +```{r} +decisionTreeLearning <- function(examples, attributes, parent_examples){ + if (length(examples[,"Ans"]) == 0) + return(getmode(parent_examples)) + # return most probable answer as there is no training data left + else if( length(attributes) == 0) + return(getmode(examples)) + else if (length(table(examples["Ans"]))) < 2): + return(examples["Ans", 1]) + + A = max(attributes, key(a)=importance(a, examples)) + # choose the most promissing attribute to condition on + tree = new Tree(root=A) + for( value in A.values()){ + exs = examples[e.A == value] + subtree = decisionTreeLearning(exs, attributes.remove(A), examples) + # note implementation should probably wrap the trivial case returns into trees for consistency + tree.addSubtreeAsBranch(subtree, label=(A, value) + } + + return(tree) +} +``` + +Add a new chunk by clicking the *Insert Chunk* button on the toolbar or by pressing *Ctrl+Alt+I*. + +When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Ctrl+Shift+K* to preview the HTML file). + +The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed. diff --git a/R/decision_tree_learning.nb.html b/R/decision_tree_learning.nb.html new file mode 100644 index 000000000..e1be19df4 --- /dev/null +++ b/R/decision_tree_learning.nb.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + +Chi^2 prunning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +

    Data generation:

    + + + +
    samples = 2000
    +a1 = runif(samples, 0, 1) < 0.5;
    +a2 = runif(samples, 0, 1) < 0.5;
    +ans = xor(a1, a2);
    +ts = data.frame(a1, a2, ans);
    +colnames(ts) <- c("A1", "A2", "Ans");
    +ts
    + + +
    + +
    + + + +

    Some helper functions:

    + + + +
    # return the most likely answer when no further evidence is avaialable
    +getmode <- function(v) {
    +   length(v["Ans"] == TRUE) > length(v["Ans"])/2
    +}
    + + + + + + +
    # gives entropy contained in a list of boolean values
    +booleanEntropy <- function(truth_table){
    +  tab = table(truth_table);
    +  if(! "TRUE" %in% names(tab) || ! "FALSE" %in% names(tab))
    +    return(0)
    +  pos <- table(truth_table)["FALSE"]
    +  names(pos) <- "bool entropy"
    +  p <- pos/length(truth_table) 
    +  return(- p * log2(p) - (1-p) * log2(1-p))
    +}
    + + + + + + +
    # calculates information gain of splitting by given attribute
    +importance <- function(atr, examples){
    +  val1 = examples[examples[atr] == TRUE, ]
    +  val2 = examples[examples[atr] == FALSE, ]
    +  s_true <- booleanEntropy(val1[,"Ans"])
    +  s_false <- booleanEntropy(val2[, "Ans"])
    +  print(paste("Entropies:", s_true, s_false))
    +  R <- (s_false*length(val1[, "Ans"]) + 
    +          s_true*length(val2[, "Ans"]))/(length(examples[, atr]))
    +  names(R) <- paste("Gain on", atr)
    +  return(-R + booleanEntropy(examples[,"Ans"])) # strange ordering to preserve name
    +}
    +importance("Ans", ts)
    + + +
    [1] "Entropies: 0 0"
    +Gain on Ans 
    +  0.9992612 
    + + + +

    Decision tree learning function:

    + + + +
    decisionTreeLearning <- function(examples, attributes, parent_examples){
    +  if (length(examples[,"Ans"]) == 0)
    +    return(getmode(parent_examples))
    +    # return most probable answer as there is no training data left
    +  else if( length(attributes) == 0)
    +    return(getmode(examples))
    +  else if (length(table(examples["Ans"]))) < 2):
    + + +
    Error: unexpected '<' in:
    +"    return(getmode(examples))
    +  else if (length(table(examples["Ans"]))) <"
    +In addition: Warning message:
    +In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
    +  EOF within quoted string
    + + + +

    Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

    +

    When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

    +

    The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

    + + +
    LS0tCnRpdGxlOiAiQ2hpXjIgcHJ1bm5pbmciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KRGF0YSBnZW5lcmF0aW9uOgpgYGB7cn0Kc2FtcGxlcyA9IDIwMDAKYTEgPSBydW5pZihzYW1wbGVzLCAwLCAxKSA8IDAuNTsKYTIgPSBydW5pZihzYW1wbGVzLCAwLCAxKSA8IDAuNTsKYW5zID0geG9yKGExLCBhMik7CnRzID0gZGF0YS5mcmFtZShhMSwgYTIsIGFucyk7CmNvbG5hbWVzKHRzKSA8LSBjKCJBMSIsICJBMiIsICJBbnMiKTsKdHMKYGBgClNvbWUgaGVscGVyIGZ1bmN0aW9uczoKYGBge3J9CiMgcmV0dXJuIHRoZSBtb3N0IGxpa2VseSBhbnN3ZXIgd2hlbiBubyBmdXJ0aGVyIGV2aWRlbmNlIGlzIGF2YWlhbGFibGUKZ2V0bW9kZSA8LSBmdW5jdGlvbih2KSB7CiAgIGxlbmd0aCh2WyJBbnMiXSA9PSBUUlVFKSA+IGxlbmd0aCh2WyJBbnMiXSkvMgp9CmBgYAoKYGBge3J9CiMgZ2l2ZXMgZW50cm9weSBjb250YWluZWQgaW4gYSBsaXN0IG9mIGJvb2xlYW4gdmFsdWVzCmJvb2xlYW5FbnRyb3B5IDwtIGZ1bmN0aW9uKHRydXRoX3RhYmxlKXsKICB0YWIgPSB0YWJsZSh0cnV0aF90YWJsZSk7CiAgaWYoISAiVFJVRSIgJWluJSBuYW1lcyh0YWIpIHx8ICEgIkZBTFNFIiAlaW4lIG5hbWVzKHRhYikpCiAgICByZXR1cm4oMCkKICBwb3MgPC0gdGFibGUodHJ1dGhfdGFibGUpWyJGQUxTRSJdCiAgbmFtZXMocG9zKSA8LSAiYm9vbCBlbnRyb3B5IgogIHAgPC0gcG9zL2xlbmd0aCh0cnV0aF90YWJsZSkgCiAgcmV0dXJuKC0gcCAqIGxvZzIocCkgLSAoMS1wKSAqIGxvZzIoMS1wKSkKfQpgYGAKCmBgYHtyfQojIGNhbGN1bGF0ZXMgaW5mb3JtYXRpb24gZ2FpbiBvZiBzcGxpdHRpbmcgYnkgZ2l2ZW4gYXR0cmlidXRlCmltcG9ydGFuY2UgPC0gZnVuY3Rpb24oYXRyLCBleGFtcGxlcyl7CiAgdmFsMSA9IGV4YW1wbGVzW2V4YW1wbGVzW2F0cl0gPT0gVFJVRSwgXQogIHZhbDIgPSBleGFtcGxlc1tleGFtcGxlc1thdHJdID09IEZBTFNFLCBdCiAgc190cnVlIDwtIGJvb2xlYW5FbnRyb3B5KHZhbDFbLCJBbnMiXSkKICBzX2ZhbHNlIDwtIGJvb2xlYW5FbnRyb3B5KHZhbDJbLCAiQW5zIl0pCiAgcHJpbnQocGFzdGUoIkVudHJvcGllczoiLCBzX3RydWUsIHNfZmFsc2UpKQogIFIgPC0gKHNfZmFsc2UqbGVuZ3RoKHZhbDFbLCAiQW5zIl0pICsgCiAgICAgICAgICBzX3RydWUqbGVuZ3RoKHZhbDJbLCAiQW5zIl0pKS8obGVuZ3RoKGV4YW1wbGVzWywgYXRyXSkpCiAgbmFtZXMoUikgPC0gcGFzdGUoIkdhaW4gb24iLCBhdHIpCiAgcmV0dXJuKC1SICsgYm9vbGVhbkVudHJvcHkoZXhhbXBsZXNbLCJBbnMiXSkpICMgc3RyYW5nZSBvcmRlcmluZyB0byBwcmVzZXJ2ZSBuYW1lCn0KaW1wb3J0YW5jZSgiQW5zIiwgdHMpCmBgYAoKCkRlY2lzaW9uIHRyZWUgbGVhcm5pbmcgZnVuY3Rpb246CmBgYHtyfQpkZWNpc2lvblRyZWVMZWFybmluZyA8LSBmdW5jdGlvbihleGFtcGxlcywgYXR0cmlidXRlcywgcGFyZW50X2V4YW1wbGVzKXsKICBpZiAobGVuZ3RoKGV4YW1wbGVzWywiQW5zIl0pID09IDApCiAgICByZXR1cm4oZ2V0bW9kZShwYXJlbnRfZXhhbXBsZXMpKQogICAgIyByZXR1cm4gbW9zdCBwcm9iYWJsZSBhbnN3ZXIgYXMgdGhlcmUgaXMgbm8gdHJhaW5pbmcgZGF0YSBsZWZ0CiAgZWxzZSBpZiggbGVuZ3RoKGF0dHJpYnV0ZXMpID09IDApCiAgICByZXR1cm4oZ2V0bW9kZShleGFtcGxlcykpCiAgZWxzZSBpZiAobGVuZ3RoKHRhYmxlKGV4YW1wbGVzWyJBbnMiXSkpKSA8IDIpOgogICAgcmV0dXJuKGV4YW1wbGVzWyJBbnMiLCAxXSkKICAKICBBID0gbWF4KGF0dHJpYnV0ZXMsIGtleShhKT1pbXBvcnRhbmNlKGEsIGV4YW1wbGVzKSkKICAjIGNob29zZSB0aGUgbW9zdCBwcm9taXNzaW5nIGF0dHJpYnV0ZSB0byBjb25kaXRpb24gb24KICB0cmVlID0gbmV3IFRyZWUocm9vdD1BKQogIGZvciggdmFsdWUgaW4gQS52YWx1ZXMoKSl7CiAgICBleHMgPSBleGFtcGxlc1tlLkEgPT0gdmFsdWVdCiAgICBzdWJ0cmVlID0gZGVjaXNpb25UcmVlTGVhcm5pbmcoZXhzLCBhdHRyaWJ1dGVzLnJlbW92ZShBKSwgZXhhbXBsZXMpCiAgICAjIG5vdGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHByb2JhYmx5IHdyYXAgdGhlIHRyaXZpYWwgY2FzZSByZXR1cm5zIGludG8gdHJlZXMgZm9yIGNvbnNpc3RlbmN5CiAgICB0cmVlLmFkZFN1YnRyZWVBc0JyYW5jaChzdWJ0cmVlLCBsYWJlbD0oQSwgdmFsdWUpCiAgfQogIAogIHJldHVybih0cmVlKQp9CmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCg==
    + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    path <- "~/Code/Henkel/Learning/aima-python/R/BigMartSales/"
    +setwd(path)
    + + + + + +

    Load datafiles downloaded from https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/

    + + + +
    train <- read.csv(file = "./Train_UWu5bXk.csv")
    +test <- read.csv(file = "./Test_u94Q5KV.csv")
    + + + + + + +
    str(train)
    +cat('\n\n Summary: \n')
    +summary(train)
    + + + + +
    table(is.na(train))
    +colSums(is.na(train))
    + + + + +
    library(ggplot2)
    +ggplot(train, aes(x= Item_Weight, y = Item_Visibility)) + geom_point(size = 2.5, color="navy") + ylab("Item Visibility") + xlab("Item Weight") + ggtitle("Item Visibility vs Item Outlet Sales")
    + + + + + + +
    test$Item_Outlet_Sales <- mean(train$Item_Outlet_Sales)
    +dim(test)
    +combi <- rbind(train, test)
    +combi$Item_Weight[is.na(combi$Item_Weight)] <- median(combi$Item_Weight, na.rm = TRUE)
    +table(is.na(combi))
    + + + + + + +
    combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0, median(combi$Item_Visibility), combi$Item_Visibility)
    + + + + +
    levels(combi$Item_Fat_Content)
    +library(plyr)
    +combi$Item_Fat_Content <- revalue(combi$Item_Fat_Content, c("LF"="Low Fat", "low fat"="Low Fat", "reg"="Regular"))
    + + + + + + +
    levels(combi$Outlet_Size)
    + + + + + + +
    summary(combi)
    +
    + + +
     Item_Identifier  Item_Weight     Item_Fat_Content Item_Visibility                    Item_Type       Item_MRP     
    + DRA24  :   10   Min.   : 4.555   Low Fat:9185     Min.   :0.003575   Fruits and Vegetables:2013   Min.   : 31.29  
    + DRA59  :   10   1st Qu.: 9.300   Regular:5019     1st Qu.:0.033143   Snack Foods          :1989   1st Qu.: 94.01  
    + DRB25  :   10   Median :12.600                    Median :0.054023   Household            :1548   Median :142.25  
    + DRC25  :   10   Mean   :12.760                    Mean   :0.069296   Frozen Foods         :1426   Mean   :141.00  
    + DRC27  :   10   3rd Qu.:16.000                    3rd Qu.:0.094037   Dairy                :1136   3rd Qu.:185.86  
    + DRC36  :   10   Max.   :21.350                    Max.   :0.328391   Baking Goods         :1086   Max.   :266.89  
    + (Other):14144                                                        (Other)              :5006                   
    + Outlet_Identifier Outlet_Establishment_Year Outlet_Size   Outlet_Location_Type            Outlet_Type   Item_Outlet_Sales 
    + OUT027 :1559      Min.   :1985              Other :4016   Tier 1:3980          Grocery Store    :1805   Min.   :   33.29  
    + OUT013 :1553      1st Qu.:1987              High  :1553   Tier 2:4641          Supermarket Type1:9294   1st Qu.: 1468.09  
    + OUT035 :1550      Median :1999              Medium:4655   Tier 3:5583          Supermarket Type2:1546   Median : 2181.29  
    + OUT046 :1550      Mean   :1998              Small :3980                        Supermarket Type3:1559   Mean   : 2181.29  
    + OUT049 :1550      3rd Qu.:2004                                                                          3rd Qu.: 2181.29  
    + OUT045 :1548      Max.   :2009                                                                          Max.   :13086.97  
    + (Other):4894                                                                                                              
    + + + + + + +
    ?group_by
    +
    + + +
    No documentation for ‘group_by’ in specified packages and libraries:
    +you could try ‘??group_by’
    + + + + + +
    LS0tCnRpdGxlOiAiaHR0cHM6Ly93d3cuYW5hbHl0aWNzdmlkaHlhLmNvbS9ibG9nLzIwMTYvMDIvY29tcGxldGUtdHV0b3JpYWwtbGVhcm4tZGF0YS1zY2llbmNlLXNjcmF0Y2gvI29uZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnBhdGggPC0gIn4vQ29kZS9IZW5rZWwvTGVhcm5pbmcvYWltYS1weXRob24vUi9CaWdNYXJ0U2FsZXMvIgpzZXR3ZChwYXRoKQpgYGAKYGBge3J9CgpgYGAKTG9hZCBkYXRhZmlsZXMgZG93bmxvYWRlZCBmcm9tIGh0dHBzOi8vZGF0YWhhY2suYW5hbHl0aWNzdmlkaHlhLmNvbS9jb250ZXN0L3ByYWN0aWNlLXByb2JsZW0tYmlnLW1hcnQtc2FsZXMtaWlpLwpgYGB7cn0KdHJhaW4gPC0gcmVhZC5jc3YoZmlsZSA9ICIuL1RyYWluX1VXdTViWGsuY3N2IikKdGVzdCA8LSByZWFkLmNzdihmaWxlID0gIi4vVGVzdF91OTRRNUtWLmNzdiIpCmBgYAoKYGBge3J9CnN0cih0cmFpbikKY2F0KCdcblxuIFN1bW1hcnk6IFxuJykKc3VtbWFyeSh0cmFpbikKYGBgCmBgYHtyfQp0YWJsZShpcy5uYSh0cmFpbikpCmNvbFN1bXMoaXMubmEodHJhaW4pKQpgYGAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHRyYWluLCBhZXMoeD0gSXRlbV9XZWlnaHQsIHkgPSBJdGVtX1Zpc2liaWxpdHkpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDIuNSwgY29sb3I9Im5hdnkiKSArIHlsYWIoIkl0ZW0gVmlzaWJpbGl0eSIpICsgeGxhYigiSXRlbSBXZWlnaHQiKSArIGdndGl0bGUoIkl0ZW0gVmlzaWJpbGl0eSB2cyBJdGVtIE91dGxldCBTYWxlcyIpCmBgYAoKYGBge3J9CnRlc3QkSXRlbV9PdXRsZXRfU2FsZXMgPC0gbWVhbih0cmFpbiRJdGVtX091dGxldF9TYWxlcykKZGltKHRlc3QpCmNvbWJpIDwtIHJiaW5kKHRyYWluLCB0ZXN0KQpjb21iaSRJdGVtX1dlaWdodFtpcy5uYShjb21iaSRJdGVtX1dlaWdodCldIDwtIG1lZGlhbihjb21iaSRJdGVtX1dlaWdodCwgbmEucm0gPSBUUlVFKQp0YWJsZShpcy5uYShjb21iaSkpCmBgYAoKYGBge3J9CmNvbWJpJEl0ZW1fVmlzaWJpbGl0eSA8LSBpZmVsc2UoY29tYmkkSXRlbV9WaXNpYmlsaXR5ID09IDAsIG1lZGlhbihjb21iaSRJdGVtX1Zpc2liaWxpdHkpLCBjb21iaSRJdGVtX1Zpc2liaWxpdHkpCmBgYApgYGB7cn0KbGV2ZWxzKGNvbWJpJEl0ZW1fRmF0X0NvbnRlbnQpCmxpYnJhcnkocGx5cikKY29tYmkkSXRlbV9GYXRfQ29udGVudCA8LSByZXZhbHVlKGNvbWJpJEl0ZW1fRmF0X0NvbnRlbnQsIGMoIkxGIj0iTG93IEZhdCIsICJsb3cgZmF0Ij0iTG93IEZhdCIsICJyZWciPSJSZWd1bGFyIikpCmBgYAoKYGBge3J9CmxldmVscyhjb21iaSRPdXRsZXRfU2l6ZSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShjb21iaSkKYGBgCgpgYGB7cn0KP2dyb3VwX2J5CmBgYAoK
    + + + +

    B& z8c6i?5CnF|TCO$_i?nY2WOEZD?A2J|O!k$&!m-B|V?Tiq3Fab|4brje-r%zym%ygY zX#)O_(4ca$Rm(KmzL2_1yOh8{cGA58CJ%2DSsu9m=#2790p?{|OeOXdw{%glW zrEj5sMmx?L(Uwt{G5QU6ft|tLe0fLYbH9VQMod^B9A0&^3G7wKmKx&VQ^#w}U1Vvo z+TTtmIX`gm2b;CRh5rljSRG6F;sf)0Ht-FTlrehn%&+?hp>KsoMPY!6^nc8c!nC z`!lfSL%0gKM+vwMe>X63Flgu=s+kuv16U_RPSCle1oX(WGc(oBT)%b=afKsd;(4(=4Lvi4qKReHMw|`2Xyj z|L_6L5CIOqE}xyZYb8(#aFgUg;D!R3n7W@&pZ&^GpHtxU;mzjrw?HiphM$UO#6gS5 zf!hgc67*A-8QfnVzdzyAlatR@`~k&d?f1LpJ6W4`EFk^t@<(sBkX`Yb>PFI3c4d{HEiNGmxQx{NG5Wpb>q8?}-0#(tY g6vaWXRN+Vcq0f8km}2_5fg#G^>FVdQ&MBb@0IfO>4*&oF diff --git a/images/pluralityLearner_plot.png b/images/pluralityLearner_plot.png deleted file mode 100644 index 50aa5dcd14c138e342d8cdca63d70b1ada73b9c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12658 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 P1V~j$^J$r))$9KPCJ%a| diff --git a/images/point_crossover.png b/images/point_crossover.png deleted file mode 100644 index 9b8d4f7f585e319750684e76f5652c089b3d316e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5655 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 IRqWpUA9haQZvX%Q diff --git a/images/restaurant.png b/images/restaurant.png deleted file mode 100644 index 195c67645ac8cc5c4346487cf87dbe9920a15d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175445 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