diff --git a/jastadd-mquat-benchmark/results/.gitignore b/jastadd-mquat-benchmark/results/.gitignore
index 4da2c52ba7cf6cff45a5ef64dd0a3f1c4522826b..b60117a22d9f06d568c670cc8852bfeeab2b0746 100644
--- a/jastadd-mquat-benchmark/results/.gitignore
+++ b/jastadd-mquat-benchmark/results/.gitignore
@@ -1,5 +1,6 @@
 *
 !.gitignore
 !jastadd-mquat-plots.ipynb
+!vis_scenarios.ipynb
 !to-html.sh
 !fr
diff --git a/jastadd-mquat-benchmark/results/jastadd-mquat-plots.ipynb b/jastadd-mquat-benchmark/results/jastadd-mquat-plots.ipynb
index bdded81c25a5d39aa085864df26a9dcf08a78e29..ed4d32568649267edb91c91662050832377a0fb4 100644
--- a/jastadd-mquat-benchmark/results/jastadd-mquat-plots.ipynb
+++ b/jastadd-mquat-benchmark/results/jastadd-mquat-plots.ipynb
@@ -453,7 +453,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.3"
+   "version": "3.6.5"
   }
  },
  "nbformat": 4,
diff --git a/jastadd-mquat-benchmark/results/vis_scenarios.ipynb b/jastadd-mquat-benchmark/results/vis_scenarios.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..cba9eeba50dd38d62d25c0da5548ba49fbdb7dc5
--- /dev/null
+++ b/jastadd-mquat-benchmark/results/vis_scenarios.ipynb
@@ -0,0 +1,1117 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 77,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Requirement already satisfied: numpy in /home/rschoene/.local/lib/python3.6/site-packages\n",
+      "Requirement already satisfied: pandas in /home/rschoene/.local/lib/python3.6/site-packages\n",
+      "Requirement already satisfied: scipy in /home/rschoene/.local/lib/python3.6/site-packages\n",
+      "Requirement already satisfied: matplotlib in /home/rschoene/.local/lib/python3.6/site-packages\n",
+      "Requirement already satisfied: python-dateutil>=2 in /home/rschoene/.local/lib/python3.6/site-packages (from pandas)\n",
+      "Requirement already satisfied: pytz>=2011k in /usr/lib/python3.6/site-packages (from pandas)\n",
+      "Requirement already satisfied: cycler>=0.10 in /home/rschoene/.local/lib/python3.6/site-packages (from matplotlib)\n",
+      "Requirement already satisfied: six>=1.10 in /usr/lib/python3.6/site-packages (from matplotlib)\n",
+      "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/lib/python3.6/site-packages (from matplotlib)\n"
+     ]
+    }
+   ],
+   "source": [
+    "!pip3 install --user numpy pandas scipy matplotlib\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy as sp\n",
+    "import matplotlib.pyplot as plt\n",
+    "from matplotlib import colors as mcolors"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 78,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "import glob"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['ILP (Direct)', 'ILP (External)', 'Simple']"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "def toLabel(name):\n",
+    "    if '-' in name:\n",
+    "        tokens = name.split('-')\n",
+    "        return '{} ({})'.format(tokens[0].upper(), tokens[1].title())\n",
+    "    else:\n",
+    "        return name.title()\n",
+    "\n",
+    "[toLabel(n) for n in ['ilp-direct', 'ilp-external', 'simple']]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bar_width = 0.2\n",
+    "solver_names = ['ilp-direct', 'ilp-external', 'simple', 'mh-naive']\n",
+    "patterns = ['❌', '❌', '✔', '➖']\n",
+    "colors = [c[4:] for c in (sorted(mcolors.TABLEAU_COLORS.keys())) if 'dark'+c[4:] in mcolors.CSS4_COLORS]\n",
+    "colors.reverse()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def load(filename, show_head=False, name=None):\n",
+    "    data = pd.read_csv(filename)\n",
+    "    data['id'] = name or os.path.basename(os.path.splitext(filename)[0])\n",
+    "    if show_head:\n",
+    "        print(data.head())\n",
+    "    return data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "                      when         id  tlc  isc  isd  csc  csd  dep  bi  res  \\\n",
+      "0  2018-06-07-16-49-57-992  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+      "1  2018-06-07-16-49-58-015  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+      "2  2018-06-07-18-04-42-518  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+      "3  2018-06-07-18-04-42-542  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+      "4  2018-06-07-18-04-42-568  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+      "\n",
+      "    ...     comp  impl  gen    initObj          name  Gen  Solved        Obj  \\\n",
+      "0   ...        1     1   23  226823.67    ilp-direct   17       2  226823.67   \n",
+      "1   ...        1     1   23  226823.67  ilp-external    0      22  226823.67   \n",
+      "2   ...        1     1   24  226823.67    ilp-direct   16       2  226823.67   \n",
+      "3   ...        1     1   24  226823.67  ilp-external    0      22  226823.67   \n",
+      "4   ...        1     1    0  226823.67    ilp-direct    0       0  226823.67   \n",
+      "\n",
+      "   Valid  TimeOut  \n",
+      "0   True    False  \n",
+      "1   True    False  \n",
+      "2   True    False  \n",
+      "3   True    False  \n",
+      "4   True    False  \n",
+      "\n",
+      "[5 rows x 23 columns]\n"
+     ]
+    }
+   ],
+   "source": [
+    "data = load('scenarios/0_trivial.csv', show_head=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>when</th>\n",
+       "      <th>id</th>\n",
+       "      <th>tlc</th>\n",
+       "      <th>isc</th>\n",
+       "      <th>isd</th>\n",
+       "      <th>csc</th>\n",
+       "      <th>csd</th>\n",
+       "      <th>dep</th>\n",
+       "      <th>bi</th>\n",
+       "      <th>res</th>\n",
+       "      <th>...</th>\n",
+       "      <th>comp</th>\n",
+       "      <th>impl</th>\n",
+       "      <th>gen</th>\n",
+       "      <th>initObj</th>\n",
+       "      <th>name</th>\n",
+       "      <th>Gen</th>\n",
+       "      <th>Solved</th>\n",
+       "      <th>Obj</th>\n",
+       "      <th>Valid</th>\n",
+       "      <th>TimeOut</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>2018-06-07-16-49-57-992</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>23</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>17</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>2018-06-07-16-49-58-015</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>23</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>22</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>2018-06-07-18-04-42-518</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>24</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>16</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>2018-06-07-18-04-42-542</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>24</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>22</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>2018-06-07-18-04-42-568</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>2018-06-07-18-04-42-570</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>2018-06-07-18-04-42-576</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>2018-06-07-18-04-42-578</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>2018-06-07-18-04-42-583</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>2018-06-07-18-04-42-585</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>10</th>\n",
+       "      <td>2018-06-07-18-04-42-590</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>11</th>\n",
+       "      <td>2018-06-07-18-04-42-592</td>\n",
+       "      <td>0_trivial</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1.0</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>226823.67</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>12 rows × 23 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                       when         id  tlc  isc  isd  csc  csd  dep  bi  res  \\\n",
+       "0   2018-06-07-16-49-57-992  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "1   2018-06-07-16-49-58-015  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "2   2018-06-07-18-04-42-518  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "3   2018-06-07-18-04-42-542  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "4   2018-06-07-18-04-42-568  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "5   2018-06-07-18-04-42-570  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "6   2018-06-07-18-04-42-576  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "7   2018-06-07-18-04-42-578  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "8   2018-06-07-18-04-42-583  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "9   2018-06-07-18-04-42-585  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "10  2018-06-07-18-04-42-590  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "11  2018-06-07-18-04-42-592  0_trivial    1    0    0    2    0    1   1  1.0   \n",
+       "\n",
+       "     ...     comp  impl  gen    initObj          name  Gen  Solved        Obj  \\\n",
+       "0    ...        1     1   23  226823.67    ilp-direct   17       2  226823.67   \n",
+       "1    ...        1     1   23  226823.67  ilp-external    0      22  226823.67   \n",
+       "2    ...        1     1   24  226823.67    ilp-direct   16       2  226823.67   \n",
+       "3    ...        1     1   24  226823.67  ilp-external    0      22  226823.67   \n",
+       "4    ...        1     1    0  226823.67    ilp-direct    0       0  226823.67   \n",
+       "5    ...        1     1    0  226823.67  ilp-external    0       2  226823.67   \n",
+       "6    ...        1     1    0  226823.67    ilp-direct    0       0  226823.67   \n",
+       "7    ...        1     1    0  226823.67  ilp-external    0       2  226823.67   \n",
+       "8    ...        1     1    0  226823.67    ilp-direct    0       0  226823.67   \n",
+       "9    ...        1     1    0  226823.67  ilp-external    0       2  226823.67   \n",
+       "10   ...        1     1    0  226823.67    ilp-direct    0       0  226823.67   \n",
+       "11   ...        1     1    0  226823.67  ilp-external    0       2  226823.67   \n",
+       "\n",
+       "    Valid  TimeOut  \n",
+       "0    True    False  \n",
+       "1    True    False  \n",
+       "2    True    False  \n",
+       "3    True    False  \n",
+       "4    True    False  \n",
+       "5    True    False  \n",
+       "6    True    False  \n",
+       "7    True    False  \n",
+       "8    True    False  \n",
+       "9    True    False  \n",
+       "10   True    False  \n",
+       "11   True    False  \n",
+       "\n",
+       "[12 rows x 23 columns]"
+      ]
+     },
+     "execution_count": 48,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th>Gen</th>\n",
+       "      <th>Solved</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>id</th>\n",
+       "      <th>name</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th rowspan=\"2\" valign=\"top\">0_trivial</th>\n",
+       "      <th>ilp-direct</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>ilp-external</th>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                        Gen  Solved\n",
+       "id        name                     \n",
+       "0_trivial ilp-direct      0       0\n",
+       "          ilp-external    0       2"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "data[['id', 'name', 'Gen', 'Solved']].groupby(['id', 'name']).median()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th>Gen</th>\n",
+       "      <th>Solved</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>id</th>\n",
+       "      <th>name</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th rowspan=\"2\" valign=\"top\">0_trivial</th>\n",
+       "      <th>ilp-direct</th>\n",
+       "      <td>5.5</td>\n",
+       "      <td>0.666667</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>ilp-external</th>\n",
+       "      <td>0.0</td>\n",
+       "      <td>8.666667</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                        Gen    Solved\n",
+       "id        name                       \n",
+       "0_trivial ilp-direct    5.5  0.666667\n",
+       "          ilp-external  0.0  8.666667"
+      ]
+     },
+     "execution_count": 50,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "data[['id', 'name', 'Gen', 'Solved']].groupby(['id', 'name']).mean()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def add_gen_and_solve(ax, index, i, solver_name, df, suffix, printStatus=True):\n",
+    "    dff = df[df['name'] == solver_name]\n",
+    "    if dff.empty:\n",
+    "        return\n",
+    "    # check if all values in the 'Gen' column are not -1, i.e., this solver does use generation\n",
+    "    does_generation = (df['Gen'] != -1).all()\n",
+    "    if does_generation:\n",
+    "        gen_value = df['Gen'].median()\n",
+    "        print('%s has generation of %s' % (solver_name, gen_value))\n",
+    "        ax.bar(index + i * bar_width, gen_value, bar_width,\n",
+    "                #label=toLabel(solver_name) + \"[GEN]\",\n",
+    "                color='dark' + colors[i])\n",
+    "    else:\n",
+    "        gen_value = 0\n",
+    "    solv_value = df['Solved'].median()\n",
+    "    solvBars = ax.bar(index + i * bar_width, solv_value, bar_width,\n",
+    "            label=toLabel(solver_name),\n",
+    "            bottom=gen_value,\n",
+    "            color=colors[i])\n",
+    "    return\n",
+    "\n",
+    "    # old code ...\n",
+    "    pattern_index = 2 * df.get(solver_name + 'Valid' + suffix) + df.get(solver_name + 'TimeOut' + suffix)\n",
+    "    genTimes = df.get(solver_name + 'Gen' + suffix)\n",
+    "    if genTimes is not None:\n",
+    "        ax.bar(index + i * bar_width, genTimes, bar_width,\n",
+    "                #label=toLabel(solver_name) + \"[GEN]\",\n",
+    "                color='dark' + colors[i])\n",
+    "    solvTimes = df.get(solver_name + 'Solved' + suffix)\n",
+    "    solvBars = None\n",
+    "    if solvTimes is not None:\n",
+    "        solvBars = ax.bar(index + i * bar_width, solvTimes, bar_width,\n",
+    "                label=toLabel(solver_name),\n",
+    "                bottom=genTimes,\n",
+    "                color=colors[i])\n",
+    "    if printStatus and solvBars is not None:\n",
+    "        for rect, pi in zip(solvBars, pattern_index):\n",
+    "            height = rect.get_height()\n",
+    "            #print(rect.get_y(), height)\n",
+    "            ax.text(rect.get_x() + rect.get_width() / 2, max(5, rect.get_y() + height),\n",
+    "                     patterns[pi], fontname='symbola', \n",
+    "                     ha='center', va='bottom', color=colors[i])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def create_single(name, suffix='Hard'):\n",
+    "    fig = plt.figure()\n",
+    "    ax = fig.add_subplot(111)\n",
+    "    data = load(name)\n",
+    "    #index = np.arange(len(data.name))\n",
+    "    index = np.arange(1)\n",
+    "    for i, solver_name in enumerate(solver_names):\n",
+    "        add_gen_and_solve(ax, index, i, solver_name, data, suffix, False)\n",
+    "\n",
+    "    plt.xticks(rotation=90)\n",
+    "    plt.title(\"Solving time for \" + name)\n",
+    "    plt.xlabel('Solver')\n",
+    "    plt.ylabel('Execution time [ms]')\n",
+    "    plt.yscale(\"log\")\n",
+    "\n",
+    "    plt.xticks(index + bar_width / len(solver_names), data.name.astype(str))\n",
+    "    plt.legend()\n",
+    "    plt.tight_layout()\n",
+    "    plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "ilp-direct has generation of 0.0\n",
+      "ilp-external has generation of 0.0\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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LcsRwUknncSsWbO22mfBggWZY12/fj3dunXLvH8eCjOKryUiYnZEnLf77rtXOhQzK6KI1n20kSFDhjTaN5U8peDaa69l5cqVTJgwodF9Ghx99NE8/PDDW8715ptv8txzz1FbW8vKlSuZP38+AGvXrmXTpk307NmTtWvXbnWO5557rtHRiG2pXSYoM7MiW7JkCf369dvyuPXWWzMdd/LJJ/Pggw9uVTZjxowtw8znz5/PfffdR+fOnZs9T9++fbnpppuYOnUqhx9+OGPHjmXx4sV07tyZW265hU9/+tMMHz6ck046ifXr1/M3f/M3LFq0aMsgCYD77ruPU089dcdegFaiptoz24PRo0eHZ9Q1s2effbZs30178aEPfYivfe1rDB48uGIxvPzyy0ybNo177rlnp8/V2Hsj6Q8RMbrcsa5BmZkVyFVXXcXKlSsrGsNf/vIXrrnmmorGAO10kISZWUdVW1tLbW1tRWNoGOVXaa5BmZlZITlBmZlZITlBmZlZIbXLPij/UNfMmvWzVp4iY1r7He3cnrXLGpR/qGtmRZPndBsjRoxgxIgRHHPMMc3GcPvtt7No0aKdfCbZNNyoduPGjYwbN45Nmza1+jXaZYIyM2uPdnS6jbq6Ourq6pg3b16z59+RBLWziaVz586MHz9+yw98W5MTlJlZG9uR6TZKXXTRRVx++eUA3HXXXYwbN4558+Zxxx13MGPGDEaMGMHSpUtZunQpEyZMYNSoURx//PFb7oI+ffp0LrjgAo466ig+//nPc9lll/Hxj3+cE044gYMPPphrr712y7UmTZrEqFGjGDp0KNddd12j8UyaNImZM2fu6MvRpHbZB2Vm1p61ZLqNhjugAwwdOpSZM2dy5ZVXMmbMGI4//ng+85nPMGfOHAYOHMjpp5/OaaedtuWGtOPHj+cHP/gBgwcP5rHHHuPCCy/k3nvvBaC+vp558+ZRU1PDZZddxuLFi7nvvvtYu3YttbW1fOpTn6JTp07ceOON7LXXXrz99tuMGTOGM888k969e28V47Bhw7bc3681OUGZmbWRHZluo7E7oHfv3p3rr7+ecePG8c1vfpOBAwdud65169Yxb948Jk+evKVsw4YNW5YnT55MTU3NlvVTTz2VLl260KVLF/bee29efvll+vXrx7XXXsttt90GwPLly3n++ee3S1A1NTV07tyZtWvX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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fbab88a4ba8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "create_single('scenarios/0_trivial.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 88,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def get_id(filename):\n",
+    "    return int(os.path.basename(filename).split('_')[0])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 91,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# merge csv files into one\n",
+    "def merge(*filenames):\n",
+    "    result = pd.DataFrame(columns=['id', 'solver', 'gen', 'solve', 'valid', 'timeout'])\n",
+    "    for filename in filenames:\n",
+    "        print(filename)\n",
+    "        # load the dateset of one scenario\n",
+    "        df = load(filename)\n",
+    "        if df.empty:\n",
+    "            continue\n",
+    "        # group by solver name, calculate mean for generation and solving time\n",
+    "        # use reset_index to get \"normal\" dataframe back\n",
+    "        df = df[['name', 'Gen', 'Solved', 'Valid', 'TimeOut']].groupby('name').mean().reset_index()\n",
+    "        # rename columns\n",
+    "        df = df.rename(index=str, columns={\"name\": \"solver\", \"Gen\": \"gen\",\n",
+    "                                           \"Solved\": \"solve\", 'Valid': 'valid', 'TimeOut': 'timeout'})\n",
+    "        # add id column with constant value equal to id of scenario\n",
+    "        df['id'] = get_id(filename)\n",
+    "        # append to result\n",
+    "        result = result.append(df)\n",
+    "    return result        "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 93,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "scenarios/0_trivial.csv\n",
+      "scenarios/1_small.csv\n",
+      "scenarios/2_small-many-hw.csv\n",
+      "scenarios/3_small-complex-sw.csv\n",
+      "scenarios/4_medium.csv\n",
+      "scenarios/5_medium-many-hw.csv\n",
+      "scenarios/6_medium-complex-sw.csv\n",
+      "scenarios/7_large.csv\n",
+      "scenarios/8_large-many-hw.csv\n",
+      "scenarios/9_large-complex-sw.csv\n",
+      "scenarios/10_huge.csv\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>gen</th>\n",
+       "      <th>id</th>\n",
+       "      <th>solve</th>\n",
+       "      <th>solver</th>\n",
+       "      <th>timeout</th>\n",
+       "      <th>valid</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>5.500000</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.666667</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0</td>\n",
+       "      <td>8.666667</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>6.833333</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>1.666667</td>\n",
+       "      <td>1</td>\n",
+       "      <td>8.833333</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>7.666667</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>3.500000</td>\n",
+       "      <td>2</td>\n",
+       "      <td>18.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>134.000000</td>\n",
+       "      <td>3</td>\n",
+       "      <td>5.666667</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>59.833333</td>\n",
+       "      <td>3</td>\n",
+       "      <td>192.500000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>False</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>1583.166667</td>\n",
+       "      <td>4</td>\n",
+       "      <td>778017.333333</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>0.833333</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>723.333333</td>\n",
+       "      <td>4</td>\n",
+       "      <td>801541.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>5442.166667</td>\n",
+       "      <td>5</td>\n",
+       "      <td>797046.333333</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>True</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>5</td>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>36913.500000</td>\n",
+       "      <td>6</td>\n",
+       "      <td>789360.333333</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>6</td>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>8528.666667</td>\n",
+       "      <td>7</td>\n",
+       "      <td>795679.500000</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0.166667</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>7</td>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>30775.166667</td>\n",
+       "      <td>8</td>\n",
+       "      <td>787172.166667</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>8</td>\n",
+       "      <td>-1.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>True</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>300019.000000</td>\n",
+       "      <td>9</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>ilp-direct</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>300649.000000</td>\n",
+       "      <td>9</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>ilp-external</td>\n",
+       "      <td>False</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "             gen id          solve        solver   timeout     valid\n",
+       "0       5.500000  0       0.666667    ilp-direct     False      True\n",
+       "1       0.000000  0       8.666667  ilp-external     False      True\n",
+       "0       6.833333  1       0.000000    ilp-direct     False      True\n",
+       "1       1.666667  1       8.833333  ilp-external     False      True\n",
+       "0       7.666667  2       0.000000    ilp-direct     False      True\n",
+       "1       3.500000  2      18.000000  ilp-external     False      True\n",
+       "0     134.000000  3       5.666667    ilp-direct     False      True\n",
+       "1      59.833333  3     192.500000  ilp-external     False      True\n",
+       "0    1583.166667  4  778017.333333    ilp-direct  0.833333         1\n",
+       "1     723.333333  4  801541.000000  ilp-external         1         1\n",
+       "0    5442.166667  5  797046.333333    ilp-direct      True      True\n",
+       "1      -1.000000  5      -1.000000  ilp-external      True     False\n",
+       "0   36913.500000  6  789360.333333    ilp-direct      True     False\n",
+       "1      -1.000000  6      -1.000000  ilp-external      True     False\n",
+       "0    8528.666667  7  795679.500000    ilp-direct         1  0.166667\n",
+       "1      -1.000000  7      -1.000000  ilp-external         1         0\n",
+       "0   30775.166667  8  787172.166667    ilp-direct      True     False\n",
+       "1      -1.000000  8      -1.000000  ilp-external      True     False\n",
+       "0  300019.000000  9       0.000000    ilp-direct     False     False\n",
+       "1  300649.000000  9       0.000000  ilp-external     False     False"
+      ]
+     },
+     "execution_count": 93,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "merged = merge(*sorted(glob.glob('scenarios/*.csv'), key=get_id))\n",
+    "merged"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}