master-thesis/EvolutionaryAlgorithm/EvolutionaryAlgorithm.ipynb

3578 lines
190 KiB
Plaintext
Raw Normal View History

2019-11-08 10:47:58 +01:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evolutionary Algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"the Evolutionary Algorithm that is supposed to create new recipes based on the Recipe Matrices that are created during the *Recipe Analysis* step.\n",
"\n",
"The Population of the Evolutional Algorithm consists of a set of recipe trees. Each Recipe Tree consists of several Nodes where each node is of one of the following Types:\n",
"\n",
"* **Ingredient Node:**\n",
" these are the leaf nodes. Containing an ingredient. The score is determined by the actions, that are applied if you follow up the path. At the Moment it measures how many duplicate actions are applied.\n",
"* **Action Node:**\n",
" An Action that is applied on it's child and this child's subtree. Score indicates the average likelihood that this action is applied on the ingredients inside the subtree\n",
"* **Mix Node:**\n",
" Mixing ingredients together. This is also the only Node that can have more than one child. The score is the average of all pairwise likelihoods that two ingredients are mixed togethter"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append(\"../\")\n",
"sys.path.append(\"../RecipeAnalysis/\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
2019-12-01 14:04:07 +01:00
"text/html": [
" <script type=\"text/javascript\">\n",
" window.PlotlyConfig = {MathJaxConfig: 'local'};\n",
" if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n",
" if (typeof require !== 'undefined') {\n",
" require.undef(\"plotly\");\n",
" requirejs.config({\n",
" paths: {\n",
" 'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n",
" }\n",
" });\n",
" require(['plotly'], function(Plotly) {\n",
" window._Plotly = Plotly;\n",
" });\n",
" }\n",
" </script>\n",
" "
]
2019-11-08 10:47:58 +01:00
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2019-12-01 14:04:07 +01:00
"text/html": [
" <script type=\"text/javascript\">\n",
" window.PlotlyConfig = {MathJaxConfig: 'local'};\n",
" if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n",
" if (typeof require !== 'undefined') {\n",
" require.undef(\"plotly\");\n",
" requirejs.config({\n",
" paths: {\n",
" 'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n",
" }\n",
" });\n",
" require(['plotly'], function(Plotly) {\n",
" window._Plotly = Plotly;\n",
" });\n",
" }\n",
" </script>\n",
" "
]
2019-11-08 10:47:58 +01:00
},
"metadata": {},
"output_type": "display_data"
2019-12-01 14:04:07 +01:00
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jonas/.local/lib/python3.7/site-packages/ipykernel_launcher.py:39: TqdmExperimentalWarning:\n",
2019-12-01 14:04:07 +01:00
"\n",
"Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
"\n"
]
2019-11-08 10:47:58 +01:00
}
],
"source": [
"import settings\n",
"\n",
"import pycrfsuite\n",
"\n",
"import json\n",
"\n",
"import db.db_settings as db_settings\n",
"from db.database_connection import DatabaseConnection\n",
"\n",
"from Tagging.conllu_generator import ConlluGenerator\n",
"from Tagging.crf_data_generator import *\n",
"\n",
"from RecipeAnalysis.Recipe import Ingredient\n",
"\n",
"import ea_tools\n",
"\n",
"from difflib import SequenceMatcher\n",
"\n",
"import numpy as np\n",
"\n",
"import ActionGroups as AG\n",
"\n",
2019-11-08 10:47:58 +01:00
"import plotly.graph_objs as go\n",
"from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n",
"from plotly.subplots import make_subplots\n",
"init_notebook_mode(connected=True)\n",
"\n",
"from graphviz import Digraph\n",
"\n",
"import itertools\n",
"\n",
"import random\n",
"\n",
"import plotly.io as pio\n",
"pio.renderers.default = \"jupyterlab\"\n",
"\n",
"from IPython.display import Markdown, HTML, display\n",
"\n",
2019-12-01 14:04:07 +01:00
"from tqdm.autonotebook import tqdm\n",
"\n",
2019-11-08 10:47:58 +01:00
"from copy import deepcopy"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def gaussian(x, mu, sig):\n",
" return 1./(np.sqrt(2.*np.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## load adjacency matrices"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import dill\n",
"m_act = dill.load(open(\"../RecipeAnalysis/m_act.dill\", \"rb\"))\n",
"m_mix = dill.load(open(\"../RecipeAnalysis/m_mix.dill\", \"rb\"))\n",
"m_base_act = dill.load(open(\"../RecipeAnalysis/m_base_act.dill\", \"rb\"))\n",
"m_base_mix = dill.load(open(\"../RecipeAnalysis/m_base_mix.dill\", \"rb\"))\n",
"\n",
2019-12-01 14:04:07 +01:00
"\n",
"m_grouped_mix = dill.load(open(\"../RecipeAnalysis/m_grouped_mix_raw.dill\", \"rb\"))\n",
"m_grouped_act = dill.load(open(\"../RecipeAnalysis/m_grouped_act_raw.dill\", \"rb\"))\n",
2019-12-01 14:04:07 +01:00
"m_grouped_base_act = dill.load(open(\"../RecipeAnalysis/m_grouped_base_act_raw.dill\", \"rb\"))\n",
"\n",
"\n",
2019-11-08 10:47:58 +01:00
"#m_act.apply_threshold(3)\n",
"#m_mix.apply_threshold(3)\n",
"#m_base_act.apply_threshold(5)\n",
"#m_base_mix.apply_threshold(5)\n",
"\n",
"\n",
"#c_act = m_act.get_csr()\n",
"#c_mix = m_mix.get_csr()\n",
"#c_base_act = m_base_act.get_csr()\n",
"#c_base_mix = m_base_mix.get_csr()\n",
"\n",
2019-12-01 14:04:07 +01:00
"m_act.compile()\n",
"m_mix.compile()\n",
"m_base_act.compile()\n",
"m_base_mix.compile()\n",
"\n",
"m_grouped_mix.compile()\n",
"m_grouped_act.compile()\n",
"m_grouped_base_act.compile()\n",
"\n",
2019-11-08 10:47:58 +01:00
"c_act = m_act._csr\n",
"c_mix = m_mix._csr\n",
"c_base_act = m_base_act._csr\n",
"c_base_mix = m_base_mix._csr\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"actions = m_act.get_labels()[0]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"base_ingredients = m_base_mix.get_labels()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"sym_label_buffer = {}\n",
"fw_label_buffer = {}\n",
"bw_label_buffer = {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### helper functions for adjacency matrices"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def get_sym_adjacent(key, m, c):\n",
" index = m._label_index[key]\n",
" i1 = c[index,:].nonzero()[1]\n",
" i2 = c[:,index].nonzero()[0]\n",
" \n",
" i = np.concatenate((i1,i2))\n",
" \n",
" if m in sym_label_buffer:\n",
" names = sym_label_buffer[m][i]\n",
" else:\n",
" names = np.array(m.get_labels())\n",
" sym_label_buffer[m] = names\n",
" names = names[i]\n",
" \n",
" counts = np.concatenate((c[index, i1].toarray().flatten(), c[i2, index].toarray().flatten()))\n",
" \n",
" s = np.argsort(-counts)\n",
" \n",
" return names[s], counts[s]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def get_forward_adjacent(key, m, c):\n",
" index = m._x_label_index[key]\n",
" i = c[index,:].nonzero()[1]\n",
" \n",
" if m in fw_label_buffer:\n",
" names = fw_label_buffer[m][i]\n",
" else:\n",
" names = np.array(m._y_labels)\n",
" fw_label_buffer[m] = names\n",
" names = names[i]\n",
" \n",
" \n",
" counts = c[index, i].toarray().flatten()\n",
" \n",
" s = np.argsort(-counts)\n",
" \n",
" return names[s], counts[s]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def get_backward_adjacent(key, m, c):\n",
" index = m._y_label_index[key]\n",
" i = c[:,index].nonzero()[0]\n",
" \n",
" if m in bw_label_buffer:\n",
" names = bw_label_buffer[m][i]\n",
" else:\n",
" names = np.array(m._x_labels)\n",
" bw_label_buffer[m] = names\n",
" names = names[i]\n",
" \n",
" \n",
" counts = c[i, index].toarray().flatten()\n",
" \n",
" s = np.argsort(-counts)\n",
" \n",
" return names[s], counts[s]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def sym_sum(key, m, c):\n",
" return np.sum(get_sym_adjacent(key,m,c)[1])\n",
"\n",
"def fw_sum(key, m, c):\n",
" return np.sum(get_forward_adjacent(key,m,c)[1])\n",
"\n",
"def bw_sum(key, m, c):\n",
" return np.sum(get_backward_adjacent(key,m,c)[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### different score functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### normalizations"
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 12,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"def fw_normalization_factor(key, m, c, quotient_func):\n",
" ia = m._x_label_index[key]\n",
" \n",
" occurances = c[ia,:].nonzero()[1]\n",
" \n",
" return 1. / quotient_func(c[ia,occurances].toarray())\n",
"\n",
"def bw_normalization_factor(key, m, c, quotient_func):\n",
" ib = m._y_label_index[key]\n",
" \n",
" occurances = c[:,ib].nonzero()[0]\n",
" \n",
" return 1. / quotient_func(c[occurances,ib].toarray())\n",
"\n",
"def sym_normalization_factor(key, m, c, quotient_func):\n",
" ii = m._label_index[key]\n",
" \n",
" fw_occurances = c[ii,:].nonzero()[1]\n",
" bw_occurances = c[:,ii].nonzero()[0]\n",
" \n",
" return 1. / quotient_func(np.concatenate(\n",
" [c[ii,fw_occurances].toarray().flatten(),\n",
" c[bw_occurances,ii].toarray().flatten()]\n",
" ))"
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 13,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"def sym_p_a_given_b(key_a, key_b, m, c, quot_func = np.max):\n",
" ia = m._label_index[key_a]\n",
" ib = m._label_index[key_b]\n",
" \n",
" v = c[ia,ib] + c[ib,ia]\n",
" \n",
" return v * sym_normalization_factor(key_b, m, c, quot_func)\n",
"\n",
"def fw_p_a_given_b(key_a, key_b, m, c, quot_func = np.max):\n",
" ia = m._x_label_index[key_a]\n",
" ib = m._y_label_index[key_b]\n",
" \n",
" v = c[ia,ib]\n",
" \n",
" return v * bw_normalization_factor(key_b, m, c, quot_func)\n",
"\n",
"def bw_p_a_given_b(key_a, key_b, m, c, quot_func = np.max):\n",
" ia = m._y_label_index[key_a]\n",
" ib = m._x_label_index[key_b]\n",
" \n",
" v = c[ib,ia]\n",
" \n",
" return v * fw_normalization_factor(key_b, m, c, quot_func)\n"
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 14,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"def sym_score(key_a, key_b, m, c):\n",
"\n",
" ia = m._label_index[key_a]\n",
" ib = m._label_index[key_b]\n",
" \n",
" v = c[ia,ib] + c[ib,ia]\n",
" \n",
" if v == 0:\n",
" return 0\n",
" \n",
" return max((v/sym_sum(key_a, m, c)), (v/sym_sum(key_b, m, c)))\n",
"\n",
"def asym_score(key_a, key_b, m, c):\n",
" ia = m._x_label_index[key_a]\n",
" ib = m._y_label_index[key_b]\n",
" \n",
" v = c[ia,ib]\n",
" \n",
" if v == 0:\n",
" return 0\n",
" \n",
" return max(v/fw_sum(key_a, m, c), v/bw_sum(key_b, m, c))"
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 15,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"def p_ingredient_unprepared(base_ing):\n",
" ing = Ingredient(base_ing)\n",
" base_sum = sym_sum(base_ing, m_base_mix, c_base_mix)\n",
" specialized_sum = sym_sum(ing.to_json(), m_mix, c_mix)\n",
" return specialized_sum / base_sum"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**new probability for preprocess ingredients:**"
]
},
2019-11-08 10:47:58 +01:00
{
"cell_type": "code",
"execution_count": 16,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"def prepare_ratio(ing:str):\n",
" keys, values = m_grouped_act.get_backward_adjacent(Ingredient(ing).to_json())\n",
" action_dict = dict(zip(keys,values))\n",
" return action_dict['prepare'] / action_dict['heat']\n",
"\n",
"def random_prepare(ing:str):\n",
" \"\"\"\n",
" returns randomly a boolean value if ing should be prepared, w.r.t. the prepare_ration function\n",
" \"\"\"\n",
" \n",
" return prepare_ratio(ing) > np.random.normal(0.35,0.1)\n",
"\n",
"def random_heated(ingredient:str):\n",
" action_set, action_weights = m_grouped_base_act.get_backward_adjacent(ingredient)\n",
" d = dict(zip(action_set, action_weights))\n",
" ratio = 1 - d['prepare'] / d['heat']\n",
" \n",
" return ratio > np.random.normal(0.65,0.15)\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def relative_action_rank(ingredient:str, action:str):\n",
" action_set, action_weights = m_base_act.get_backward_adjacent(ingredient)\n",
" if action not in action_set or len(action_set) <= 1:\n",
" return 0\n",
" return 1 - action_set.tolist().index(action) / (len(action_set) - 1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"def filter_set_by_group(act_set, act_w, group):\n",
" new_act_set = []\n",
" new_act_w = []\n",
" for i in range(len(act_set)):\n",
" if act_set[i] in AG.inverse_groups[group]:\n",
" new_act_set.append(act_set[i])\n",
" new_act_w.append(act_w[i])\n",
" return np.array(new_act_set), np.array(new_act_w)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## better normalized scores:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"def normalized_score(key, matrix):\n",
" sum_key = matrix.get_sum(key)\n",
" keys, values = matrix.get_adjacent(key)\n",
" normalized_values = np.array([(values[i] / matrix.get_sum(keys[i])) * (values[i] / sum_key) for i in range(len(keys))])\n",
" sort = np.argsort(-normalized_values)\n",
" return keys[sort], normalized_values[sort]\n",
"\n",
"def forward_normalized_score(key, matrix):\n",
" sum_key = matrix.get_fw_sum(key)\n",
" keys, values = matrix.get_forward_adjacent(key)\n",
" normalized_values = np.array([(values[i] / matrix.get_bw_sum(keys[i])) * (values[i] / sum_key) for i in range(len(keys))])\n",
" sort = np.argsort(-normalized_values)\n",
" return keys[sort], normalized_values[sort]\n",
"\n",
"def backward_normalized_score(key, matrix):\n",
" sum_key = matrix.get_bw_sum(key)\n",
" keys, values = matrix.get_backward_adjacent(key)\n",
" normalized_values = np.array([(values[i] / matrix.get_fw_sum(keys[i])) * (values[i] / sum_key) for i in range(len(keys))])\n",
" sort = np.argsort(-normalized_values)\n",
" return keys[sort], normalized_values[sort]"
2019-11-08 10:47:58 +01:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Recipe Tree\n",
"### Tree Node Base Class"
]
},
{
"cell_type": "code",
"execution_count": 20,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class RecipeTreeNode(object):\n",
" \n",
" id = 0\n",
" \n",
" def __init__(self, name, constant=False, single_child=False):\n",
" self._constant = constant\n",
" self._name = name\n",
" self._parent = None\n",
" \n",
" self._id = str(RecipeTreeNode.id)\n",
" RecipeTreeNode.id += 1\n",
" \n",
" self._single_child = single_child\n",
" \n",
" if self._single_child:\n",
" self._child = None\n",
" \n",
" def child():\n",
" return self._child\n",
" \n",
" def remove_child(c):\n",
" assert c == self._child\n",
" self._child._parent = None\n",
" self._child = None\n",
" \n",
" def childs():\n",
" c = self.child()\n",
" if c is None:\n",
" return set()\n",
" return set([c])\n",
" \n",
" def add_child(n):\n",
" self._child = n\n",
" n._parent = self\n",
" \n",
" self.child = child\n",
" self.childs = childs\n",
" self.add_child = add_child\n",
" self.remove_child = remove_child\n",
" else:\n",
" self._childs = set()\n",
" \n",
" def childs():\n",
" return self._childs\n",
" \n",
" def add_child(n):\n",
" self._childs.add(n)\n",
" n._parent = self\n",
" \n",
" def remove_child(c):\n",
" assert c in self._childs\n",
" c._parent = None\n",
" self._childs.remove(c)\n",
" \n",
" self.childs = childs\n",
" self.add_child = add_child\n",
" self.remove_child = remove_child\n",
" \n",
" def parent(self):\n",
" return self._parent\n",
" \n",
2019-12-01 14:04:07 +01:00
" def root(self):\n",
" if self._parent is None:\n",
" return self\n",
" return self._parent.root()\n",
" \n",
2019-11-08 10:47:58 +01:00
" def name(self):\n",
" return self._name\n",
" \n",
" def traverse(self):\n",
" l = []\n",
" \n",
" for c in self.childs():\n",
" l += c.traverse()\n",
" \n",
" return [self] + l\n",
" \n",
" def traverse_ingredients(self):\n",
" ingredient_set = []\n",
" for c in self.childs():\n",
" ingredient_set += c.traverse_ingredients()\n",
" \n",
" return ingredient_set\n",
" \n",
" def remove(self):\n",
" p = self.parent()\n",
" childs = self.childs().copy()\n",
" \n",
" assert p is None or not (len(childs) > 1 and p._single_child)\n",
" \n",
" for c in childs:\n",
" self.remove_child(c)\n",
" \n",
" if p is not None:\n",
" p.remove_child(self)\n",
" \n",
" if self._single_child and self._child is not None and p._name == self._child._name:\n",
" # two adjacent nodes with same name would remain after deletion.\n",
" # merge them! (by adding the child's childs to our parent instead of our childs)\n",
" childs = self._child.childs()\n",
" self._child.remove()\n",
" \n",
" \n",
" for c in childs:\n",
" p.add_child(c)\n",
" \n",
" def insert_before(self, n):\n",
" p = self._parent\n",
" if p is not None:\n",
" p.remove_child(self)\n",
" p.add_child(n)\n",
" n.add_child(self)\n",
" \n",
" def mutate(self):\n",
" n_node = self.n_node_mutate_options()\n",
" n_edge = self.n_edge_mutate_options()\n",
" \n",
" choice = random.choice(range(n_node + n_edge))\n",
" if choice < n_node:\n",
" self.mutate_node()\n",
" else:\n",
" self.mutate_edges()\n",
" \n",
" def mutate_edges(self):\n",
" ings = self.traverse_ingredients()\n",
" ing = random.choice(ings)\n",
" \n",
" a, w = get_backward_adjacent(ing._base_ingredient, m_base_act, c_base_act)\n",
" \n",
" action = random.choices(a, w)[0]\n",
" self.insert_before(ActionNode(action))\n",
" \n",
" def mutate_node(self):\n",
" raise NotImplementedError\n",
" \n",
" def n_node_mutate_options(self):\n",
" \n",
" return 0 if self._constant else 1\n",
" \n",
" def n_edge_mutate_options(self):\n",
" n = 1 if self._parent is not None else 0\n",
" return n\n",
" \n",
" def n_mutate_options(self):\n",
" return self.n_edge_mutate_options() + self.n_node_mutate_options()\n",
" \n",
" def dot_node(self, dot):\n",
" raise NotImplementedError()\n",
" \n",
" def dot(self, d=None):\n",
" if d is None:\n",
" d = Digraph()\n",
" self.dot_node(d)\n",
" \n",
" else:\n",
" self.dot_node(d)\n",
" if self._parent is not None:\n",
" d.edge(self._parent._id, self._id)\n",
" \n",
" \n",
" for c in self.childs():\n",
" c.dot(d)\n",
" \n",
" return d\n",
" \n",
" def serialize(self):\n",
" r = {}\n",
" r['type'] = str(self.__class__.__name__)\n",
" r['id'] = self._id\n",
" r['parent'] = self._parent._id if self._parent is not None else None\n",
" r['name'] = self._name\n",
" r['childs'] = [c._id for c in self.childs()]\n",
" r['constant'] = self._constant\n",
" r['single_child'] = self._single_child\n",
" \n",
" return r\n",
" \n",
" def node_score(self):\n",
" raise NotImplementedError()\n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Mix Node"
]
},
2019-12-01 14:04:07 +01:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the Node Score: just make a simple lookup whether this combination is seen or not. So the node Score is defined as:\n"
]
},
2019-11-08 10:47:58 +01:00
{
"cell_type": "code",
"execution_count": 21,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class MixNode(RecipeTreeNode):\n",
" def __init__(self, constant=False):\n",
" super().__init__(\"mix\", constant, single_child=False)\n",
" \n",
" def dot_node(self, dot):\n",
" dot.node(self._id, label=f\"< <B>{self._name}</B><BR/>node score: {self.node_score():.4f}>\", shape=\"diamond\", style=\"filled\", color=\"#d5e8d4\")\n",
" \n",
" def split(self, set_above, set_below, node_between):\n",
" assert len(set_above.difference(self.childs())) == 0\n",
" assert len(set_below.difference(self.childs())) == 0\n",
" \n",
" n_above = MixNode()\n",
" n_below = MixNode()\n",
" \n",
" p = self.parent()\n",
" \n",
" for c in self.childs().copy():\n",
" self.remove_child(c)\n",
" self.remove()\n",
" \n",
" for c in set_below:\n",
" n_below.add_child(c)\n",
" \n",
" for c in set_above:\n",
" n_above.add_child(c)\n",
" \n",
" n_above.add_child(node_between)\n",
" node_between.add_child(n_below)\n",
" \n",
" if p is not None:\n",
" p.add_child(n_above)\n",
" \n",
" # test whether the mix nodes are useless\n",
" if len(n_above.childs()) == 1:\n",
" n_above.remove()\n",
" \n",
" if len(n_below.childs()) == 1:\n",
" n_below.remove()\n",
" \n",
" def n_node_mutate_options(self):\n",
" return 0 if self._constant or len(self.childs()) <= 2 else len(self.childs())\n",
" \n",
" def mutate_node(self):\n",
" \n",
" childs = self.childs()\n",
" \n",
" if len(childs) <= 2:\n",
" print(\"Warning: cannot modify mix node\")\n",
" return\n",
" \n",
" childs = random.sample(childs, len(childs))\n",
" \n",
" n = random.choice(range(1, len(childs)-1))\n",
" \n",
" between_node = ActionNode(random.choice(actions))\n",
" \n",
" self.split(set(childs[:n]), set(childs[n:]), between_node)\n",
" \n",
" \n",
" def node_score(self):\n",
" child_ingredients = [c.traverse_ingredients() for c in self.childs()]\n",
" \n",
" tmp_set = set()\n",
" cumulative_sets = []\n",
" \n",
" pairwise_tuples = []\n",
" \n",
" for c in child_ingredients:\n",
" if len(tmp_set) > 0:\n",
" cumulative_sets.append(tmp_set)\n",
" pairwise_tuples += [x for x in itertools.product(tmp_set, c)]\n",
" tmp_set = tmp_set.union(set(c))\n",
" \n",
" s_base = 0\n",
" s = 0\n",
" \n",
" for ing_a, ing_b in pairwise_tuples:\n",
" try:\n",
" #s_base += sym_score(ing_a._base_ingredient, ing_b._base_ingredient, m_base_mix, c_base_mix)\n",
" \n",
" #s += sym_score(ing_a.to_json(), ing_b.to_json(), m_mix, c_mix)\n",
" \n",
2019-12-01 14:04:07 +01:00
" # old method:\n",
" #p1 = sym_p_a_given_b(ing_a.to_json(), ing_b.to_json(), m_mix, c_mix)\n",
" #p2 = sym_p_a_given_b(ing_b.to_json(), ing_a.to_json(), m_mix, c_mix)\n",
" #s += 0.5 * p1 + 0.5 * p2\n",
" \n",
" \n",
" ia = m_mix._label_index[ing_a.to_json()]\n",
" ib = m_mix._label_index[ing_b.to_json()]\n",
" \n",
" if c_mix[ia,ib] > 0 or c_mix[ib,ia] > 0:\n",
" s += 1\n",
" \n",
2019-11-08 10:47:58 +01:00
" \n",
2019-12-01 14:04:07 +01:00
" \n",
" except KeyError as e:\n",
2019-11-08 10:47:58 +01:00
" pass\n",
" \n",
" #s_base /= len(pairwise_tuples)\n",
" s /= len(pairwise_tuples)\n",
" \n",
" #return 0.5 * (s_base + s)\n",
" return s\n",
" \n",
" \n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ingredient Node Class"
]
},
{
"cell_type": "code",
"execution_count": 22,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class IngredientNode(RecipeTreeNode):\n",
" def __init__(self, name, constant=False):\n",
" super().__init__(name, constant, single_child=True)\n",
" \n",
" def get_actions(self):\n",
" a_list = []\n",
" n = self.parent()\n",
" while n is not None:\n",
" if type(n) == ActionNode:\n",
" a_list.append(n.name())\n",
" n = n.parent()\n",
" return a_list\n",
" \n",
" def mutate_node(self):\n",
" self._name = random.choice(base_ingredients)\n",
" #TODO: change w.r.t. mixing probabilities \n",
" \n",
" def traverse_ingredients(self):\n",
" return [Ingredient(self._name)]\n",
" \n",
" def node_score(self):\n",
" actions = self.get_actions()\n",
" \n",
" if len(actions) == 0:\n",
" if p_ingredient_unprepared(self._name) < 0.2:\n",
" return 0\n",
" return 1\n",
" \n",
" seen_actions = set()\n",
" n_duplicates = 0\n",
" for act in actions:\n",
" if act in seen_actions:\n",
" n_duplicates += 1\n",
" else:\n",
" seen_actions.add(act)\n",
" \n",
" duplicate_actions_score = len(seen_actions) / len(actions)\n",
" \n",
" return duplicate_actions_score\n",
" \n",
" \n",
" def dot_node(self, dot):\n",
" dot.node(self._id, label=f\"< <B>{self._name}</B><BR/>node score:{self.node_score():.4f}>\", shape=\"box\", style=\"filled\", color=\"#ffe6cc\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Action Node Class"
]
},
{
"cell_type": "code",
"execution_count": 23,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class ActionNode(RecipeTreeNode):\n",
" def __init__(self, name, constant=False):\n",
" super().__init__(name, constant, single_child=True)\n",
" \n",
" def n_node_mutate_options(self):\n",
" # beacause we can change or remove ourselve!\n",
" return 0 if self._constant else 2 \n",
" def mutate_node(self):\n",
" if random.choice(range(2)) == 0:\n",
" # change action\n",
" self._name = random.choice(actions)\n",
" else:\n",
" # delete\n",
" self.remove()\n",
" \n",
" def traverse_ingredients(self):\n",
" ingredient_set = super().traverse_ingredients()\n",
" for ing in ingredient_set:\n",
" ing.apply_action(self._name)\n",
" \n",
" return ingredient_set\n",
" \n",
" def node_score(self):\n",
" ings = self.child().traverse_ingredients()\n",
" \n",
" s = 0\n",
" \n",
" for ing in ings:\n",
" try:\n",
" #score = asym_score(self._name, ing.to_json(), m_act, c_act)\n",
" #base_score = asym_score(self._name, ing._base_ingredient, m_base_act, c_base_act)\n",
" \n",
" score = fw_p_a_given_b(self._name, ing._base_ingredient, m_base_act, c_base_act)\n",
" \n",
" s += score\n",
" except KeyError as e:\n",
" pass\n",
" \n",
" \n",
" return s / len(ings)\n",
" \n",
" def dot_node(self, dot):\n",
" dot.node(self._id, label=f\"< <B>{self._name}</B><BR/>node score: {self.node_score():.4f}>\", shape=\"ellipse\", style=\"filled\", color=\"#dae8fc\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tree Class"
]
},
{
"cell_type": "code",
"execution_count": 24,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class Tree(object):\n",
" @staticmethod\n",
" def build_initial_tree(ingredients: list, main_ingredients: list, max_n = 4, wheel_turns = 2):\n",
2019-12-01 14:04:07 +01:00
" \n",
" '''\n",
2019-11-08 10:47:58 +01:00
" # get action sets for ingredients\n",
" possible_actions = {}\n",
" for ing in ingredients:\n",
" action_set, action_weights = m_base_act.get_backward_adjacent(ing)\n",
" possible_actions[ing] = set(action_set.tolist()[:5])\n",
" \n",
" # now find actions with the same subset\n",
" \n",
" ings_for_acts = {}\n",
" \n",
" for ing, acts in possible_actions.items():\n",
" for a in acts:\n",
" if a not in ings_for_acts:\n",
" ings_for_acts[a] = set()\n",
" \n",
" ings_for_acts[a].add(ing)\n",
2019-12-01 14:04:07 +01:00
"\n",
" '''\n",
" \n",
2019-12-01 14:04:07 +01:00
" # choose randomly an action for each ingredient by the \"wheel of fortune\" method\n",
" actions_for_ing = {}\n",
" for ing in ingredients:\n",
" actions_for_ing[ing] = set()\n",
" action_set, action_weights = m_base_act.get_backward_adjacent(ing)\n",
" for i in range(wheel_turns):\n",
" action = ea_tools.wheel_of_fortune_selection(action_set[:max_n], action_weights[:max_n])\n",
" actions_for_ing[ing].add(action)\n",
" #print(ing, action)\n",
"\n",
" ings_for_acts = {}\n",
" \n",
" for ing, acts in actions_for_ing.items():\n",
" for a in acts:\n",
" if a not in ings_for_acts:\n",
" ings_for_acts[a] = set()\n",
" \n",
" ings_for_acts[a].add(ing)\n",
2019-11-08 10:47:58 +01:00
" \n",
" # now looking for the largest subset and choose one of them randomly\n",
" \n",
" action_keys = np.array(list(ings_for_acts.keys()))\n",
" set_lengths = np.array([len(ings_for_acts[a]) for a in action_keys])\n",
" \n",
" # sort lengths\n",
" sorted_length_indices = np.argsort(-set_lengths)\n",
" \n",
" # now perform the following steps:\n",
" # * go through all unprocessed ingredients\n",
" # * for each ing: find largest action set that is suitable\n",
" # * perform this action on all it's ingredients.\n",
" # * continue until no ingredient is left\n",
" \n",
" unprocessed_ings = set(ingredients)\n",
" unprocessed_actions = set(ings_for_acts.keys())\n",
" \n",
2019-12-01 14:04:07 +01:00
" ingredient_nodes = {}\n",
2019-11-08 10:47:58 +01:00
" \n",
" # create ingredient nodes:\n",
" for ing in ingredients:\n",
2019-12-01 14:04:07 +01:00
" ingredient_nodes[ing] = IngredientNode(ing, constant=True)\n",
" \n",
" i = 0\n",
2019-11-08 10:47:58 +01:00
" \n",
" while len(unprocessed_ings) > 0:\n",
2019-12-01 14:04:07 +01:00
" \n",
2019-11-08 10:47:58 +01:00
" # select random ingredient:\n",
" ing = np.random.choice(list(unprocessed_ings))\n",
" \n",
" sorted_actions = action_keys[sorted_length_indices]\n",
" selected_action = None\n",
" \n",
" for action in sorted_actions:\n",
" if ing in ings_for_acts[action]:\n",
" selected_action = action\n",
" break\n",
" \n",
" # found best action. apply it to all matching ingredients\n",
" if selected_action is not None:\n",
" matching_ingredients = ings_for_acts[selected_action]\n",
" \n",
2019-12-01 14:04:07 +01:00
" # debugging:\n",
" '''\n",
" print(f\"choose {selected_action}\")\n",
" print(f\"matching ingredients {matching_ingredients}\")\n",
" '''\n",
2019-11-08 10:47:58 +01:00
" \n",
" if len(matching_ingredients) == 1:\n",
" ing = list(matching_ingredients)[0]\n",
2019-12-01 14:04:07 +01:00
" ing_node = ingredient_nodes[ing].root()\n",
2019-11-08 10:47:58 +01:00
" action_node = ActionNode(selected_action)\n",
" action_node.add_child(ing_node)\n",
" unprocessed_ings.remove(ing)\n",
2019-12-01 14:04:07 +01:00
" #display(action_node.dot())\n",
2019-11-08 10:47:58 +01:00
" \n",
" else:\n",
" \n",
" nodes_to_mix = set()\n",
"\n",
" mix_node = MixNode()\n",
" action_node = ActionNode(selected_action)\n",
" action_node.add_child(mix_node)\n",
" \n",
" for ing in matching_ingredients:\n",
2019-12-01 14:04:07 +01:00
" nodes_to_mix.add(ingredient_nodes[ing].root())\n",
2019-11-08 10:47:58 +01:00
" \n",
" if ing in unprocessed_ings:\n",
" unprocessed_ings.remove(ing)\n",
"\n",
" for node in nodes_to_mix:\n",
" mix_node.add_child(node)\n",
" #display(action_node.dot())\n",
2019-12-01 14:04:07 +01:00
" \n",
" # debugging:\n",
" '''\n",
" tmp = set([n.root() for n in ingredient_nodes.values()])\n",
" print(f\"iteration {i}:\")\n",
" for n in tmp:\n",
" print(n.name())\n",
" display(n.dot())\n",
" '''\n",
" i += 1\n",
" \n",
2019-11-08 10:47:58 +01:00
" \n",
2019-12-01 14:04:07 +01:00
" root_layer = set([n.root() for n in ingredient_nodes.values()])\n",
2019-11-08 10:47:58 +01:00
"\n",
" root_layer_without_parents = []\n",
" for node in root_layer:\n",
" if node.parent() is None:\n",
" root_layer_without_parents.append(node)\n",
" \n",
" if len(root_layer_without_parents) == 1:\n",
" return root_layer_without_parents[0]\n",
" \n",
" root_node = MixNode()\n",
" for r in root_layer_without_parents:\n",
" root_node.add_child(r)\n",
" \n",
" return root_node\n",
" \n",
2019-12-01 14:04:07 +01:00
" @staticmethod\n",
" def find_ingredients(constant_ingredients, main_ingredients, min_additional:int, max_additional:int, top_ings:int=3):\n",
2019-12-01 14:04:07 +01:00
" '''\n",
" create an initial set of ingredients, based on given constant ingredients.\n",
" min_additional and max_additional gives the range of ingredients that are added to our set\n",
" '''\n",
" \n",
" seen_items = set(constant_ingredients)\n",
" \n",
" items = []\n",
" scores = []\n",
" \n",
" for ing in constant_ingredients:\n",
" # find best matching ingredients\n",
" best_items = []\n",
" best_scores = []\n",
" \n",
" candidates, weights = m_base_mix.get_adjacent(ing)\n",
" i = 0\n",
" while i < len(candidates) and len(best_items) < top_ings:\n",
" if candidates[i] not in seen_items:\n",
" best_items.append(candidates[i])\n",
" best_scores.append(weights[i])\n",
" i += 1\n",
2019-11-08 10:47:58 +01:00
" \n",
2019-12-01 14:04:07 +01:00
" items.append(best_items)\n",
" scores.append(best_scores)\n",
" \n",
" #TODO: error handling if too few options are availabale!\n",
2019-11-08 10:47:58 +01:00
" \n",
2019-12-01 14:04:07 +01:00
" additional_ingredients = ea_tools.combined_wheel_of_fortune_selection(items,\n",
" scores,\n",
" np.random.randint(\n",
" min_additional,\n",
" max_additional + 1\n",
" ))\n",
" \n",
" return list(constant_ingredients) + list(additional_ingredients)\n",
2019-11-08 10:47:58 +01:00
"\n",
" @staticmethod\n",
" def from_ingredients(ingredients: list, main_ingredients: list, additional_ings=0):\n",
2019-12-01 14:04:07 +01:00
" root = None\n",
" \n",
" constant_ingredients = ingredients\n",
" \n",
" if additional_ings > 0:\n",
" ingredients = Tree.find_ingredients(ingredients, main_ingredients, min_additional=0, max_additional=additional_ings)\n",
2019-11-08 10:47:58 +01:00
" \n",
2019-12-01 14:04:07 +01:00
" \n",
" root = Tree.build_initial_tree(ingredients, main_ingredients)\n",
2019-12-01 14:04:07 +01:00
" \n",
" # mark initial ingredient nodes as constant:\n",
" nodes = root.traverse()\n",
" for node in nodes:\n",
" if type(node) == IngredientNode:\n",
" if node.name() in constant_ingredients:\n",
" node._constant = True\n",
2019-11-08 10:47:58 +01:00
" \n",
" return Tree(root)\n",
" \n",
" @staticmethod\n",
" def from_serialization(s):\n",
" def empty_node(raw_n):\n",
" if raw_n['type'] == \"MixNode\":\n",
" node = MixNode(raw_n['constant'])\n",
" elif raw_n['type'] == \"IngredientNode\":\n",
" node = IngredientNode(raw_n['name'], raw_n['constant'])\n",
" elif raw_n['type'] == \"ActionNode\":\n",
" node = ActionNode(raw_n['name'], raw_n['constant'])\n",
" else:\n",
" print(\"unknown node detected\")\n",
" return\n",
" \n",
" return node\n",
" \n",
" nodes = {}\n",
" for n in s:\n",
" nodes[n['id']] = empty_node(n)\n",
" \n",
" for n in s:\n",
" childs = n['childs']\n",
" id = n['id']\n",
" for c in childs:\n",
" nodes[id].add_child(nodes[c])\n",
" \n",
" return Tree(nodes[s[0]['id']])\n",
" \n",
" \n",
" def __init__(self, root):\n",
" # create a dummy entry node\n",
" self._root = RecipeTreeNode(\"root\", single_child=True)\n",
" self._root.add_child(root)\n",
" \n",
" def root(self):\n",
" return self._root.child()\n",
" \n",
" def mutate(self):\n",
" nodes = self.root().traverse()\n",
" weights = [n.n_mutate_options() for n in nodes]\n",
" \n",
" n = random.choices(nodes, weights)[0]\n",
" \n",
" n.mutate()\n",
" \n",
" def dot(self):\n",
" return self.root().dot()\n",
" \n",
" def serialize(self):\n",
" return [n.serialize() for n in self.root().traverse()]\n",
" \n",
" def structure_score(self):\n",
" n_duplicates = 0\n",
" \n",
" \n",
" def collect_scores(self):\n",
" self._mix_scores = []\n",
" self._act_scores = []\n",
" self._ing_scores = []\n",
" \n",
" nodes = self.root().traverse()\n",
" self._n_mix_nodes = 0\n",
" self._n_act_nodes = 0\n",
" self._n_ing_nodes = 0\n",
" \n",
" s = 0\n",
" for n in nodes:\n",
" if type(n) == MixNode:\n",
" self._mix_scores.append(n.node_score())\n",
" self._n_mix_nodes += 1\n",
" if type(n) == ActionNode:\n",
" self._act_scores.append(n.node_score())\n",
" self._n_act_nodes += 1\n",
" if type(n) == IngredientNode:\n",
" self._ing_scores.append(n.node_score())\n",
" self._n_ing_nodes += 1\n",
" \n",
" self._n_duplicates = 0\n",
" seen_actions = set()\n",
" \n",
" for n in nodes:\n",
" if type(n) == ActionNode:\n",
" if n.name() in seen_actions:\n",
" self._n_duplicates += 1\n",
" else:\n",
" seen_actions.add(n.name())\n",
" \n",
" self._mix_scores = np.array(self._mix_scores)\n",
" self._act_scores = np.array(self._act_scores)\n",
" self._ing_scores = np.array(self._ing_scores)\n",
" \n",
" \n",
" def mix_scores(self):\n",
" return self._mix_scores\n",
" \n",
" def action_scores(self):\n",
" return self._act_scores\n",
" \n",
" def ing_scores(self):\n",
" return self._ing_scores\n",
" \n",
" def bounds_mix_scores(self):\n",
" \n",
" nonzeros = self._mix_scores[self._mix_scores > 0]\n",
" if len(nonzeros) > 0:\n",
" mmax = np.max(nonzeros)\n",
" mmin = np.min(nonzeros)\n",
" return mmin, mmax\n",
" else:\n",
" return None, None\n",
" \n",
" def bounds_act_scores(self):\n",
" \n",
" if len(self._act_scores) == 0:\n",
" return None, None\n",
" nonzeros = self._act_scores[self._act_scores > 0]\n",
" if len(nonzeros) > 0:\n",
" mmax = np.max(nonzeros)\n",
" mmin = np.min(nonzeros)\n",
" return mmin, mmax\n",
" else:\n",
" return None, None\n",
" \n",
" def normalized_mix_scores(self, min, max):\n",
" if (max != min):\n",
" normalized = (self._mix_scores - min)/(max-min)\n",
" normalized[normalized <= 0] = 0\n",
" return normalized\n",
" else:\n",
" return None\n",
" \n",
" def normalized_act_scores(self, min, max):\n",
" if len(self._act_scores) == 0 or max == min:\n",
" return None\n",
" normalized = (self._act_scores - min)/(max-min)\n",
" normalized[normalized <= 0] = 0\n",
" return normalized\n",
" \n",
" def copy(self):\n",
" return Tree.from_serialization(self.serialize())\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"ingredients = [\"onion\", \"tomato\", \"rice\", \"salt\"] \n",
"main_ingredients = [\"rice\"]\n",
"\n",
"assert set(main_ingredients).issubset(set(ingredients))\n",
"\n",
"max_n = 5\n",
"wheel_turns = 2\n",
"\n",
"def does_action_match(ingredient:str, action:str, t = 0.6):\n",
" return relative_action_rank(ingredient, action) > t\n",
"\n",
"\n",
"# choose randomly an action for each ingredient by the \"wheel of fortune\" method\n",
"actions_for_ing = {}\n",
"for ing in ingredients:\n",
" actions_for_ing[ing] = set()\n",
" action_set, action_weights = m_base_act.get_backward_adjacent(ing)\n",
" if random_heated(ing):\n",
" #print(action_set)\n",
" action_set, action_weights = filter_set_by_group(action_set, action_weights, \"heat\")\n",
" #print(action_set)\n",
" for i in range(wheel_turns):\n",
" if ing in main_ingredients:\n",
" # if main ingredient: choose by action probability\n",
" w = np.array(list(action_weights), dtype=float)\n",
" w *= (1.0 / np.sum(w))\n",
" action = np.random.choice(list(action_set), size=1, replace=False, p=w)[0]\n",
" else:\n",
" # else: choose rank based\n",
" action = ea_tools.wheel_of_fortune_selection(action_set[:max_n], action_weights[:max_n])\n",
" actions_for_ing[ing].add(action)\n",
" #print(f\"action {action} for ing {ing}\")\n",
" #print(ing, action)\n",
" \n",
"# create ingredient nodes:\n",
"ingredient_nodes = {}\n",
"\n",
"# create ingredient nodes:\n",
"for ing in ingredients:\n",
" new_node = IngredientNode(ing, constant=True)\n",
" \n",
" # check if we should do a preparation step\n",
" if random_prepare(ing):\n",
" # choose a preparation cooking action\n",
" action_set, action_weights = m_act.get_backward_adjacent(Ingredient(ing).to_json())\n",
" action_set, action_weights = filter_set_by_group(action_set, action_weights, \"prepare\")\n",
" if len(action_set) > 0:\n",
" action = ea_tools.wheel_of_fortune_selection(action_set[:max_n], action_weights[:max_n])\n",
" act_node = ActionNode(action)\n",
" act_node.add_child(new_node)\n",
" new_node = act_node\n",
" \n",
" \n",
" ingredient_nodes[ing] = new_node\n",
"\n",
"# starting now with the actions found for the main ingredients and try to match all ingredients together\n",
"# with that:\n",
"\n",
"unprocessed_ings = set(filter(lambda x: len(actions_for_ing[x]) > 0, ingredients))\n",
"unprocessed_main_ings = set(filter(lambda x: len(actions_for_ing[x]) > 0, main_ingredients))\n",
"\n",
"while len(unprocessed_main_ings) > 0:\n",
" main_ing = unprocessed_main_ings.pop()\n",
" \n",
" # random action for that ing:\n",
" act = actions_for_ing[main_ing].pop()\n",
" \n",
" act_node = ActionNode(act)\n",
" mix_node = MixNode()\n",
" mix_node.add_child(ingredient_nodes[main_ing])\n",
" act_node.add_child(mix_node)\n",
" ingredient_nodes[main_ing] = act_node\n",
" \n",
" unprocessed_ings.remove(main_ing)\n",
" \n",
" for ing in unprocessed_ings.copy():\n",
" if does_action_match(ing, act):\n",
" mix_node.add_child(ingredient_nodes[ing])\n",
" ingredient_nodes[ing] = act_node\n",
" unprocessed_ings.remove(ing)\n",
" if ing in unprocessed_main_ings:\n",
" unprocessed_main_ings.remove(ing)\n",
" \n",
" if len(mix_node.childs()) == 1:\n",
" mix_node.remove()\n",
"\n",
"# now make the same with all remaining ingredients:\n",
"while len(unprocessed_ings) > 0:\n",
" current_ing = unprocessed_ings.pop() \n",
" \n",
" # random action for that ing:\n",
" act = actions_for_ing[current_ing].pop()\n",
" \n",
" act_node = ActionNode(act)\n",
" mix_node = MixNode()\n",
" mix_node.add_child(ingredient_nodes[current_ing])\n",
" act_node.add_child(mix_node)\n",
" \n",
" ingredient_nodes[current_ing] = act_node\n",
" \n",
" \n",
" for ing in unprocessed_ings.copy():\n",
" if does_action_match(ing, act):\n",
" mix_node.add_child(ingredient_nodes[ing])\n",
" ingredient_nodes[ing] = act_node\n",
" unprocessed_ings.remove(ing)\n",
" \n",
" if len(mix_node.childs()) == 1:\n",
" mix_node.remove()\n",
"\n",
"\n",
"root_layer = set([n.root() for n in ingredient_nodes.values()])\n",
"\n",
"root_layer_without_parents = []\n",
"for node in root_layer:\n",
" if node.parent() is None:\n",
" root_layer_without_parents.append(node)\n",
"\n",
"if len(root_layer_without_parents) == 1:\n",
" root_node = root_layer_without_parents[0]\n",
"\n",
"else:\n",
" root_node = MixNode()\n",
" for r in root_layer_without_parents:\n",
" root_node.add_child(r)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"613pt\" height=\"434pt\"\n",
" viewBox=\"0.00 0.00 612.85 433.82\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 429.8234)\">\n",
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-429.8234 608.8528,-429.8234 608.8528,4 -4,4\"/>\n",
"<!-- 10 -->\n",
"<g id=\"node1\" class=\"node\">\n",
"<title>10</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"272.8528,-425.8234 152.8528,-389.8234 272.8528,-353.8234 392.8528,-389.8234 272.8528,-425.8234\"/>\n",
"<text text-anchor=\"start\" x=\"259.3528\" y=\"-393.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"263.3528\" y=\"-393.6234\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"220.8528\" y=\"-379.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
"</g>\n",
"<!-- 8 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>8</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"84.8528\" cy=\"-292.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"68.8528\" y=\"-296.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"72.8528\" y=\"-296.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bake</text>\n",
"<text text-anchor=\"start\" x=\"32.8528\" y=\"-282.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
"</g>\n",
"<!-- 10&#45;&gt;8 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>10&#45;&gt;8</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M228.7752,-366.9743C201.1586,-352.6584 165.4433,-334.1442 136.5007,-319.1409\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"137.8495,-315.8978 127.3606,-314.4028 134.6279,-322.1124 137.8495,-315.8978\"/>\n",
"</g>\n",
"<!-- 3 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>3</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"272.8528\" cy=\"-292.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"261.3528\" y=\"-296.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"265.3528\" y=\"-296.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cut</text>\n",
"<text text-anchor=\"start\" x=\"220.8528\" y=\"-282.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.2505</text>\n",
"</g>\n",
"<!-- 10&#45;&gt;3 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>10&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M272.8528,-353.8113C272.8528,-345.4239 272.8528,-336.496 272.8528,-328.1199\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"276.3529,-327.8873 272.8528,-317.8874 269.3529,-327.8874 276.3529,-327.8873\"/>\n",
"</g>\n",
"<!-- 6 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>6</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"464.8528\" cy=\"-292.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"453.8528\" y=\"-296.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"457.8528\" y=\"-296.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">fry</text>\n",
"<text text-anchor=\"start\" x=\"412.8528\" y=\"-282.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0859</text>\n",
"</g>\n",
"<!-- 10&#45;&gt;6 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>10&#45;&gt;6</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M317.8683,-366.9743C346.1945,-352.5964 382.8636,-333.9838 412.4895,-318.9462\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"414.1077,-322.05 421.4406,-314.4028 410.9394,-315.808 414.1077,-322.05\"/>\n",
"</g>\n",
"<!-- 5 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>5</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"142.8528,-212.9117 26.8528,-212.9117 26.8528,-176.9117 142.8528,-176.9117 142.8528,-212.9117\"/>\n",
"<text text-anchor=\"start\" x=\"72.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"76.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"34.8528\" y=\"-184.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 8&#45;&gt;5 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>8&#45;&gt;5</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M84.8528,-266.7622C84.8528,-253.4123 84.8528,-237.0481 84.8528,-223.3105\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"88.3529,-222.9641 84.8528,-212.9642 81.3529,-222.9642 88.3529,-222.9641\"/>\n",
"</g>\n",
"<!-- 2 -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>2</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"328.8528,-212.9117 212.8528,-212.9117 212.8528,-176.9117 328.8528,-176.9117 328.8528,-212.9117\"/>\n",
"<text text-anchor=\"start\" x=\"247.8528\" y=\"-198.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"251.8528\" y=\"-198.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"220.8528\" y=\"-184.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;2 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>3&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M272.3273,-266.7622C272.0534,-253.4123 271.7175,-237.0481 271.4356,-223.3105\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"274.9278,-222.8902 271.2233,-212.9642 267.9293,-223.0339 274.9278,-222.8902\"/>\n",
"</g>\n",
"<!-- 7 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>7</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"466.8528,-230.9117 346.8528,-194.9117 466.8528,-158.9117 586.8528,-194.9117 466.8528,-230.9117\"/>\n",
"<text text-anchor=\"start\" x=\"453.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"457.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"414.8528\" y=\"-184.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
"</g>\n",
"<!-- 6&#45;&gt;7 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>6&#45;&gt;7</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M465.3783,-266.7622C465.5397,-258.8985 465.7225,-249.989 465.9032,-241.1865\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"469.4068,-241.0411 466.1128,-230.9713 462.4083,-240.8974 469.4068,-241.0411\"/>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>1</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"385.8528\" cy=\"-97.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"371.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"375.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">slice</text>\n",
"<text text-anchor=\"start\" x=\"333.8528\" y=\"-87.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.1501</text>\n",
"</g>\n",
"<!-- 7&#45;&gt;1 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>7&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M442.7695,-165.9356C433.3727,-154.6298 422.5567,-141.6164 412.8939,-129.9906\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"415.5038,-127.655 406.4202,-122.2016 410.1204,-132.1293 415.5038,-127.655\"/>\n",
"</g>\n",
"<!-- 4 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>4</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"604.8528,-115.4558 488.8528,-115.4558 488.8528,-79.4558 604.8528,-79.4558 604.8528,-115.4558\"/>\n",
"<text text-anchor=\"start\" x=\"533.8528\" y=\"-101.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"537.8528\" y=\"-101.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">rice</text>\n",
"<text text-anchor=\"start\" x=\"496.8528\" y=\"-87.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 7&#45;&gt;4 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>7&#45;&gt;4</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M490.6389,-165.9356C501.7,-152.4609 514.7524,-136.5605 525.4944,-123.4746\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"528.2061,-125.6875 531.8458,-115.7374 522.7956,-121.246 528.2061,-125.6875\"/>\n",
"</g>\n",
"<!-- 0 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>0</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"443.8528,-36 327.8528,-36 327.8528,0 443.8528,0 443.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"367.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"371.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"335.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M385.8528,-71.8782C385.8528,-63.7122 385.8528,-54.6289 385.8528,-46.2824\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"389.3529,-46.2287 385.8528,-36.2288 382.3529,-46.2288 389.3529,-46.2287\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7ff425fc1a90>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"root_node.dot()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"constant_ingredients = [\"noodle\", \"onion\", \"tomato\"]\n",
"main_ingredients = ['noodle']\n",
"min_additional = 3\n",
"max_additional = 6\n",
"top_ings =3"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['noodle',\n",
" 'onion',\n",
" 'tomato',\n",
" 'salt',\n",
" 'cheese',\n",
" 'garlic clove',\n",
" 'olive oil',\n",
" 'mozzarella cheese']"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seen_items = set(constant_ingredients)\n",
"\n",
"items = []\n",
"scores = []\n",
"\n",
"assert set(main_ingredients).issubset(set(constant_ingredients))\n",
"\n",
"# additional ingredients are choosen w.r.t all given ingredients\n",
"n_additional_ings = np.random.randint(min_additional, max_additional + 1)\n",
"\n",
"# extra ings are ingredients choosen specially for the main ingredient\n",
"n_extra_ings = int((len(main_ingredients) / len(constant_ingredients)) * n_additional_ings)\n",
"\n",
"if n_extra_ings > n_additional_ings:\n",
" n_extra_ings = n_additional_ings\n",
"\n",
" \n",
"# choose extra ingredients\n",
"extra_candidates = []\n",
"extra_weights = []\n",
"\n",
"for ing in main_ingredients:\n",
" candidates, weights = normalized_score(ing, m_base_mix)\n",
" extra_candidates.append(candidates[:10])\n",
" extra_weights.append(weights[:10])\n",
"\n",
"extra_ingredients = ea_tools.combined_wheel_of_fortune_selection(extra_candidates,\n",
" extra_weights,\n",
" n_extra_ings)\n",
"\n",
"for ing in constant_ingredients:\n",
" # find best matching ingredients\n",
" best_items = []\n",
" best_scores = []\n",
"\n",
" candidates, weights = m_base_mix.get_adjacent(ing)\n",
" i = 0\n",
" while i < len(candidates) and len(best_items) < top_ings:\n",
" if candidates[i] not in seen_items:\n",
" best_items.append(candidates[i])\n",
" best_scores.append(weights[i])\n",
" i += 1\n",
"\n",
" items.append(best_items)\n",
" scores.append(best_scores)\n",
"\n",
"#TODO: error handling if too few options are availabale!\n",
"\n",
"additional_ingredients = ea_tools.combined_wheel_of_fortune_selection(items,\n",
" scores,\n",
" n_additional_ings - n_extra_ings)\n",
"list(constant_ingredients) + list(additional_ingredients) + list(extra_ingredients)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array(['ricotta cheese', 'spaghetti sauce', 'mozzarella cheese', 'cheese',\n",
" 'spinach', 'sausage', 'ground beef', 'tomato sauce', 'onion',\n",
" 'basil', 'broccoli', 'parsley', 'mushroom soup', 'mushroom',\n",
" 'sauce', 'egg', 'garlic clove', 'chicken', 'milk', 'water', 'salt',\n",
" 'zucchini', 'tomato', 'pepper', 'seasoning', 'green pepper',\n",
" 'shrimp', 'soy sauce', 'butter', 'red pepper', 'oregano',\n",
" 'clove garlic', 'olive oil', 'pork', 'carrot', 'green onion',\n",
" 'cream cheese', 'garlic', 'chicken broth', 'tablespoon butter',\n",
" 'red bell pepper', 'flour', 'cream', 'black pepper',\n",
" 'vegetable oil', 'chicken breast', 'sugar'], dtype='<U86'),\n",
" array([1.72269296e-03, 1.36100201e-03, 4.55169243e-04, 1.77893267e-04,\n",
" 1.24020302e-04, 1.23572299e-04, 1.15856830e-04, 8.13045041e-05,\n",
" 7.44682982e-05, 6.11712938e-05, 5.25617916e-05, 4.61949373e-05,\n",
" 4.57840602e-05, 4.48640553e-05, 3.80872894e-05, 3.73615068e-05,\n",
" 3.41135643e-05, 2.86899933e-05, 2.60745654e-05, 2.58892962e-05,\n",
" 2.39238665e-05, 2.25048416e-05, 2.02862719e-05, 1.98958546e-05,\n",
" 1.98476423e-05, 1.70669883e-05, 1.64057568e-05, 1.63032289e-05,\n",
" 1.57316299e-05, 1.57055922e-05, 1.50292158e-05, 1.42549883e-05,\n",
" 1.39543420e-05, 1.13377515e-05, 1.08577156e-05, 1.06498185e-05,\n",
" 1.04539527e-05, 1.01201500e-05, 9.80997203e-06, 9.75022935e-06,\n",
" 8.94143133e-06, 8.23586373e-06, 6.82070606e-06, 5.09612356e-06,\n",
" 4.75313364e-06, 4.31247765e-06, 3.80137782e-06]))"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"normalized_score(\"noodle\", m_base_mix)"
]
},
2019-11-08 10:47:58 +01:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Population"
]
},
{
"cell_type": "code",
"execution_count": 29,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"class Population(object):\n",
2019-12-01 14:04:07 +01:00
" def __init__(self, start_ingredients, main_ingredients, n_population = 10, max_additional_ings=0):\n",
" self.population = [Tree.from_ingredients(start_ingredients, main_ingredients, additional_ings=max_additional_ings) for i in range(n_population)]\n",
2019-11-08 10:47:58 +01:00
" self._n = n_population\n",
" self._mix_min = None\n",
" self._mix_max = None\n",
" self._act_min = None\n",
" self._act_max = None\n",
" self._mix_scores = None\n",
" self._act_scores = None\n",
" self._scores = None\n",
" \n",
" def mutate(self):\n",
" for tree in self.population.copy():\n",
" t_clone = tree.copy()\n",
" t_clone.mutate()\n",
" self.population.append(t_clone)\n",
" \n",
" def pairwise_competition(self):\n",
" new_population = []\n",
" indices = list(range(len(self.population)))\n",
" random.shuffle(indices)\n",
" \n",
" for i in range(len(self.population) // 2):\n",
" i_a = indices[2*i]\n",
" i_b = indices[2*i+1]\n",
" \n",
" if self._scores[i_a] > self._scores[i_b]:\n",
" new_population.append(self.population[i_a])\n",
" else:\n",
" new_population.append(self.population[i_b])\n",
" \n",
" self.population = new_population\n",
" \n",
" def hold_best(self, n=10):\n",
" sorted_indices = np.argsort(-self._scores)\n",
" \n",
" self.population = np.array(self.population)[sorted_indices[:n]].tolist()\n",
" \n",
" def analyse_scores(self):\n",
" for tree in self.population:\n",
" min, max = tree.bounds_mix_scores()\n",
" if min is not None and max is not None:\n",
" if self._mix_min is None or min < self._mix_min:\n",
" self._mix_min = min\n",
" if self._mix_max is None or max > self._mix_max:\n",
" self._mix_max = max\n",
" \n",
" min, max = tree.bounds_act_scores()\n",
" if min is not None and max is not None:\n",
" if self._act_min is None or min < self._act_min:\n",
" self._act_min = min\n",
" if self._act_max is None or max > self._act_max:\n",
" self._act_max = max\n",
" \n",
" def single_score(self, mix_scores, act_scores, ing_scores):\n",
" if mix_scores is None or act_scores is None or ing_scores is None:\n",
" return 0\n",
" score = (0.5 * np.average(mix_scores) + 0.5 * np.average(act_scores)) * np.average(ing_scores)\n",
" # judging also how many actions we have. So far use a gaussian with mean at number of ingredients\n",
" \n",
" score *= gaussian(len(act_scores), len(mix_scores), 1)\n",
" return score\n",
" \n",
" \n",
" \n",
" def collect_scores(self):\n",
2019-12-01 14:04:07 +01:00
" for tree in tqdm(self.population, desc=\"evaluate population scores\", leave=False):\n",
2019-11-08 10:47:58 +01:00
" tree.collect_scores()\n",
" \n",
" self.analyse_scores()\n",
" \n",
" if self._mix_min is not None and self._mix_max is not None:\n",
" self._mix_scores = [t.normalized_mix_scores(self._mix_min, self._mix_max) for t in self.population]\n",
" else:\n",
" # if no normalization can be done, all values are the same or 0.\n",
" # in this case just fill in zeros as score\n",
" self._mix_scores = [np.zeros(shape=t._mix_scores.shape) for t in self.population]\n",
" \n",
" if self._act_min is not None and self._act_max is not None:\n",
" self._act_scores = [t.normalized_act_scores(self._act_min, self._act_max) for t in self.population]\n",
" else:\n",
" self._act_scores = [np.zeros(shape=t._act_scores) for t in self.population]\n",
" \n",
" self._scores = []\n",
" for i in range(len(self._mix_scores)):\n",
" #print (self._mix_scores[i], self._act_scores[i])\n",
" if self._act_scores is None or self._mix_scores is None or self._act_scores[i] is None:\n",
" self._scores.append(0)\n",
" continue\n",
" \n",
" s = self.single_score(self._mix_scores[i], self._act_scores[i], self.population[i].ing_scores())\n",
" self._scores.append(s)\n",
" self._scores = np.array(self._scores)\n",
" \n",
" def run(self, n=50):\n",
2019-12-01 14:04:07 +01:00
" for i in tqdm(range(n), desc=\"run evolutionary cycles\"):\n",
2019-11-08 10:47:58 +01:00
" self.mutate()\n",
" self.mutate()\n",
" self.collect_scores()\n",
2019-12-01 14:04:07 +01:00
" \n",
2019-11-08 10:47:58 +01:00
" #self.pairwise_competition()\n",
" #self.collect_scores()\n",
" self.hold_best(self._n)\n",
" \n",
" \n",
" \n",
2019-12-01 14:04:07 +01:00
" def plot_population(self, collect_scores=True):\n",
" if (collect_scores):\n",
" self.collect_scores()\n",
2019-11-08 10:47:58 +01:00
" #print(self._mix_scores)\n",
" #print(self._act_scores)\n",
" #print(self._scores)\n",
" for i, t in enumerate(self.population):\n",
2019-12-01 14:04:07 +01:00
" if (collect_scores):\n",
" display(self._scores[i])\n",
2019-11-08 10:47:58 +01:00
" display(t.root().dot())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run Evolutionary Algorithm"
]
},
{
"cell_type": "code",
"execution_count": 30,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"p = Population([\"bacon\", \"tomato\", \"onion\"],['noodle'], max_additional_ings=6)"
2019-11-08 10:47:58 +01:00
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 24,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [],
"source": [
"#p_ingredient_unprepared(list(p.population[0].root().childs())[0]._name) < 0.2"
]
},
{
"cell_type": "code",
2019-12-01 14:04:07 +01:00
"execution_count": 26,
2019-11-08 10:47:58 +01:00
"metadata": {},
2019-12-01 14:04:07 +01:00
"outputs": [],
2019-11-08 10:47:58 +01:00
"source": [
2019-12-01 14:04:07 +01:00
"#p.run(100)"
2019-11-08 10:47:58 +01:00
]
},
{
"cell_type": "code",
"execution_count": 31,
2019-11-08 10:47:58 +01:00
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"562pt\" height=\"347pt\"\n",
" viewBox=\"0.00 0.00 561.71 346.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
2019-12-01 14:04:07 +01:00
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 342.9117)\">\n",
2019-11-08 10:47:58 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-342.9117 557.7056,-342.9117 557.7056,4 -4,4\"/>\n",
"<!-- 9 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>9</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"276.8528,-338.9117 156.8528,-302.9117 276.8528,-266.9117 396.8528,-302.9117 276.8528,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"263.3528\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"267.3528\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"224.8528\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.1429</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 5 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>5</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"84.8528\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"68.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"72.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bake</text>\n",
"<text text-anchor=\"start\" x=\"32.8528\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 9&#45;&gt;5 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>9&#45;&gt;5</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M231.8373,-280.0626C203.5111,-265.6847 166.8421,-247.0722 137.2161,-232.0346\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"138.7663,-228.8963 128.265,-227.4911 135.5979,-235.1383 138.7663,-228.8963\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 7 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>7</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"276.8528\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"260.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"264.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"224.8528\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.9182</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 9&#45;&gt;7 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>9&#45;&gt;7</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M276.8528,-266.8996C276.8528,-258.5122 276.8528,-249.5843 276.8528,-241.2082\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"280.3529,-240.9756 276.8528,-230.9757 273.3529,-240.9757 280.3529,-240.9756\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 8 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>8</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"468.8528\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"454.3528\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"458.3528\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">beat</text>\n",
"<text text-anchor=\"start\" x=\"416.8528\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7344</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 9&#45;&gt;8 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>9&#45;&gt;8</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M321.8683,-280.0626C350.1945,-265.6847 386.8636,-247.0722 416.4895,-232.0346\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"418.1077,-235.1383 425.4406,-227.4911 414.9394,-228.8963 418.1077,-235.1383\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 3 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>3</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"138.8528,-126 22.8528,-126 22.8528,-90 138.8528,-90 138.8528,-126\"/>\n",
"<text text-anchor=\"start\" x=\"68.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"72.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"30.8528\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 5&#45;&gt;3 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>5&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M83.8019,-179.8505C83.2539,-166.5006 82.5823,-150.1364 82.0184,-136.3988\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"85.501,-135.9005 81.5938,-126.0525 78.5069,-136.1876 85.501,-135.9005\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 6 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>6</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"276.8528,-144 156.8528,-108 276.8528,-72 396.8528,-108 276.8528,-144\"/>\n",
"<text text-anchor=\"start\" x=\"263.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"267.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"224.8528\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.6667</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 7&#45;&gt;6 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>7&#45;&gt;6</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M276.8528,-179.8505C276.8528,-171.9868 276.8528,-163.0773 276.8528,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"280.3529,-154.0596 276.8528,-144.0596 273.3529,-154.0597 280.3529,-154.0596\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 0 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>0</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"200.8528,-36 84.8528,-36 84.8528,0 200.8528,0 200.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"123.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"127.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"92.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 6&#45;&gt;0 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>6&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M239.5263,-82.93C220.3199,-70.0301 197.0366,-54.3921 178.1328,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"180.0388,-38.7595 169.7859,-36.0894 176.1358,-44.5705 180.0388,-38.7595\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 2 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>2</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"334.8528,-36 218.8528,-36 218.8528,0 334.8528,0 334.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"258.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"262.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"226.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 6&#45;&gt;2 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>6&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M276.8528,-71.9121C276.8528,-63.3433 276.8528,-54.3253 276.8528,-46.1692\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"280.3529,-46.0539 276.8528,-36.0539 273.3529,-46.0539 280.3529,-46.0539\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 1 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>1</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"468.8528,-36 352.8528,-36 352.8528,0 468.8528,0 468.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"387.8528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"391.8528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"360.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 6&#45;&gt;1 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>6&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M314.1793,-82.93C333.3857,-70.0301 356.6691,-54.3921 375.5728,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"377.5698,-44.5705 383.9197,-36.0894 373.6669,-38.7595 377.5698,-44.5705\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 4 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>4</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"530.8528,-126 414.8528,-126 414.8528,-90 530.8528,-90 530.8528,-126\"/>\n",
"<text text-anchor=\"start\" x=\"460.8528\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"464.8528\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">egg</text>\n",
"<text text-anchor=\"start\" x=\"422.8528\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 8&#45;&gt;4 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>8&#45;&gt;4</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M469.9038,-179.8505C470.4517,-166.5006 471.1234,-150.1364 471.6872,-136.3988\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"475.1987,-136.1876 472.1119,-126.0525 468.2046,-135.9005 475.1987,-136.1876\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0837a89d0>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"1062pt\" height=\"347pt\"\n",
" viewBox=\"0.00 0.00 1062.00 346.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 342.9117)\">\n",
2019-11-08 10:47:58 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-342.9117 1058,-342.9117 1058,4 -4,4\"/>\n",
"<!-- 25 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>25</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"513,-338.9117 393,-302.9117 513,-266.9117 633,-302.9117 513,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"499.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"503.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"461\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.1000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 24 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>24</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"285\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"270.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"274.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"233\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 25&#45;&gt;24 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>25&#45;&gt;24</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M463.2462,-281.645C427.8542,-266.5171 380.1959,-246.1462 343.0638,-230.2745\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"344.435,-227.0544 333.8642,-226.3422 341.6837,-233.491 344.435,-227.0544\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 20 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>20</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"513\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"497\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"501\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"461\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7815</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 25&#45;&gt;20 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>25&#45;&gt;20</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M513,-266.8996C513,-258.5122 513,-249.5843 513,-241.2082\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"516.5001,-240.9756 513,-230.9757 509.5001,-240.9757 516.5001,-240.9756\"/>\n",
"</g>\n",
"<!-- 22 -->\n",
"<g id=\"node12\" class=\"node\">\n",
"<title>22</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"808\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"792\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"796\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bake</text>\n",
"<text text-anchor=\"start\" x=\"756\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
"</g>\n",
"<!-- 25&#45;&gt;22 -->\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<title>25&#45;&gt;22</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M570.2288,-284.0057C619.183,-267.8332 689.6929,-244.5396 741.2161,-227.5185\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"742.5332,-230.7695 750.9305,-224.3092 740.3373,-224.1228 742.5332,-230.7695\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 23 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>23</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"192,-144 72,-108 192,-72 312,-108 192,-144\"/>\n",
"<text text-anchor=\"start\" x=\"178.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"182.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"140\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 24&#45;&gt;23 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>24&#45;&gt;23</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M261.5322,-180.8636C250.7484,-169.5632 237.7537,-155.9458 225.9309,-143.5566\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"228.1872,-140.8512 218.7513,-136.033 223.123,-145.6839 228.1872,-140.8512\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 14 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>14</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-36 0,-36 0,0 116,0 116,-36\"/>\n",
"<text text-anchor=\"start\" x=\"33\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"37\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">olive oil</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 23&#45;&gt;14 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>23&#45;&gt;14</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M154.6735,-82.93C135.4671,-70.0301 112.1837,-54.3921 93.28,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"95.1859,-38.7595 84.9331,-36.0894 91.283,-44.5705 95.1859,-38.7595\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 12 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>12</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"250,-36 134,-36 134,0 250,0 250,-36\"/>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"173\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"142\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 23&#45;&gt;12 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>23&#45;&gt;12</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M192,-71.9121C192,-63.3433 192,-54.3253 192,-46.1692\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"195.5001,-46.0539 192,-36.0539 188.5001,-46.0539 195.5001,-46.0539\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 19 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>19</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"513,-144 393,-108 513,-72 633,-108 513,-144\"/>\n",
"<text text-anchor=\"start\" x=\"499.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"503.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"461\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8333</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 20&#45;&gt;19 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>20&#45;&gt;19</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M513,-179.8505C513,-171.9868 513,-163.0773 513,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"516.5001,-154.0596 513,-144.0596 509.5001,-154.0597 516.5001,-154.0596\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 13 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>13</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"384,-36 268,-36 268,0 384,0 384,-36\"/>\n",
"<text text-anchor=\"start\" x=\"307.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"311.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"276\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 19&#45;&gt;13 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>19&#45;&gt;13</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M466.7753,-85.7528C438.0826,-71.9435 401.3295,-54.2548 372.5721,-40.4144\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"374.0652,-37.2487 363.5366,-36.0657 371.0294,-43.5562 374.0652,-37.2487\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 11 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node9\" class=\"node\">\n",
"<title>11</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"518,-36 402,-36 402,0 518,0 518,-36\"/>\n",
"<text text-anchor=\"start\" x=\"440.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"444.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"410\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 19&#45;&gt;11 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge8\" class=\"edge\">\n",
"<title>19&#45;&gt;11</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M494.9086,-77.2788C488.7555,-66.8302 481.9277,-55.2357 475.9542,-45.092\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"478.8426,-43.0994 470.7523,-36.2586 472.8108,-46.6515 478.8426,-43.0994\"/>\n",
"</g>\n",
"<!-- 16 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>16</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"652,-36 536,-36 536,0 652,0 652,-36\"/>\n",
"<text text-anchor=\"start\" x=\"573.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"577.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cheese</text>\n",
"<text text-anchor=\"start\" x=\"544\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 19&#45;&gt;16 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>19&#45;&gt;16</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M538.6289,-79.5234C548.9226,-68.086 560.7048,-54.9947 570.7471,-43.8365\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"573.6177,-45.8789 577.7059,-36.1046 568.4147,-41.1962 573.6177,-45.8789\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 17 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node11\" class=\"node\">\n",
"<title>17</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"786,-36 670,-36 670,0 786,0 786,-36\"/>\n",
"<text text-anchor=\"start\" x=\"692.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"696.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">garlic clove</text>\n",
"<text text-anchor=\"start\" x=\"678\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 19&#45;&gt;17 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge10\" class=\"edge\">\n",
"<title>19&#45;&gt;17</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M563.1366,-87.0126C596.8224,-72.9116 641.1358,-54.3617 675.3363,-40.0453\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"676.8243,-43.2168 684.6972,-36.1268 674.1213,-36.7597 676.8243,-43.2168\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 21 -->\n",
"<g id=\"node13\" class=\"node\">\n",
"<title>21</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"862,-144 742,-108 862,-72 982,-108 862,-144\"/>\n",
"<text text-anchor=\"start\" x=\"848.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"852.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"810\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 22&#45;&gt;21 -->\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<title>22&#45;&gt;21</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M822.0469,-180.1049C827.4668,-170.3234 833.7993,-158.8948 839.8042,-148.0575\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"842.9588,-149.5857 844.7441,-139.1424 836.8359,-146.193 842.9588,-149.5857\"/>\n",
"</g>\n",
"<!-- 15 -->\n",
"<g id=\"node14\" class=\"node\">\n",
"<title>15</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"920,-36 804,-36 804,0 920,0 920,-36\"/>\n",
"<text text-anchor=\"start\" x=\"849.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"853.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"812\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 21&#45;&gt;15 -->\n",
"<g id=\"edge13\" class=\"edge\">\n",
"<title>21&#45;&gt;15</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M862,-71.9121C862,-63.3433 862,-54.3253 862,-46.1692\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"865.5001,-46.0539 862,-36.0539 858.5001,-46.0539 865.5001,-46.0539\"/>\n",
"</g>\n",
"<!-- 18 -->\n",
"<g id=\"node15\" class=\"node\">\n",
"<title>18</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"1054,-36 938,-36 938,0 1054,0 1054,-36\"/>\n",
"<text text-anchor=\"start\" x=\"984\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"988\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">egg</text>\n",
"<text text-anchor=\"start\" x=\"946\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 21&#45;&gt;18 -->\n",
"<g id=\"edge14\" class=\"edge\">\n",
"<title>21&#45;&gt;18</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M899.3265,-82.93C918.5329,-70.0301 941.8163,-54.3921 960.72,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"962.717,-44.5705 969.0669,-36.0894 958.8141,-38.7595 962.717,-44.5705\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-12-01 14:04:07 +01:00
]
2019-11-08 10:47:58 +01:00
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2019-12-01 14:04:07 +01:00
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"526pt\" height=\"239pt\"\n",
" viewBox=\"0.00 0.00 526.00 238.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 234.9117)\">\n",
2019-12-01 14:04:07 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-234.9117 522,-234.9117 522,4 -4,4\"/>\n",
"<!-- 32 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>32</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"259\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"244.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"248.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8099</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 31 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>31</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"259,-144 139,-108 259,-72 379,-108 259,-144\"/>\n",
"<text text-anchor=\"start\" x=\"245.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"249.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8333</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 32&#45;&gt;31 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>32&#45;&gt;31</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M259,-179.8505C259,-171.9868 259,-163.0773 259,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"262.5001,-154.0596 259,-144.0596 255.5001,-154.0597 262.5001,-154.0596\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 27 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>27</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-36 0,-36 0,0 116,0 116,-36\"/>\n",
"<text text-anchor=\"start\" x=\"38.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"42.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 31&#45;&gt;27 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>31&#45;&gt;27</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M210.8555,-86.4428C179.7007,-72.4929 139.233,-54.373 107.7628,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.8625,-36.9395 98.3053,-36.0472 106.0018,-43.3283 108.8625,-36.9395\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 28 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>28</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"250,-36 134,-36 134,0 250,0 250,-36\"/>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"173\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"142\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 31&#45;&gt;28 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>31&#45;&gt;28</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M237.0617,-78.5306C228.8707,-67.5278 219.6287,-55.1131 211.656,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"214.3576,-42.1713 205.5786,-36.2399 208.7426,-46.3513 214.3576,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 29 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>29</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"384,-36 268,-36 268,0 384,0 384,-36\"/>\n",
"<text text-anchor=\"start\" x=\"307.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"311.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"276\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 31&#45;&gt;29 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>31&#45;&gt;29</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M280.9383,-78.5306C289.1293,-67.5278 298.3713,-55.1131 306.344,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"309.2574,-46.3513 312.4214,-36.2399 303.6424,-42.1713 309.2574,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 30 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>30</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"518,-36 402,-36 402,0 518,0 518,-36\"/>\n",
"<text text-anchor=\"start\" x=\"447.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"451.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"410\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 31&#45;&gt;30 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>31&#45;&gt;30</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M307.1445,-86.4428C338.2993,-72.4929 378.767,-54.373 410.2372,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"411.9982,-43.3283 419.6947,-36.0472 409.1375,-36.9395 411.9982,-43.3283\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
2019-11-08 10:47:58 +01:00
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"554pt\" height=\"239pt\"\n",
" viewBox=\"0.00 0.00 553.71 238.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 234.9117)\">\n",
2019-11-08 10:47:58 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-234.9117 549.7056,-234.9117 549.7056,4 -4,4\"/>\n",
"<!-- 40 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>40</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"272.8528,-230.9117 152.8528,-194.9117 272.8528,-158.9117 392.8528,-194.9117 272.8528,-230.9117\"/>\n",
"<text text-anchor=\"start\" x=\"259.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"263.3528\" y=\"-198.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"220.8528\" y=\"-184.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 38 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>38</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"84.8528\" cy=\"-97.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"70.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"74.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"32.8528\" y=\"-87.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.9679</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 40&#45;&gt;38 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>40&#45;&gt;38</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M228.7752,-172.0626C201.1586,-157.7467 165.4433,-139.2325 136.5007,-124.2292\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"137.8495,-120.9861 127.3606,-119.4911 134.6279,-127.2007 137.8495,-120.9861\"/>\n",
"</g>\n",
"<!-- 39 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>39</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"272.8528\" cy=\"-97.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"255.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"259.3528\" y=\"-101.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">place</text>\n",
"<text text-anchor=\"start\" x=\"220.8528\" y=\"-87.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.3942</text>\n",
"</g>\n",
"<!-- 40&#45;&gt;39 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>40&#45;&gt;39</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M272.8528,-158.8996C272.8528,-150.5122 272.8528,-141.5843 272.8528,-133.2082\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"276.3529,-132.9756 272.8528,-122.9757 269.3529,-132.9757 276.3529,-132.9756\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 37 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>37</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"460.8528\" cy=\"-97.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"435.8528\" y=\"-101.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"439.8528\" y=\"-101.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">simmer</text>\n",
"<text text-anchor=\"start\" x=\"408.8528\" y=\"-87.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7959</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 40&#45;&gt;37 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>40&#45;&gt;37</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M316.9305,-172.0626C344.547,-157.7467 380.2623,-139.2325 409.2049,-124.2292\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"411.0778,-127.2007 418.345,-119.4911 407.8562,-120.9861 411.0778,-127.2007\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 36 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>36</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"142.8528,-36 26.8528,-36 26.8528,0 142.8528,0 142.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"66.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"70.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"34.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 38&#45;&gt;36 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>38&#45;&gt;36</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M84.8528,-71.8782C84.8528,-63.7122 84.8528,-54.6289 84.8528,-46.2824\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"88.3529,-46.2287 84.8528,-36.2288 81.3529,-46.2288 88.3529,-46.2287\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 34 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>34</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"330.8528,-36 214.8528,-36 214.8528,0 330.8528,0 330.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"253.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"257.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"222.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 39&#45;&gt;34 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>39&#45;&gt;34</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M272.8528,-71.8782C272.8528,-63.7122 272.8528,-54.6289 272.8528,-46.2824\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"276.3529,-46.2287 272.8528,-36.2288 269.3529,-46.2288 276.3529,-46.2287\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 35 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>35</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"518.8528,-36 402.8528,-36 402.8528,0 518.8528,0 518.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"437.8528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"441.8528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"410.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 37&#45;&gt;35 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>37&#45;&gt;35</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M460.8528,-71.8782C460.8528,-63.7122 460.8528,-54.6289 460.8528,-46.2824\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"464.3529,-46.2287 460.8528,-36.2288 457.3529,-46.2288 464.3529,-46.2287\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2019-12-01 14:04:07 +01:00
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"412pt\" height=\"347pt\"\n",
" viewBox=\"0.00 0.00 411.85 346.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 342.9117)\">\n",
2019-12-01 14:04:07 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-342.9117 407.8528,-342.9117 407.8528,4 -4,4\"/>\n",
"<!-- 48 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>48</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"223,-338.9117 103,-302.9117 223,-266.9117 343,-302.9117 223,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"209.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"213.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"171\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 46 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>46</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"129\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"114.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"118.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"77\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8198</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 48&#45;&gt;46 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>48&#45;&gt;46</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M196.0634,-274.9848C184.7417,-263.2469 171.508,-249.5266 159.8017,-237.39\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"162.2025,-234.8375 152.741,-230.0697 157.1642,-239.6971 162.2025,-234.8375\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 47 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>47</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"319\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"294\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"298\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">simmer</text>\n",
"<text text-anchor=\"start\" x=\"267\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7959</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 48&#45;&gt;47 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>48&#45;&gt;47</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M250.5097,-274.9848C262.0723,-263.2469 275.5876,-249.5266 287.5429,-237.39\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"290.2296,-239.65 294.7538,-230.0697 285.2427,-234.7376 290.2296,-239.65\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 45 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>45</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"125,-144 5,-108 125,-72 245,-108 125,-144\"/>\n",
"<text text-anchor=\"start\" x=\"111.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"115.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"73\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 46&#45;&gt;45 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>46&#45;&gt;45</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M127.949,-179.8505C127.6194,-171.8194 127.245,-162.6974 126.8762,-153.7127\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"130.3722,-153.5404 126.465,-143.6924 123.3781,-153.8276 130.3722,-153.5404\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 42 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>42</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-36 0,-36 0,0 116,0 116,-36\"/>\n",
"<text text-anchor=\"start\" x=\"38.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"42.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 45&#45;&gt;42 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>45&#45;&gt;42</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M103.0617,-78.5306C94.8707,-67.5278 85.6287,-55.1131 77.656,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"80.3576,-42.1713 71.5786,-36.2399 74.7426,-46.3513 80.3576,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 44 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>44</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"250,-36 134,-36 134,0 250,0 250,-36\"/>\n",
"<text text-anchor=\"start\" x=\"173.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"177.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"142\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 45&#45;&gt;44 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>45&#45;&gt;44</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M146.9383,-78.5306C155.1293,-67.5278 164.3713,-55.1131 172.344,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"175.2574,-46.3513 178.4214,-36.2399 169.6424,-42.1713 175.2574,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 43 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>43</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"379,-126 263,-126 263,-90 379,-90 379,-126\"/>\n",
"<text text-anchor=\"start\" x=\"298\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"302\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"271\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 47&#45;&gt;43 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>47&#45;&gt;43</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M319.5255,-179.8505C319.7994,-166.5006 320.1353,-150.1364 320.4172,-136.3988\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"323.9235,-136.1222 320.6295,-126.0525 316.925,-135.9785 323.9235,-136.1222\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
2019-11-08 10:47:58 +01:00
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"446pt\" height=\"737pt\"\n",
" viewBox=\"0.00 0.00 446.00 736.74\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 732.7351)\">\n",
2019-11-08 10:47:58 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-732.7351 442,-732.7351 442,4 -4,4\"/>\n",
"<!-- 64 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>64</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"202,-728.7351 82,-692.7351 202,-656.7351 322,-692.7351 202,-728.7351\"/>\n",
"<text text-anchor=\"start\" x=\"188.5\" y=\"-696.5351\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"192.5\" y=\"-696.5351\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"150\" y=\"-682.5351\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 59 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>59</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"108\" cy=\"-595.2792\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"93.5\" y=\"-599.0792\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"97.5\" y=\"-599.0792\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">beat</text>\n",
"<text text-anchor=\"start\" x=\"56\" y=\"-585.0792\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7344</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 64&#45;&gt;59 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>64&#45;&gt;59</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M175.0634,-664.8081C163.7417,-653.0703 150.508,-639.35 138.8017,-627.2133\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"141.2025,-624.6608 131.741,-619.8931 136.1642,-629.5205 141.2025,-624.6608\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 63 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>63</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"298\" cy=\"-595.2792\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"282\" y=\"-599.0792\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"286\" y=\"-599.0792\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bake</text>\n",
"<text text-anchor=\"start\" x=\"246\" y=\"-585.0792\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.4789</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 64&#45;&gt;63 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>64&#45;&gt;63</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M229.5097,-664.8081C241.0723,-653.0703 254.5876,-639.35 266.5429,-627.2133\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"269.2296,-629.4734 273.7538,-619.8931 264.2427,-624.561 269.2296,-629.4734\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 54 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>54</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"162,-515.8234 46,-515.8234 46,-479.8234 162,-479.8234 162,-515.8234\"/>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-501.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"96\" y=\"-501.6234\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">egg</text>\n",
"<text text-anchor=\"start\" x=\"54\" y=\"-487.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 59&#45;&gt;54 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>59&#45;&gt;54</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M106.949,-569.6738C106.4011,-556.324 105.7295,-539.9598 105.1656,-526.2222\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.6482,-525.7239 104.7409,-515.8758 101.6541,-526.011 108.6482,-525.7239\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 62 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>62</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"300,-533.8234 180,-497.8234 300,-461.8234 420,-497.8234 300,-533.8234\"/>\n",
"<text text-anchor=\"start\" x=\"286.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"290.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"248\" y=\"-487.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.2000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 63&#45;&gt;62 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>63&#45;&gt;62</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M298.5255,-569.6738C298.6869,-561.8102 298.8697,-552.9007 299.0503,-544.0982\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"302.554,-543.9528 299.26,-533.883 295.5554,-543.8091 302.554,-543.9528\"/>\n",
"</g>\n",
"<!-- 61 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>61</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"219\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"203\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7853</text>\n",
"</g>\n",
"<!-- 62&#45;&gt;61 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>62&#45;&gt;61</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M275.9166,-468.8473C266.5199,-457.5415 255.7039,-444.5281 246.0411,-432.9023\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"248.651,-430.5666 239.5674,-425.1133 243.2676,-435.041 248.651,-430.5666\"/>\n",
"</g>\n",
"<!-- 55 -->\n",
"<g id=\"node15\" class=\"node\">\n",
"<title>55</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"438,-418.3675 322,-418.3675 322,-382.3675 438,-382.3675 438,-418.3675\"/>\n",
"<text text-anchor=\"start\" x=\"359.5\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"363.5\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cheese</text>\n",
"<text text-anchor=\"start\" x=\"330\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
"</g>\n",
"<!-- 62&#45;&gt;55 -->\n",
"<g id=\"edge14\" class=\"edge\">\n",
"<title>62&#45;&gt;55</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M323.786,-468.8473C334.8472,-455.3726 347.8996,-439.4722 358.6416,-426.3863\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"361.3533,-428.5991 364.993,-418.6491 355.9428,-424.1577 361.3533,-428.5991\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 60 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>60</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"219,-338.9117 99,-302.9117 219,-266.9117 339,-302.9117 219,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"205.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"209.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.4286</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 61&#45;&gt;60 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>61&#45;&gt;60</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M219,-374.7622C219,-366.8985 219,-357.989 219,-349.1865\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"222.5001,-348.9713 219,-338.9713 215.5001,-348.9714 222.5001,-348.9713\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 52 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>52</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-223.4558 0,-223.4558 0,-187.4558 116,-187.4558 116,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"39.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"43.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 60&#45;&gt;52 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>60&#45;&gt;52</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M179.2022,-278.8215C153.9904,-263.5603 121.5502,-243.9238 96.5767,-228.8069\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"98.1082,-225.6428 87.741,-223.4585 94.4834,-231.6311 98.1082,-225.6428\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 58 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node9\" class=\"node\">\n",
"<title>58</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"219\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"204.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"208.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 60&#45;&gt;58 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge8\" class=\"edge\">\n",
"<title>60&#45;&gt;58</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M219,-266.8996C219,-258.5122 219,-249.5843 219,-241.2082\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"222.5001,-240.9756 219,-230.9757 215.5001,-240.9757 222.5001,-240.9756\"/>\n",
"</g>\n",
"<!-- 50 -->\n",
"<g id=\"node14\" class=\"node\">\n",
"<title>50</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"438,-223.4558 322,-223.4558 322,-187.4558 438,-187.4558 438,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"360.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"364.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"330\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 60&#45;&gt;50 -->\n",
"<g id=\"edge13\" class=\"edge\">\n",
"<title>60&#45;&gt;50</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M258.7978,-278.8215C284.0096,-263.5603 316.4498,-243.9238 341.4233,-228.8069\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"343.5166,-231.6311 350.259,-223.4585 339.8918,-225.6428 343.5166,-231.6311\"/>\n",
"</g>\n",
"<!-- 57 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node10\" class=\"node\">\n",
"<title>57</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"219,-144 99,-108 219,-72 339,-108 219,-144\"/>\n",
"<text text-anchor=\"start\" x=\"205.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"209.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 58&#45;&gt;57 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge9\" class=\"edge\">\n",
"<title>58&#45;&gt;57</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M219,-179.8505C219,-171.9868 219,-163.0773 219,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"222.5001,-154.0596 219,-144.0596 215.5001,-154.0597 222.5001,-154.0596\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 56 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node11\" class=\"node\">\n",
"<title>56</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"143,-36 27,-36 27,0 143,0 143,-36\"/>\n",
"<text text-anchor=\"start\" x=\"60\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"64\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">olive oil</text>\n",
"<text text-anchor=\"start\" x=\"35\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 57&#45;&gt;56 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge10\" class=\"edge\">\n",
"<title>57&#45;&gt;56</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M181.6735,-82.93C162.4671,-70.0301 139.1837,-54.3921 120.28,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"122.1859,-38.7595 111.9331,-36.0894 118.283,-44.5705 122.1859,-38.7595\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 51 -->\n",
"<g id=\"node12\" class=\"node\">\n",
"<title>51</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"277,-36 161,-36 161,0 277,0 277,-36\"/>\n",
"<text text-anchor=\"start\" x=\"196\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"200\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 57&#45;&gt;51 -->\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<title>57&#45;&gt;51</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M219,-71.9121C219,-63.3433 219,-54.3253 219,-46.1692\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"222.5001,-46.0539 219,-36.0539 215.5001,-46.0539 222.5001,-46.0539\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 53 -->\n",
"<g id=\"node13\" class=\"node\">\n",
"<title>53</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"411,-36 295,-36 295,0 411,0 411,-36\"/>\n",
"<text text-anchor=\"start\" x=\"317.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"321.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">garlic clove</text>\n",
"<text text-anchor=\"start\" x=\"303\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 57&#45;&gt;53 -->\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<title>57&#45;&gt;53</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M256.3265,-82.93C275.5329,-70.0301 298.8163,-54.3921 317.72,-41.6955\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"319.717,-44.5705 326.0669,-36.0894 315.8141,-38.7595 319.717,-44.5705\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
2019-11-08 10:47:58 +01:00
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"526pt\" height=\"434pt\"\n",
" viewBox=\"0.00 0.00 526.00 433.82\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 429.8234)\">\n",
2019-11-08 10:47:58 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-429.8234 522,-429.8234 522,4 -4,4\"/>\n",
"<!-- 74 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>74</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"178\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"162\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"166\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"126\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7125</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 73 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>73</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"178,-338.9117 58,-302.9117 178,-266.9117 298,-302.9117 178,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"164.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"168.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"126\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.2500</text>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"<!-- 74&#45;&gt;73 -->\n",
2019-11-08 10:47:58 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>74&#45;&gt;73</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M178,-374.7622C178,-366.8985 178,-357.989 178,-349.1865\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"181.5001,-348.9713 178,-338.9713 174.5001,-348.9714 181.5001,-348.9713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 66 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>66</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"156,-223.4558 40,-223.4558 40,-187.4558 156,-187.4558 156,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"78.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"82.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 73&#45;&gt;66 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>73&#45;&gt;66</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M154.214,-273.9356C143.1528,-260.4609 130.1004,-244.5605 119.3584,-231.4746\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"122.0572,-229.246 113.007,-223.7374 116.6467,-233.6875 122.0572,-229.246\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 72 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>72</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"259\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"244.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"248.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8920</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 73&#45;&gt;72 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>73&#45;&gt;72</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M202.0834,-273.9356C211.4801,-262.6298 222.2961,-249.6164 231.9589,-237.9906\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"234.7324,-240.1293 238.4326,-230.2016 229.349,-235.655 234.7324,-240.1293\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 71 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>71</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"259,-144 139,-108 259,-72 379,-108 259,-144\"/>\n",
"<text text-anchor=\"start\" x=\"245.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"249.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 72&#45;&gt;71 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>72&#45;&gt;71</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M259,-179.8505C259,-171.9868 259,-163.0773 259,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"262.5001,-154.0596 259,-144.0596 255.5001,-154.0597 262.5001,-154.0596\"/>\n",
"</g>\n",
"<!-- 68 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>68</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-36 0,-36 0,0 116,0 116,-36\"/>\n",
"<text text-anchor=\"start\" x=\"39.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"43.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 71&#45;&gt;68 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>71&#45;&gt;68</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M210.8555,-86.4428C179.7007,-72.4929 139.233,-54.373 107.7628,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.8625,-36.9395 98.3053,-36.0472 106.0018,-43.3283 108.8625,-36.9395\"/>\n",
"</g>\n",
"<!-- 69 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>69</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"250,-36 134,-36 134,0 250,0 250,-36\"/>\n",
"<text text-anchor=\"start\" x=\"179.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"183.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"142\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 71&#45;&gt;69 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>71&#45;&gt;69</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M237.0617,-78.5306C228.8707,-67.5278 219.6287,-55.1131 211.656,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"214.3576,-42.1713 205.5786,-36.2399 208.7426,-46.3513 214.3576,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 70 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>70</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"384,-36 268,-36 268,0 384,0 384,-36\"/>\n",
"<text text-anchor=\"start\" x=\"301\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"305\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">olive oil</text>\n",
"<text text-anchor=\"start\" x=\"276\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 71&#45;&gt;70 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>71&#45;&gt;70</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M280.9383,-78.5306C289.1293,-67.5278 298.3713,-55.1131 306.344,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"309.2574,-46.3513 312.4214,-36.2399 303.6424,-42.1713 309.2574,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 67 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node9\" class=\"node\">\n",
"<title>67</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"518,-36 402,-36 402,0 518,0 518,-36\"/>\n",
"<text text-anchor=\"start\" x=\"437\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"441\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"410\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 71&#45;&gt;67 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge8\" class=\"edge\">\n",
"<title>71&#45;&gt;67</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M307.1445,-86.4428C338.2993,-72.4929 378.767,-54.373 410.2372,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"411.9982,-43.3283 419.6947,-36.0472 409.1375,-36.9395 411.9982,-43.3283\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-12-01 14:04:07 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"410pt\" height=\"347pt\"\n",
" viewBox=\"0.00 0.00 409.85 346.91\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 342.9117)\">\n",
2019-12-01 14:04:07 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-342.9117 405.8528,-342.9117 405.8528,4 -4,4\"/>\n",
"<!-- 82 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>82</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"178.8528,-338.9117 58.8528,-302.9117 178.8528,-266.9117 298.8528,-302.9117 178.8528,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"165.3528\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"169.3528\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"126.8528\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 81 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>81</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"84.8528\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"70.3528\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"74.3528\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"32.8528\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 82&#45;&gt;81 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>82&#45;&gt;81</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M151.9162,-274.9848C140.5946,-263.2469 127.3608,-249.5266 115.6545,-237.39\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"118.0553,-234.8375 108.5939,-230.0697 113.017,-239.6971 118.0553,-234.8375\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 80 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>80</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"274.8528\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"258.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"262.8528\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"222.8528\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 82&#45;&gt;80 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>82&#45;&gt;80</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M206.3626,-274.9848C217.9251,-263.2469 231.4404,-249.5266 243.3958,-237.39\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"246.0824,-239.65 250.6066,-230.0697 241.0955,-234.7376 246.0824,-239.65\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 77 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>77</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"138.8528,-126 22.8528,-126 22.8528,-90 138.8528,-90 138.8528,-126\"/>\n",
"<text text-anchor=\"start\" x=\"57.8528\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"61.8528\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"30.8528\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 81&#45;&gt;77 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>81&#45;&gt;77</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M83.8019,-179.8505C83.2539,-166.5006 82.5823,-150.1364 82.0184,-136.3988\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"85.501,-135.9005 81.5938,-126.0525 78.5069,-136.1876 85.501,-135.9005\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 79 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>79</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"276.8528,-144 156.8528,-108 276.8528,-72 396.8528,-108 276.8528,-144\"/>\n",
"<text text-anchor=\"start\" x=\"263.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"267.3528\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"224.8528\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 80&#45;&gt;79 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>80&#45;&gt;79</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M275.3783,-179.8505C275.5397,-171.9868 275.7225,-163.0773 275.9032,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"279.4068,-154.1294 276.1128,-144.0596 272.4083,-153.9857 279.4068,-154.1294\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 76 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>76</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"267.8528,-36 151.8528,-36 151.8528,0 267.8528,0 267.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"190.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"194.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"159.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 79&#45;&gt;76 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>79&#45;&gt;76</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M254.9145,-78.5306C246.7235,-67.5278 237.4815,-55.1131 229.5088,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.2104,-42.1713 223.4314,-36.2399 226.5954,-46.3513 232.2104,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 78 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>78</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"401.8528,-36 285.8528,-36 285.8528,0 401.8528,0 401.8528,-36\"/>\n",
"<text text-anchor=\"start\" x=\"325.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"329.3528\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"293.8528\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 79&#45;&gt;78 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>79&#45;&gt;78</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M298.7911,-78.5306C306.9821,-67.5278 316.2242,-55.1131 324.1968,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"327.1102,-46.3513 330.2742,-36.2399 321.4952,-42.1713 327.1102,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-12-01 14:04:07 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"816pt\" height=\"542pt\"\n",
" viewBox=\"0.00 0.00 816.00 541.82\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 537.8234)\">\n",
2019-12-01 14:04:07 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-537.8234 812,-537.8234 812,4 -4,4\"/>\n",
"<!-- 97 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>97</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"518,-533.8234 398,-497.8234 518,-461.8234 638,-497.8234 518,-533.8234\"/>\n",
"<text text-anchor=\"start\" x=\"504.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"508.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"466\" y=\"-487.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 96 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>96</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"424\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"409.5\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"413.5\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">heat</text>\n",
"<text text-anchor=\"start\" x=\"372\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.9279</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 97&#45;&gt;96 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>97&#45;&gt;96</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M491.0634,-469.8964C479.7417,-458.1586 466.508,-444.4383 454.8017,-432.3016\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"457.2025,-429.7491 447.741,-424.9814 452.1642,-434.6088 457.2025,-429.7491\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 94 -->\n",
"<g id=\"node11\" class=\"node\">\n",
"<title>94</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"629\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"615\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"619\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cool</text>\n",
"<text text-anchor=\"start\" x=\"577\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.6073</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 97&#45;&gt;94 -->\n",
"<g id=\"edge10\" class=\"edge\">\n",
"<title>97&#45;&gt;94</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M548.6251,-470.9352C562.5942,-458.6705 579.2142,-444.0785 593.7057,-431.3552\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"596.3018,-433.7335 601.5072,-424.5057 591.6833,-428.4733 596.3018,-433.7335\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 95 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>95</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"389,-338.9117 269,-302.9117 389,-266.9117 509,-302.9117 389,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"375.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"379.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"337\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.5000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 96&#45;&gt;95 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>96&#45;&gt;95</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M414.8955,-375.0166C411.6108,-365.8704 407.8089,-355.2842 404.147,-345.0879\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"407.3746,-343.7196 400.7005,-335.4912 400.7865,-346.0856 407.3746,-343.7196\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 92 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>92</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"259\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"243\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"247\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.7929</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 95&#45;&gt;92 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>95&#45;&gt;92</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M354.5037,-277.0512C337.4379,-264.2576 316.7441,-248.7443 298.9884,-235.4336\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"300.6375,-232.2955 290.5368,-229.0977 296.4387,-237.8965 300.6375,-232.2955\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 85 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node10\" class=\"node\">\n",
"<title>85</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"478,-223.4558 362,-223.4558 362,-187.4558 478,-187.4558 478,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"397\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"401\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"370\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 95&#45;&gt;85 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge9\" class=\"edge\">\n",
"<title>95&#45;&gt;85</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M399.4952,-269.9176C403.2607,-258.0798 407.4677,-244.8541 411.0863,-233.4782\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"414.5186,-234.2342 414.2146,-223.6437 407.8479,-232.1122 414.5186,-234.2342\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 91 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node5\" class=\"node\">\n",
"<title>91</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"259,-144 139,-108 259,-72 379,-108 259,-144\"/>\n",
"<text text-anchor=\"start\" x=\"245.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"249.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"207\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.8333</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 92&#45;&gt;91 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge4\" class=\"edge\">\n",
"<title>92&#45;&gt;91</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M259,-179.8505C259,-171.9868 259,-163.0773 259,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"262.5001,-154.0596 259,-144.0596 255.5001,-154.0597 262.5001,-154.0596\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 84 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>84</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-36 0,-36 0,0 116,0 116,-36\"/>\n",
"<text text-anchor=\"start\" x=\"38.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"42.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 91&#45;&gt;84 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>91&#45;&gt;84</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M210.8555,-86.4428C179.7007,-72.4929 139.233,-54.373 107.7628,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.8625,-36.9395 98.3053,-36.0472 106.0018,-43.3283 108.8625,-36.9395\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 86 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node7\" class=\"node\">\n",
"<title>86</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"250,-36 134,-36 134,0 250,0 250,-36\"/>\n",
"<text text-anchor=\"start\" x=\"173.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"177.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"142\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 91&#45;&gt;86 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge6\" class=\"edge\">\n",
"<title>91&#45;&gt;86</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M237.0617,-78.5306C228.8707,-67.5278 219.6287,-55.1131 211.656,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"214.3576,-42.1713 205.5786,-36.2399 208.7426,-46.3513 214.3576,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 88 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>88</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"384,-36 268,-36 268,0 384,0 384,-36\"/>\n",
"<text text-anchor=\"start\" x=\"301\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"305\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">olive oil</text>\n",
"<text text-anchor=\"start\" x=\"276\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 91&#45;&gt;88 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>91&#45;&gt;88</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M280.9383,-78.5306C289.1293,-67.5278 298.3713,-55.1131 306.344,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"309.2574,-46.3513 312.4214,-36.2399 303.6424,-42.1713 309.2574,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 89 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node9\" class=\"node\">\n",
"<title>89</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"518,-36 402,-36 402,0 518,0 518,-36\"/>\n",
"<text text-anchor=\"start\" x=\"424.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"428.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">garlic clove</text>\n",
"<text text-anchor=\"start\" x=\"410\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 91&#45;&gt;89 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge8\" class=\"edge\">\n",
"<title>91&#45;&gt;89</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M307.1445,-86.4428C338.2993,-72.4929 378.767,-54.373 410.2372,-40.2818\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"411.9982,-43.3283 419.6947,-36.0472 409.1375,-36.9395 411.9982,-43.3283\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 93 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node12\" class=\"node\">\n",
"<title>93</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"647,-338.9117 527,-302.9117 647,-266.9117 767,-302.9117 647,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"633.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"637.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"595\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 94&#45;&gt;93 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge11\" class=\"edge\">\n",
"<title>94&#45;&gt;93</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M633.7293,-374.7622C635.2898,-366.3134 637.0732,-356.6573 638.8156,-347.2238\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"642.303,-347.6119 640.6776,-337.1425 635.4195,-346.3405 642.303,-347.6119\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 87 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node13\" class=\"node\">\n",
"<title>87</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"674,-223.4558 558,-223.4558 558,-187.4558 674,-187.4558 674,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"603.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"607.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"566\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 93&#45;&gt;87 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge12\" class=\"edge\">\n",
"<title>93&#45;&gt;87</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M636.5048,-269.9176C632.7393,-258.0798 628.5323,-244.8541 624.9137,-233.4782\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"628.1521,-232.1122 621.7854,-223.6437 621.4814,-234.2342 628.1521,-232.1122\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 90 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node14\" class=\"node\">\n",
"<title>90</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"808,-223.4558 692,-223.4558 692,-187.4558 808,-187.4558 808,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"738\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"742\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">egg</text>\n",
"<text text-anchor=\"start\" x=\"700\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 93&#45;&gt;90 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge13\" class=\"edge\">\n",
"<title>93&#45;&gt;90</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M675.9653,-275.5055C690.7255,-261.5398 708.5618,-244.6635 723.0288,-230.9753\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"725.8201,-233.1526 730.6784,-223.7374 721.009,-228.0679 725.8201,-233.1526\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-12-01 14:04:07 +01:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: %3 Pages: 1 -->\n",
"<svg width=\"425pt\" height=\"542pt\"\n",
" viewBox=\"0.00 0.00 424.85 541.82\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 537.8234)\">\n",
2019-12-01 14:04:07 +01:00
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-537.8234 420.8528,-537.8234 420.8528,4 -4,4\"/>\n",
"<!-- 108 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node1\" class=\"node\">\n",
"<title>108</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"236,-533.8234 116,-497.8234 236,-461.8234 356,-497.8234 236,-533.8234\"/>\n",
"<text text-anchor=\"start\" x=\"222.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"226.5\" y=\"-501.6234\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"184\" y=\"-487.6234\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 107 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node2\" class=\"node\">\n",
"<title>107</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"142\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"126\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"130\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cook</text>\n",
"<text text-anchor=\"start\" x=\"90\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.9182</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 108&#45;&gt;107 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge1\" class=\"edge\">\n",
"<title>108&#45;&gt;107</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M209.0634,-469.8964C197.7417,-458.1586 184.508,-444.4383 172.8017,-432.3016\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"175.2025,-429.7491 165.741,-424.9814 170.1642,-434.6088 175.2025,-429.7491\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 103 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>103</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"332\" cy=\"-400.3675\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"318\" y=\"-404.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"322\" y=\"-404.1675\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">cool</text>\n",
"<text text-anchor=\"start\" x=\"280\" y=\"-390.1675\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.5490</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 108&#45;&gt;103 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>108&#45;&gt;103</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M263.5097,-469.8964C275.0723,-458.1586 288.5876,-444.4383 300.5429,-432.3016\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"303.2296,-434.5617 307.7538,-424.9814 298.2427,-429.6493 303.2296,-434.5617\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 106 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node3\" class=\"node\">\n",
"<title>106</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"138,-338.9117 18,-302.9117 138,-266.9117 258,-302.9117 138,-338.9117\"/>\n",
"<text text-anchor=\"start\" x=\"124.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"128.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"86\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 107&#45;&gt;106 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge2\" class=\"edge\">\n",
"<title>107&#45;&gt;106</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M140.949,-374.7622C140.6194,-366.7311 140.245,-357.6091 139.8762,-348.6244\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"143.3722,-348.4521 139.465,-338.6041 136.3781,-348.7393 143.3722,-348.4521\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 99 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node4\" class=\"node\">\n",
"<title>99</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"116,-223.4558 0,-223.4558 0,-187.4558 116,-187.4558 116,-223.4558\"/>\n",
"<text text-anchor=\"start\" x=\"38.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"42.5\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">bacon</text>\n",
"<text text-anchor=\"start\" x=\"8\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 106&#45;&gt;99 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge3\" class=\"edge\">\n",
"<title>106&#45;&gt;99</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M114.214,-273.9356C103.1528,-260.4609 90.1004,-244.5605 79.3584,-231.4746\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"82.0572,-229.246 73.007,-223.7374 76.6467,-233.6875 82.0572,-229.246\"/>\n",
"</g>\n",
"<!-- 105 -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>105</title>\n",
"<ellipse fill=\"#dae8fc\" stroke=\"#dae8fc\" cx=\"219\" cy=\"-205.4558\" rx=\"84.7059\" ry=\"25.4118\"/>\n",
"<text text-anchor=\"start\" x=\"194\" y=\"-209.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"198\" y=\"-209.2558\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">simmer</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-195.2558\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 0.6840</text>\n",
"</g>\n",
"<!-- 106&#45;&gt;105 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>106&#45;&gt;105</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M162.0834,-273.9356C171.4801,-262.6298 182.2961,-249.6164 191.9589,-237.9906\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"194.7324,-240.1293 198.4326,-230.2016 189.349,-235.655 194.7324,-240.1293\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 104 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node6\" class=\"node\">\n",
"<title>104</title>\n",
"<polygon fill=\"#d5e8d4\" stroke=\"#d5e8d4\" points=\"219,-144 99,-108 219,-72 339,-108 219,-144\"/>\n",
"<text text-anchor=\"start\" x=\"205.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"209.5\" y=\"-111.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"<text text-anchor=\"start\" x=\"167\" y=\"-97.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score: 1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 105&#45;&gt;104 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge5\" class=\"edge\">\n",
"<title>105&#45;&gt;104</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M219,-179.8505C219,-171.9868 219,-163.0773 219,-154.2748\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"222.5001,-154.0596 219,-144.0596 215.5001,-154.0597 222.5001,-154.0596\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 100 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>100</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"210,-36 94,-36 94,0 210,0 210,-36\"/>\n",
"<text text-anchor=\"start\" x=\"129\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"133\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">tomato</text>\n",
"<text text-anchor=\"start\" x=\"102\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 104&#45;&gt;100 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>104&#45;&gt;100</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M197.0617,-78.5306C188.8707,-67.5278 179.6287,-55.1131 171.656,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"174.3576,-42.1713 165.5786,-36.2399 168.7426,-46.3513 174.3576,-42.1713\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 101 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node8\" class=\"node\">\n",
"<title>101</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"344,-36 228,-36 228,0 344,0 344,-36\"/>\n",
"<text text-anchor=\"start\" x=\"267.5\" y=\"-21.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"271.5\" y=\"-21.8\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">onion</text>\n",
"<text text-anchor=\"start\" x=\"236\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 104&#45;&gt;101 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge7\" class=\"edge\">\n",
"<title>104&#45;&gt;101</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M240.9383,-78.5306C249.1293,-67.5278 258.3713,-55.1131 266.344,-44.4036\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"269.2574,-46.3513 272.4214,-36.2399 263.6424,-42.1713 269.2574,-46.3513\"/>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 102 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"node10\" class=\"node\">\n",
"<title>102</title>\n",
"<polygon fill=\"#ffe6cc\" stroke=\"#ffe6cc\" points=\"392,-320.9117 276,-320.9117 276,-284.9117 392,-284.9117 392,-320.9117\"/>\n",
"<text text-anchor=\"start\" x=\"321.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n",
"<text text-anchor=\"start\" x=\"325.5\" y=\"-306.7117\" font-family=\"Times,serif\" font-weight=\"bold\" font-size=\"14.00\" fill=\"#000000\">salt</text>\n",
"<text text-anchor=\"start\" x=\"284\" y=\"-292.7117\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">node score:1.0000</text>\n",
2019-12-01 14:04:07 +01:00
"</g>\n",
"<!-- 103&#45;&gt;102 -->\n",
2019-12-01 14:04:07 +01:00
"<g id=\"edge9\" class=\"edge\">\n",
"<title>103&#45;&gt;102</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M332.5255,-374.7622C332.7994,-361.4123 333.1353,-345.0481 333.4172,-331.3105\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"336.9235,-331.0339 333.6295,-320.9642 329.925,-330.8902 336.9235,-331.0339\"/>\n",
2019-11-08 10:47:58 +01:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fe0be49b390>"
2019-11-08 10:47:58 +01:00
]
},
"metadata": {},
2019-12-01 14:04:07 +01:00
"output_type": "display_data"
2019-11-08 10:47:58 +01:00
}
],
"source": [
2019-12-01 14:04:07 +01:00
"p.plot_population(collect_scores=False)"
2019-11-08 10:47:58 +01:00
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"file_extension": ".py",
"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",
2019-12-01 14:04:07 +01:00
"version": "3.7.5"
2019-11-08 10:47:58 +01:00
},
"mimetype": "text/x-python",
"name": "python",
"npconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"nbformat": 4,
"nbformat_minor": 4
2019-12-01 14:04:07 +01:00
}