master-thesis/EvolutionaryAlgorithm/EvolutionaryAlgorithm.ipynb

2541 lines
111 KiB
Plaintext
Raw Normal View History

2019-09-05 12:03:01 +02:00
{
"cells": [
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evolutionary Algorithm"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 104,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [
{
"data": {
"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",
" "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import sys\n",
"sys.path.append(\"../\")\n",
"sys.path.append(\"../RecipeAnalysis/\")\n",
"\n",
"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",
"from difflib import SequenceMatcher\n",
"\n",
"import numpy as np\n",
"\n",
"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",
"from copy import deepcopy"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## load adjacency matrices"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 105,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"m_act = pickle.load(open(\"m_act.pickle\", \"rb\"))\n",
"m_mix = pickle.load(open(\"m_mix.pickle\", \"rb\"))\n",
"m_base_act = pickle.load(open(\"m_base_act.pickle\", \"rb\"))\n",
"m_base_mix = pickle.load(open(\"m_base_mix.pickle\", \"rb\"))\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"
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 106,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
"actions = m_act.get_labels()[0]"
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 107,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
"base_ingredients = m_base_mix.get_labels()"
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 108,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
2019-09-19 10:19:35 +02:00
"source": [
"sym_label_buffer = {}\n",
"fw_label_buffer = {}\n",
"bw_label_buffer = {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2019-10-06 20:08:25 +02:00
"### helper functions for adjacency matrices"
2019-09-19 10:19:35 +02:00
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 109,
2019-09-19 10:19:35 +02:00
"metadata": {},
"outputs": [],
2019-09-05 12:03:01 +02:00
"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",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \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",
2019-10-06 20:08:25 +02:00
"execution_count": 110,
2019-09-05 12:03:01 +02:00
"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",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \n",
" counts = c[index, i].toarray().flatten()\n",
" \n",
" s = np.argsort(-counts)\n",
" \n",
" return names[s], counts[s]"
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 111,
2019-09-05 12:03:01 +02:00
"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",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \n",
" counts = c[i, index].toarray().flatten()\n",
" \n",
" s = np.argsort(-counts)\n",
" \n",
" return names[s], counts[s]"
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 112,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array(['heat', 'simmer', 'cook', 'bake', 'boil', 'place', 'cut', 'slice',\n",
" 'chop', 'dice', 'pour', 'drain', 'cool', 'refrigerate', 'thicken',\n",
" 'warm', 'chill', 'brown', 'blend', 'spread', 'grill', 'fry',\n",
" 'saute', 'mash', 'melt', 'whisk', 'peel', 'freeze', 'wash',\n",
" 'grate', 'squeeze', 'broil', 'marinate', 'skim', 'soak', 'mince',\n",
" 'break', 'open', 'sour', 'thaw', 'beat', 'wipe', 'carve', 'curdle'],\n",
" dtype='<U11'),\n",
" array([141, 116, 108, 67, 62, 50, 42, 40, 35, 28, 26, 26, 25,\n",
" 25, 20, 19, 17, 16, 15, 13, 12, 10, 10, 8, 7, 7,\n",
" 6, 6, 5, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1,\n",
" 1, 1, 1, 1, 1]))"
]
},
"execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_backward_adjacent(\"tomato\", m_base_act, c_base_act)"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array(['cook', 'heat', 'simmer', 'boil', 'bake', 'place', 'cool', 'brown',\n",
" 'warm', 'drain', 'pour', 'spread', 'cut', 'chill', 'chop',\n",
" 'refrigerate', 'steam', 'soak', 'thicken', 'rinse', 'fry', 'wash',\n",
" 'blend', 'saute', 'freeze', 'slice', 'thaw', 'break', 'melt',\n",
" 'whisk', 'open', 'whip', 'scorch', 'peel', 'burn', 'baste',\n",
" 'broil', 'marinate', 'squeeze', 'skim', 'grind'], dtype='<U11'),\n",
" array([121, 108, 61, 47, 42, 38, 27, 26, 20, 18, 16, 14, 13,\n",
" 13, 10, 10, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4,\n",
" 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1]))"
]
},
"execution_count": 113,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_backward_adjacent(\"rice\", m_base_act, c_base_act)"
]
},
{
"cell_type": "code",
"execution_count": 114,
2019-09-05 12:03:01 +02:00
"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])"
]
},
2019-10-06 20:08:25 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### different score functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### normalizations"
]
},
{
"cell_type": "code",
"execution_count": 115,
"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",
"execution_count": 116,
"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",
" "
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 117,
2019-09-05 12:03:01 +02: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))"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Recipe Tree\n",
"### Tree Node Base Class"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 118,
2019-09-05 12:03:01 +02: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",
" 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",
" "
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Mix Node"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 119,
2019-09-05 12:03:01 +02: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\"{self._name} ({self.node_score()})\", shape=\"diamond\")\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",
2019-09-19 10:19:35 +02:00
" \n",
" tmp_set = set()\n",
" cumulative_sets = []\n",
" \n",
2019-09-05 12:03:01 +02:00
" pairwise_tuples = []\n",
2019-09-19 10:19:35 +02:00
" \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",
2019-09-05 12:03:01 +02:00
" \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",
2019-10-06 20:08:25 +02:00
" \n",
" #s += sym_score(ing_a.to_json(), ing_b.to_json(), m_mix, c_mix)\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",
" \n",
" s += 0.5 * p1 + 0.5 * p2\n",
" \n",
2019-09-05 12:03:01 +02:00
" except:\n",
" 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",
" "
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Ingredient Node Class"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 120,
2019-09-05 12:03:01 +02: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",
2019-09-19 10:19:35 +02:00
" a_list = []\n",
2019-09-05 12:03:01 +02:00
" n = self.parent()\n",
" while n is not None:\n",
" if type(n) == ActionNode:\n",
2019-09-19 10:19:35 +02:00
" a_list.append(n.name())\n",
" n = n.parent()\n",
" return a_list\n",
2019-09-05 12:03:01 +02:00
" \n",
" def mutate_node(self):\n",
" self._name = random.choice(base_ingredients)\n",
2019-10-06 20:08:25 +02:00
" #TODO: change w.r.t. mixing probabilities \n",
2019-09-05 12:03:01 +02:00
" \n",
" def traverse_ingredients(self):\n",
" return [Ingredient(self._name)]\n",
" \n",
" def node_score(self):\n",
2019-09-19 10:19:35 +02:00
" actions = self.get_actions()\n",
" \n",
" if len(actions) == 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",
" return len(seen_actions) / len(actions)\n",
2019-09-05 12:03:01 +02:00
" \n",
" \n",
" def dot_node(self, dot):\n",
" dot.node(self._id, label=f\"{self._name} ({self.node_score()})\", shape=\"box\")"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Action Node Class"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 121,
2019-09-05 12:03:01 +02: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",
2019-10-06 20:08:25 +02:00
" #score = asym_score(self._name, ing.to_json(), m_act, c_act)\n",
2019-09-05 12:03:01 +02:00
" #base_score = asym_score(self._name, ing._base_ingredient, m_base_act, c_base_act)\n",
2019-10-06 20:08:25 +02:00
" \n",
" score = fw_p_a_given_b(self._name, ing._base_ingredient, m_base_act, c_base_act)\n",
" \n",
2019-09-05 12:03:01 +02:00
" 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\"{self._name} ({self.node_score()})\", shape=\"ellipse\")"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Tree Class"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 122,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
"class Tree(object):\n",
" \n",
" @staticmethod\n",
" def from_ingredients(ingredients: list):\n",
" root = MixNode()\n",
" \n",
" for ing in ingredients:\n",
" root.add_child(IngredientNode(ing, constant=True))\n",
" \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",
2019-09-19 10:19:35 +02:00
" def collect_scores(self):\n",
" self._mix_scores = []\n",
" self._act_scores = []\n",
" self._ing_scores = []\n",
2019-09-05 12:03:01 +02:00
" \n",
" nodes = self.root().traverse()\n",
2019-09-19 10:19:35 +02:00
" self._n_mix_nodes = 0\n",
" self._n_act_nodes = 0\n",
" self._n_ing_nodes = 0\n",
" \n",
2019-09-05 12:03:01 +02:00
" s = 0\n",
" for n in nodes:\n",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \n",
2019-09-19 10:19:35 +02:00
" self._n_duplicates = 0\n",
2019-09-05 12:03:01 +02:00
" seen_actions = set()\n",
" \n",
" for n in nodes:\n",
" if type(n) == ActionNode:\n",
" if n.name() in seen_actions:\n",
2019-09-19 10:19:35 +02:00
" self._n_duplicates += 1\n",
2019-09-05 12:03:01 +02:00
" else:\n",
" seen_actions.add(n.name())\n",
" \n",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \n",
2019-09-19 10:19:35 +02:00
" \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",
2019-09-05 12:03:01 +02:00
" \n",
" def copy(self):\n",
" return Tree.from_serialization(self.serialize())\n"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Population"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 123,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
"class Population(object):\n",
" def __init__(self, start_ingredients, n_population = 10):\n",
" self.population = [Tree.from_ingredients(start_ingredients) for i in range(n_population)]\n",
" self._n = n_population\n",
2019-09-19 10:19:35 +02:00
" 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",
2019-09-05 12:03:01 +02:00
" \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",
2019-09-19 10:19:35 +02:00
" indices = list(range(len(self.population)))\n",
" random.shuffle(indices)\n",
2019-09-05 12:03:01 +02:00
" \n",
2019-09-19 10:19:35 +02:00
" for i in range(len(self.population) // 2):\n",
" i_a = indices[2*i]\n",
" i_b = indices[2*i+1]\n",
2019-09-05 12:03:01 +02:00
" \n",
2019-09-19 10:19:35 +02:00
" if self._scores[i_a] > self._scores[i_b]:\n",
" new_population.append(self.population[i_a])\n",
2019-09-05 12:03:01 +02:00
" else:\n",
2019-09-19 10:19:35 +02:00
" new_population.append(self.population[i_b])\n",
2019-09-05 12:03:01 +02:00
" \n",
" self.population = new_population\n",
" \n",
2019-09-19 10:19:35 +02:00
" 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",
" return np.average(mix_scores) * np.average(act_scores) * np.average(ing_scores)\n",
" \n",
" \n",
" \n",
" def collect_scores(self):\n",
" for tree in self.population:\n",
" 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",
" \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",
" \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",
" self._scores.append(self.single_score(self._mix_scores[i], self._act_scores[i], self.population[i].ing_scores()))\n",
" self._scores = np.array(self._scores)\n",
" \n",
2019-09-05 12:03:01 +02:00
" def run(self, n=50):\n",
" for i in range(n):\n",
" print(i)\n",
" self.mutate()\n",
2019-09-19 10:19:35 +02:00
" self.mutate()\n",
" self.collect_scores()\n",
" #self.pairwise_competition()\n",
" #self.collect_scores()\n",
" self.hold_best(self._n)\n",
" \n",
" \n",
2019-09-05 12:03:01 +02:00
" \n",
" def plot_population(self):\n",
2019-09-19 10:19:35 +02:00
" self.collect_scores()\n",
" #print(self._mix_scores)\n",
" #print(self._act_scores)\n",
" #print(self._scores)\n",
" for i, t in enumerate(self.population):\n",
" print(self._scores[i])\n",
2019-09-05 12:03:01 +02:00
" display(t.root().dot())"
]
},
2019-09-19 10:19:35 +02:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run Evolutionary Algorithm"
]
},
2019-09-05 12:03:01 +02:00
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 150,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [],
"source": [
2019-10-06 20:08:25 +02:00
"p = Population([\"noodle\",\"tomato\", \"onion\"])"
2019-09-05 12:03:01 +02:00
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 154,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
2019-10-06 20:08:25 +02:00
"4\n"
2019-09-05 12:03:01 +02:00
]
}
],
"source": [
2019-10-06 20:08:25 +02:00
"p.run(5)"
2019-09-05 12:03:01 +02:00
]
},
{
"cell_type": "code",
2019-10-06 20:08:25 +02:00
"execution_count": 155,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1.])"
]
},
"execution_count": 155,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p.population[0].action_scores()"
]
},
{
"cell_type": "code",
"execution_count": 156,
2019-09-05 12:03:01 +02:00
"metadata": {},
"outputs": [
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.27112203844434507\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"422pt\" height=\"260pt\"\n",
" viewBox=\"0.00 0.00 422.27 260.00\" 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 256)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-256 418.2717,-256 418.2717,4 -4,4\"/>\n",
"<!-- 3727 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3727</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"269.7717,-252 207.2663,-234 269.7717,-216 332.2771,-234 269.7717,-252\"/>\n",
"<text text-anchor=\"middle\" x=\"269.7717\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3730 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3730</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"161.7717,-180 .228,-162 161.7717,-144 323.3154,-162 161.7717,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.22564102564102564)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3727&#45;&gt;3730 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3727&#45;&gt;3730</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M250.7121,-221.2936C234.9244,-210.7685 212.154,-195.5882 193.6056,-183.2226\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"195.4171,-180.2238 185.1551,-177.589 191.5342,-186.0482 195.4171,-180.2238\"/>\n",
"</g>\n",
"<!-- 3728 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>3728</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"414.2717,-180 341.2717,-180 341.2717,-144 414.2717,-144 414.2717,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"377.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3727&#45;&gt;3728 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>3727&#45;&gt;3728</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M288.8313,-221.2936C303.5067,-211.51 324.2156,-197.704 341.9586,-185.8754\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"344.0121,-188.7129 350.3911,-180.2537 340.1291,-182.8886 344.0121,-188.7129\"/>\n",
"</g>\n",
"<!-- 3731 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3731</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"114.7717,-108 40.7717,-108 40.7717,-72 114.7717,-72 114.7717,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"77.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3730&#45;&gt;3731 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3730&#45;&gt;3731</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M143.1294,-146.0209C132.4241,-136.8449 118.7503,-125.1245 106.6795,-114.7781\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"108.8965,-112.0686 99.0261,-108.2181 104.3409,-117.3834 108.8965,-112.0686\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3732 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3732</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"245.7717\" cy=\"-90\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"245.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9999999999999999)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3730&#45;&gt;3732 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3730&#45;&gt;3732</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M180.414,-146.0209C191.2779,-136.709 205.1989,-124.7767 217.3993,-114.3192\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"219.8039,-116.8679 225.1187,-107.7025 215.2484,-111.5531 219.8039,-116.8679\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3733 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3733</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"284.2717,-36 207.2717,-36 207.2717,0 284.2717,0 284.2717,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"245.7717\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3732&#45;&gt;3733 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3732&#45;&gt;3733</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M245.7717,-71.8314C245.7717,-64.131 245.7717,-54.9743 245.7717,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"249.2718,-46.4132 245.7717,-36.4133 242.2718,-46.4133 249.2718,-46.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.2576130268096809\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"472pt\" height=\"476pt\"\n",
" viewBox=\"0.00 0.00 472.14 476.00\" 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 472)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-472 468.1396,-472 468.1396,4 -4,4\"/>\n",
"<!-- 3716 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3716</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"313.6396\" cy=\"-450\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"313.6396\" y=\"-446.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9219858156028368)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3717 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3717</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"313.6396\" cy=\"-378\" rx=\"112.3801\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"313.6396\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">bake (0.5054716884821958)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3716&#45;&gt;3717 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3716&#45;&gt;3717</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M313.6396,-431.8314C313.6396,-424.131 313.6396,-414.9743 313.6396,-406.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"317.1397,-406.4132 313.6396,-396.4133 310.1397,-406.4133 317.1397,-406.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3718 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3718</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"313.6396,-324 251.1342,-306 313.6396,-288 376.1449,-306 313.6396,-324\"/>\n",
"<text text-anchor=\"middle\" x=\"313.6396\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3717&#45;&gt;3718 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3717&#45;&gt;3718</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M313.6396,-359.8314C313.6396,-352.131 313.6396,-342.9743 313.6396,-334.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"317.1397,-334.4132 313.6396,-324.4133 310.1397,-334.4133 317.1397,-334.4132\"/>\n",
"</g>\n",
"<!-- 3721 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>3721</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"220.6396\" cy=\"-234\" rx=\"123.4781\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"220.6396\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">simmer (0.6899063929501801)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3718&#45;&gt;3721 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>3718&#45;&gt;3721</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M296.5819,-292.7941C284.0164,-283.066 266.5782,-269.5654 251.5807,-257.9544\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"253.5962,-255.0885 243.5463,-251.7342 249.3109,-260.6236 253.5962,-255.0885\"/>\n",
"</g>\n",
"<!-- 3719 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>3719</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"414.6396\" cy=\"-234\" rx=\"45.4919\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"414.6396\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cut (0.25)</text>\n",
"</g>\n",
"<!-- 3718&#45;&gt;3719 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>3718&#45;&gt;3719</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M331.6963,-293.1278C346.1918,-282.7945 366.8717,-268.0523 383.9556,-255.8737\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"386.3987,-258.4304 392.5098,-249.7757 382.3353,-252.7305 386.3987,-258.4304\"/>\n",
"</g>\n",
"<!-- 3722 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3722</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"206.6396,-180 50.6257,-162 206.6396,-144 362.6534,-162 206.6396,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"206.6396\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.3897435897435897)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3721&#45;&gt;3722 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3721&#45;&gt;3722</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M217.1068,-215.8314C215.5697,-207.9266 213.7343,-198.4872 212.0328,-189.7365\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"215.4672,-189.0615 210.1227,-179.9134 208.5958,-190.3976 215.4672,-189.0615\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3726 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3726</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"117.6396\" cy=\"-90\" rx=\"117.7793\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"117.6396\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">chop (0.21089630931458697)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3722&#45;&gt;3726 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3722&#45;&gt;3726</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M186.8876,-146.0209C175.2674,-136.6203 160.3462,-124.5492 147.332,-114.0208\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"149.4977,-111.2709 139.5218,-107.7025 145.095,-116.7131 149.4977,-111.2709\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3723 -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>3723</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"338.1396,-108 253.1396,-108 253.1396,-72 338.1396,-72 338.1396,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"295.6396\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3722&#45;&gt;3723 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>3722&#45;&gt;3723</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M226.3915,-146.0209C237.734,-136.8449 252.2218,-125.1245 265.011,-114.7781\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"267.5468,-117.2287 273.12,-108.2181 263.1442,-111.7865 267.5468,-117.2287\"/>\n",
"</g>\n",
"<!-- 3724 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>3724</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"156.1396,-36 79.1396,-36 79.1396,0 156.1396,0 156.1396,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"117.6396\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
"</g>\n",
"<!-- 3726&#45;&gt;3724 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>3726&#45;&gt;3724</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M117.6396,-71.8314C117.6396,-64.131 117.6396,-54.9743 117.6396,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"121.1397,-46.4132 117.6396,-36.4133 114.1397,-46.4133 121.1397,-46.4132\"/>\n",
"</g>\n",
"<!-- 3720 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>3720</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"464.1396,-180 381.1396,-180 381.1396,-144 464.1396,-144 464.1396,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"422.6396\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
"</g>\n",
"<!-- 3719&#45;&gt;3720 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>3719&#45;&gt;3720</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M416.6583,-215.8314C417.5139,-208.131 418.5313,-198.9743 419.4822,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"422.9678,-190.7386 420.5936,-180.4133 416.0106,-189.9656 422.9678,-190.7386\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.23576471183610126\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"444pt\" height=\"188pt\"\n",
" viewBox=\"0.00 0.00 444.22 188.00\" 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 184)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-184 440.2175,-184 440.2175,4 -4,4\"/>\n",
"<!-- 3403 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3403</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"160.4458,-180 97.9404,-162 160.4458,-144 222.9512,-162 160.4458,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"160.4458\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3404 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3404</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"47.4458\" cy=\"-90\" rx=\"47.3916\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"47.4458\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3403&#45;&gt;3404 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3403&#45;&gt;3404</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M140.7627,-149.4586C124.2026,-138.907 100.1684,-123.5932 80.639,-111.1497\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"82.3404,-108.0836 72.0261,-105.6618 78.5788,-113.9871 82.3404,-108.0836\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3407 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3407</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"274.4458,-108 112.9021,-90 274.4458,-72 435.9895,-90 274.4458,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"274.4458\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.20029027576197386)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3403&#45;&gt;3407 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3403&#45;&gt;3407</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M180.0431,-149.6228C196.9012,-138.9755 221.5744,-123.3924 241.4689,-110.8275\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"243.3603,-113.7726 249.9462,-105.4734 239.6223,-107.8542 243.3603,-113.7726\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3406 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>3406</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"88.9458,-36 5.9458,-36 5.9458,0 88.9458,0 88.9458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"47.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3404&#45;&gt;3406 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>3404&#45;&gt;3406</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M47.4458,-71.8314C47.4458,-64.131 47.4458,-54.9743 47.4458,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"50.9459,-46.4132 47.4458,-36.4133 43.9459,-46.4133 50.9459,-46.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3409 -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>3409</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"262.9458,-36 195.9458,-36 195.9458,0 262.9458,0 262.9458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"229.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3407&#45;&gt;3409 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>3407&#45;&gt;3409</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M263.7814,-72.937C258.5423,-64.5544 252.1063,-54.2569 246.228,-44.8516\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"249.0883,-42.8242 240.8203,-36.1992 243.1523,-46.5342 249.0883,-42.8242\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3408 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3408</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"355.4458,-36 281.4458,-36 281.4458,0 355.4458,0 355.4458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"318.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3407&#45;&gt;3408 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3407&#45;&gt;3408</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M284.8732,-72.937C289.9959,-64.5544 296.2888,-54.2569 302.0365,-44.8516\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"305.096,-46.5571 307.3241,-36.1992 299.123,-42.9069 305.096,-46.5571\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.23576471183610126\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"444pt\" height=\"188pt\"\n",
" viewBox=\"0.00 0.00 444.22 188.00\" 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 184)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-184 440.2175,-184 440.2175,4 -4,4\"/>\n",
"<!-- 3708 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3708</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"160.4458,-180 97.9404,-162 160.4458,-144 222.9512,-162 160.4458,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"160.4458\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3709 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3709</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"47.4458\" cy=\"-90\" rx=\"47.3916\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"47.4458\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3708&#45;&gt;3709 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3708&#45;&gt;3709</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M140.7627,-149.4586C124.2026,-138.907 100.1684,-123.5932 80.639,-111.1497\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"82.3404,-108.0836 72.0261,-105.6618 78.5788,-113.9871 82.3404,-108.0836\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3712 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3712</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"274.4458,-108 112.9021,-90 274.4458,-72 435.9895,-90 274.4458,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"274.4458\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.20029027576197386)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3708&#45;&gt;3712 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3708&#45;&gt;3712</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M180.0431,-149.6228C196.9012,-138.9755 221.5744,-123.3924 241.4689,-110.8275\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"243.3603,-113.7726 249.9462,-105.4734 239.6223,-107.8542 243.3603,-113.7726\"/>\n",
"</g>\n",
"<!-- 3711 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>3711</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"88.9458,-36 5.9458,-36 5.9458,0 88.9458,0 88.9458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"47.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3709&#45;&gt;3711 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>3709&#45;&gt;3711</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M47.4458,-71.8314C47.4458,-64.131 47.4458,-54.9743 47.4458,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"50.9459,-46.4132 47.4458,-36.4133 43.9459,-46.4133 50.9459,-46.4132\"/>\n",
"</g>\n",
"<!-- 3714 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3714</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"262.9458,-36 195.9458,-36 195.9458,0 262.9458,0 262.9458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"229.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1)</text>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3712&#45;&gt;3714 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3712&#45;&gt;3714</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M263.7814,-72.937C258.5423,-64.5544 252.1063,-54.2569 246.228,-44.8516\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"249.0883,-42.8242 240.8203,-36.1992 243.1523,-46.5342 249.0883,-42.8242\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3713 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3713</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"355.4458,-36 281.4458,-36 281.4458,0 355.4458,0 355.4458,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"318.4458\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1)</text>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3712&#45;&gt;3713 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3712&#45;&gt;3713</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M284.8732,-72.937C289.9959,-64.5544 296.2888,-54.2569 302.0365,-44.8516\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"305.096,-46.5571 307.3241,-36.1992 299.123,-42.9069 305.096,-46.5571\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.21735554335886978\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"432pt\" height=\"260pt\"\n",
" viewBox=\"0.00 0.00 432.27 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
2019-09-05 12:03:01 +02:00
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n",
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-256 428.2717,-256 428.2717,4 -4,4\"/>\n",
"<!-- 4004 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>4004</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"151.5\" cy=\"-234\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"151.5\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9219858156028368)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4006 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>4006</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"151.5,-180 88.9946,-162 151.5,-144 214.0054,-162 151.5,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"151.5\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4004&#45;&gt;4006 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>4004&#45;&gt;4006</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M151.5,-215.8314C151.5,-208.131 151.5,-198.9743 151.5,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"155.0001,-190.4132 151.5,-180.4133 148.0001,-190.4133 155.0001,-190.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4010 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>4010</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"83,-108 0,-108 0,-72 83,-72 83,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"41.5\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4006&#45;&gt;4010 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>4006&#45;&gt;4010</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M132.3395,-149.4586C117.3164,-139.6253 95.9746,-125.6561 77.7518,-113.7284\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"79.3818,-110.6123 69.0979,-108.0641 75.5481,-116.4692 79.3818,-110.6123\"/>\n",
"</g>\n",
"<!-- 4007 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>4007</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"262.5,-108 100.9563,-90 262.5,-72 424.0437,-90 262.5,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"262.5\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.20029027576197386)</text>\n",
"</g>\n",
"<!-- 4006&#45;&gt;4007 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>4006&#45;&gt;4007</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M170.8347,-149.4586C187.2095,-138.8371 211.0235,-123.3902 230.2748,-110.9028\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.2709,-113.78 238.7558,-105.4016 228.4615,-107.9072 232.2709,-113.78\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4009 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>4009</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"255,-36 170,-36 170,0 255,0 255,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"212.5\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4007&#45;&gt;4009 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>4007&#45;&gt;4009</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M250.6507,-72.937C244.7695,-64.468 237.5308,-54.0444 230.9451,-44.561\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"233.7171,-42.4165 225.1383,-36.1992 227.9675,-46.4093 233.7171,-42.4165\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4008 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>4008</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"350,-36 273,-36 273,0 350,0 350,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"311.5\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 4007&#45;&gt;4008 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>4007&#45;&gt;4008</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M274.1123,-72.937C279.8759,-64.468 286.9698,-54.0444 293.4238,-44.561\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"296.3817,-46.4355 299.1145,-36.1992 290.5947,-42.4971 296.3817,-46.4355\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.21735554335886978\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"432pt\" height=\"260pt\"\n",
" viewBox=\"0.00 0.00 432.27 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
2019-09-19 10:19:35 +02:00
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-256 428.2717,-256 428.2717,4 -4,4\"/>\n",
"<!-- 3909 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3909</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"151.5\" cy=\"-234\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"151.5\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9219858156028368)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3911 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3911</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"151.5,-180 88.9946,-162 151.5,-144 214.0054,-162 151.5,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"151.5\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3909&#45;&gt;3911 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3909&#45;&gt;3911</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M151.5,-215.8314C151.5,-208.131 151.5,-198.9743 151.5,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"155.0001,-190.4132 151.5,-180.4133 148.0001,-190.4133 155.0001,-190.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3915 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3915</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"83,-108 0,-108 0,-72 83,-72 83,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"41.5\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3911&#45;&gt;3915 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3911&#45;&gt;3915</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M132.3395,-149.4586C117.3164,-139.6253 95.9746,-125.6561 77.7518,-113.7284\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"79.3818,-110.6123 69.0979,-108.0641 75.5481,-116.4692 79.3818,-110.6123\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3912 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3912</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"262.5,-108 100.9563,-90 262.5,-72 424.0437,-90 262.5,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"262.5\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.20029027576197386)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3911&#45;&gt;3912 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3911&#45;&gt;3912</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M170.8347,-149.4586C187.2095,-138.8371 211.0235,-123.3902 230.2748,-110.9028\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.2709,-113.78 238.7558,-105.4016 228.4615,-107.9072 232.2709,-113.78\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3913 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3913</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"251,-36 174,-36 174,0 251,0 251,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"212.5\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3912&#45;&gt;3913 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3912&#45;&gt;3913</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M250.6507,-72.937C244.7695,-64.468 237.5308,-54.0444 230.9451,-44.561\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"233.7171,-42.4165 225.1383,-36.1992 227.9675,-46.4093 233.7171,-42.4165\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3914 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3914</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"354,-36 269,-36 269,0 354,0 354,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"311.5\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3912&#45;&gt;3914 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3912&#45;&gt;3914</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M274.1123,-72.937C279.8759,-64.468 286.9698,-54.0444 293.4238,-44.561\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"296.3817,-46.4355 299.1145,-36.1992 290.5947,-42.4971 296.3817,-46.4355\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.20962497813112532\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"422pt\" height=\"476pt\"\n",
" viewBox=\"0.00 0.00 421.76 476.00\" 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 472)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-472 417.7567,-472 417.7567,4 -4,4\"/>\n",
"<!-- 3947 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3947</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"263.2567\" cy=\"-450\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"263.2567\" y=\"-446.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9219858156028368)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3948 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3948</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"263.2567\" cy=\"-378\" rx=\"112.3801\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"263.2567\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">bake (0.5054716884821958)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3947&#45;&gt;3948 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3947&#45;&gt;3948</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M263.2567,-431.8314C263.2567,-424.131 263.2567,-414.9743 263.2567,-406.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"266.7568,-406.4132 263.2567,-396.4133 259.7568,-406.4133 266.7568,-406.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3949 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3949</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"263.2567,-324 200.7513,-306 263.2567,-288 325.7621,-306 263.2567,-324\"/>\n",
"<text text-anchor=\"middle\" x=\"263.2567\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3948&#45;&gt;3949 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3948&#45;&gt;3949</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M263.2567,-359.8314C263.2567,-352.131 263.2567,-342.9743 263.2567,-334.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"266.7568,-334.4132 263.2567,-324.4133 259.7568,-334.4133 266.7568,-334.4132\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3950 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3950</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"176.2567\" cy=\"-234\" rx=\"111.2805\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"176.2567\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cut (0.21044759376285382)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3949&#45;&gt;3950 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3949&#45;&gt;3950</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M246.8927,-292.4574C235.2893,-282.8546 219.397,-269.7023 205.6249,-258.3047\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"207.745,-255.5161 197.8095,-251.8368 203.282,-260.9089 207.745,-255.5161\"/>\n",
"</g>\n",
"<!-- 3955 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>3955</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"361.2567\" cy=\"-234\" rx=\"45.4919\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"361.2567\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cut (0.25)</text>\n",
"</g>\n",
"<!-- 3949&#45;&gt;3955 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>3949&#45;&gt;3955</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M281.2314,-292.7941C295.2539,-282.4919 315.0349,-267.9589 331.4215,-255.9198\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"333.6461,-258.6284 339.6327,-249.8871 329.5016,-252.9873 333.6461,-258.6284\"/>\n",
"</g>\n",
"<!-- 3951 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3951</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"156.2567,-180 .2429,-162 156.2567,-144 312.2706,-162 156.2567,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"156.2567\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.3897435897435897)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3950&#45;&gt;3951 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3950&#45;&gt;3951</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M171.2099,-215.8314C169.0141,-207.9266 166.3921,-198.4872 163.9613,-189.7365\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"167.2815,-188.6118 161.2327,-179.9134 160.5369,-190.4854 167.2815,-188.6118\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3954 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3954</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"109.7567,-108 24.7567,-108 24.7567,-72 109.7567,-72 109.7567,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"67.2567\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3951&#45;&gt;3954 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3951&#45;&gt;3954</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M136.5047,-146.0209C125.1623,-136.8449 110.6745,-125.1245 97.8853,-114.7781\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"99.7521,-111.7865 89.7763,-108.2181 95.3495,-117.2287 99.7521,-111.7865\"/>\n",
"</g>\n",
"<!-- 3952 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>3952</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"245.2567\" cy=\"-90\" rx=\"117.7793\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"245.2567\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">chop (0.21089630931458697)</text>\n",
"</g>\n",
"<!-- 3951&#45;&gt;3952 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>3951&#45;&gt;3952</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M176.0087,-146.0209C187.6289,-136.6203 202.5501,-124.5492 215.5643,-114.0208\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"217.8013,-116.7131 223.3745,-107.7025 213.3986,-111.2709 217.8013,-116.7131\"/>\n",
"</g>\n",
"<!-- 3953 -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>3953</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"283.7567,-36 206.7567,-36 206.7567,0 283.7567,0 283.7567,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"245.2567\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
"</g>\n",
"<!-- 3952&#45;&gt;3953 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>3952&#45;&gt;3953</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M245.2567,-71.8314C245.2567,-64.131 245.2567,-54.9743 245.2567,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"248.7568,-46.4132 245.2567,-36.4133 241.7568,-46.4133 248.7568,-46.4132\"/>\n",
"</g>\n",
"<!-- 3956 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>3956</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"413.7567,-180 330.7567,-180 330.7567,-144 413.7567,-144 413.7567,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"372.2567\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
"</g>\n",
"<!-- 3955&#45;&gt;3956 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>3955&#45;&gt;3956</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M364.0325,-215.8314C365.2089,-208.131 366.6079,-198.9743 367.9153,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"371.3931,-190.8272 369.4436,-180.4133 364.4734,-189.7699 371.3931,-190.8272\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.18941305549164347\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"509pt\" height=\"260pt\"\n",
" viewBox=\"0.00 0.00 509.21 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
2019-09-05 12:03:01 +02:00
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n",
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-256 505.2117,-256 505.2117,4 -4,4\"/>\n",
"<!-- 3870 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3870</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"274.7717,-252 212.2663,-234 274.7717,-216 337.2771,-234 274.7717,-252\"/>\n",
"<text text-anchor=\"middle\" x=\"274.7717\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3873 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3873</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"161.7717,-180 .228,-162 161.7717,-144 323.3154,-162 161.7717,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.20029027576197386)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3870&#45;&gt;3873 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3870&#45;&gt;3873</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M255.0886,-221.4586C238.4188,-210.8371 214.1757,-195.3902 194.5775,-182.9028\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"196.258,-179.8235 185.9437,-177.4016 192.4965,-185.727 196.258,-179.8235\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3871 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3871</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"388.7717\" cy=\"-162\" rx=\"47.3916\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"388.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3870&#45;&gt;3871 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3870&#45;&gt;3871</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M294.369,-221.6228C311.2271,-210.9755 335.9003,-195.3924 355.7948,-182.8275\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"357.6862,-185.7726 364.2721,-177.4734 353.9482,-179.8542 357.6862,-185.7726\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3874 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3874</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"136.2717,-108 69.2717,-108 69.2717,-72 136.2717,-72 136.2717,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"102.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3873&#45;&gt;3874 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3873&#45;&gt;3874</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M148.0876,-145.3008C140.9602,-136.6029 132.084,-125.7709 124.0812,-116.0048\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"126.6672,-113.6386 117.6218,-108.1222 121.2529,-118.0754 126.6672,-113.6386\"/>\n",
"</g>\n",
"<!-- 3875 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>3875</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"228.7717,-108 154.7717,-108 154.7717,-72 228.7717,-72 228.7717,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"191.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1)</text>\n",
"</g>\n",
"<!-- 3873&#45;&gt;3875 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>3873&#45;&gt;3875</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M169.0338,-144.5708C172.4213,-136.4409 176.5338,-126.571 180.3249,-117.4722\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"183.6477,-118.5975 184.2631,-108.0206 177.1861,-115.9052 183.6477,-118.5975\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3877 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3877</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"388.7717\" cy=\"-90\" rx=\"112.3801\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"388.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">bake (0.6071428571428571)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3871&#45;&gt;3877 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3871&#45;&gt;3877</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M388.7717,-143.8314C388.7717,-136.131 388.7717,-126.9743 388.7717,-118.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"392.2718,-118.4132 388.7717,-108.4133 385.2718,-118.4133 392.2718,-118.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3872 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node7\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3872</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"430.2717,-36 347.2717,-36 347.2717,0 430.2717,0 430.2717,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"388.7717\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3877&#45;&gt;3872 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge6\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3877&#45;&gt;3872</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M388.7717,-71.8314C388.7717,-64.131 388.7717,-54.9743 388.7717,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"392.2718,-46.4132 388.7717,-36.4133 385.2718,-46.4133 392.2718,-46.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.18081651769563872\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"370pt\" height=\"476pt\"\n",
" viewBox=\"0.00 0.00 369.86 476.00\" 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 472)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-472 365.8616,-472 365.8616,4 -4,4\"/>\n",
"<!-- 3680 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3680</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"241.7717,-468 179.2663,-450 241.7717,-432 304.2771,-450 241.7717,-468\"/>\n",
"<text text-anchor=\"middle\" x=\"241.7717\" y=\"-446.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3689 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3689</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-378\" rx=\"106.6812\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">heat (0.969244288224956)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3680&#45;&gt;3689 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3680&#45;&gt;3689</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M226.3469,-436.1177C215.8187,-426.6423 201.5821,-413.8294 189.1554,-402.6453\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"191.4756,-400.0247 181.7012,-395.9366 186.7928,-405.2278 191.4756,-400.0247\"/>\n",
"</g>\n",
"<!-- 3687 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>3687</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"359.2717,-396 286.2717,-396 286.2717,-360 359.2717,-360 359.2717,-396\"/>\n",
"<text text-anchor=\"middle\" x=\"322.7717\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1)</text>\n",
"</g>\n",
"<!-- 3680&#45;&gt;3687 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>3680&#45;&gt;3687</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M257.3893,-436.1177C267.9729,-426.71 282.2579,-414.0123 294.7758,-402.8852\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"297.1439,-405.4631 302.2927,-396.2035 292.4933,-400.2313 297.1439,-405.4631\"/>\n",
"</g>\n",
"<!-- 3681 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3681</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-306\" rx=\"122.3786\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">open (0.009697241645788928)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3689&#45;&gt;3681 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3689&#45;&gt;3681</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-359.8314C161.7717,-352.131 161.7717,-342.9743 161.7717,-334.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-334.4132 161.7717,-324.4133 158.2718,-334.4133 165.2718,-334.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3682 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3682</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-234\" rx=\"123.4781\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">simmer (0.6899063929501801)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3681&#45;&gt;3682 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3681&#45;&gt;3682</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-287.8314C161.7717,-280.131 161.7717,-270.9743 161.7717,-262.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-262.4132 161.7717,-252.4133 158.2718,-262.4133 165.2718,-262.4132\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3683 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3683</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"161.7717,-180 .228,-162 161.7717,-144 323.3154,-162 161.7717,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.22564102564102564)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3682&#45;&gt;3683 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3682&#45;&gt;3683</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-215.8314C161.7717,-208.131 161.7717,-198.9743 161.7717,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-190.4132 161.7717,-180.4133 158.2718,-190.4133 165.2718,-190.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3684 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3684</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"117.2717,-108 32.2717,-108 32.2717,-72 117.2717,-72 117.2717,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"74.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3683&#45;&gt;3684 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3683&#45;&gt;3684</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M142.4636,-146.0209C131.376,-136.8449 117.2138,-125.1245 104.7119,-114.7781\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"106.7206,-111.8974 96.7852,-108.2181 102.2576,-117.2902 106.7206,-111.8974\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3685 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node7\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3685</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"248.7717\" cy=\"-90\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"248.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9999999999999999)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3683&#45;&gt;3685 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge6\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3683&#45;&gt;3685</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M181.0798,-146.0209C192.3316,-136.709 206.7498,-124.7767 219.386,-114.3192\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"221.9087,-116.7746 227.3811,-107.7025 217.4457,-111.3818 221.9087,-116.7746\"/>\n",
"</g>\n",
"<!-- 3686 -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>3686</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"287.2717,-36 210.2717,-36 210.2717,0 287.2717,0 287.2717,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"248.7717\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
"</g>\n",
"<!-- 3685&#45;&gt;3686 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>3685&#45;&gt;3686</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M248.7717,-71.8314C248.7717,-64.131 248.7717,-54.9743 248.7717,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"252.2718,-46.4132 248.7717,-36.4133 245.2718,-46.4133 252.2718,-46.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
},
2019-09-19 10:19:35 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
2019-10-06 20:08:25 +02:00
"0.17755644030720744\n"
2019-09-19 10:19:35 +02:00
]
},
2019-09-05 12:03:01 +02:00
{
"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",
2019-10-06 20:08:25 +02:00
"<svg width=\"519pt\" height=\"476pt\"\n",
" viewBox=\"0.00 0.00 519.21 476.00\" 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 472)\">\n",
2019-09-05 12:03:01 +02:00
"<title>%3</title>\n",
2019-10-06 20:08:25 +02:00
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-472 515.2117,-472 515.2117,4 -4,4\"/>\n",
"<!-- 3878 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node1\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3878</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"279.7717,-468 217.2663,-450 279.7717,-432 342.2771,-450 279.7717,-468\"/>\n",
"<text text-anchor=\"middle\" x=\"279.7717\" y=\"-446.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3879 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node2\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3879</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-378\" rx=\"106.6812\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">heat (0.969244288224956)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3878&#45;&gt;3879 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge1\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3878&#45;&gt;3879</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M259.4868,-437.6228C242.9555,-427.5359 219.1641,-413.0191 199.1963,-400.8354\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"200.9783,-397.8226 190.6189,-395.6017 197.3322,-403.7981 200.9783,-397.8226\"/>\n",
"</g>\n",
"<!-- 3888 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>3888</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"398.7717\" cy=\"-378\" rx=\"112.3801\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"398.7717\" y=\"-374.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">bake (0.6071428571428571)</text>\n",
"</g>\n",
"<!-- 3878&#45;&gt;3888 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>3878&#45;&gt;3888</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M299.9584,-437.7862C316.7097,-427.6509 340.9858,-412.9629 361.2835,-400.6819\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"363.2519,-403.5818 369.9959,-395.4105 359.6282,-397.5927 363.2519,-403.5818\"/>\n",
"</g>\n",
"<!-- 3880 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node3\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3880</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-306\" rx=\"122.3786\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">open (0.009697241645788928)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3879&#45;&gt;3880 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge2\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3879&#45;&gt;3880</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-359.8314C161.7717,-352.131 161.7717,-342.9743 161.7717,-334.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-334.4132 161.7717,-324.4133 158.2718,-334.4133 165.2718,-334.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3881 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node4\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3881</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"161.7717\" cy=\"-234\" rx=\"123.4781\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">simmer (0.6899063929501801)</text>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3880&#45;&gt;3881 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge3\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3880&#45;&gt;3881</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-287.8314C161.7717,-280.131 161.7717,-270.9743 161.7717,-262.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-262.4132 161.7717,-252.4133 158.2718,-262.4133 165.2718,-262.4132\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3882 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node5\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3882</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"161.7717,-180 .228,-162 161.7717,-144 323.3154,-162 161.7717,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"161.7717\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix (0.22564102564102564)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3881&#45;&gt;3882 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge4\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3881&#45;&gt;3882</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M161.7717,-215.8314C161.7717,-208.131 161.7717,-198.9743 161.7717,-190.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"165.2718,-190.4132 161.7717,-180.4133 158.2718,-190.4133 165.2718,-190.4132\"/>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3883 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"node6\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3883</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"117.2717,-108 32.2717,-108 32.2717,-72 117.2717,-72 117.2717,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"74.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">tomato (1.0)</text>\n",
2019-09-19 10:19:35 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3882&#45;&gt;3883 -->\n",
2019-09-19 10:19:35 +02:00
"<g id=\"edge5\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3882&#45;&gt;3883</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M142.4636,-146.0209C131.376,-136.8449 117.2138,-125.1245 104.7119,-114.7781\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"106.7206,-111.8974 96.7852,-108.2181 102.2576,-117.2902 106.7206,-111.8974\"/>\n",
"</g>\n",
"<!-- 3884 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>3884</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"248.7717\" cy=\"-90\" rx=\"113.18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"248.7717\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">cook (0.9999999999999999)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3882&#45;&gt;3884 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>3882&#45;&gt;3884</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M181.0798,-146.0209C192.3316,-136.709 206.7498,-124.7767 219.386,-114.3192\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"221.9087,-116.7746 227.3811,-107.7025 217.4457,-111.3818 221.9087,-116.7746\"/>\n",
"</g>\n",
"<!-- 3885 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"node8\" class=\"node\">\n",
2019-10-06 20:08:25 +02:00
"<title>3885</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"287.2717,-36 210.2717,-36 210.2717,0 287.2717,0 287.2717,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"248.7717\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">onion (1.0)</text>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
2019-10-06 20:08:25 +02:00
"<!-- 3884&#45;&gt;3885 -->\n",
2019-09-05 12:03:01 +02:00
"<g id=\"edge7\" class=\"edge\">\n",
2019-10-06 20:08:25 +02:00
"<title>3884&#45;&gt;3885</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M248.7717,-71.8314C248.7717,-64.131 248.7717,-54.9743 248.7717,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"252.2718,-46.4132 248.7717,-36.4133 245.2718,-46.4133 252.2718,-46.4132\"/>\n",
"</g>\n",
"<!-- 3886 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>3886</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"440.2717,-324 357.2717,-324 357.2717,-288 440.2717,-288 440.2717,-324\"/>\n",
"<text text-anchor=\"middle\" x=\"398.7717\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">noodle (1.0)</text>\n",
"</g>\n",
"<!-- 3888&#45;&gt;3886 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>3888&#45;&gt;3886</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M398.7717,-359.8314C398.7717,-352.131 398.7717,-342.9743 398.7717,-334.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"402.2718,-334.4132 398.7717,-324.4133 395.2718,-334.4133 402.2718,-334.4132\"/>\n",
2019-09-05 12:03:01 +02:00
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2019-10-06 20:08:25 +02:00
"<graphviz.dot.Digraph at 0x7f765e905780>"
2019-09-05 12:03:01 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"p.plot_population()"
]
},
{
"cell_type": "code",
2019-09-19 10:19:35 +02:00
"execution_count": 28,
2019-09-05 12:03:01 +02:00
"metadata": {},
2019-09-19 10:19:35 +02:00
"outputs": [
{
"ename": "NameError",
"evalue": "name 't' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-28-11fd5e5bf443>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_serialization\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 't' is not defined"
]
}
],
2019-09-05 12:03:01 +02:00
"source": [
"t2 = Tree.from_serialization(t.serialize())"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"t.mutate()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.00499001996007984"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t.score()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"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=\"148pt\" height=\"188pt\"\n",
" viewBox=\"0.00 0.00 148.00 188.00\" 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 184)\">\n",
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-184 144,-184 144,4 -4,4\"/>\n",
"<!-- 43 -->\n",
"<g id=\"node1\" class=\"node\">\n",
"<title>43</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"73,-180 38.1439,-162 73,-144 107.8561,-162 73,-180\"/>\n",
"<text text-anchor=\"middle\" x=\"73\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">mix</text>\n",
"</g>\n",
"<!-- 44 -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>44</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"68,-108 0,-108 0,-72 68,-72 68,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"34\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">chocolate</text>\n",
"</g>\n",
"<!-- 43&#45;&gt;44 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>43&#45;&gt;44</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M65.2949,-147.7751C60.5218,-138.9633 54.2385,-127.3633 48.5551,-116.871\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"51.6086,-115.1596 43.7682,-108.0336 45.4536,-118.4936 51.6086,-115.1596\"/>\n",
"</g>\n",
"<!-- 51 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>51</title>\n",
"<ellipse fill=\"none\" stroke=\"#000000\" cx=\"113\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"113\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">beat</text>\n",
"</g>\n",
"<!-- 43&#45;&gt;51 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>43&#45;&gt;51</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M80.9027,-147.7751C85.9391,-138.7097 92.6148,-126.6934 98.5733,-115.9681\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"101.7687,-117.4231 103.5657,-106.9818 95.6496,-114.0236 101.7687,-117.4231\"/>\n",
"</g>\n",
"<!-- 45 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>45</title>\n",
"<polygon fill=\"none\" stroke=\"#000000\" points=\"140,-36 86,-36 86,0 140,0 140,-36\"/>\n",
"<text text-anchor=\"middle\" x=\"113\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">sugar</text>\n",
"</g>\n",
"<!-- 51&#45;&gt;45 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>51&#45;&gt;45</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M113,-71.8314C113,-64.131 113,-54.9743 113,-46.4166\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"116.5001,-46.4132 113,-36.4133 109.5001,-46.4133 116.5001,-46.4132\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<graphviz.dot.Digraph at 0x7fb72d1506a0>"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t.root().dot()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'pepper'"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(t.root().childs())[0]._name"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"n = IngredientNode(\"test\")"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n.traverse() == IngredientNode"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
2019-09-19 10:19:35 +02:00
},
"toc-autonumbering": false,
"toc-showcode": false,
"toc-showmarkdowntxt": false,
"toc-showtags": false
2019-09-05 12:03:01 +02:00
},
"nbformat": 4,
"nbformat_minor": 4
}